Appearance
Nginx教程 - 4 多站点配置
虚拟主机 server 是可以配置多个的,我们可以在 nginx.conf 中进行配置。
这样我们可以使用 Nginx 发布多个项目。
4.1 多站点配置
首先再准备一个项目,我这里放在 /home/doubi/project8080 目录下,然后在目录下创建一个 index.html, 内容如下:
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
Hello, 8080
</body>
</html>然后修改 nginx.conf:
配置了两个 server,一个监听 80 端口,一个监听 8080 端口。
nginx
# 这个是一开始的配置
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# 在同级再添加一个server配置
server {
listen 8080; # 监听8080端口
server_name localhost;
location / {
root /home/doubi/project8080; # 配置站点路径
index index.html; # 首页
}
}检查 nginx 的配置,并重新加载 nginx 配置文件:
shell
cd /usr/local/nginx/sbin
./nginx -t
./nginx -s reload此时访问 http://192.168.0.103:8080 (我的Nginx主机IP为192.168.0.103),显示内容如下:

访问 http://192.168.0.103 ,显示内容如下:

可以看到两个站点的 server 配置都生效了。
4.2 独立server配置文件
上面我们在 nginx.conf 中配置了多个虚拟主机,如果虚拟主机很多,都写在 nginx.conf 中,会很臃肿。
我们可以为每个虚拟主机建立单独的配置文件,然后在 nginx.conf 中,使用 include 进行导入。
现在的文件结构是这样的,nginx.conf 是在 conf 下:
shell
doubi@doubibiji-server:/usr/local/nginx$ ls # 显示/usr/local/nginx
conf html nginx.pid sbin我们也在 conf 下新建一个 conf.d 的目录,并在其中新建两个配置文件,用来配置两个虚拟主机的 server 。
server80.conf 如下:
nginx
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}server8080.conf 如下:
nginx
server {
listen 8080; # 监听8080端口
server_name localhost;
location / {
root /home/doubi/project8080; # 配置站点路径
index index.html; # 首页
}
}然后将 nginx.conf 中的虚拟主机 server 的配置删掉,在 http 模块下添加如下配置,引入 conf.d 下所有虚拟主机的配置文件:
nginx
http {
# ....其他配置
include /usr/local/nginx/conf/conf.d/*.conf; # 包含虚拟主机配置文件
# ....其他配置
}重新加载 nginx 配置,然后访问 80 和 8080 的首页,发现也是正常工作 。这样配置文件更规整。
4.3 多IP多站点部署
上面我们部署了 2 个站点,两个站点通过不同的端口来部署。
这种情况下,80端口在访问的时候,URL中可以不包含端口,但是非80端口,就必须写端口号,这样不太方便,我们可以使用多IP的方式来部署多个站点,这样在访问的时候,就都不用端口号了。
多IP多站点部署,就是为一个主机分配多个IP,操作系统都支持,这样可以使用多个IP的80端口。
1 为主机添加多个IP地址
在 Ubuntu 22.04 中配置多个IP地址可以通过Netplan进行设置,Netplan的配置文件通常位于/etc/netplan/目录中,以.yaml结尾。我系统中的文件名为 00-installer-config.yaml ,编辑内容如下:
yaml
network:
version: 2
ethernets:
enp0s5: # 网卡名称
dhcp4: no
addresses:
- 192.168.0.108/24 # 配置了两个IP
- 192.168.0.109/24
routes:
- to: default
via: 192.168.0.1
nameservers: # DNS
addresses:
- 8.8.8.8
- 8.8.4.4保存完成后运行如下命令,应用新的网络配置:
shell
sudo netplan apply使用如下命令可以查看网卡的多个IP:
shell
ip addr show enp0s5
现在我的主机有了两个IP 192.168.0.108 和 192.168.0.109 ,配置完成,可以 ping 试试。
如果是 CentOS,网络接口配置文件位于 /etc/sysconfig/network-scripts/ 目录中。文件名格式通常为 ifcfg-<interface>,例如 ifcfg-eth0。
在文件末尾添加以下内容来配置第二个IP地址:
ini
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR1=192.168.0.108 # 配置IP1
IPADDR2=192.168.0.109 # 配置IP2
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=8.8.8.8保存并关闭配置文件后,重启网络服务以应用新的配置:
shell
sudo systemctl restart network使用如下命令可以查看网卡的多个IP:
shell
ip addr show enp0s5配置完成,可以 ping 试试。
2 准备站点
分别准备了两个站点,位于 /home/doubi/htm1_1 和 /home/doubi/htm1_2 ,并在其下创建了两个首页。
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>HTML1</title>
</head>
<body>
你好,HTML1
</body>
</html>另一个首页类似,改成 HTML2 。
3 修改配置文件
在 nginx.conf 配置文件中已经使用 include 引入 conf.d 目录下的文件了:
shell
include /usr/local/nginx/conf/conf.d/*.conf;所以在 conf.d 目录将其他的配置文件先删除(怕端口冲突),重新添加配置文件。
html_12.conf(名称随意)
nginx
server {
listen 192.168.0.108:80; # 监听80端口
server_name localhost;
location / {
root /home/doubi/html_1; # 站点1路径
index index.html; # 首页
}
}
server {
listen 192.168.0.109:80; # 监听80端口
server_name localhost;
location / {
root /home/doubi/html_2; # 站点2路径
index index.html; # 首页
}
}上面将两个 server 放在一个文件中了,也可以放在两个配置文件中。
4 重新加载nginx配置
shell
# 进入到nginx目录,重新加载nginx配置
./nginx -s reload
# 如果不行,可以重启nginx服务
sudo systemctl restart nginx5 访问
这里一定要注意站点路径目录每个层级的访问权限,如果没有权限会出现403。
如果有问题,可以使用 nginx -V 命令查看一下日志目录,然后查看一下错误日志。


注意:多IP多站点的方式只能在局域网使用,公网没必要使用多个IP的方式,因为公网IP是收费的。
4.4 多域名多站点部署
如果想要在公网中,使用80端口访问同一台主机上的 Nginx 下的多个站点,可以使用多域名的方式,这是最常用的。
首先得有一个二级域名,例如 doubibiji.com 。然后创建两个三级域名,例如 abc.doubibiji.com 和 bcd.doubibiji.com ,将这两个三级域名都同时指向同一台主机。当然你也可以使用两个不同的二级域名。
当然,这里只是演示,所以我使用 www.abc.com 和 www.bcd.com 两个二级域名来进行测试。
因为这两个域名不是我的,只是测试,所以修改主机的 host 文件,在访问这两个域名的时候,指向本机地址。
1 修改host文件
在访问 Nginx 的主机上配置,如果是 Linux 系统是 /etc/hosts 文件,如果是 windows 系统是 C:\Windows\System32\drivers\etc\hosts 文件,在文件中添加如下内容:
192.168.0.108 www.abc.com
192.168.0.108 www.bcd.com192.168.0.108 是我的 Nginx 主机的IP,这样访问上面两个域名就访问到 Nginx 主机的地址了。
如果有真的域名,就直接配置域名指向 Nginx 主机就可以了,这一步就不用了。
2 准备站点
和上面多IP多站点一样。
位于 /home/doubi/htm1_1 和 /home/doubi/htm1_2 ,并在其下创建了两个首页。
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>HTML1</title>
</head>
<body>
你好,HTML1
</body>
</html>另一个首页类似,改成 HTML2 。
3 修改配置文件
在 conf.d 目录将其他的配置文件先删除(怕端口冲突),重新添加配置文件。
html_12.conf(名称随意)
nginx
server {
listen 80; # 监听80端口
server_name www.abc.com; # 域名
location / {
root /home/doubi/html_1; # 站点1路径
index index.html;
}
}
server {
listen 80; # 监听80端口
server_name www.bcd.com; # 域名
location / {
root /home/doubi/html_2; # 站点2路径
index index.html;
}
}配置两个 server,端口都是 80 ,server_name 不同。
上面将两个 server 放在一个文件中了,也可以放在两个配置文件中。
4 重新加载nginx配置
shell
# 进入到nginx目录,重新加载nginx配置
./nginx -s reload
# 如果不行,可以重启nginx服务
sudo systemctl restart nginx5 访问
这样就可以通过不同的域名,都是 80 端口来访问 Nginx 项目了。
通过 www.abc.com 访问 HTML1 。

通过 www.bcd.com 访问 HTML2 。

这种方式是比较常用的,在一个 Nginx 服务器上发布多个项目的方式。
一个 server 也可以配置多个域名,例如:
nginx
server_name abc.com www.abc.com;这样访问 abc.com 或 www.abc.com 都映射到这个站点。
6 注意点
上面配置了两个 server,如果将其中一个删掉,例如将 www.bcd.com 的站点2配置删掉,只保留站点1:
nginx
server {
listen 80; # 监听80端口
server_name www.abc.com; # 域名
location / {
root /home/doubi/html_1; # 站点1路径
index index.html;
}
}那么在访问 www.bcd.com 的时候,会访问到站点1。
如果有多个站点,会按照搜索顺序找到下一个相同端口的站点。
如果希望找不到指定站点,就访问到指定默认站点(不按照搜索顺序),可以在默认站点添加配置:
nginx
server {
listen 80 default_server; # 80端口默认站点
server_name www.abc.com;
location / {
root /home/doubi/html_1;
index index.html;
}
}这样其他 80 端口的站点找不到,就会访问该站点。