天天看點

Nginx性能優化配置(三)

Nginx性能優化配置(三)

 本文主要介紹Nginx的性能優化配置,文章的層次架構如圖所示。

<a href="https://s5.51cto.com/wyfs02/M00/9C/DD/wKioL1l3BrnhFZZrAABlXj8TpmI714.png" target="_blank"></a>

1.Nginx的工作程序優化

 1.worker_processes

    作用:worker程序的數量;通常應該等于小于目前主機的cpu的實體核心數;auto表示根據CPU的實體核心數自動調整工作程序數。使用lscpu或或者cat /proc/cpuinfo | grep 'processor' | wc -l 可以檢視CPU的實體核心數。

    配置:worker_processes auto;

    配置段:main

 2.worker_cpu_affinity cpumask 

    作用:使用這個指令可以綁定到具體那顆CPU。如果你有4顆CPU,可以這麼配置

    配置:worker_processes    4;

        worker_cpu_affinity 0001 0010 0100 1000;

 3.worker_priority number;

    作用:指定worker程序的nice值,設定worker程序優先級;[-20,20] 

    配置: worker_priority 0;

 4.worker_rlimit_nofile number;

    作用:worker程序所能夠打開的檔案數量上限;

    配置:worker_rlimit_nofile 20960;

 5.accept_mutex

    作用:如果你有多個workers,那麼還要配置影響worker的相關指令。accept_mutex指令将使程序worker逐個接受新連接配接。預設為on,如果為off會導緻驚群現象,即每秒重複多次連接配接,産生過多的上下文切換,降低伺服器的性能。

    配置:accept_mutex on;

    配置段:events

 6.accept_mutex_delay

    作用:acceppet_mutex開啟時才有效,這表示隻有一個互斥的worker程序接受連接配接,其他的在延遲世間内輪流等待新的連接配接。

    配置: accept_mutex_delay 500ms;

 7.worker_connections

    作用:指明worker程序的最大連接配接數。

    配置:worker_connections 10240;

 8.multi_accept

    作用:worker程序是否同時接受連接配接所有新請求。預設為off,表示一次隻接受一個新的請求。

    配置:multi_accept off;

2.I/O優化

 1.Sendfile

    作用:資料直接在核心空間完成檔案描述符之間的複制而不經由應用層,這使得作業系統資源的使用率提高。

    配置:sendifile on;

    配置段:http,server和location代碼塊

 2.直接I/O(directio)

    作用:作業系統核心通常嘗試優化和緩存任何讀/寫請求,但是對于一些較大的資料或者說緩存命中率較差的資料,我們卻不期望緩存在高速緩存中,我們應該按需加載。直接I/O就提供這麼一個功能,它讓應用資料直接從磁盤中進行I/O請求。這樣一來能夠更好地利用CPU周期和提高緩存命中率。

    配置:directio 4m;#任何大于4m的檔案将由直接I/O加載。

      directio_alignment 512; #設定資料傳輸的塊大小。

 3.異步I/O(aio)

    作用:異步I/O允許程序進行不受阻塞或者不需要等待I/O完成的I/O操作。

    配置:aio off;#按需配置,在linux上需要啟動direction

3.TCP優化

 http使用tcp傳輸資料,資料以tcp分組的形式傳遞。Nginx提供了改變底層TCP棧行為的指令,這些屬性能夠更改單個套接字連接配接的屬性。

 1.TCP_NODELAY

    作用:TCP/IP傳輸時存在大量的小包問題。啟用這個指令表示在keepalived模式中不緩存,不延遲小檔案而把小檔案快速發出去。

    配置: tcp_nodelay on;

 2.TCP_CORK

    作用:它不把小檔案發出去,而是打包發出去。

    配置:tcp_nopush off;

4.buffer優化

在接受請求時,nginx提供可可以将請求資料寫入請求緩存區的功能。這些緩存區的資料可以作為Nginx的變量使用。緩存區大小與請求的資料大小相比,若小于請求的資料,則将資料寫入磁盤檔案中。

 1.client_body_buffer_size

    作用:此指令設定請求主體的緩沖區大小。 如果主體超過緩沖區大小,則完整主體或其一部分将寫入臨時檔案。

    配置:client_body_buffer_size 16k;

 2.client_max_body_size

    作用:此指令設定NGINX能處理的最大請求主體大小。 如果請求大于指定的大小,則NGINX發回HTTP 413(Request Entity too large)錯誤。

    配置: client_max_body_size 2m;

 3.client_body_in_file_only

    作用:此指令禁用NGINX緩沖區并将請求體存儲在臨時檔案中。

    配置:client_body_in_file_only off;

 4.client_body_in_single_buffer

    作用:該指令設定NGINX将完整的請求主體存儲在單個緩沖區中。預設off,啟用能夠優化讀取$request_body變量涉及的I/O操作。

    配置:client_body_in_single_buffer off;

 5.client_header_buffer_size

    作用:它為請求頭配置設定一個緩沖區。 如果請求頭大小大于指定的緩沖區,則使用large_client_header_buffers指令配置設定更大的緩沖區。

    配置:client_header_buffer_size 1m;

    配置段:http, server

 6.large_client_header_buffers

    作用:此指令規定了用于讀取大型用戶端請求頭的緩沖區的最大數量和大小。當在預設的緩存區不足時按需配置設定,如果請求轉入長連接配接則釋放緩存區。

    配置: large_client_header_buffers 4 8k;

5.靜态内容緩存優化

 使用open_file_cache進一步提高性能, NGINX緩存将最近使用的檔案描述符和相關中繼資料(如修改時間,大小等)存儲在緩存中。 緩存不會存儲所請求檔案的内容。

 1.open_file_cache

    作用:緩存檔案描述符的中繼資料,如大小,修改時間,權限等等。緩存清理使用LRU算法。

    配置:open_file_cache max=1000 inactive=20s;

 2.open_file_cache_valid

    作用:檢驗緩存中元素有效性的頻率;預設為60s。

    配置:open_file_cache_valid 30s;

 3.open_file_cache_min_uses

    作用:NGINX将在非活動時間段之後從高速緩存中清除元素。在非活動時長通路的次數超過了指定次數,則不淘汰;否則淘汰。

    配置:open_file_cache_min_uses 4;

 4.open_file_cache_errors

    作用:NGINX可以緩存在檔案通路期間發生的錯誤。

    配置: open_file_cache_errors off;

6.FastCGI緩存優化

 1.啟用緩存fastcgi_cache_path

    作用:定義fastcgi的緩存;緩存位置為磁盤上的檔案系統,由path所指定路徑來定義。levels=levels:指定緩存目錄的層級數量,以及每一級的目錄數量。keys_zone=name:size,指定k/v映射的記憶體空間的名稱及大小。inactive=time,指定非活動時長。max_size=size,磁盤上用于緩存資料的緩存空間上限。

    配置:fastcgi_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;

      fastcgi_cache_key $request_method://$host$request_uri;

 2.fastcgi_cache 

    作用:調用指定的緩存空間來緩存資料

    配置:fastcgi_cache off;

    配置段;http,server和location代碼塊

 3.fastcgi_cache_key string;

    作用:定義緩存項的key的字元串。

    配置:fastcgi_cache_key localhost:9000$request_uri;

 4.fastcgi_cache_methods

    作用:為哪些請求方法使用緩存。

    配置:fastcgi_cache_methods GET HEAD;

 5.fastcgi_cache_min_uses 

    作用:緩存空間中的緩存項在非活動時間内至少要被通路到此處所指定的次數方可被認作活動項;

    配置:fastcgi_cache_min_uses 4;

 6.fastcgi_cache_valid

    作用:指定緩存的響應碼和各自的緩存時長。

    配置:fastcgi_cache_valid 200 302 10m;

 7.fastcgi_keep_conn

    作用:指定FastCGI服務是否開啟長連接配接。預設為off。

    配置:fastcgi_keep_conn off;

 8.FastCGI緩存示例

 示例:

<code>http {</code>

<code>    </code><code>...</code>

<code>    </code><code>fastcgi_cache_path </code><code>/var/cache/nginx/fastcgi_cache</code> <code>levels=1:2:1 keys_zone=fcgi:20m inactive=120s;</code>

<code>    </code><code>server {</code>

<code>        </code><code>location ~* \.php$ {</code>

<code>            </code><code>fastcgi_cache fcgi;</code>

<code>            </code><code>fastcgi_cache_key $request_uri;</code>

<code>            </code><code>fastcgi_cache_valid 200 302 10m;</code>

<code>            </code><code>fastcgi_cache_valid 301 1h;</code>

<code>            </code><code>fastcgi_cache_valid any 1m;</code>

<code>        </code><code>}</code>

<code>    </code><code>}</code>

<code>}</code>

7.proxy緩存優化

 1.proxy_pass

    作用:指明代理的路徑

    配置:proxy_pass http://localhost:8000/uri/;

    配置段:location, if in location, limit_except

 2. proxy_set_header

    作用:設定發往後端主機的請求封包的請求首部的值。

    配置:proxy_set_header        X-Forwarded-For         $proxy_add_x_forwarded_for;

 3.proxy_cache_path

    作用:設定緩存的路徑以及其他的相關屬性

    配置:proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;

    配置段:http

 4. proxy_cache

    作用:調用的緩存的名稱,或禁用緩存;

    配置:proxy_cache off;

 5.proxy_cache_key

    作用:緩存條目的鍵

    配置:proxy_cache_key "$host$request_uri $cookie_user";

 6. proxy_cache_valid

    作用:定義各類響應碼的緩存時長;

    配置:proxy_cache_valid 200 302 10m;

8.memcached緩存優化

 Memcache是一個通用的記憶體緩存系統,通常用于web加速。nginx提供許多memcached的指令,進而使得可以直接通路memcached提供的内容,避免對上遊伺服器的影響。

$memcached_key變量,用于執行高速緩存查找。如果要使用Memcached進行查找操作,必須給$memcached_key設定一個值,該值根據URL确定。

 1.memcached_pass

    作用:此指令用于指定memcached伺服器的位置。可以使用三種方式指定:(1)域名或IP,以及可選端口(2)unix套接字(3)upstream建立的一組伺服器

     配置:set $memached_key $uri;

        memcached_pass localhost:11211;

     配置段:location, if in location

 2.memcached_connect_timeout 

    作用:指定連接配接逾時時長

    配置:memcached_connect_timeout 30s;

     配置段:http,server和location代碼塊

 3.memcached_ send_timeout

    作用:指定請求寫入memcached伺服器的逾時時長

     配置:.memcached_ send_timeout 30s;

 4.memcached_read_timeout

     作用:指定從memcached伺服器讀取響應的逾時逾時。

     配置:memcached_read_timeout 30s;

     配置段;http,server和location代碼塊

 5.memcached_bind

     作用:将伺服器的IP與memcached伺服器綁定。預設為關閉,但會自動為伺服器自動選擇一台伺服器的IP連接配接memcached。

<code> </code><code>示例:</code>

<code>   </code><code>server{</code>

<code>       </code><code>location </code><code>/python/css/</code> <code>{</code>

<code>           </code><code>alias</code> <code>"/code/location/css/"</code><code>;</code>

<code>       </code><code>}</code>

<code>       </code><code>location </code><code>/python/</code> <code>{</code>

<code>           </code><code>set</code> <code>$memcached_key </code><code>"$request_method$request_uri"</code><code>;</code>

<code>           </code><code>charset utf-8;</code>

<code>           </code><code>memcached_pass 127.0.0.1:11211;</code>

<code>           </code><code>error_page 404 502 504 = @pythonfallback;</code>

<code>           </code><code>default_type text</code><code>/html</code><code>;</code>

<code>       </code><code>location @pythonfallback {</code>

<code>           </code><code>rewrite ^</code><code>/python/</code><code>(.*) /$1 </code><code>break</code><code>;</code>

<code>     </code> 

<code>           </code><code>proxy_pass http:</code><code>//127</code><code>.0.0.1:5000;</code>

<code>           </code><code>proxy_set_header X-Cache-Key </code><code>"$request_method$request_uri"</code><code>;</code>

<code>       </code><code># Rest NGINX configuration omitted for brevity</code>

本文轉自 PowerMichael 51CTO部落格,原文連結:http://blog.51cto.com/huwho/1950880,如需轉載請自行聯系原作者