1. 程式人生 > >Nginx經驗總結(持續更新)

Nginx經驗總結(持續更新)

1. post方法請求靜態檔案

預設情況下,web伺服器都不允許post方法請求靜態檔案,會返回響應403 Not Allowed。但是有些時候確實有這種需求。可以通過配置檔案來改變這種設定:在需要處理靜態檔案的location裡這樣配置即可,
location /static/ {
    root /path/to/files/;
    error_page 405 =200 $uri;
}

2. Nginx預設一次只能傳送50個子請求(subrequest)

在nginx原始碼中,src/http/ngx_http_request.h檔案中:
#define NGX_HTTP_MAX_SUBREQUESTS        50
在使用Openresty時,可以向configure指令碼傳參置這個限制, ./configure --with-cc-opt="-D NGX_HTTP_MAX_SUBREQUESTS=250"

3. Nginx location匹配規則

匹配順序: a. 字串匹配,和location塊的順序無關,根據uri匹配所有的location,從而得到一個匹配度最大的location。 b. 正則匹配,按照location塊的順序從前向後,如果找到匹配的location,則直接由該location處理請求。如果所有的location都不匹配,則由在字串匹配中,匹配度最大的location處理。 匹配規則: = /uri/   ——字串精確匹配 ^~ /uri/ ——字串字首匹配 ~ /uri/   ——大小寫區分的正則匹配 ~* /uri/ ——大小寫不區分的正則匹配 @ /uri/ ——命名location,只用於內部重定向請求 其中,如果=和^~匹配成功之後會立即停止搜尋,即不再進行正則匹配。

4. 監控Nginx的狀態

需要HttpStubStatusModule模組,預設情況是不開啟的,所以需要編譯時,指定開啟這個模組。
./configure --with-http_stub_status_modules
nginx的配置:
location /nginx_status {
  # copied from http://blog.kovyrin.net/2006/04/29/monitoring-nginx-with-rrdtool/
  stub_status on;
  access_log   off;
  allow SOME.IP.ADD.RESS;
  deny all;
}
然後通過瀏覽器訪問localhost/nginx_status,瀏覽器顯示Nginx的狀態
Active connections: 291
server accepts handled requests
  16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106

5. Nginx啟用aio

預設Nginx是沒有開啟aio的,需要在配置編譯時,加上相應選項否則啟動Nginx會報錯unknown directive “aio”。
./configure --with-file-aio

6. 限制請求內容的大小

指令:client_max_body_size,用於設定這個值,預設是1m。context可以是http,server或者location。

7. 通過echo模組合併靜態檔案請求

正常html中包含多個js檔案或者css檔案,那麼瀏覽器需要多次http請求才能完成這些檔案的載入。比如html檔案:
<html>
<head>
    <script type='text/javascript' src='/static/a.js'></script>
    <script type='text/javascript' src='/static/b.js'></script>
    <script type='text/javascript' src='/static/c.js'></script>
……
</html>
那麼就需要3次請求。下面介紹echo模組實現請求合併。先修改html:
<html>
<head>
    <script type='text/javascript' src='/merge?/static/a.js&/static/b.js&/static/c.js'></script>
……
</html>
nginx配置檔案:
location /static/ {
    root /home/www/doc_root;
}

location /merge {
    default_type 'text/javascript';

    echo_foreach_split '&' $query_string;    # 將查詢字串以&分割
        echo_location_async $echo_it;        # 傳送子請求到$echo_it對應的location
        echo;
    echo_end;
}
通過這種方式可以有效減少客戶端請求,降低伺服器端的壓力。

8. nginx開啟gzip

gzip    on;    # 開啟gzip,預設關閉
gzip_comp_level    5;    # 壓縮級別,1-9,級別越高壓縮率越高,但是相應的耗cpu
gzip_min_length    1025;    # 當響應內容大小大於多少bytes後使用gzip
gzip_types    text/plain application/x-javascript application/json text/javascript text/css    # 對於什麼型別的內容使用gzip