首页  /  Web 应用服务  /  正文

Nginx 虚拟主机配置

Web 应用服务 2026-10-01📖 15 分钟👁 —
🌐 Web 应用服务 · Nginx第 2 / 8 页12345678📖 完整导航 →

一、Nginx 和 http、浏览器

Nginx 处在浏览器和互联网之间的位置

https(后面详细说)在 http 基础上加密,流量会经由很多网关,层层 I/O 到全国总网关到互联网,需要安全的保障。


二、虚拟主机

虚拟主机技术是将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源。

开一台主机,开启了一个站点,不能保证资源利用率一直是高效的,可能很多时间都是空余的,可以把一台主机虚拟出更多的主机(多个域名对应一个 IP,由 Nginx 判断访问的是客户端哪个域名)。

两个域名同时解析到了一个 IP,需要在请求头写入域名,得以区分,结合之前的配置文件来看。

配置 host 映射

首先看 win 的目录,找到 hosts 文件 C:\Windows\System32\drivers\etc\hosts,需要管理员权限。

如果需要修改权限:右键文件--属性--安全--选择users--编辑--全部允许--应用。

改完之后可以修改回权限,防止 DNS 劫持,主机映射说了很多遍了,这里省略了。

公网域名配置和泛域名

万网和一些厂商(aliyun 还算靠谱)可以注册域名。

这里用 console.cloud.tencent.com(腾讯云)举例。在域名配置界面,可以设置域名解析:

腾讯云域名解析列表,还是空的

记录类型和之前 DNS-bind 的记录类型是一样的,A 是 IPV4,AAAA、NS 等(有的配置界面可能没有):

添加域名解析的弹窗,主机记录、记录类型和记录值

前提是买了域名。测试:在 cmd 去 ping 一下。

域名比较多就要添加多个记录了,比如 2、3 级域名很多,需要通配符来批量添加(都是之前 DNS 的东西)。

配置虚拟主机

插入:jumpserver/其他服务,前端资源丢失的恢复方法。先删除旧的(如果有):

docker exec jms_web rm -rf /opt/jumpserver/data/static

Docker 容器和宿主机之间拷贝文件,重新复制,指定目标为 static:

docker cp /tmp/jumpserver_static jms_web:/opt/jumpserver/data/static

在 /var/www 创建多个站点比如 www 和 void,分别在其中写入 html 文件,编辑文件内容(随便写一些东西方便验证):

ubuntu@VM-0-12-ubuntu:/var/www$ ll
drwxr-xr-x  2 root root 4096 Apr 17 15:22 html/
drwxr-xr-x  2 root root 4096 Apr 17 20:47 void/
drwxr-xr-x  2 root root 4096 Apr 17 20:48 www/

原本只有 html,新建 www 和 void,里面分别放 index.html 配置,然后需要把这个两个 uri 配置到 nginx 的站点配置文件中。

默认配置文件 /etc/nginx/nginx.conf,站点配置文件 /etc/nginx/sites-enabled/default。

视频中的目录是 /usr/local/nginx/conf,修改这个就能起到修改上述两个文件的效果,所以在学习/复习的时候需要注意哦,不要弄混了。

刚才创建的两个 www 站点和 void 站点怎么设置他们的配置文件呢,是在统一文件还是分开呢?单独开两个,apt 默认安装是的站点配置一个站点一个文件:www 是 /etc/nginx/sites-available/www,void 是 /etc/nginx/sites-available/void。

  1. 创建好站点文件
vi /etc/nginx/sites-available/www
server {
            listen 8081; # 端口
            root /var/www/www; # 根目录
            index www.html; # 配置文件
            
            server_name _; # 主机名称
# _ 就像一个“垃圾桶”,所有找不到对应 server 的请求,都丢到这里

}
vi /etc/nginx/sites-available/void
server {
    listen 8082;
    root /var/www/void;
    index void.html;
    
    server_name _;
}
# 分别创建两个站点的配置文件

上面是新加的两个站点的配置,下面是默认的站点的配置(8080),可以看到上面即简化版:

server {
	listen 8080 default_server;
	listen [::]:8080 default_server;

	root /var/www/html;
	index index.html index.htm index.nginx-debian.html;

	server_name _;

	location / {
		try_files $uri $uri/ =404;
	}

}
  1. 启用配置
sudo ln -s /etc/nginx/sites-available/www /etc/nginx/sites-enabled/
# 在 sites-enabled 目录下创建一个叫 www 的链接
# 最好不要写反了
sudo ln -s /etc/nginx/sites-available/void /etc/nginx/sites-enabled/
# 创建软连接,禁用网站时,配置文件不丢失
systemctl reload nginx # 重启

ln -s 是创建软连接的符号链接。

刚才编辑了测试页面 void.html 和 www.html,接下来直接访问端口查看即可(浏览器),需要开启云服务的防火墙。

# 仓库(有文件)
/etc/nginx/sites-available/
├── default   # 默认站点配置
├── www       # www 站点配置
└── void      # void 站点配置

# 执行 ln -s 后
sudo ln -s /etc/nginx/sites-available/www /etc/nginx/sites-enabled/

# 分部(有了快捷方式)
/etc/nginx/sites-enabled/
├── default -> ../sites-available/default
├── www -> ../sites-available/www      # ← 快捷方式
└── void -> ../sites-available/void    # ← 快捷方式

软链接(link)就相当于 CDN 访问入口,原始文件相当于源站资源。

访问不通的时候我是按这个顺序查的:

  1. 云安全组(防火墙)—— 腾讯云控制台 → 安全组 → 入站规则,这个已经做过了
  2. 系统防火墙 —— sudo ufw status(Ubuntu),看是否开启、是否放行端口
  3. 服务是否在跑 —— sudo systemctl status nginx
  4. 端口是否监听 —— sudo ss -tuln | grep 8081
  5. 本地测试 —— curl localhost:8081,测 Nginx 本身是否正常
  6. 配置文件语法 —— sudo nginx -t
  7. 错误日志 —— sudo tail -20 /var/log/nginx/error.log,这个最关键
  8. 访问日志 —— sudo tail -20 /var/log/nginx/access.log,看是否有请求进入

在浏览器访问成功之后,现在完成了:可以通过 IP + 端口 访问,但是通过域名访问需要再做配置(如同默认站点文件一样,在原来的基础上添加 location 函数)。

下用 void 举例:可以直接访问域名抵达站点,此时可使用同一端口

vi /etc/nginx/sites-available/void
server {
    listen 8080;
    root /var/www/void;
    index void.html;
    
    server_name void.senrenbanka.art;
    # 这里写子域名或域名--主机名
}
nginx -t # 需要root
systemctl reload nginx

如图所示:

浏览器访问 void.senrenbanka.art:8080 显示 this is void page

所以配置虚拟主机的时候有两种:

  1. 通过端口号区分(相同的端口号和相同的主机名是冲突的)
  2. 通过域名区分

Nginx 不是靠端口区分站点,是靠 HTTP 请求里的 Host 头区分。同一端口可以服务无数个域名,就像一栋大楼的一个大门可以服务无数个公司。

# 同一个 8080 端口,两个不同的 server 块

server {
    listen 8080;
    server_name site1.com;
    root /var/www/site1;
}

server {
    listen 8080;
    server_name site2.com;
    root /var/www/site2;
}

用户访问 site1.com:8080 → 返回 site1 的内容

用户访问 site2.com:8080 → 返回 site2 的内容

server_name 的多种匹配方式

特殊匹配:通配符、正则

void 那个域名对应了一个 html 文件路径,如果想让 void1.senrenbanka.art 也对应同样的路径,不需要再次复制配置文件,再加一个 server_name 即可。

如果云服务规则里的域名解析配置了通配符,未配置成功直接输入 void1 的域名就会跳转到默认配置。

如果多个 server 模块放在同一个配置文件,此时匹配有先后顺序,前面匹配了后面就不会匹配了,这里我每个站点都分开了,不必担心的。

vi /etc/nginx/sites-available/void
server {
    listen 8080;
    root /var/www/void;
    index void.html;
    
    server_name void.senrenbanka.art void1.senrenbanka.art;
    # 域名之间按空格分开即可
}
reload服务

如果刷新了浏览器还是没有更新,可能是由 cache(缓存),在 F12 中的 network 功能点可以关闭缓存。或者直接在域名后面的目录随机写几个字母,浏览器就会按照新的站点加载。

也可以使用 Ctrl + Shift + R。

还有暴力的配置,直接在 server_name 写 *.senrenbanka.art 这样也可以匹配,这种不会单独配置的,刚才提到多个 server 模块有先后顺序的,通常这样的情况使用通配符。

上面时主机名位置用了通配符,有时候根域名也会用的。

正则匹配

正则的元字符:. 匹配任意单个字符;* 前面字符重复 0 次或多次;+ 前面字符重复 1 次或多次;? 前面字符重复 0 次或 1 次;[] 匹配括号内任意一个;[0-9] 匹配任意数字;[a-z] 匹配任意小写字母;^ 行首;$ 行尾;\d 数字(等价于 [0-9]);\w 字母/数字/下划线。

~是正则开始标志,$是正则结束标志(不是语句结束标志)

下面是基本的正则匹配:

vi /etc/nginx/sites-available/void
server {
    listen 8080;
    root /var/www/void;
    index void.html;
    
    server_name ~^[0-9]+\.senrenbanka\.art$;
    # ~和$之间的符号,都会优先匹配正则,所以 . 要用转义符
    # 以数字开头的都匹配到void域名
}