# Nginx教程 - 4 多站点配置

虚拟主机 server 是可以配置多个的,我们可以在 nginx.conf 中进行配置。

这样我们可以使用 Nginx 发布多个项目。


# 4.1 多站点配置

首先再准备一个项目,我这里放在 /home/doubi/project8080 目录下,然后在目录下创建一个 index.html, 内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello</title>
</head>
<body>
Hello, 8080
</body>
</html>
1
2
3
4
5
6
7
8
9
10

然后修改 nginx.conf

配置了两个 server,一个监听 80 端口,一个监听 8080 端口。

# 这个是一开始的配置
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;		# 首页
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

检查 nginx 的配置,并重新加载 nginx 配置文件:

cd /usr/local/nginx/sbin
./nginx -t
./nginx -s reload
1
2
3

此时访问 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 下:

doubi@doubibiji-server:/usr/local/nginx$ ls     # 显示/usr/local/nginx
conf  html  nginx.pid  sbin
1
2

我们也在 conf 下新建一个 conf.d 的目录,并在其中新建两个配置文件,用来配置两个虚拟主机的 server

server80.conf 如下:

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;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

server8080.conf 如下:

server {
    listen       8080;  # 监听8080端口
    server_name  localhost;

    location / {
        root   /home/doubi/project8080;  # 配置站点路径
        index  index.html;		# 首页
    }
}
1
2
3
4
5
6
7
8
9

然后将 nginx.conf 中的虚拟主机 server 的配置删掉,在 http 模块下添加如下配置,引入 conf.d 下所有虚拟主机的配置文件:

http {
    # ....其他配置
  
    include /usr/local/nginx/conf/conf.d/*.conf;  # 包含虚拟主机配置文件
    
    # ....其他配置
}
1
2
3
4
5
6
7

重新加载 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 ,编辑内容如下:

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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

保存完成后运行如下命令,应用新的网络配置:

sudo netplan apply
1

使用如下命令可以查看网卡的多个IP:

ip addr show enp0s5
1

现在我的主机有了两个IP 192.168.0.108192.168.0.109 ,配置完成,可以 ping 试试。


如果是 CentOS,网络接口配置文件位于 /etc/sysconfig/network-scripts/ 目录中。文件名格式通常为 ifcfg-<interface>,例如 ifcfg-eth0

在文件末尾添加以下内容来配置第二个IP地址:

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
1
2
3
4
5
6
7
8

保存并关闭配置文件后,重启网络服务以应用新的配置:

sudo systemctl restart network
1

使用如下命令可以查看网卡的多个IP:

ip addr show enp0s5
1

配置完成,可以 ping 试试。

# 2 准备站点

分别准备了两个站点,位于 /home/doubi/htm1_1/home/doubi/htm1_2 ,并在其下创建了两个首页。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>HTML1</title>
</head>
<body>
你好,HTML1
</body>
</html>
1
2
3
4
5
6
7
8
9
10

另一个首页类似,改成 HTML2 。

# 3 修改配置文件

在 nginx.conf 配置文件中已经使用 include 引入 conf.d 目录下的文件了:

include /usr/local/nginx/conf/conf.d/*.conf;
1

所以在 conf.d 目录将其他的配置文件先删除(怕端口冲突),重新添加配置文件。

html_12.conf(名称随意)

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;		# 首页
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

上面将两个 server 放在一个文件中了,也可以放在两个配置文件中。

# 4 重新加载nginx配置

# 进入到nginx目录,重新加载nginx配置
./nginx -s reload

# 如果不行,可以重启nginx服务
sudo systemctl restart nginx
1
2
3
4
5

# 5 访问

这里一定要注意站点路径目录每个层级的访问权限,如果没有权限会出现403。

如果有问题,可以使用 nginx -V 命令查看一下日志目录,然后查看一下错误日志。

注意:多IP多站点的方式只能在局域网使用,公网没必要使用多个IP的方式,因为公网IP是收费的。

# 4.4 多域名多站点部署

如果想要在公网中,使用80端口访问同一台主机上的 Nginx 下的多个站点,可以使用多域名的方式,这是最常用的。

首先得有一个二级域名,例如 doubibiji.com 。然后创建两个三级域名,例如 abc.doubibiji.combcd.doubibiji.com ,将这两个三级域名都同时指向同一台主机。当然你也可以使用两个不同的二级域名。

当然,这里只是演示,所以我使用 www.abc.comwww.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.com
1
2

192.168.0.108 是我的 Nginx 主机的IP,这样访问上面两个域名就访问到 Nginx 主机的地址了。

如果有真的域名,就直接配置域名指向 Nginx 主机就可以了,这一步就不用了。

# 2 准备站点

和上面多IP多站点一样。

位于 /home/doubi/htm1_1/home/doubi/htm1_2 ,并在其下创建了两个首页。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>HTML1</title>
</head>
<body>
你好,HTML1
</body>
</html>
1
2
3
4
5
6
7
8
9
10

另一个首页类似,改成 HTML2 。

# 3 修改配置文件

conf.d 目录将其他的配置文件先删除(怕端口冲突),重新添加配置文件。

html_12.conf(名称随意)

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;		
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

配置两个 server,端口都是 80server_name 不同。

上面将两个 server 放在一个文件中了,也可以放在两个配置文件中。

# 4 重新加载nginx配置

# 进入到nginx目录,重新加载nginx配置
./nginx -s reload

# 如果不行,可以重启nginx服务
sudo systemctl restart nginx
1
2
3
4
5

# 5 访问

这样就可以通过不同的域名,都是 80 端口来访问 Nginx 项目了。

通过 www.abc.com 访问 HTML1

通过 www.bcd.com 访问 HTML2

这种方式是比较常用的,在一个 Nginx 服务器上发布多个项目的方式。

一个 server 也可以配置多个域名,例如:

server_name  abc.com www.abc.com;
1

这样访问 abc.comwww.abc.com 都映射到这个站点。

# 6 注意点

上面配置了两个 server,如果将其中一个删掉,例如将 www.bcd.com 的站点2配置删掉,只保留站点1:

server {
    listen       80;  # 监听80端口
    server_name  www.abc.com;  # 域名

    location / {
        root   /home/doubi/html_1;  # 站点1路径
        index  index.html;		
    }
}
1
2
3
4
5
6
7
8
9

那么在访问 www.bcd.com 的时候,会访问到站点1。

如果有多个站点,会按照搜索顺序找到下一个相同端口的站点。

如果希望找不到指定站点,就访问到指定默认站点(不按照搜索顺序),可以在默认站点添加配置:

server {
    listen       80 default_server;  # 80端口默认站点
    server_name  www.abc.com;  

    location / {
        root   /home/doubi/html_1;  
        index  index.html;		
    }
}
1
2
3
4
5
6
7
8
9

这样其他 80 端口的站点找不到,就会访问该站点。