nginx基礎版本專案實戰包含最佳化(六)

紫翼龍王夜發表於2015-04-23
1、較小nginx編譯後的檔案大小:
在編譯nginx時,預設以debug模式執行,而在debug模式下回插入很多跟蹤和assert之類的資訊。編譯完成後,一個nginx要好幾M位元組。而在編譯前取消nginx的debug模式,編譯完成後nginx只有幾百個位元組。因此可以在編譯之前,修改相關原始碼,取消debug模式,具體的方法如下:
在nginx原始碼解壓縮之後,找到原始碼目錄下的auto/cc/gcc檔案,在其中找到如下幾行:
#debug
CFLAGS=“$CFLAGS -g"
註釋掉或者刪除掉這兩行,即可取消debug模式;
2、為特定的cpu指定cpu型別編譯最佳化:

在編譯nginx時,預設的GCC編譯引數是”-O“,要最佳化GCC編譯,可以使用如下兩個引數:
--with-cc-opt='-03'
--with-cpu-opt=CPU  #為特定的CPU編譯,有效的值包括:pentium,pentiumpro,pentium3,pentium4,athlon,opteron,amd64,sparc32,sparc64,ppc64

要確定cpu型別,可以使用下面的命令:
cat   /proc/cpuinfo  |grep  "model name"

3、nginx核心最佳化引數
核心引數的最佳化,主要是在linux系統中針對nginx應用而進行的系統核心引數最佳化,下面給出一個最佳化的例項以供參考:
net.ipv4.tcp_max_tw_buckets = 6000  #用來設定timewait的數量,預設是180000,這裡設定為6000;
net.ipv4_ip_local_port_range = 1024  65000 #用來設定允許系統開啟的埠範圍;
net.ipv4.tcp_tw_recycle =1  #用於設定啟用timewait快速回收機制;
net.ipv4.tcp_tw_reuse  = 1  #選項用於開啟重用,允許將time-wait sockets重新用於新的tcp連線;
net.ipv4.tcp_syncookies = 1 #用於開啟SYN COOKIES,當出現syn等待佇列溢位時,啟用cookies進行處理;
net.core.somaxconn = 262144  #選項的預設值是128,這個引數用來調節系統同時發起tcp連線的數目,在高併發的請求中,預設值可能會導致連結超時或者重傳;因此需要結合併發請求數來調整;
net.core.netdev_max_backlog=262144#選項表示當每個網路介面接收資料包的速率比核心處理這些包的速率快時,允許傳送到佇列的資料包的最大數目;
net.ipv4.tcp_max_orphans=262144  #選項用於設定系統中最多有多少個tcp套接字不被關聯到任何一個使用者控制程式碼上。如果超過這個字數,孤立連線將立即被複位並列印出警告資訊;這個限制只是為了簡單的防止dos攻擊,不能過分依靠這個甚至人為減少這個值;更多的情況下應該增加這個數值;
net.ipv4.tcp_max_syn_backlog  = 262144 #用於設定哪些尚未收到客戶端確認資訊的連線請求的最大值,對於有128M記憶體的系統而言,此引數的預設值是1024;對小記憶體的系統則是128;
net.ipv4.tcp_synack_retries  =  1  #引數的值決定了核心放棄連線之前傳送SYN+ACK包的數量;
net.ipv4.tcp_syn_retries  =  1  #表示在核心放棄之前SYN包的數量;
net.ipv4.tcp_fin_timeout  = 1 #選項決定了套接字保持在FIN-WAIT-2狀態的時間。預設值是60秒。正確設定這個值非常重要,有時即使一個負載很小的web伺服器,也會出現大量的死套接字而產生溢位的風險;FIN-WAIT-2的危險性比FIN-WAIT-1要小,因為它最多隻能消耗1.5KB記憶體,但是其生存期長些;
net.ipv4.tcp_syn_reties = 1#表示在核心放棄建立連線之前傳送syn包的數量;如果傳送端要求關閉套接字,net.ipv4.tcp_fin_timeout選項決定了套接字保持在FIN-WAIT-2狀態時間。接收端可以出錯並永遠不關閉連線,甚至意外當機。
net.ipv4.tcp_keepalive_time = 30選項表示當keepalive啟用的時候,TCP傳送keepalive訊息的頻度。預設值是2(單位是小時);


編譯安裝nginx,見五編譯安裝nginx的文章
user nginx;#定義Nginx執行的使用者和使用者組
worker_processes 2;#nginx程式數,建議設定為等於CPU總核心數。
error_log /var/log/nginx/error.log warn;#全域性錯誤日誌定義型別,[ debug | info | notice | warn | error | crit ]
pid /var/run/nginx.pid;#程式檔案
#worker_processes 2
#worker_cpu_affinity 0101 1010;#如果有4個CPU,並且指定2個worker程式,我這裡還沒使用;
worker_rlimit_nofile 102400;#一個nginx程式開啟的最多檔案描述符數目,理論值應該是最多開啟檔案數(系統的值ulimit -n)與nginx程式數相除,但是nginx分配請求並不均勻,所以建議與ulimit -n的值保持一致。
events
{
#參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本核心中的高效能網路I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;#工作模式與連線數上限
worker_connections 51200;#單個程式最大連線數(最大連線數=連線數*程式數)
}


http {
    include       /etc/nginx/mime.types;#副檔名與檔案型別對映表
    default_type  application/octet-stream; #預設檔案型別
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"' '"$upstream_addr"' '"$upstream_response_time"';#日誌輸出格式
    access_log  /home/nginx/log/access.log  main;#訪問日誌路徑
    client_header_buffer_size 1k;#設定使用者請求頭所使用的buffer大小;預設1k;#注意對於對於攜帶有較大cookie或來自於wap使用者的請求頭來說,1k的buffer一般不夠,這時可以使用指令large_client_header_buffers
large_client_header_buffers 4 64k; 
client_body_buffer_size 512k;如果使用者請求體超過了buffer的大小,則將全部內容或部分內容儲存到一個臨時檔案中。
client_max_body_size 2m; 根據請求頭中的Content-Length來判斷請求體大小是否允許。如果大於設定值,則返回
“ Request Entity Too Large”(413)錯誤。不過要注意的是,瀏覽器一般並不對這個錯誤進行特殊顯示。
#sendfile off; #開啟高效檔案傳輸模式,sendfile指令指定nginx是否呼叫sendfile函式來輸出檔案,對於普通應用設為 on,如果用來進行下載等應用磁碟IO重負載應用,可設定為off,
以平衡磁碟與網路I/O處理速度,降低系統的負載。注意:如果圖片顯示不正常把這個改成off。我這裡沒有使用
#autoindex on; #開啟目錄列表訪問,合適下載伺服器,預設關閉。
send_timeout 120;#指定響應客戶端的超時時間,單位:秒,預設值為60 
tcp_nopush on; #防止網路阻塞
tcp_nodelay on; #防止網路阻塞 
#fastcgi_cache_path /usr/local/Nginx/fastcgi_cache levels=
1:2 keys_zone=TEST:10m inactive=5m; #這個指令為FastCGI快取指定一個路徑,目錄結構等級,關鍵字區域儲存時間和非活動刪除時間。
單純的圖片伺服器不用這個引數;
#fastcgi_connect_timeout 300;#指定連線到後端FastCGI的超時時間。
#fastcgi_send_timeout 300;#向FastCGI傳送請求的超時時間,這個值是指已經完成兩次握手後向FastCGI傳送請求的超時時間
#fastcgi_read_timeout 300;#接收FastCGI應答的超時時間,這個值是指已經完成兩次握手後接收FastCGI應答的超時時間。
#fastcgi_buffer_size 4k;#指定讀取FastCGI應答第一部分需要用多大的緩衝區,一般第一部分應答不會超過1k,由於頁面大小為4k,所以這裡設定為4k。
#fastcgi_buffers 8 4k;#指定本地需要用多少和多大的緩衝區來緩衝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_busy_buffers_size 8k;#預設值是fastcgi_buffers的兩倍;
#fastcgi_temp_file_write_size 16k;#在寫入fastcgi_temp_path時將用多大的資料塊,預設值是fastcgi_buffers的兩倍
    #fastcgi_cache_valid 200 302 1h;  
    #fastcgi_cache_valid 301 1d;  
#fastcgi_cache_valid any 1m; 
#為指定的應答程式碼指定快取時間,如上例中將200,302應答快取一小時,301應答快取1天,其他為1分鐘。
keepalive_timeout  650;#保持連線時間,單位:秒,超過該時間,伺服器會關閉連線
#fastcgi_cache_min_uses 1; #快取在fastcgi_cache_path指令inactive引數值時間內的最少使用次數,如上例,如果在5分鐘內某檔案1次也沒有被使用,那麼這個檔案將被移除。
    include /var/nginx/conf.d/*.conf;
}




然後在conf.d下面建立檔案,gzip.conf

# HttpGzip模組配置,這個模組支援線上實時壓縮輸出資料流
/****
gzip(GNU-ZIP)是一種壓縮技術。經過gzip壓縮後頁面大小可以變為原來的30%甚至更小,這樣,
使用者瀏覽頁面的時候速度會塊得多。gzip的壓縮頁面需要瀏覽器和伺服器雙方都支援,實際上就 是伺服器端壓縮,
傳到瀏覽器後瀏覽器解壓並解析。瀏覽器那裡不需要我們擔心,因為目前的巨 大多數瀏覽器都支援解析gzip過的頁面。
何種場景下使用,主要看gzip_type
***/
    gzip on; #開啟gzip壓縮輸出,該指令用於開啟或關閉gzip模組
gzip_min_length 1k; #最小壓縮檔案大小;設定允許壓縮的頁面最小位元組數,頁面位元組數從header頭得content-length中進行獲取。
  預設值是0,不管頁面多大都壓縮。建議設定成大於1k的位元組數,小於1k可能會越壓越大
gzip_buffers 4 16k; #壓縮緩衝區;設定系統獲取幾個單位的快取用於儲存gzip的壓縮結果資料流。4 16k代表以16k為單位, 安裝原始資料大小以16k為單位的4倍申請記憶體;
gzip_http_version 1.0; #識別http協議版本(預設1.1,前端如果是squid2.5請使用1.0)
gzip_comp_level 2; #gzip壓縮比,1壓縮比最小處理速度最快,9壓縮比最大但處理速度最慢(傳輸快但比較消耗cpu)
gzip_types text/plain application/x-javascript text/css application/xml;#匹配mime型別進行壓縮,無論是否指定,”text/html”型別總是會被壓縮的。
gzip_vary on;#和http頭有關係,加個vary頭,給代理伺服器用的,有的瀏覽器支援壓縮,有的不支援,所以避免浪費不支援的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮
#limit_zone crawler $binary_remote_addr 10m; #開啟限制IP連線數的時候需要使用
#gzip_disable "MSIE [1-6]."   #指定版本瀏覽器不壓縮



再建一個檔案,用來跑自己代理的服務:
upstream  img {
server  192.168.1.1:82 weight=1 max_fails=2 fail_timeout=2;
server  192.168.1.2 weight=2 max_fails=2 fail_timeout=2;
}
server {
listen 81;
location / {
proxy_pass
}
}
server {
listen  82;
     proxy_connect_timeout 60000;
        proxy_read_timeout 60000;
        proxy_send_timeout 60000;
        charset UTF-8;
        proxy_max_temp_file_size 0;
        index default.jpg;
     root  /nx/upload/file;
     #limit_conn   crawler  20;    
     error_page  404              /default.jpg;
     error_page  500              /default.jpg;
     error_page  403           /default.jpg;
location ~* /500x500(.*)\.(gif|jpg|jpeg|png|bmp|swf)$         
      {      
      root /nx3200/upload/file500x500;            
      expires      30d;         
      }     
        
      
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
 {
error_page 404 = /default.jpg;
expires      30d;
}
  
location ~ .*\.(js|css)?$
{
 expires      1h;
    
}
location ~ ^/(WEB-INF)/
{
deny all;
}
}

再建一個檔案命名為common.conf中配置了http模組中公用資訊
include       mime.types;
    default_type  application/octet-stream;     
    log_format  main  '|$remote_addr|- |$http_cookie| - |$remote_user| [$time_local]| '
                      '"$request" |$status| $body_bytes_sent| "$http_referer"| '
                      '|"$http_user_agent"| |"$http_x_forwarded_for"|';
    #access_log  off
    access_log  logs/access.log  main buffer=32K;   
    server_tokens off;
    client_max_body_size  20m;                                                          
    client_header_buffer_size    32K;                                                   
    large_client_header_buffers  4 32K;                                                 
    sendfile        on;                                                                 
    tcp_nopush     on;                                                                  
    tcp_nodelay     on;                                 
    client_header_timeout  30;                                                          
    client_body_timeout    30;                                                          
    send_timeout          30;
    keepalive_timeout  65;    


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30129545/viewspace-1593447/,如需轉載,請註明出處,否則將追究法律責任。

相關文章