一個很好的原則是調優時每次只個性一個配置。若是對配置的個性不能提升性能的話,改回默認值
優化必需要經過性能測試。不能意淫,須要先後對比,真實說明問題。javascript
# nginx進程數,建議按照cpu數目來指定,通常爲它的倍數。 worker_processes 8; worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; # 這個指令是指當一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與nginx進程數相除,可是nginx分配請求並非那麼均勻,因此最好與ulimit -n的值保持一致 worker_rlimit_nofile 65535; events { # 使用epoll的I/O模型。 use epoll; # 每一個進程容許的最多鏈接數,理論上每臺nginx服務器的最大鏈接數爲worker_processes*worker_connections worker_connections 50000; } #sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對於普通應用, #必須設爲 on,若是用來進行下載等應用磁盤IO重負載應用,可設置爲 off,以平衡磁盤與網絡I/O處理速度,下降系統的uptime. sendfile on; #鏈接超時時間,單位時間是秒 keepalive_timeout 180; #FastCGI相關參數是爲了改善網站的性能:減小資源佔用,提升訪問速度。下面參數看字面意思都能理解。 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; #防止網絡阻塞 tcp_nopush on; tcp_nodelay on; #開啓gzip壓縮 gzip on; gzip_min_length 512; gzip_buffers 4 16k; gzip_http_version 1.0; #壓縮版本(默認1.1,前端若是是squid2.5請使用1.0) gzip_comp_level 5; #壓縮類型,默認就已經包含text/html,因此下面就不用再寫了,寫上去也不會有問題,可是會有一個warn。 gzip_types text/plain application/json application/x-javascript text/css application/xml; gzip_vary on; gzip_disable "MSIE [1-6]\."; # 這個是指多長時間檢查一次緩存的有效信息。 open_file_cache_valid 30s; # open_file_cache指令中的inactive參數時間內文件的最少使用次數,若是超過這個數字,文件描述符一直是在緩存中打開的,如上例,若是有一個文件在inactive時間內一次沒被使用,它將被移除。 open_file_cache_min_uses 1; # 客戶端請求頭部的緩衝區大小,這個能夠根據你的系統分頁大小來設置,通常一個請求的頭部大小不會超過1k,不過因爲通常系統分頁都要大於1k,因此這裏設置爲分頁大小。分頁大小能夠用命令getconf PAGESIZE取得 open_file_cache max=102400 inactive=20s;
日誌是要讀寫文件的,I/O消耗特別嚴重。日誌是否開啓能夠根據本身具體的架構需求。
建議的是以下:css
靜態資源不記錄。html
# 靜態資源經過nginx來管理 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css|ico)$ { # 關閉日誌 access_log off; include deny/agent.conf; if (-f $request_filename) { expires 1d; break; } }
動態資源要記,可是須要添加緩存。前端
access_log logs/access.log main buffer=2k;
這個其實和安全很是類似。本質是限制資源使用,這樣就能讓有限的資源爲更多人提供服務。
因此能夠參見:web安全——代理(nginx)java
通常web容器的性能都是比較差了,因此儘可能阻止訪問web容器。node
通常的web容器的長連接性能都比較弱,而nginx在這方面又特別優秀。nginx
# 動態的服務 server { server_name sso.xxx.com; #監聽 listen 80; location / { #反向代理到指定的服務 proxy_pass http://xxx-server; #定義服務器的默認網站根目錄位置 root /; proxy_set_header Host $host; #後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 100m; } } # 靜態的服務 server { server_name static.xxx.com; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css|ico)$ { # 文件根目錄,這個目錄根據文件的位置變動便可。 root /home/static; if (-f $request_filename) { expires 1d; break; } } }
把一些熱點的數據放在緩存服務器,這樣能提高性能。
srcache_nginx+redis構建緩存系統。在web應用中經過設置http的緩存特性(最好是基於註釋或者配置,對開發者儘可能是透明的,不要增長業務複雜度),來判斷是否須要緩存。web
#設置key,根據域名和uri set $key $host$request_uri; #來一個md5,要否則key太長。並且key特別長的時候,貌似在srache_store的時候執行不了 set_md5 $md5key $key; #調用HttpSRCacheModule的srcache_fetch 在http進入時,執行該方法,若是取到值,則不執行代理(即不執行tomcat),直接返回 srcache_fetch GET /redis2_get $md5key; #若是沒有設置緩存時間,則默認時間爲這個 srcache_default_expire 3600s; #調用HttpSRCacheModule的srcache_store在執行代理(即執行tomcat)後,執行該方法,並且必需爲「cache-control」 不等於"no-cahce"才執行。 #srcache_expire的取值優先級 #一、若是有cache-control;max-age=N,則取N #二、若是沒有,有expire,則取expire #三、若是都沒有取srcache_default_expire srcache_store PUT /redis2_set key=$md5key&expire=$srcache_expire;
把基本沒有變化的請求轉爲靜態文件資源。直接經過文件提供服務。
實現思路見下面的參考資料。
不過可能會有個問題,須要注意而且之後去解決redis
# 問題 日常訪問是沒有問題,但在高併發下,你想死的心都有。打開文件不對,一看是前面還沒寫完,另一個用戶就訪問了,又寫,致使文件格式不對。 # 建議思路 若是最終仍是要寫html,仍是經過程序去實現。例如:新聞類更新時,由編輯人員點擊發布,此時可能就寫了一個靜態的html,而不是由用戶去訪問出發寫html,避免高併發會出現的問題
須要進一步思考的地方:
緩存化
和靜態化
使用的場景。以及在nginx使用靜態化
是否合適。json