1. 程式人生 > >Nginx系列--03HTTP段基本配置及虛擬主機

Nginx系列--03HTTP段基本配置及虛擬主機

HTTP段基本配置 Nginx虛擬主機配置

HTTP協議配置格式
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.conf
    http {
    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段基本配置及虛擬主機