1. 程式人生 > 實用技巧 >企業級Web Nginx 服務優化(3)

企業級Web Nginx 服務優化(3)

企業級Web Nginx 服務優化(3)

1.10設定連線的超時時間:

什麼是超時?

php服務希望短連結,java服務是長連線。

  1. keepalive_timeout 60;

  2. <-設定客戶端連線保持回話的超時時間,超過這個時間,伺服器會關閉該連結。

  3. tcp_nodelay no;

  4. <-開啟tcp_nodelay,在包含了keepalive引數才有效

  5. client_header_timeout 15;

  6. <-設定客戶端請求頭讀取超時時間。如超過這個時間,客戶端還沒有傳送任何資料,Nginx將返回“Request time out (408)”錯誤。

  7. clinet_body_timeout 15;

  8. <-設定客戶端請求

    頭讀取超時時間。如超過這個時間,客戶端還沒有傳送任何資料,Nginx將返回“Request time out (408)”錯誤,預設值是60秒。

  9. send_timeout 15;

  10. <-指定響應客戶端的超時時間。這個超時僅限於兩個連線活動之間的時間,如果超過這個時間,客戶端沒有任何活動,Nginx將會關閉連線。

官方說明:

wKiom1ihXajjkGnlAAB70ejYcpY735.jpg-wh_50

wKioL1ihXcTiVMUwAABCjTId7jQ544.jpg-wh_50

wKiom1ihXd6wUumqAABMu0wN4dw886.jpg-wh_50

1.11上傳檔案大小的限制(動態應用)

主配置檔案加入如下引數,具體引數大小根據你自己的業務做調整。
client_max_body_size10m;

官方說明:

wKioL1ihXgrj1IB2AABwDr9LcJg172.jpg-wh_50

  1. HTTP/1.1 403 Forbidden

  2. Server: nginx

  3. Date: Fri, 05 Jun 2015 12:47:45 GMT

  4. Content-Type: text/html

  5. Content-Length: 162

  6. Connection: keep-alive

1.12fastcgi(配合php引擎動態服務)


  1. fastcgi_connect_timeout 300;

  2. <-指定連線到後端FastCGI的超時時間

  1. fastcgi_send_timeout 300;

  2. <-向fastcgi傳送請求的超時時間,這個值是指已經完成兩次握手後向FastCGI傳送請求的超時時間。

  3. fastcgi_read_timeout 300;

  4. <-指定接收Fastcgi應答的超時時間,這個值是指定已經完成兩次握手後接收的fastcgi應答的超時時間。

  1. fastcgi_buffer

    +size 64k;

  2. <-指定讀取FastCGI應答的第一部分需要用多大的緩衝區,這個值白哦是將使用164kb的緩衝區讀取應答的第一部分(應答頭),可以設定為fastcgi_buffers選項指定的緩衝區大小。

  3. fastcg_buffers 4 64k;

  4. <-指定本地需要用多少和多大的緩衝區來緩衝FastCGI的應答請求。如果一個PHP指令碼所產生的頁面大小為256kb,那麼會為其分配464kb的緩衝區來快取;如果頁面大小大於256kb,那麼大於256kb的部分會快取到fastcgi_temp指定 的路徑中,但是並不是好的辦法,因為記憶體中的資料處理速度快於硬碟,一般這個值應該為站點中php指令碼所產生的頁面大小的中間值,如果站點大部分指令碼所產生的頁面的大小為256kb那麼可以把這個設定為“16k 4 64k

wKioL1ihXm-wmbiiAAB0kvAYo4M786.jpg-wh_50

wKioL1ihXoTT6y2SAABTtL6kFJU051.jpg-wh_50

1.13配置nginx zip壓縮功能

nginx gzip壓縮模組提供了對檔案內容壓縮的功能,允許nginx伺服器將輸出內容在傳送到客戶端之前根據具體的策略進行壓縮,以節約萬佔貸款,同時提升童虎體驗。

此功能同apache的mod_deflate壓縮功能,以來ngx_http_gzip_nodule模組,預設已安裝,我們已經詳細講解過了壓縮的功能。

所有程式(js,css,html) 不要壓縮的內容(圖片,視訊 ,FLASH)

1,對應壓縮引數的說明如下:

  1. 壓縮配置

  2. gzip On

  3. <-開啟gizp壓縮功能

  4. gzip_min_length 1k;

  5. <-設定允許壓縮的頁面最小位元組數,頁面位元組數從header頭的Contet-length中獲取。預設是0,不管頁面多大進行壓縮。建議配置大於1k。如果小於1k可能會月牙越大。

  6. gzip 4 16k

  7. <-壓縮緩衝區大小。白哦是申請4各單位為16k的記憶體作為壓縮結果流快取,預設值是申請與原生資料大小相同的記憶體空間來儲存gzip壓縮的結果。

  8. gzip_http_version 1.0

  9. <-壓縮版本(預設是1.1,前端為squid2.5使用1.0)用於設定識別HTTP協議版本,預設是1.1,目前大部分的瀏覽器都已經支援GZIP解壓。預設即可

  10. gzip_comp_level 2;

  11. 壓縮比率,用來指定GZIP壓縮比,1壓縮比最小,處理速度最快,9壓縮比最大,傳輸速度快,但處理最慢,也比較小號cpu資源

  12. gzip_types text/plain application/x-javascript text/css application/xml;

  13. <-用來指定壓縮的型別,“text/html” 型別總司會被壓縮。

  14. gzip_bary on;

  15. <-vary header 支援。該選項可以讓前端的快取伺服器快取經過GZIP壓縮的頁面,例如使用SQUID快取經過NGINX壓縮資料

2.完整的配置如下:

wKioL1ihXtTh5Z9iAABCdRO4be8405.jpg-wh_50

修改的內容如下:

  1. [[email protected]-01 conf]# nginx -t

  2. nginx: the configuration file /application/nginx1.6.2/conf/nginx.conf syntax is ok

  3. nginx: configuration file /application/nginx1.6.2/conf/nginx.conf test is successful

  4. [[email protected]-01 conf]# cat nginx.conf

  5. worker_processes 4;

  6. worker_cpu_affinity 0001 0010 0100 1000;

  7. events {

  8. worker_connections 1024;

  9. use epoll;

  10. }

  11. http {

  12. server_tokens off;

  13. gzip on;

  14. gzip_min_length 1k;

  15. gzip_buffers 4 32k;

  16. gzip_http_version 1.1;

  17. gzip_comp_level 9;

  18. gzip_types text/html text/css text/xml application/javascripti;

  19. gzip_vary on;

  20. gzip的壓縮的情況是根據不同版本可能會不同的,上述的nginx 1.6.2的版本型別的。

檢視可以壓縮的檔案型別在哪裡?都是什麼?

上方加紅的地方寫法是按照這個來進行寫的。

  1. [[email protected]-01 conf]# cat mime.types


  2. types {

  3. text/html html htm shtml;

  4. text/css css;

  5. text/xml xml;

  6. p_w_picpath/gif gif;

  7. p_w_picpath/jpeg jpeg jpg;

  8. application/javascript js;

  9. application/atom+xml atom;

  10. application/rss+xml rss;


  11. text/mathml mml;

  12. text/plain txt;

  13. text/vnd.sun.j2me.app-descriptor jad;

  14. text/vnd.wap.wml wml;

  15. text/x-component htc;


  16. p_w_picpath/png png;

  17. p_w_picpath/tiff tif tiff;

  18. p_w_picpath/vnd.wap.wbmp wbmp;

  19. p_w_picpath/x-icon ico;

  20. p_w_picpath/x-jng jng;

  21. p_w_picpath/x-ms-bmp bmp;

  22. p_w_picpath/svg+xml svg svgz;

  23. p_w_picpath/webp webp;


  24. application/font-woff woff;

  25. application/java-archive jar war ear;

  26. application/json json;

  27. application/mac-binhex40 hqx;

  28. application/msword doc;

  29. application/pdf pdf;

  30. application/postscript ps eps ai;

  31. application/rtf rtf;

  32. application/vnd.apple.mpegurl m3u8;

  33. application/vnd.ms-excel xls;

  34. application/vnd.ms-fontobject eot;

  35. application/vnd.ms-powerpoint ppt;

  36. application/vnd.wap.wmlc wmlc;

  37. application/vnd.google-earth.kml+xml kml;

  38. application/vnd.google-earth.kmz kmz;

  39. application/x-7z-compressed 7z;

  40. application/x-cocoa cco;

  41. application/x-java-archive-diff jardiff;

  42. application/x-java-jnlp-file jnlp;

  43. application/x-makeself run;

  44. application/x-perl pl pm;

  45. application/x-pilot prc pdb;

  46. application/x-rar-compressed rar;

  47. application/x-redhat-package-manager rpm;

  48. application/x-sea sea;

  49. application/x-shockwave-flash swf;

  50. application/x-stuffit sit;

  51. application/x-tcl tcl tk;

  52. application/x-x509-ca-cert der pem crt;

  53. application/x-xpinstall xpi;

  54. application/xhtml+xml xhtml;

  55. application/xspf+xml xspf;

  56. application/zip zip;


  57. application/octet-stream bin exe dll;

  58. application/octet-stream deb;

  59. application/octet-stream dmg;

  60. application/octet-stream iso img;

  61. application/octet-stream msi msp msm;


  62. application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;

  63. application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;

  64. application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;


  65. audio/midi mid midi kar;

  66. audio/mpeg mp3;

  67. audio/ogg ogg;

  68. audio/x-m4a m4a;

  69. audio/x-realaudio ra;


  70. video/3gpp 3gpp 3gp;

  71. video/mp2t ts;

  72. video/mp4 mp4;

  73. video/mpeg mpeg mpg;

  74. video/quicktime mov;

  75. video/webm webm;

  76. video/x-flv flv;

  77. video/x-m4v m4v;

  78. video/x-mng mng;

  79. video/x-ms-asf asx asf;

  80. video/x-ms-wmv wmv;

  81. video/x-msvideo avi;

  82. }

進行重新啟動

  1. [[email protected]-01 conf]# nginx -t

  2. nginx: the configuration file /application/nginx1.6.2/conf/nginx.conf syntax is ok

  3. nginx: configuration file /application/nginx1.6.2/conf/nginx.conf test is successful

  4. [[email protected]-01 conf]# nginx

然後瀏覽器進行檢視如下gzip的壓縮以及expires的快取結果:

wKiom1ihXz2iTNh9AACIJD3XhaE311.jpg-wh_50

這裡面是火狐的瀏覽器需要安裝Yslow 的這個擴充套件元件才是可以的。

需要和不需要的壓縮的物件:

大於1K的純文字檔案html,,js ,css xml shtml

圖片,視訊等不要壓縮。因為不但不會減少,在壓縮時小號CPU和MEM資源。


nginx的翻向的一個優化 就是沒必要的載入的模組是什麼?

  1. [[email protected]-01 nginx-1.6.2]# ./configure --help

  2. --without-http_charset_module disable ngx_http_charset_module

  3. --without-http_gzip_module disable ngx_http_gzip_module

  4. --without-http_ssi_module disable ngx_http_ssi_module

  5. --without-http_userid_module disable ngx_http_userid_module

  6. --without-http_access_module disable ngx_http_access_module

  7. --without-http_auth_basic_module disable ngx_http_auth_basic_module

  8. --without-http_autoindex_module disable ngx_http_autoindex_module

  9. --without-http_geo_module disable ngx_http_geo_module

  10. --without-http_map_module disable ngx_http_map_module

  11. --without-http_split_clients_module disable ngx_http_split_clients_module

  12. --without-http_referer_module disable ngx_http_referer_module

  13. --without-http_rewrite_module disable ngx_http_rewrite_module

  14. --without-http_proxy_module disable ngx_http_proxy_module

  15. --without-http_fastcgi_module disable ngx_http_fastcgi_module

  16. --without-http_uwsgi_module disable ngx_http_uwsgi_module

  17. --without-http_scgi_module disable ngx_http_scgi_module

  18. --without-http_memcached_module disable ngx_http_memcached_module

  19. --without-http_limit_conn_module disable ngx_http_limit_conn_module

  20. --without-http_limit_req_module disable ngx_http_limit_req_module

  21. --without-http_empty_gif_module disable ngx_http_empty_gif_module

  22. --without-http_browser_module disable ngx_http_browser_module

  23. --without-http_upstream_ip_hash_module


1.14配置nginx expires 快取功能

在網站開發和運營中,對於圖片,css,js等元素更改機會比較少,特別是圖片,這時可以將圖片設定在瀏覽器本地快取365天或者更長,CSSJS,html等待嗎快取10天,這樣使用者第一次開啟頁面後,你,會在本地的瀏覽器快取相應的上述內容,這樣的快取可以提高下次使用者開啟類似的頁面的載入速度,並節省伺服器端的大量資源的頻寬,此功能同apache的expire是,我們已經詳細講解過了,這裡通過location的,將需要快取的副檔名列出來,然後指定快取的時間。

好處:

1.第一次以後,訪問網站會很快----->體驗就好了

2.節省網站的頻寬。。。。成本變低了。

3.伺服器的壓力降低了。----->成本降低了

壞處:

1.網站如果改版,對應的使用者看到的還是舊的。(js,css,圖片)

解決壞處的:

1.過期時間短一些

2.資原始檔更新的時候,進行改名字就可以了。

圖片和附件一般不會被使用者修改,如果使用者修改了,實際上也都是更改檔名字重新傳了而已。

網站升級對於jss,css元素,一般可以改名。把css,jss,推送到CDN。

企業網站案例日期的案例:

1.51cto 1周

2.sina 15天

3.京東 25年

4.淘寶的 10年

一般不希望被快取的內容:

1)廣告圖片、

2)網站流量統計檔案

3)更新頻繁的檔案

1.根據副檔名進行判斷,新增expires功能範例:

[[email protected] conf]# vim nginx.conf

server {

location ~.*\.(gif|jpg|jpeg|png|bmp|swf)$

{

expires 3650d;

root html/bbs

}

location ~.*\.(js|css)?$

{

expires 30d;

root html/bbs

}

在server裡面的標籤。

這個時間是跟伺服器的時間對應的

wKiom1ihX4yB8-k5AAB-6-mltUk533.jpg-wh_50

單個檔案新增expires功能範例:

給robots.txt設定過期時間;這裡為robots.txt 為7天並不記錄404錯誤日誌

wKiom1ihX6vBUzOJAAAasK0sI2g381.jpg-wh_50

wKioL1ihX8bxg1AvAABPqZ1ZkDA411.png-wh_50

wKioL1ihX9vizn9wAAAlQzK58yA945.png-wh_50

wKiom1ihYAPglplMAAAzKaSeGF0094.png-wh_50

nginx防止爬蟲的配置的是什麼?

wKioL1ihYB7RKHmZAAA4XLrrwO8180.jpg-wh_50

結果如下:

wKioL1ihYDnQ6hqTAABAv5yJ6ms241.jpg-wh_50

wKiom1ihYE_xFF07AABFp_YF_MI093.jpg-wh_50

1.2更改原始碼檔案來更改原始碼名稱


更改編譯的原始碼檔案:

  1. vim src/http/ngx_http_header_filter_module.c +49

  2. static char ngx_http_server_string[] = "Server: BWS" CRLF;

  3. static char ngx_http_server_full_string[] = "Server: BWS" CRLF;



  4. static ngx_str_t ngx_http_status_lines[] = {

進行檢視編譯的引數是什麼:

[[email protected]nginx-1.6.2]#nginx-Vnginxversion:nginx/1.6.2builtbygcc4.4.720120313(RedHat4.4.7-11)(GCC)TLSSNIsupportenabledconfigurearguments:--user=nginx--group=nginx--prefix=/application/nginx1.6.2--with-http_stub_status_module--with-http_ssl_module

修改錯誤資訊的返回頁面:

  1. [[email protected]-01 nginx-1.6.2]# vim src/http/ngx_http_special_response.c

  2. static u_char ngx_http_error_tail[] =

  3. "<hr><center>BWS(http://www.baidu.com</center>)" CRLF

  4. "</body>" CRLF

  5. "</html>" CRLF

  6. ;

重新編譯安裝:

安裝完成後測試的結果如下:

本機測試:

  1. [[email protected]-01 nginx-1.6.2]# curl -I 127.0.0.1

  2. HTTP/1.1 403 Forbidden

  3. Server: BWS

  4. Date: Fri, 05 Jun 2015 13:55:03 GMT

  5. Content-Type: text/html

  6. Content-Length: 223

  7. Connection: keep-alive

錯誤頁面的顯示:

wKiom1ihYMeT7YAiAAAtA0LsDSU278.png-wh_50

1.3 Nginx 日誌相關優化與安全

1.3.1編寫指令碼實現Nginx access 日誌輪訓

Nginx沒有類似Apache的cronolog日誌分割處理的功能,但是,可以通過nginx的訊號控制功能或者reload新家在,然後利用指令碼來實現日誌的自動切割。

詳細操作過程如下:

1.配置日誌切割指令碼

  1. [[email protected]-01 scripts]# cat nginxlog.sh

  2. #!/bin/sh

  3. cd /application/nginx/logs &&\

  4. /bin/mv www_access.log www_access_$(date +%F -d -1day).log

  5. /application/nginx/sbin/nginx -s reload

1.3.2 不記錄不需要的訪問日誌

對於健康檢查或某些圖片,jss,css的日誌,一般不需要記錄,因為在同級PV時是按照頁面計算。而且日誌寫入頻繁消耗磁碟IO,降低服務效能。

wKiom1ihYQjCb_m5AAAax81nEu4875.jpg-wh_50

1.3.3訪問日誌的許可權設定

假如日誌目錄/app/logs,則授權方法、

chown-Rroot.root/app/logs
chmod-R700/app/logs


不需要在日誌目錄上給nginx使用者讀或者寫許可,這個問題很多網友都沒在意,直接給了nginx或apache使用者。

最小化apache和nginx目錄及檔案許可權設定

安全的許可權:

為了保證apache的網站不遭受******上傳及修改檔案。

1.所有站點目錄的使用者和組都應該為root,

2.所有目錄許可權755;

3.所有檔案的許可權644;

注意網站的服務使用者不能用root;

wKiom1ihYTLzM2PWAAA9fXqEg78146.jpg-wh_50

以上的許可權設定可以做到防止***上傳***,以及修改站點檔案,但是,合理的使用者上傳的內容也被據之門外了。那麼如何解決可以讓合法的使用者傳檔案又不至於被***利用***吶?

這就是對業務進行分離,在比較好的網站業務架構中,應該把資原始檔,包括使用者上傳的圖片,附件等的服務和程式服務分離,最好把上傳程式服務也分離,這樣就可以從容按照前面安全的標準來進行授權了。

缺一個把資原始檔,包括使用者上傳圖片,包括上傳程式液分離的圖

wKioL1ihYVGRDQ6SAABPToGVt8U574.jpg-wh_50

大多數公司的不是很安全的授權如下:

1)chown -R 777 /sitedir(最不安全的)

2)chown -R apache.apache /sitedir(最不安全的)

如果按照大多數公司授權一般公司的授權,會給網站帶來非常大的安全隱患。

wKiom1ihYXOg9-ccAACqptcQo5o915.jpg-wh_50


轉載於:https://blog.51cto.com/yanruohan/1897329