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