博客 / 詳情

返回

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內核以及原理部分有待研究。

user avatar helei112g 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.