首頁  >  文章  >  後端開發  >  高並發中nginx較優的配置方法介紹(程式碼分析)

高並發中nginx較優的配置方法介紹(程式碼分析)

不言
不言原創
2018-09-14 14:31:291757瀏覽

這篇文章帶給大家的內容是關於高並發中nginx較優的配置方法介紹(程式碼分析),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

一、這裡的最佳化主要是指nginx的配置最佳化,一般來說nginx設定檔中對最佳化比較有作用的主要有以下幾項:

nginx進程數,建議依照cpu數目來指定,一般跟cpu核數相同或為它的倍數。

worker_processes 8;

為每個進程分配cpu,上例中將8個進程分配到8個cpu,當然可以寫多個,或將一個進程分配到多個cpu。

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

下面這個指令是指當一個nginx進程打開的最多檔案描述符數目,理論值應該是系統的最多開啟檔案數(ulimit-n)與nginx進程數相除,但是nginx分配請求並不是那麼均勻,所以最好與ulimit -n的值保持一致。

worker_rlimit_nofile 65535;

使用epoll的I/O模型,用這個模型來高效處理非同步事件

use epoll;

每個進程允許的最多連接數,理論上每台nginx伺服器的最大連接數為worker_processes*worker_connections。

worker_connections 65535;

http連線逾時時間,預設是60s,功能是使客戶端到伺服器端的連線在設定的時間內持續有效,當出現對伺服器的後繼請求時,該功能避免了建立或重新建立連線。記得這個參數也不能設定過大!否則會導致許多無效的http連線佔據著nginx的連線數,終nginx崩潰!

keepalive_timeout 60;

客戶端請求頭部的緩衝區大小,這個可以根據你的系統分頁大小來設置,一般一個請求的頭部大小不會超過1k,不過由於一般系統分頁都要大於1k,所以這裡設定為分頁大小。分頁大小可以用指令getconf PAGESIZE取得。

client_header_buffer_size 4k;

下面這個參數將為開啟檔案指定緩存,預設是沒有啟用的,max指定快取數量,建議和開啟檔案數一致,inactive是指經過多久檔案沒被要求後刪除緩存。

open_file_cache max=102400 inactive=20s;

下面這個是指多久檢查一次快取的有效資訊。

open_file_cache_valid 30s;

open_file_cache指令中的inactive參數時間內檔案的最少使用次數,如果超過這個數字,檔案描述子一直是在快取中開啟的,如上例,如果有一個檔案在inactive時間內一次沒被使用,它將被移除。

open_file_cache_min_uses 1;

隱藏回應頭中的有關作業系統和web server(Nginx)版本號的信息,這樣對於安全性是有好處的。

server_tokens off;

可以讓sendfile()發揮作用。 sendfile()可以在磁碟和TCP socket之間互相拷貝資料(或任意兩個檔案描述符)。 Pre-sendfile是傳送資料之前在使用者空間申請資料緩衝區。之後用read()將資料從檔案拷貝到這個緩衝區,write()將緩衝區資料寫入網路。 sendfile()是立即將資料從磁碟讀到OS快取。因為這種拷貝是在內核完成的,sendfile()要比組合read()和write()以及打開關閉丟棄緩衝更加有效(更多有關於sendfile)。

sendfile on;

#告訴nginx在一個資料包裡發送所有頭文件,而不一個接一個的發送。就是說資料包不會馬上傳送出去,等到資料包最大時,一次性的傳輸出去,這樣有助於解決網路堵塞。

tcp_nopush on;

#告訴nginx不要緩存數據,而是一段一段的發送--當需要及時發送數據時,就應該給應用設置這個屬性,這樣發送一小塊數據信息時就不能立即得到返回值。

tcp_nodelay on;

例如:

http { 
server_tokens off; 
sendfile on; 
tcp_nopush on; 
tcp_nodelay on; 
......
}

客戶端請求頭部的緩衝區大小,這個可以根據系統分頁大小來設置,一般一個請求頭的大小不會超過1k,但由於一般系統分頁都要大於1k,所以這裡設定為分頁大小。

client_header_buffer_size 4k;

客戶端請求頭部的緩衝區大小,這個可以根據系統分頁大小來設置,一般一個請求頭的大小不會超過1k,但由於一般系統分頁都要大於1k,所以這裡設置為分頁大小。分頁大小可以用指令getconf PAGESIZE取得。

[root@test-huanqiu ~]# getconf PAGESIZE 
4096

但也有client_header_buffer_size超過4k的情況,但是client_header_buffer_size該值必須設定為「系統分頁大小」的整倍數。

為開啟檔案指定緩存,預設是沒有啟用的,max 指定快取數量,建議和開啟檔案數一致,inactive 是指經過多久檔案沒被要求後刪除快取。

open_file_cache max=65535 inactive=60s;

open_file_cache 指令中的inactive 參數時間內檔案的最少使用次數,如果超過這個數字,檔案描述子一直是在快取中開啟的,如上例,如果有一個檔案在inactive 時間內一次沒被使用,它將被移除。

open_file_cache_min_uses 1;

指定多久檢查一次快取的有效資訊。

open_file_cache_valid 80s;

下面是一個使用的簡單的nginx設定檔:

[root@dev-huanqiu ~]# cat /usr/local/nginx/conf/nginx.conf
user   www www;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;
error_log   /www/log/nginx_error.log   crit;
pid         /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 65535;
 
events
{
   use epoll;
   worker_connections 65535;
}
 
http
{
   include       mime.types;
   default_type   application/octet-stream;
 
   charset   utf-8;
 
   server_names_hash_bucket_size 128;
   client_header_buffer_size 2k;
   large_client_header_buffers 4 4k;
   client_max_body_size 8m;
 
   sendfile on;
   tcp_nopush     on;
 
   keepalive_timeout 60;
 
   fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2
                 keys_zone=TEST:10m
                 inactive=5m;
   fastcgi_connect_timeout 300;
   fastcgi_send_timeout 300;
   fastcgi_read_timeout 300;
   fastcgi_buffer_size 16k;
   fastcgi_buffers 16 16k;
   fastcgi_busy_buffers_size 16k;
   fastcgi_temp_file_write_size 16k;
   fastcgi_cache TEST;
   fastcgi_cache_valid 200 302 1h;
   fastcgi_cache_valid 301 1d;
   fastcgi_cache_valid any 1m;
   fastcgi_cache_min_uses 1;
   fastcgi_cache_use_stale error timeout invalid_header http_500; 
   open_file_cache max=204800 inactive=20s;
   open_file_cache_min_uses 1;
   open_file_cache_valid 30s; 
 
   tcp_nodelay on;
   
   gzip on;
   gzip_min_length   1k;
   gzip_buffers     4 16k;
   gzip_http_version 1.0;
   gzip_comp_level 2;
   gzip_types       text/plain application/x-javascript text/css application/xml;
   gzip_vary on;
 
   server
   {
     listen       8080;
     server_name   huan.wangshibo.com;
     index index.php index.htm;
     root   /www/html/;
 
     location /status
     {
         stub_status on;
     }
 
     location ~ .*\.(php|php5)?$
     {
         fastcgi_pass 127.0.0.1:9000;
         fastcgi_index index.php;
         include fcgi.conf;
     }
 
     location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
     {
       expires       30d;
     }
 
     log_format   access   '$remote_addr - $remote_user [$time_local] "$request" '
               '$status $body_bytes_sent "$http_referer" '
               '"$http_user_agent" $http_x_forwarded_for';
     access_log   /www/log/access.log   access;
       }
}

二、關於FastCGI的幾個指令

這個指令為FastCGI快取指定一個路徑,目錄結構等級,關鍵字區域儲存時間和非活動刪除時間。

fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;

指定連線到後端FastCGI的逾時時間。

fastcgi_connect_timeout 300;

向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。

fastcgi_send_timeout 300;

接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间。

fastcgi_read_timeout 300;

指定读取FastCGI应答第一部分 需要用多大的缓冲区,这里可以设置为fastcgi_buffers指令指定的缓冲区大小,上面的指令指定它将使用1个 16k的缓冲区去读取应答的第一部分,即应答头,其实这个应答头一般情况下都很小(不会超过1k),但是你如果在fastcgi_buffers指令中指 定了缓冲区的大小,那么它也会分配一个fastcgi_buffers指定的缓冲区大小去缓存。

fastcgi_buffer_size 16k;

指定本地需要用多少和多大的缓冲区来 缓冲FastCGI的应答,如上所示,如果一个php脚本所产生的页面大小为256k,则会为其分配16个16k的缓冲区来缓存,如果大于256k,增大 于256k的部分会缓存到fastcgi_temp指定的路径中, 当然这对服务器负载来说是不明智的方案,因为内存中处理数据速度要快于硬盘,通常这个值 的设置应该选择一个你的站点中的php脚本所产生的页面大小的中间值,比如你的站点大部分脚本所产生的页面大小为 256k就可以把这个值设置为16 16k,或者4 64k 或者64 4k,但很显然,后两种并不是好的设置方法,因为如果产生的页面只有32k,如果用4 64k它会分配1个64k的缓冲区去缓存,而如果使用64 4k它会分配8个4k的缓冲区去缓存,而如果使用16 16k则它会分配2个16k去缓存页面,这样看起来似乎更加合理。

fastcgi_buffers 16 16k;

这个指令我也不知道是做什么用,只知道默认值是fastcgi_buffers的两倍。

fastcgi_busy_buffers_size 32k;

在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍。

fastcgi_temp_file_write_size 32k;

开启FastCGI缓存并且为其制定一个名称。个人感觉开启缓存非常有用,可以有效降低CPU负载,并且防止502错误。但是这个缓存会引起很多问题,因为它缓存的是动态页面。具体使用还需根据自己的需求。

fastcgi_cache TEST

为指定的应答代码指定缓存时间,如上例中将200,302应答缓存一小时,301应答缓存1天,其他为1分钟。

fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;

缓存在fastcgi_cache_path指令inactive参数值时间内的最少使用次数,如上例,如果在5分钟内某文件1次也没有被使用,那么这个文件将被移除。

fastcgi_cache_min_uses 1;

不知道这个参数的作用,猜想应该是让nginx知道哪些类型的缓存是没用的。

fastcgi_cache_use_stale error timeout invalid_header http_500;

相关推荐:

nginx+keepalived配置高可用HTTP群集

高流量站点NGINX与PHP-fpm配置优化(译)

以上是高並發中nginx較優的配置方法介紹(程式碼分析)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn