Nginx常用配置解釋

Nginx已經廣泛應用於J-one和Jdos的環境部署上,本文對Nginx的常用的配置和基本功能進行講解,適合Nginx入門學習。

1 核心配置

找到Nginx安裝目錄下的conf目錄下nginx.conf文件,Nginx的基本功能配置是由它提供的。

Nginx的配置文件(conf/nginx.conf)整體上分為如下幾個部分: :

區域

職責

全局塊

配置和Nginx運行相關的全局配置

events塊

配置和網路連結相關的配置

http塊

配置代理、緩存、日誌記錄、虛擬主機等配置

server塊

配置虛擬主機的相關參數,一個http快中可以有多個server塊

location塊

配置請求的路由,以及各種頁面的處理情況

配置層級圖如下所示。

1.2 配置文件示例

一個比較全的配置文件示例如下。

# 以下是全局段配置

user administrator administrators; #配置用戶或者組,默認為nobody nobody。

worker_processes 2; #設置進程數,默認為1

pid /nginx/pid/nginx.pid; #指定nginx進程運行文件存放地址

error_log log/error.log debug; #制定日誌路徑,級別:debug|info|notice|warn|error|crit|alert|emerg
# events段配置資訊
events {
accept_mutex on; #設置網路連接序列化,防止驚群現象發生,默認為on
multi_accept on; #設置一個進程是否同時接受多個網路連接,默認為off

use epoll; #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport

worker\_connections  1024;    #最大連接數,默認為512

}
# http、配置請求資訊
http {
include mime.types; #文件擴展名與文件類型映射表
default_type application/octet-stream; #默認文件類型,默認為text/plain

access_log off; #取消服務日誌

log\_format myFormat '$remote\_addr–$remote\_user \[$time\_local\] $request $status $body\_bytes\_sent $http\_referer $http\_user\_agent $http\_x\_forwarded\_for'; #自定義格式
access\_log log/access.log myFormat;  #combined為日誌格式的默認值
sendfile on;   #允許sendfile方式傳輸文件,默認為off,可以在http塊,server塊,location塊。
sendfile\_max\_chunk 100k;  #每個進程每次調用傳輸數量不能大於設定的值,默認為0,即不設上限。
keepalive\_timeout 65;  #連接超時時間,默認為75s,可以在http,server,location塊。

upstream mysvr {   
  server 127.0.0.1:7878;
  server 192.168.10.121:3333 backup;  #熱備
}
error\_page 404 https://www.baidu.com; #錯誤頁
\# 第一個Server區塊開始,表示一個獨立的虛擬主機 網站
server {
    keepalive\_requests 120; #單連接請求上限次數。
    listen       4545;   #監聽埠
    server\_name  127.0.0.1;   #監聽地址       
    location  ~\*^.+$ {       #請求的url過濾,正則匹配,~為區分大小寫,~\*為不區分大小寫。
       #root path;  #根目錄
       #index vv.txt;  #設置默認頁
       proxy\_pass  http://mysvr;  #請求轉向mysvr 定義的 伺服器列表
       deny 127.0.0.1;  #拒絕的ip
       allow 172.18.5.54; #允許的ip           
    } 
}

}

1.3 locat路徑映射講解

1.3.1格式:

location [ = | ~ | ~ | !~ | !~ | @ ] uri {…}

1.3.2解釋:

\= 表示精確匹配,如果找到,立即停止搜索並立即處理此請求。

~ 表示執行一個正則匹配,區分大小寫匹配

~* 表示執行一個正則匹配,不區分大小寫匹配

!~ 區分大小寫不匹配

!~* 不區分大小寫不匹配

^~ 即表示只匹配普通字元(空格)。使用前綴匹配,^表示「非」,即不查詢正則表達式。如果匹配成功,則不再匹配其他location。

@ 指定一個命名的location,一般只用於內部重新導向請求。例如 error\_page, try\_files

uri 是待匹配的請求字元串,可以不包含正則表達式,也可以包含正則表達式;

1.3.3優先順序和示例:

  • [不加] < [~/~*] < [^~] < [=]
  • 示例如下:

location \= / {

精確匹配/,主機名後面不能帶任何字元串 /

# 只匹配http://abc.com
\# http://abc.com \[匹配成功\]
\# http://abc.com/index \[匹配失敗\]

}
location ^~ /img/ {

以 /img/ 開頭的請求,都會匹配上

#http://abc.com/img/a.jpg   \[成功\]
#http://abc.com/img/b.mp4  \[成功\]
}

location ~* /Example/ {
# 則會忽略 uri 部分的大小寫

http://abc.com/test/Example/ [匹配成功]

http://abc.com/example/ [匹配成功]

}
location /documents {
# 如果有正則表達式可以匹配,則優先匹配正則表達式。

http://abc.com/documentsabc [匹配成功]

}
location / {

http://abc.com/abc [匹配成功]

}

2 反向代理

2.1 反向代理概念:

反向代理(Reverse Proxy)是指以代理 伺服器來接受internet上的連接請求,然後將請求轉發給內部網路上的 伺服器,並將從 伺服器上得到的結果返回給internet上請求連接的客戶端。真實的 伺服器不能直接被外部網路訪問,所以需要一台代理 伺服器,而代理 伺服器能被外部網路訪問的同時又跟真實 伺服器在同一個網路環境,當然也可能是同一台 伺服器,埠不同而已。

反向代理通過proxy_pass指令來實現。

2.2 反向代理示例:

server {
listen 80;
server_name localhost;

location / {
     proxy\_pass http://localhost:8081;
     proxy\_set\_header Host $host:$server\_port;#為請求頭添加Host欄位,用於指定請求 伺服器的域名/IP地址和埠號。  

     \# 設置用戶ip地址
     proxy\_set\_header X-Forwarded-For $remote\_addr;#為請求頭添加XFF欄位,值為客戶端的IP地址。
     \# 當請求 伺服器出錯去尋找其他 伺服器
     proxy\_next\_upstream error timeout invalid\_header http\_500 http\_502 http\_503;

當我們訪問localhost的時候,ngnix就將我們的請求轉到 localhost:8081了

3 負載均衡

3.1 負載均衡概念:

當有2台或以上 伺服器時,代理 伺服器根據規則將請求分發到指定的 伺服器上處理。

3.2 負載均衡策略及示例:

Nginx目前支持多種負載均衡策略,這裡講解常用的6種。

3.2.1RR(round robin :輪詢 默認):

每個請求按時間順序逐一分配到不同的後端 伺服器,也就是說第一次請求分配到第一台 伺服器上,第二次請求分配到第二台 伺服器上,如果只有兩台 伺服器,第三次請求繼續分配到第一台上,這樣循環輪詢下去,也就是 伺服器接收請求的比例是 1:1, 如果後端 伺服器down掉,能自動剔除。輪詢是默認配置,不需要太多的配置

同一個項目分別使用8081和8082埠啟動項目

upstream web_servers {
server localhost:8081;
server localhost:8082;
}

server {
listen 80;
server_name localhost;

access_log logs/host.access.log main;

location / {
    proxy\_pass http://web\_servers;
    proxy\_set\_header Host $host:$server\_port;
}

3.2.2 熱備:

假設有2台 伺服器,當一台 伺服器發生事故時,才啟用第二台 伺服器給提供服務。 伺服器處理請求的順序:AAAAAA突然A掛了, 伺服器處理請求的順序:BBBBBBBBBBBBBB……

upstream web_servers {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #熱備
}

3.2.3 權重

跟據配置的權重的大小而分發給不同 伺服器不同數量的請求。如果不設置,則默認為1。下面 伺服器的請求順序為:ABBABBABBABBABB….。

upstream web_servers {
server localhost:8081 weight\=1;
server localhost:8082 weight\=2;
}

3.2.4 ip_hash

這樣每個ip地址固定訪問一個後端 伺服器,可以解決session的問題。

upstream test {
ip_hash;
server localhost:8080;
server localhost:8081;
}

3.2.5 fair(第三方)

按後端 伺服器的響應時間來分配請求,響應時間短的優先分配。這個配置是為了更快的給用戶響應。

upstream backend {
fair;
server localhost:8080;
server localhost:8081;
}

3.2.6 url_hash(第三方)

按訪問url的hash結果來分配請求,使每個url定向到同一個後端 伺服器,後端 伺服器為緩存時比較有效。在upstream中加入hash語句,hash_method是使用的hash演算法

upstream backend {
hash_method crc32;
hash $request_uri;
server localhost:8080;
server localhost:8081;
}

以上6種負載均衡各自適用不同情況下單獨或者混合使用,可以根據實際情況選擇使用,fair和url_hash需要安裝第三方模塊才能使用。

4 動靜分離:

4.1 動靜分離概念:

動靜分離是指在web 伺服器架構中,將靜態頁面與動態頁面或者靜態內容介面和動態內容介面分開不同系統訪問的架構設計方法,進而提升整個服務訪問性能和可維護性。

4.2 動靜分離示例:

upstream web_servers {
server localhost:8081;
server localhost:8082;
}
server {
listen 80;
server_name localhost;
set $doc_root /usr/local/var/www;

location ~\* \\.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
   root $doc\_root/img;
}
location / {
    proxy\_pass http://web\_servers;
    proxy\_set\_header Host $host:$server\_port;
}
error\_page 500 502 503 504  /50x.html;  #出現 500 502 503 504錯誤時走內部跳轉
location = /50x.html { 
    root $doc\_root;
}

}

結果:訪問http://localhost/test.jpg時直接返回/usr/local/var/www/img路徑下的圖片.

訪問http://localhost/index.html就會訪問後端 伺服器(tomcat等)

5 其他常用的指令:

5.1.return指令

返回http狀態碼和可選的第二個參數可以是重新導向的URL

return code [text];
return code URL;
return URL;
例如:
location / {
return 404; # 直接返回狀態碼
}
location / {
return 404 “pages not found”; # 返回狀態碼 + 一段文本
}
location / {
return 302 /bbs ; # 返回狀態碼 + 重新導向地址
}
location / {
return https://www.baidu.com ; # 返回重新導向地址
}

5.2 rewrite指令

重寫URI請求 rewrite,通過使用rewrite指令在請求處理期間多次修改請求URI,該指令具有一個可選參數和兩個必需參數。

第一個(必需)參數是請求URI必須匹配的正則表達式。

第二個參數是用於替換匹配URI的URI。

可選的第三個參數重寫策略

  • last 重寫后的 URL 發起新請求,再次進入 server 段,重試 location 的中的匹配;
  • break 直接使用重寫后的 URL ,不再匹配其它 location 中語句;
  • redirect 返回302臨時重新導向;
  • permanent 返回301永久重新導向;

location /users/ {
rewrite ^/users/(.*)$ /show?user=$1 break;
}

5.3 error_page指令

使用error\_page指令,您可以配置NGINX返回自定義頁面以及錯誤程式碼,替換響應中的其他錯誤程式碼,或將瀏覽器重新導向到其他URI。在以下示例中,error\_page指令指定要返回404頁面錯誤程式碼的頁面(/404.html)。

server{
    error\_page 500 502 503 504 /50x.html;
    location \=/50x.html{
        root html;
    }
}

5.4 日誌

訪問日誌:需要開啟壓縮 gzip on; 否則不生成日誌文件,打開log\_format、access\_log註釋

log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘“$http_user_agent” “$http_x_forwarded_for”’;

access_log /usr/local/etc/nginx/logs/host.access.log main;

gzip

5.5 deny 、allow指令

禁止訪問某個目錄

location / {
allow 192.168.0.0;
allow 127.0.0.1;
deny all;

這段配置值允許192.168.0./24網段和127.0.0.1的請求,其他來源IP全部拒絕。

}

5.6 內置變數

nginx的配置文件中可以使用的內置變數以美元符$開始。其中,大部分預定義的變數的值由客戶端發送攜帶。

  • $args :#這個變數等於請求行中的參數,同$query_string
  • $content_length :請求頭中的Content-length欄位。
  • $content_type :請求頭中的Content-Type欄位。
  • $document_root :當前請求在root指令中指定的值。
  • $host :請求行的主機名,為空則為請求頭欄位 Host 中的主機名,再為空則與請求匹配的server_name
  • $http\_user\_agent :客戶端agent資訊
  • $http_cookie :客戶端cookie資訊
  • $limit_rate :這個變數可以限制連接速率。
  • $request_method :客戶端請求的動作,通常為GET或POST。
  • $remote_addr :客戶端的IP地址。
  • $remote_port :客戶端的埠。
  • $remote_user :已經經過Auth Basic Module驗證的用戶名。
  • $request_filename :當前請求的文件路徑,由root或alias指令與URI請求生成。
  • $scheme :HTTP方法(如http,https)。
  • $server_protocol :請求使用的協議,通常是HTTP/1.0或HTTP/1.1。
  • $server_addr : 伺服器地址,在完成一次系統調用后可以確定這個值。
  • $server_name : 伺服器名稱。
  • $server_port :請求到達 伺服器的埠號。
  • $request_uri :包含請求參數的原始URI,不包含主機名,如:」/foo/bar.php?arg=baz」。
  • $uri :不帶請求參數的當前URI,$uri不包含主機名,如」/foo/bar.html」。
  • $document_uri :與$uri相同

6 總結

Ngnix是一款高性能反向代理 伺服器,學習它非常有必要,本文講解了Ngnix核心配置,介紹了反向代理,負載均衡,動靜分離三大功能,最後擴展了一些常用的指令。本文介紹了Ngnix的基礎用法,後續的Ngnix內核以及原理部分有待研究。