Nginx系列--03HTTP段基本配置及虛擬主機
http {
...
...:各server的公共配置
server {
...
}:每個server用於定義一個虛擬主機;
server {
...
server_name
root
alias
location [OPERATOR] URL {
...
if CONDITION {
...
}
}
}
}
不同於HTTPD有一個默認的主機,Nginx必須使用server指令定義一個虛擬主機。
HTTP協議配置
所有的配置如果不加說明的話,都是配置在/etc/nginx/nginx.conf中
1.套接字相關配置
(1)server { ... }
- 作用:配置一個虛擬主機
- 示例:
server { listen address[:port] | port; server_name SERVER_NAME; root /PATH/TO/DOCUMENT_ROOT; }
(2)listen
語法:
listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
只能放在server配置段中
解釋:
- PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE:指明監聽的地址和端口的方式,如果ip不指明則默認為本機所有ip,如果端口不指明則為80端口。若兩則都省略則監聽在本機所有ip的80端口上。
unix:/PATH/TO/SOCKET_FILE:表明通過socket文件進行通行,那就只能用於本機通信。 - default_server:指明默認處理請求的虛擬主機,在多個虛擬主機監聽了同樣的ip和port時,指明默認處理請求的虛擬主機。
- [ssl] [http2 | spdy] :指明客戶端請求資源時使用的協議。
- [backlog=number]:監聽套接字在處理請求時,如果處理不來,則將來不及處理的請求放入後援隊列。backlog指明後援隊列的大小。
- [rcvbuf=size]:監聽套接字接受緩沖區大小。
- [sndbuf=size]:監聽套接字發送緩沖區大小。
配置示例:
listen 80 default_server
listen 127.0.0.1:80 ssl backlog=512
(3)root
語法:
root PATH
上下文:
http、 server、 location、if in location
放置在不同的上下文中意味著生效範圍的不同。
解釋:
指明用戶訪問資源時對應於主機根目錄。
示例:
root /var/www/vhost;
如果用戶訪問的URL為http://192.168.239.131/index.html ,將會獲取主機上/var/www/vhost/index.html資源。也就是說URL中/index.html的/代表主機上的/var/www/vhost路徑。root指明的路徑如果不存在,語法檢測時並不報錯。如果多個上下文中有root配置,範圍小的生效。
(4)server_name
指明虛擬主機的主機名稱;可以指明多個,用空白字符分割
支持通配任意長度的任意字符;server_name .baidu.com www.baidu. 。基於
支持~起始的字符做正則表達式模式匹配;server_name ~^www\d+.baidu.com$
匹配機制:首先是精確匹配,再是左側匹配,再是右側*匹配,最後是正則表達式。
虛擬主機配置示例
-
基於IP的虛擬主機
node1節點有兩個IP,192.168.239.131和192.168.239.132。不同的IP監聽在相同的端口上,構成基於IP的虛擬主機
配置文件為:http { server { listen 192.168.239.131:80 ; server_name node1; root /var/www/vhost/131; } server { listen 192.168.239.132:80 ; server_name node1; root /var/www/vhost/132; } }
~]# mkdir /var/www/vhost/{131,132} -pv
~]# echo "131 virtual host" > /var/www/vhost/131/index.html
~]# echo "132 virtual host" > /var/www/vhost/132/index.html
~]# nginx -t
~]# nginx -r reload - 基於端口的虛擬主機
不同的虛擬主機監聽在相同IP地址不同端口上
配置文件/etc/nginx/nginx.conf中http端配置http { server { listen 192.168.239.131:80; server_name node1; root /var/www/vhost/80; } server { listen 192.168.239.131:808; server_name node1; root /var/www/vhost/808; } }
- 基於IP和PORT的混合虛擬主機
虛擬主機監聽在不同IP和不同端口上
配置文件/etc/nginx/nginx.conf中http端配置http { server { listen 192.168.239.131:80; server_name node1; root /var/www/vhost/131_80; } server { listen 192.168.239.132:808; server_name node1; root /var/www/vhost/132_808; } }
- 基於FQDN的虛擬主機
虛擬主機監聽在相同的IP和端口上,不同的是用於訪問虛擬主機時域名的不同。Nginx會通過請求頭部中的Host的值確定交由那個虛擬主機處理請求。
配置文件配置/etc/nginx/nginx.confhttp { server { listen 192.168.239.131:80; server_name vhost1; root /var/www/vhost/vhost1; } server { listen 192.168.239.131:80; server_name vhost2; root /var/www/vhost/vhost2; } }
訪問結果
2.與路徑映射相關
(1)location
語法
location [ = | ~ | ~* | ^~ ] uri { ... }
解釋
用於實現從uri到文件系統的路徑映射;ngnix會根據用戶請求的URI來檢查定義的所有location,並找出一個最佳匹配,而後應用其配置;。在一個server中location可以有多個,並且location可以嵌套。但需要註意的是“=”進行精確匹配時嵌套,nginx -t進行語法檢測時會報錯。匹配URI的方式有如下幾種:
=:對URI進行精確匹配;精確匹配一旦匹配到,URI匹配機制就會關閉,起到了加速匹配的作用
location = / {
...此種配置只有http://192.168.239.131/ 能夠匹配到,而http://192.168.239.131/index.html 不能匹配到,不然怎麽稱之為精確匹配呢。
}
^~:對URI左半部分做匹配檢測,不區分大小寫。此匹配一旦匹配到就會終止匹配,不會進行正則表達式匹配。
~:正則表達式匹配,區分大小寫。
~*:正則表達式匹配,不區分大小寫。
不帶符號:匹配起始於此uri的所有URI。
既然有多種匹配方式,那就一定有優先級的問題。匹配優先級為:=,^~,~/~*,不帶符號;
優先級示例
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
若我們的訪問URI為“/”,將會匹配到配置A;若訪問URI為“/index.html”,將會匹配到配置B;若我們訪問的URI為“/document/index.html”,將匹配到配置C;若我們訪問的URI為“/images/1.jpg”,將會匹配到配置D;如果訪問URI為“/document/1.jpg”,將會匹配到配置E。
root和location同時配置示例
配置文件配置/etc/nginx/nginx.conf
server {
listen 80;
server_name node1;
location /admin/ {
root /var/www/vhost;
}
}
那麽請問,http://192.168.239.131/admin/ 會獲取主機/var/www/vhost/index.html文件,還是/var/www/vhost/admin/index.html?
從上圖結果可以看出,root指明的路徑等同於“/admin/”中左“/”,所以獲取主機資源路徑為“/var/www/vhost/admin/index.html”。root指明的路徑中右斜線可有可無,即/var/www/vhost和/var/www/vhost/都可。但需要註意的是location中/admin/和/admin是不同的。我們可以看如下示例:
http {
server {
listen 80;
server_name node1;
location /admin {
root /var/www/vhost/;
}
}
}
從上圖我們可以看到,用戶訪問URI為/admin,服務器返回一個301臨時重定向,重定向的URI為/admin/,然後瀏覽器會再次發起請求,請求的URI為/admin/。在反向代理情景中我們可能不需要此功能,那麽我們可以使用精確匹配
http {
server {
listen 80;
server_name node1;
location = /admin {
root /var/www/vhost/;
}
}
}
(2)alias
語法
alias path;
解釋
定義路徑別名,將制定的location替換成alias制定的路徑。只能放在location中,不能與root指令同用。
示例
http {
server {
listen 80;
server_name node1;
location /admin/ {
alias /alias/;
}
}
}
可以看到alias指明的路徑是相對於根文件系統的。
還需註意的是location中的路徑和alias的路徑右斜線要同時存在或不存在,否者資源會訪問不到。例如:
location /admin {
alias /alias/;
}
或
location /admin/ {
alias /alias;
}
都是錯誤的,不可取
(3)index
用法
index file ...;
解釋
用於指定默認訪問資源,可用在http,server,location中。當用於訪問的資源對應的路徑是目錄時,默認訪問此目錄的文件
示例
http {
server {
listen 80;
server_name node1;
location / {
root /var/www/vhost/;
index a.html;
}
}
}
(4)error_page
語法
error_page code ... [=[response]] uri;
解釋
對於特定的錯誤返回一個指定的uri。code對應特定的錯誤。=response,指明返回給用戶時的狀態碼。
示例1
我們將404錯誤定向百度頁面
http {
server {
listen 80;
server_name node1;
location / {
root /var/www/vhost/;
error_page 404 http://www.baidu.com;
}
}
}
示例2
在正常線上環境,我們都會有對應的錯誤頁面返回,並不會上上面那樣重定向到百度頁面。而在線上環境我們的配置往往是這樣
http {
server {
listen *:80;
server_name node1;
locastion / {
root /var/www/vhost/;
error_page 404 /404.html
}
location /404.html {
root /etc/nginx/error_pages/;
index 404.html;
}
}
}
訪問一個不存在的頁。
示例3--返回一個指定的響應碼
http {
server {
listen *:80;
server_name node1;
locastion / {
root /var/www/vhost/;
error_page 404 =200 /404.html
}
location /404.html {
root /etc/nginx/error_pages/;
index 404.html;
}
}
}
註意:示例1和示例2,3是不同,示例1是做了重定向,而示例2,3是nginx內部重新做了路徑映射。所以示例一種使用=reponse是達不到指定響應碼的效果。
參考
https://nginx.org/en/docs/http/ngx_http_core_module.html
Nginx系列--03HTTP段基本配置及虛擬主機