nginx常用模塊歸納

目錄

NGINX功能詳解... 2

一、proxy_pass. 2

二、rewrite. 3

三、log_format. 4

四、ssl證書加密配置... 5

五、sendfile. 6

六、keepalive_timeout. 7

七、gzip. 7

八、客戶端上傳文件限制... 7

九、worker_processes和worker_connections. 8

十、stream模塊... 9

NGINX功能詳解

一、proxy_pass

 

nginx中配置proxy_pass代理轉發時,如果在proxy_pass後面的url加/,表示絕對根路徑;如果沒有/,表示相對路徑,把匹配的路徑部分也給代理走

假設下面四種情況分別用 http://192.168.1.1/proxy/test.html 進行訪問。

第一種

location /proxy/ {

    proxy_pass http://127.0.0.1/;

}

代理到URLhttp://127.0.0.1/test.html

第二種(相對於第一種,最後少一個 /

location /proxy/ {

    proxy_pass http://127.0.0.1;

}

代理到URLhttp://127.0.0.1/proxy/test.html

第三種:

location /proxy/ {

    proxy_pass http://127.0.0.1/aaa/;

}

代理到URLhttp://127.0.0.1/aaa/test.html

 

第四種(相對於第三種,最後少一個 /

location /proxy/ {

    proxy_pass http://127.0.0.1/aaa;

}

代理到URLhttp://127.0.0.1/aaatest.html

第五種 配合upstream模塊

如果一個域名可以解析到多個地址,那麼這些地址會被輪流使用,此外,還可以把一個地址指定爲 server group

upstream fasf.com {

          server 10.*.*.20:17007 max_fails=2 fail_timeout=15s;

          server 10.*.*.21:17007 max_fails=2 fail_timeout=15s down;

          ip_hash;

    }

server {

        listen       9000;

        server_name  fsf-NGINX-P01;

        location / {

                proxy_pass http://fasf.com;

                proxy_read_timeout 300;

                proxy_connect_timeout 90;

                proxy_send_timeout 300;

               proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;

        }  X_Forward_For字段表示該條http請求是有誰發起的?如果反向代理服務器不重寫該請求頭的話,那麼後端真實服務器在處理時會認爲所有的請求都來在反向代理服務器,如果後端有防攻擊策略的話,那麼機器就被封掉了(顯示真實訪問ip)

 

 

二、rewrite     

 

syntax: rewrite regex replacement [flag]

rewrite由ngx_http_rewrite_module標準模塊支持是實現URL重定向的重要指令,他根據regex(正則表達式)來匹配內容跳轉到replacement,結尾是flag標記

簡單的小例子:

1.rewrite ^/(.*) http://www.baidu.com/ permanent;     # 匹配成功後跳轉到百度,執行永久301跳轉

常用正則表達式regex

字符    描述

\       將後面接着的字符標記爲一個特殊字符或者一個原義字符或一個向後引用

^       匹配輸入字符串的起始位置

$       匹配輸入字符串的結束位置

*       匹配前面的字符零次或者多次

+       匹配前面字符串一次或者多次

?       匹配前面字符串的零次或者一次

.       匹配除“\n”之外的所有單個字符

(pattern)       匹配括號內的pattern

rewrite 最後一項flag參數:

標記符號        說明

last        本條規則匹配完成後繼續向下匹配新的location URI規則

break       本條規則匹配完成後終止,不在匹配任何規則

redirect        返回302臨時重定向

permanent       返回301永久重定向

在反向代理域名的使用,在tomcat中配置多個項目需要掛目錄的使用案例:

  server {

            listen 443;

            server_name FLS-Nginx-P01;

            ssl on;

            ssl_certificate   cert/214837463560686.pem;

            ssl_certificate_key  cert/214837463560686.key;

             

 

ssl_session_timeout 5m;

            ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

            ssl_prefer_server_ciphers on;

            location  = / {

              rewrite ^(.*)$ https://fls.***.com/fls/;

            }

            location / {

                proxy_redirect http https;

                proxy_set_header Host $host;

                proxy_set_header X-Real-IP $remote_addr;

                proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;

                proxy_pass http://10.0.3.4:8080;

             }

        }

公網域名解析fls.***.com

三、log_format

nginx服務器日誌相關指令主要有兩條:一條是log_format,用來設置日誌格式;另外一條是access_log,用來指定日誌文件的存放路徑、格式和緩存大小,可以參加ngx_http_log_module。一般在nginx的配置文件中日記配置(/usr/local/nginx/conf/nginx.conf)

log_format指令用來設置日誌的記錄格式,它的語法如下:

log_format name format {format ...}

其中name表示定義的格式名稱,format表示定義的格式樣式。

log_format有一個默認的、無須設置的combined日誌格式設置,相當於Apache的combined日誌格式,其具體參數如下:

log_format combined '$remote_addr-$remote_user [$time_local]'

‘"$request"$status $body_bytes_sent’

 ‘"$http_referer" "$http_user_agent"’

也可以自定義一份日誌的記錄格式,不過要注意,log_format指令設置的名稱在配置文件中是不能重複的。

 

四、ssl證書加密配置

 

upstream fasf.com {

        server 10.5.1.*:17007 max_fails=2 fail_timeout=15s;

        server 10.5.1.*:17007 max_fails=2 fail_timeout=15s down;

        ip_hash;      ----同一ip會被分配給固定的後端服務器,解決session問題

}

server {

      listen       443;

      server_name fsfs-pi-P01;

      ssl on;

      ssl_certificate   214820781820381.pem;    證書路徑:nginx.conf所在目錄

      ssl_certificate_key  214820781820381.key;

      ssl_session_timeout 5m;

      ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

      ssl_prefer_server_ciphers on;

      location / {

              proxy_pass http://fafs.com;

              proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;

      }

    }

五、sendfile

 

sendfile: 設置爲on表示啓動高效傳輸文件的模式。sendfile可以讓Nginx在傳輸文件時直接在磁盤和tcp socket之間傳輸數據。如果這個參數不開啓,會先在用戶空間(Nginx進程空間)申請一個buffer,用read函數把數據從磁盤讀到cache,再從cache讀取到用戶空間的buffer,再用write函數把數據從用戶空間的buffer寫入到內核的buffer,最後到tcp socket。開啓這個參數後可以讓數據不用經過用戶buffer。

 

六、keepalive_timeout

 

當上傳一個發數據文件時,nginx往往會超時,此時需要調整keepalive_timeout參數,保持會話長鏈接

七、gzip

如果你是個前端開發人員,你肯定知道線上環境要把js,css,圖片等壓縮,儘量減少文件的大小,提升響應速度,特別是對移動端,這個非常重要。

gzip使用環境:http,server,location,if(x),一般把它定義在nginx.conf的http{…..}之間

  • gzip on
    on爲啓用,off爲關閉
  • gzip_min_length 1k
    設置允許壓縮的頁面最小字節數,頁面字節數從header頭中的Content-Length中進行獲取。默認值是0,不管頁面多大都壓縮。建議設置成大於1k的字節數,小於1k可能會越壓越大。
  • gzip_buffers 4 16k
    獲取多少內存用於緩存壓縮結果,‘4 16k’表示以16k*4爲單位獲得
  • gzip_comp_level 5
    gzip壓縮比(1~9),越小壓縮效果越差,但是越大處理越慢,所以一般取中間值;
  • gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php
    對特定的MIME類型生效,其中'text/html’被系統強制啓用
  • gzip_http_version 1.1
    識別http協議的版本,早起瀏覽器可能不支持gzip自解壓,用戶會看到亂碼
  • gzip_vary on
    啓用應答頭"Vary: Accept-Encoding"
  • gzip_proxied off
    nginx做爲反向代理時啓用,off(關閉所有代理結果的數據的壓縮),expired(啓用壓縮,如果header頭中包括"Expires"頭信息),no-cache(啓用壓縮,header頭中包含"Cache-Control:no-cache"),no-store(啓用壓縮,header頭中包含"Cache-Control:no-store"),private(啓用壓縮,header頭中包含"Cache-Control:private"),no_last_modefied(啓用壓縮,header頭中不包含"Last-Modified"),no_etag(啓用壓縮,如果header頭中不包含"Etag"頭信息),auth(啓用壓縮,如果header頭中包含"Authorization"頭信息)
  • gzip_disable msie6
    (IE5.5和IE6 SP1使用msie6參數來禁止gzip壓縮 )指定哪些不需要gzip壓縮的瀏覽器(將和User-Agents進行匹配),依賴於PCRE庫

以上代碼可以插入到 http {...}整個服務器的配置裏,也可以插入到虛擬主機的 server {...}或者下面的location模塊內

 

八、客戶端上傳文件限制

client_body_buffer_size 15M;

請求緩衝區在NGINX請求處理中起着重要作用。 在接收到請求時,NGINX將其寫入這些緩衝區,此指令設置用於請求主體的緩衝區大小。 如果主體超過緩衝區大小,則完整主體或其一部分將寫入臨時文件。 如果NGINX配置爲使用文件而不是內存緩衝區,則該指令會被忽略。 默認情況下,該指令爲32位系統設置一個8k緩衝區,爲64位系統設置一個16k緩衝區

client_body_temp_path clientpath 3 2;

關於client_body_temp目錄的作用,簡單說就是如果客戶端POST一個比較大的文件,長度超過了nginx緩衝區的大小,需要把這個文件的部分或者全部內容暫存到client_body_temp目錄下的臨時文件

後面的level123是什麼意思?

因爲如果所有上傳的文件都放在一個文件夾下,不僅很容易文件名衝突,並且容易導致一個文件夾特別大。

所以有必要創建子目錄

這裏的level1,2,3如果有值就代表存在一級,二級,三級子目錄。

目錄名是由數字進行命名的,所以這裏的具體的值就是代表目錄名的數字位數

比如

client_body_temp_path  /spool/nginx/client_temp 3 2;
可能創建的文件路徑爲
/spool/nginx/client_temp/702/45/00000123457

 

client_max_body_size 30M;

此指令設置NGINX能處理的最大請求主體大小。 如果請求大於指定的大小,則NGINX發回HTTP 413(Request Entity too large)錯誤。 如果服務器處理大文件上傳,則該指令非常重要。

 

九、worker_processes和worker_connections

worker_processes:操作系統啓動多少個工作進程運行Nginx。注意是工作進程,不是有多少個nginx工程。在Nginx運行的時候,會啓動兩種進程,一種是主進程master process;一種是工作進程worker process。例如我在配置文件中將worker_processes設置爲4,啓動Nginx後,使用進程查看命令觀察名字叫做nginx的進程信息,我會看到如下結果:1個nginx主進程,master process;還有四個工作進程,worker process。主進程負責監控端口,協調工作進程的工作狀態,分配工作任務,工作進程負責進行任務處理。一般這個參數要和操作系統的CPU內核數成倍數。可以設置爲auto自動識別

worker_connections:這個屬性是指單個工作進程可以允許同時建立外部連接的數量。無論這個連接是外部主動建立的,還是內部建立的。這裏需要注意的是,一個工作進程建立一個連接後,進程將打開一個文件副本。所以這個數量還受操作系統設定的,進程最大可打開的文件數有關

十、stream模塊

nginx從1.9.0開始,新增加了一個stream模塊,用來實現四層協議的轉發、代理或者負載均衡等。這完全就是搶HAproxy份額的節奏,鑑於nginx在7層負載均衡和web service上的成功,和nginx良好的框架,stream模塊前景一片光明

stream模塊默認沒有編譯到nginx, 編譯nginx時候 ./configure –with-stream 即可

stream模塊用法和http模塊差不多,關鍵的是語法幾乎一致。熟悉http模塊配置語法的上手更快
以下是一個配置了tcp負載均衡和udp(dns)負載均衡的例子, 有 server,upstream塊,而且還有server,
hash, listen, proxy_pass等指令,如果不看最外層的stream關鍵字,還以爲是http模塊呢,下例是四層反代郵箱協議的例子,直寫了25端口,其他端口方法相同

stream {

    upstream smtp {

        least_conn;    ------把請求轉發給連接數較少的後端,能夠達到更好的負載均衡效果

        server 10.5.3.17:25 max_fails=2 fail_timeout=10s;

        }

    server {

        listen        25;

        proxy_pass    smtp;

        proxy_timeout 3s;

        proxy_connect_timeout 1s;

    }

 

 

 

 

 

 

 

 

 

                                                                                                                                                                               

 

 

 

 

 

 

 

 

 

 

 

 

 

                                                                                                                                                                    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章