高性能 WEB 服务器 Nginx:多虚拟主机实现!
Nginx 配置多虚拟主机实现
多虚拟主机是指在一台 Nginx 服务器上配置多个网站
在 Nginx 中,多虚拟主机有三种实现方式:
-
基于IP地址实现多虚拟主机
-
基于端口号实现多虚拟主机
-
基于域名实现多虚拟主机
1 基于域名实现多虚拟主机
在 Nginx 中配置多个 server 段,每个 server 中设置一个虚拟主机配置,客户端访问服务器时,会根据客户端请求头中的 Host 字段值来匹配 server 段中的配置,从而访问不同的网站
[root@ubuntu ~]# cd /etc/nginx/sites-enabled/
#设置两个域名配置文件
[root@ubuntu sites-enabled]# cat www.m99-josedu.com
server {
listen 80;
server_name www.m99-josedu.com;
root /var/www/html/www.m99-josedu.com;
}
[root@ubuntu sites-enabled]# cat www.m99-josedu.net
server {
listen 80;
server_name www.m99-josedu.net;
root /var/www/html/www.m99-josedu.net;
}
#修改默认页面,创建网站目录和首页
[root@ubuntu ~]# mv /var/www/html/index.nginx-debian.html /tmp/
[root@ubuntu ~]# echo "welcome to nginx" > /var/www/html/index.html
[root@ubuntu ~]# mkdir /var/www/html/www.m99-josedu.{com,net}
[root@ubuntu ~]# echo "this page from com" > /var/www/html/www.m99-josedu.com/index.html
[root@ubuntu ~]# echo "this page from net" > /var/www/html/www.m99-josedu.net/index.html
[root@ubuntu ~]# tree /var/www/html/
/var/www/html/
├── index.html
├── www.m99-josedu.com
│ └── index.html
└── www.m99-josedu.net
└── index.html
2 directories, 3 files
#测试配置文件并重新加载服务
[root@ubuntu ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@ubuntu ~]# systemctl reload nginx.service
#客户端配置域名解析并测试
[root@ubuntu ~]# cat /etc/hosts
10.0.0.206 www.m99-josedu.com www.m99-josedu.net
[root@ubuntu ~]# curl www.m99-josedu.com
this page from com
[root@ubuntu ~]# curl www.m99-josedu.net
this page from net
1.1 设置虚拟主机的默认主页
#当前没有设置 index,使用默认index配置
[root@ubuntu ~]# cat /etc/nginx/sites-enabled/www.m99-josedu.com
server {
listen 80;
server_name www.m99-josedu.com;
root /var/www/html/www.m99-josedu.com;
}
[root@ubuntu ~]# ls -l /var/www/html/www.m99-josedu.com/
total 12
-rw-r--r-- 1 root root 4 Jan 23 17:49 a.txt
-rw-r--r-- 1 root root 8 Jan 23 17:49 default.htm
-rw-r--r-- 1 root root 19 Jan 23 09:05 index.html
#测试,默认 index.html 生效
[root@ubuntu ~]# curl www.m99-josedu.com
this page from com
#修改配置
[root@ubuntu ~]# cat /etc/nginx/sites-enabled/www.m99-josedu.com
server {
listen 80;
index index.html default.htm a.txt;
server_name www.m99-josedu.com;
root /var/www/html/www.m99-josedu.com;
}
#重载生效
[root@ubuntu ~]# systemctl reload nginx.service
#客户端测试 默认页面是 index.html
[root@ubuntu ~]# curl www.m99-josedu.com
this page from com
#服务器上删除 index.html
[root@ubuntu ~]# rm -f /var/www/html/www.m99-josedu.com/index.html
[root@ubuntu ~]# ls /var/www/html/www.m99-josedu.com/
a.txt default.htm
#客户端测试 默认页面是 default.htm
[root@ubuntu ~]# curl www.m99-josedu.com
default
#服务器上删除 default.htm
[root@ubuntu ~]# rm -f /var/www/html/www.m99-josedu.com/default.htm
[root@ubuntu ~]# ls /var/www/html/www.m99-josedu.com/
a.txt
#客户端测试 默认页面是 a.txt
[root@ubuntu ~]# curl www.m99-josedu.com
aaa
#服务器上删除 a.txt
[root@ubuntu ~]# rm -f /var/www/html/www.m99-josedu.com/a.txt
[root@ubuntu ~]# ls /var/www/html/www.m99-josedu.com/
#客户端测试 报错
[root@ubuntu ~]# curl www.m99-josedu.com
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>
1.2 设置服务器的默认虚拟主机
用 http 协议访问服务器IP或没有在服务器上配置的域名时,会被默认虚拟主机命中
#此时如果客户端直接访问服务器IP地址,能访问到默认页面
[root@ubuntu ~]# curl http://10.0.0.206
welcome to nginx
#在主配置文件 /etc/nginx.conf 中,包含了虚拟主机配置文件
[root@ubuntu ~]# cat /etc/nginx/nginx.conf
include /etc/nginx/sites-enabled/*;
#查看当前的虚拟主机配置
[root@ubuntu ~]# ls -lh /etc/nginx/sites-enabled/
total 8.0K
lrwxrwxrwx 1 root root 34 Jan 21 00:36 default -> /etc/nginx/sitesavailable/default
-rw-r--r-- 1 root root 100 Jan 23 09:04 www.m99-josedu.com
-rw-r--r-- 1 root root 100 Jan 23 09:06 www.m99-josedu.net
#查看默认配置
[root@ubuntu ~]# cat /etc/nginx/sites-enabled/default | grep -Ev "#|^$"
server {
listen 80 default_server; #default_server 表示默认虚拟主机配置
listen [::]:80 default_server; #default_server 表示默认虚拟主机配置
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
#客户端增加 abc.m99-josedu.org def.m99-josedu.org 的解析
#但服务端没有该域名的配置
[root@ubuntu ~]# cat /etc/hosts
10.0.0.206 www.m99-josedu.com www.m99-josedu.net abc.m99-josedu.org def.m99-josedu.org
#测试,被服务端兜底的配置命中
[root@ubuntu ~]# curl abc.m99-josedu.org
welcome to nginx
[root@ubuntu ~]# curl def.m99-josedu.org
welcome to nginx
#修改服务端配置,新增域名解析
[root@ubuntu ~]# cat /etc/nginx/sites-enabled/abc.m99-josedu.org
server {
listen 80;
server_name abc.m99-josedu.org;
root /var/www/html/abc.m99-josedu.org;
}
[root@ubuntu ~]# mkdir /var/www/html/abc.m99-josedu.org
[root@ubuntu ~]# echo "this page from abc.m99-josedu.org" > /var/www/html/abc.m99-josedu.org/index.html
[root@ubuntu ~]# systemctl reload nginx.service
#客户端测试-命中域名配置
[root@ubuntu ~]# curl abc.m99-josedu.org
this page from abc.m99-josedu.org
#客户端测试-命中默认配置
[root@ubuntu ~]# curl def.m99-josedu.org
welcome to nginx
#去掉默认配置中的 default_server
[root@ubuntu ~]# cat /etc/nginx/sites-enabled/default
server {
#listen 80 default_server;
#listen [::]:80 default_server;
listen 80;
......
#重载服务并测试
[root@ubuntu ~]# systemctl reload nginx.service
[root@ubuntu ~]# curl abc.m99-josedu.org
this page from abc.m99-josedu.org
#此处被 abc 的配置命中
[root@ubuntu ~]# curl def.m99-josedu.org
this page from abc.m99-josedu.org
#IP也被 abc 配置命中
[root@ubuntu ~]# curl http://10.0.0.206
this page from abc.m99-josedu.org
#在没有定义 default_server 的情况下,默认会被第一个配置文件命中
#主配置文件中会按此顺序引用文件
[root@ubuntu ~]# ls /etc/nginx/sites-enabled/
abc.m99-josedu.org default www.m99-josedu.com www.m99-josedu.net
[root@ubuntu ~]# ls -l /etc/nginx/sites-enabled/
total 12
-rw-r--r-- 1 root root 100 Jan 23 10:03 abc.m99-josedu.org
lrwxrwxrwx 1 root root 34 Jan 21 00:36 default -> /etc/nginx/sitesavailable/default
-rw-r--r-- 1 root root 100 Jan 23 09:50 www.m99-josedu.com
-rw-r--r-- 1 root root 100 Jan 23 09:06 www.m99-josedu.net
#修改文件名
[root@ubuntu ~]# mv /etc/nginx/sites-enabled/{www.m99-josedu.com,aaa.m99-josedu.com}
#重载服务
[root@ubuntu ~]# systemctl reload nginx.service
[root@ubuntu ~]# ls /etc/nginx/sites-enabled/
aaa.m99-josedu.com abc.m99-josedu.org default www.m99-josedu.net
#再次测试,默认被最先引用的配置文件命中
[root@ubuntu ~]# curl def.m99-josedu.org
this page from com
[root@ubuntu ~]# curl http://10.0.0.206
this page from com
#改回文件名,并设置 default_server
[root@ubuntu ~]# mv /etc/nginx/sites-enabled/{aaa.m99-josedu.com,www.m99-josedu.com}
[root@ubuntu ~]# ls /etc/nginx/sites-enabled/
abc.m99-josedu.org default www.m99-josedu.com www.m99-josedu.net
#www.m99-josedu.net 文件在引用时被放在最后,但设置了 default_server
[root@ubuntu ~]# cat /etc/nginx/sites-enabled/www.m99-josedu.net
server {
listen 80 default_server;
server_name www.m99-josedu.net;
root /var/www/html/www.m99-josedu.net;
}
[root@ubuntu ~]# systemctl reload nginx.service
#客户端测试
[root@ubuntu ~]# curl http://10.0.0.206
this page from net
[root@ubuntu ~]# curl def.m99-josedu.org
this page from net
2 基于IP地址实现多虚拟主机
#添加IP
[root@ubuntu ~]# ip a a 10.0.0.216/24 dev ens33
[root@ubuntu ~]# ip a a 10.0.0.226/24 dev ens33
[root@ubuntu ~]# ip a a 10.0.0.236/24 dev ens33
[root@ubuntu ~]# ip a s ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:11:98:d9 brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 10.0.0.206/24 metric 100 brd 10.0.0.255 scope global dynamic ens33
valid_lft 1118sec preferred_lft 1118sec
inet 10.0.0.216/24 scope global secondary ens33
valid_lft forever preferred_lft forever
inet 10.0.0.226/24 scope global secondary ens33
valid_lft forever preferred_lft forever
inet 10.0.0.236/24 scope global secondary ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe11:98d9/64 scope link
valid_lft forever preferred_lft forever
#恢复 default_server ,为域名绑定不同的IP
[root@ubuntu ~]# cat /etc/nginx/sites-enabled/abc.m99-josedu.org
server {
listen 10.0.0.206:80;
listen 10.0.0.216:80;
server_name abc.m99-josedu.org;
root /var/www/html/abc.m99-josedu.org;
}
[root@ubuntu ~]# cat /etc/nginx/sites-enabled/www.m99-josedu.com
server {
listen 10.0.0.226:80;
server_name www.m99-josedu.com;
root /var/www/html/www.m99-josedu.com;
}
[root@ubuntu ~]# ls /etc/nginx/sites-enabled/
abc.m99-josedu.org default www.m99-josedu.com www.m99-josedu.net
[root@ubuntu ~]# systemctl reload nginx
#客户端修改hosts 文件并测试
[root@ubuntu ~]# cat /etc/hosts
10.0.0.206 www.m99-josedu.net
10.0.0.216 abc.m99-josedu.org
10.0.0.226 www.m99-josedu.com
[root@ubuntu ~]# curl www.m99-josedu.com
this page from com
[root@ubuntu ~]# curl abc.m99-josedu.org
this page from abc.m99-josedu.org
[root@ubuntu ~]# curl www.m99-josedu.com
this page from com
[root@ubuntu ~]# curl 10.0.0.206
this page from abc.m99-josedu.org
[root@ubuntu ~]# curl 10.0.0.216
this page from abc.m99-josedu.org
[root@ubuntu ~]# curl 10.0.0.226
this page from com
[root@ubuntu ~]# curl 10.0.0.236
welcome to nginx
3 基于端口号实现多虚拟主机
#服务器上所有IP 的81,82端口都会被此规则匹配
[root@ubuntu ~]# cat /etc/nginx/sites-enabled/abc.m99-josedu.org
server {
listen 81;
listen 82;
server_name abc.m99-josedu.org;
root /var/www/html/abc.m99-josedu.org;
}
#所有88端口的访问都会被此规则匹配
[root@ubuntu ~]# cat /etc/nginx/sites-enabled/www.m99-josedu.com
server {
listen 88;
server_name www.m99-josedu.com;
root /var/www/html/www.m99-josedu.com;
}
[root@ubuntu ~]# systemctl reload nginx.service
#客户端测试
[root@ubuntu ~]# curl 10.0.0.206
welcome to nginx
[root@ubuntu ~]# curl 10.0.0.206:81
this page from abc.m99-josedu.org
[root@ubuntu ~]# curl 10.0.0.206:82
this page from abc.m99-josedu.org
[root@ubuntu ~]# curl 10.0.0.206:88
this page from com
#用默认端口,被默认规则匹配
[root@ubuntu ~]# curl abc.m99-josedu.org
welcome to nginx
#指定域名和端口
[root@ubuntu ~]# curl abc.m99-josedu.org:81
this page from abc.m99-josedu.org
[root@ubuntu ~]# curl abc.m99-josedu.org:82
this page from abc.m99-josedu.org
#指定域名和端口,被服务器上默认 88 匹配
[root@ubuntu ~]# curl abc.m99-josedu.org:88
this page from com