Nginx性能優(yōu)化方法總結(jié)--詳細(xì)
目錄[-]
nginx優(yōu)化
#將nginx進(jìn)程設(shè)置為普通用戶,為了安全考慮 user nginx; #當(dāng)前啟動的worker進(jìn)程,官方建議是與系統(tǒng)核心數(shù)一致 worker_processes 2; #方式一,就是自動分配綁定 worker_cpu_affinity auto; #日志配置成warn error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; #針對 nginx 句柄的文件限制 worker_rlimit_nofile 35535; #事件模型 events { #使用epoll內(nèi)核模型 user epoll; #每一個(gè)進(jìn)程可以處理多少個(gè)連接,如果是多核可以將連接數(shù)調(diào)高 worker_processes * 1024 worker_connections 10240; } http { include /etc/nginx/mime.types; default_type application/octet-stream; charset utf-8; #設(shè)置字符集 #設(shè)置日志輸出格式,根據(jù)自己的情況設(shè)置 log_format main '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' '"$args" "$request_uri"'; access_log /var/log/nginx/access.log main; sendfile on; #對靜態(tài)資源的處理比較有效 #tcp_nopush on; #如果做靜態(tài)資源服務(wù)器可以打開 #tcp_nodeny on; #當(dāng)nginx做動態(tài)的服務(wù)時(shí)可以選擇打開 keepalive_timeout 65; ######## #Gzip module gzip on; #文件壓縮默認(rèn)可以打開 gzip_disable "MSIE [1-6]."; #對于有些瀏覽器不能識別壓縮,需要過濾如ie6 gzip_http_version 1.1; include /etc/nginx/conf.d/*.conf; }
Nginx gzip壓縮模塊提供了壓縮文件內(nèi)容的功能,用戶請求的內(nèi)容在發(fā)送到用戶客戶端之前,Nginx服務(wù)器會根據(jù)一些具體的策略實(shí)施壓縮,以節(jié)約網(wǎng)站出口帶寬,同時(shí)加快數(shù)據(jù)傳輸效率,來提升用戶訪問體驗(yàn)。
server_tokens off; 隱藏版本號 worker_connections 4096; 每一個(gè)進(jìn)程打開的最大連接數(shù) worker_rlimit_nofile 10240; 每個(gè)進(jìn)程打開的最大的文件數(shù),受限于操作系統(tǒng):
1、Nginx運(yùn)行工作進(jìn)程數(shù)量
而worker 進(jìn)程數(shù)默認(rèn)為 1 。單進(jìn)程最大連接數(shù)為1024。如下圖(打開Nginx目錄下的/conf/nginx.conf 文檔),現(xiàn)在我們來對這兩個(gè)數(shù)值進(jìn)行調(diào)優(yōu)
在這里插入圖片描述
nginx 進(jìn)程數(shù),建議按照cpu 數(shù)目來指定,一般為它的倍數(shù) (如,2個(gè)四核的cpu計(jì)為8)。
Nginx運(yùn)行工作進(jìn)程個(gè)數(shù)一般設(shè)置CPU的核心或者核心數(shù)x2。如果不了解cpu的核數(shù),可以top命令之后按1看出來,也可以查看/proc/cpuinfo文件 grep ^processor /proc/cpuinfo | wc -l。
[root@lx~]# vi/usr/local/nginx1.10/conf/nginx.conf worker_processes 4; [root@lx~]# /usr/local/nginx1.10/sbin/nginx-s reload [root@lx~]# ps -aux | grep nginx |grep -v grep root 9834 0.0 0.0 47556 1948 ? Ss 22:36 0:00 nginx: master processnginxwww 10135 0.0 0.0 50088 2004 ? S 22:58 0:00 nginx: worker processwww 10136 0.0 0.0 50088 2004 ? S 22:58 0:00 nginx: worker processwww 10137 0.0 0.0 50088 2004 ? S 22:58 0:00 nginx: worker processwww 10138 0.0 0.0 50088 2004 ? S 22:58 0:00 nginx: worker process
2、Nginx運(yùn)行CPU親和力
比如4核配置:
worker_processes 4;worker_cpu_affinity 0001 0010 0100 1000
比如8核配置:
`worker_processes 8;worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000 01000000 10000000;`
worker_processes最多開啟8個(gè),8個(gè)以上性能提升不會再提升了,而且穩(wěn)定性變得更低,所以8個(gè)進(jìn)程夠用了。
為每個(gè)進(jìn)程分配cpu,上例中將8 個(gè)進(jìn)程分配到8 個(gè)cpu,當(dāng)然可以寫多個(gè),或者將一個(gè)進(jìn)程分配到多個(gè)cpu。
3、Nginx最大打開文件數(shù)
優(yōu)化 Nginx worker 進(jìn)程打開的最大文件數(shù)
# worker 進(jìn)程打開的最大文件數(shù),可設(shè)置為優(yōu)化后的 ulimit -HSn 的結(jié)果 worker_rlimit_nofile65535;
這個(gè)指令是指當(dāng)一個(gè)nginx進(jìn)程打開的最多文件描述符數(shù)目,理論值應(yīng)該是最多打開文件數(shù)(ulimit -n)與nginx進(jìn)程數(shù)相除,但是nginx分配請求并不是那么均勻,所以最好與ulimit -n的值保持一致。
注:文件資源限制的配置可以在/etc/security/limits.conf設(shè)置,針對root/user等各個(gè)用戶或者*代表所有用戶來設(shè)置。
* soft nofile 65535* hard nofile 65535
用戶重新登錄生效(ulimit -n)
查看linux系統(tǒng)文件描述符的方法:
[root@web001 ~]# sysctl -a | grep fs.file fs.file-max = 789972 fs.file-nr = 510 0 789972
在這里插入圖片描述
worker_connections 65535;
每個(gè)進(jìn)程允許的最多連接數(shù), 理論上每臺nginx 服務(wù)器的最大連接數(shù)為worker_processes*worker_connections。
client_header_buffer_size 4k;
客戶端請求頭部的緩沖區(qū)大小,這個(gè)可以根據(jù)你的系統(tǒng)分頁大小來設(shè)置,一般一個(gè)請求頭的大小不會超過1k,不過由于一般系統(tǒng)分頁都要大于1k,所以這里設(shè)置為分頁大小。
分頁大小可以用命令getconf PAGESIZE 取得。
[root@web001 ~]# getconf PAGESIZE 4096
但也有client_header_buffer_size超過4k的情況,但是client_header_buffer_size該值必須設(shè)置為“系統(tǒng)分頁大小”的整倍數(shù)。
open_file_cache max=65535 inactive=60s;
這個(gè)將為打開文件指定緩存,默認(rèn)是沒有啟用的,max 指定緩存數(shù)量,建議和打開文件數(shù)一致,inactive 是指經(jīng)過多長時(shí)間文件沒被請求后刪除緩存。
open_file_cache_valid 80s;
這個(gè)是指多長時(shí)間檢查一次緩存的有效信息。
open_file_cache_min_uses 1;
open_file_cache 指令中的inactive 參數(shù)時(shí)間內(nèi)文件的最少使用次數(shù),如果超過這個(gè)數(shù)字,文件描述符一直是在緩存中打開的,如上例,如果有一個(gè)文件在inactive 時(shí)間內(nèi)一次沒被使用,它將被移除。
4、Nginx事件處理模型
`events { use epoll; worker_connections 65535; multi_accept on;}`
nginx采用epoll事件模型,處理效率高。
work_connections是單個(gè)worker進(jìn)程允許客戶端最大連接數(shù),這個(gè)數(shù)值一般根據(jù)服務(wù)器性能和內(nèi)存來制定,實(shí)際最大值就是worker進(jìn)程數(shù)乘以work_connections。
實(shí)際我們填入一個(gè)65535,足夠了,這些都算并發(fā)值,一個(gè)網(wǎng)站的并發(fā)達(dá)到這么大的數(shù)量,也算一個(gè)大站了!
multi_accept 告訴nginx收到一個(gè)新連接通知后接受盡可能多的連接,默認(rèn)是on,設(shè)置為on后,多個(gè)worker按串行方式來處理連接,也就是一個(gè)連接只有一個(gè)worker被喚醒,其他的處于休眠狀態(tài),設(shè)置為off后,多個(gè)worker按并行方式來處理連接,也就是一個(gè)連接會喚醒所有的worker,直到連接分配完畢,沒有取得連接的繼續(xù)休眠。當(dāng)你的服務(wù)器連接數(shù)不多時(shí),開啟這個(gè)參數(shù)會讓負(fù)載有一定的降低,但是當(dāng)服務(wù)器的吞吐量很大時(shí),為了效率,可以關(guān)閉這個(gè)參數(shù)。
5、開啟高效傳輸模式
`http { include mime.types; default_type application/octet-stream; …… sendfile on; tcp_nopush on; ……}`
? Include mime.types :媒體類型,include 只是一個(gè)在當(dāng)前文件中包含另一個(gè)文件內(nèi)容的指令。
? default_type application/octet-stream :默認(rèn)媒體類型足夠。
? sendfile on:開啟高效文件傳輸模式,sendfile指令指定nginx是否調(diào)用sendfile函數(shù)來輸出文件,對于普通應(yīng)用設(shè)為 on,如果用來進(jìn)行下載等應(yīng)用磁盤IO重負(fù)載應(yīng)用,可設(shè)置為off,以平衡磁盤與網(wǎng)絡(luò)I/O處理速度,降低系統(tǒng)的負(fù)載。注意:如果圖片顯示不正常把這個(gè)改成off。
? tcp_nopush on:必須在sendfile開啟模式才有效,防止網(wǎng)路阻塞,積極的減少網(wǎng)絡(luò)報(bào)文段的數(shù)量(將響應(yīng)頭和正文的開始部分一起發(fā)送,而不一個(gè)接一個(gè)的發(fā)送。)
6、連接超時(shí)時(shí)間
主要目的是保護(hù)服務(wù)器資源,CPU,內(nèi)存,控制連接數(shù),因?yàn)榻⑦B接也是需要消耗資源的。
keepalive_timeout 60; #keepalive 超時(shí)時(shí)間。 tcp_nodelay on;client_header_buffer_size 4k; open_file_cache max=102400 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 1; client_header_timeout 15; client_body_timeout 15; reset_timedout_connection on; send_timeout 15; server_tokens off; client_max_body_size 10m;
或者
http { include mime.types; server_names_hash_bucket_size 512; default_type application/octet-stream; sendfile on; tcp_nodelay on; keepalive_timeout 65; client_header_timeout 15; client_body_timeout 15; send_timeout 25; include vhosts/*.conf; }
? keepalived_timeout :客戶端連接保持會話超時(shí)時(shí)間,超過這個(gè)時(shí)間,服務(wù)器斷開這個(gè)鏈接。
? tcp_nodelay:也是防止網(wǎng)絡(luò)阻塞,不過要包涵在keepalived參數(shù)才有效。
? client_header_buffer_size 4k:客戶端請求頭部的緩沖區(qū)大小,這個(gè)可以根據(jù)你的系統(tǒng)分頁大小來設(shè)置,一般一個(gè)請求頭的大小不會超過 1k,不過由于一般系統(tǒng)分頁都要大于1k,所以這里設(shè)置為分頁大小。分頁大小可以用命令getconf PAGESIZE取得。
? open_file_cache max=102400 inactive=20s :這個(gè)將為打開文件指定緩存,默認(rèn)是沒有啟用的,max指定緩存數(shù)量,建議和打開文件數(shù)一致,inactive 是指經(jīng)過多長時(shí)間文件沒被請求后刪除緩存。
? open_file_cache_valid 30s:這個(gè)是指多長時(shí)間檢查一次緩存的有效信息。
? open_file_cache_min_uses 1 :open_file_cache指令中的inactive 參數(shù)時(shí)間內(nèi)文件的最少使用次數(shù),如果超過這個(gè)數(shù)字,文件描述符一直是在緩存中打開的,如上例,如果有一個(gè)文件在inactive 時(shí)間內(nèi)一次沒被使用,它將被移除。
? client_header_timeout :設(shè)置請求頭的超時(shí)時(shí)間。我們也可以把這個(gè)設(shè)置低些,如果超過這個(gè)時(shí)間沒有發(fā)送任何數(shù)據(jù),nginx將返回request time out的錯(cuò)誤。
? client_body_timeout設(shè)置請求體的超時(shí)時(shí)間。我們也可以把這個(gè)設(shè)置低些,超過這個(gè)時(shí)間沒有發(fā)送任何數(shù)據(jù),和上面一樣的錯(cuò)誤提示。
? reset_timeout_connection :告訴nginx關(guān)閉不響應(yīng)的客戶端連接。這將會釋放那個(gè)客戶端所占有的內(nèi)存空間。
? send_timeout :響應(yīng)客戶端超時(shí)時(shí)間,這個(gè)超時(shí)時(shí)間僅限于兩個(gè)活動之間的時(shí)間,如果超過這個(gè)時(shí)間,客戶端沒有任何活動,nginx關(guān)閉連接。
? server_tokens :并不會讓nginx執(zhí)行的速度更快,但它可以關(guān)閉在錯(cuò)誤頁面中的nginx版本數(shù)字,這樣對于安全性是有好處的。
? client_max_body_size:上傳文件大小限制。
7、fastcgi 調(diào)優(yōu)
當(dāng) LNMP 組合工作時(shí),用戶通過瀏覽器輸入域名請求 Nginx Web 服務(wù):
如果請求的是靜態(tài)資源,則由 Nginx 解析后直接返回給用戶;
如果是動態(tài)請求(如 PHP),那么 Nginx 就會把它通過 FastCGI 接口發(fā)送給 PHP 引擎服務(wù)(即 php-fpm)進(jìn)行解析,如果這個(gè)動態(tài)請求要讀取數(shù)據(jù)庫數(shù)據(jù),那么 PHP 就會繼續(xù)請求 MySQL 數(shù)據(jù)庫,以讀取需要的數(shù)據(jù),并最終通過 Nginx 服務(wù)把獲取的數(shù)據(jù)返回給用戶。
這就是 LNMP 環(huán)境的基本請求流程。
在 Linux 中,F(xiàn)astCGI 接口即為 socket ,這個(gè) socket 可以是文件 socket,也可以是 IP socket。
簡化配置
fastcgi_connect_timeout 600; fastcgi_send_timeout 600; fastcgi_read_timeout 600; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; fastcgi_temp_path/usr/local/nginx1.10/nginx_tmp; fastcgi_intercept_errors on; fastcgi_cache_path/usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g;
完整配置
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; fastcgi_connect_timeout 240; # Nginx服務(wù)器和后端FastCGI服務(wù)器連接的超時(shí)時(shí)間 fastcgi_send_timeout 240; # Nginx允許FastCGI服務(wù)器返回?cái)?shù)據(jù)的超時(shí)時(shí)間,即在規(guī)定時(shí)間內(nèi)后端服務(wù)器必須傳完所有的數(shù)據(jù),否則Nginx將斷開這個(gè)連接 fastcgi_read_timeout 240; # Nginx從FastCGI服務(wù)器讀取響應(yīng)信息的超時(shí)時(shí)間,表示連接建立成功后,Nginx等待后端服務(wù)器的響應(yīng)時(shí)間 fastcgi_buffer_size 64k; # Nginx FastCGI 的緩沖區(qū)大小,用來讀取從FastCGI服務(wù)器端收到的第一部分響應(yīng)信息的緩沖區(qū)大小 fastcgi_buffers 4 64k; # 設(shè)定用來讀取從FastCGI服務(wù)器端收到的響應(yīng)信息的緩沖區(qū)大小和緩沖區(qū)數(shù)量 fastcgi_busy_buffers_size 128k; # 用于設(shè)置系統(tǒng)很忙時(shí)可以使用的 proxy_buffers 大小 fastcgi_temp_file_write_size 128k; # FastCGI 臨時(shí)文件的大小 # fastcti_temp_path /data/ngx_fcgi_tmp; # FastCGI 臨時(shí)文件的存放路徑 fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g; # 緩存目錄 server { listen 80; server_name www.abc.com; location / { root html/www; index index.html index.htm; } location ~ .*.(php|php5)?$ { root html/www; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; fastcgi_cache ngx_fcgi_cache; # 緩存FastCGI生成的內(nèi)容,比如PHP生成的動態(tài)內(nèi)容 fastcgi_cache_valid 200 302 1h; # 指定http狀態(tài)碼的緩存時(shí)間,這里表示將200和302緩存1小時(shí) fastcgi_cache_valid 301 1d; # 指定http狀態(tài)碼的緩存時(shí)間,這里表示將301緩存1天 fastcgi_cache_valid any 1m; # 指定http狀態(tài)碼的緩存時(shí)間,這里表示將其他狀態(tài)碼緩存1分鐘 fastcgi_cache_min_uses 1; # 設(shè)置請求幾次之后響應(yīng)被緩存,1表示一次即被緩存 fastcgi_cache_use_stale error timeout invalid_header http_500; # 定義在哪些情況下使用過期緩存 fastcgi_cache_key http://$host$request_uri; # 定義 fastcgi_cache 的 key } } }
? fastcgi_connect_timeout 600 :指定連接到后端FastCGI的超時(shí)時(shí)間
? fastcgi_send_timeout 600 :向FastCGI傳送請求的超時(shí)時(shí)間。
? fastcgi_read_timeout 600 :指定接收FastCGI應(yīng)答的超時(shí)時(shí)間。
? fastcgi_buffer_size 64k :指定讀取FastCGI應(yīng)答第一部分需要用多大的緩沖區(qū),默認(rèn)的緩沖區(qū)大小為。fastcgi_buffers指令中的每塊大小,可以將這個(gè)值設(shè)置更小。
? fastcgi_buffers 4 64k :指定本地需要用多少和多大的緩沖區(qū)來緩沖FastCGI的應(yīng)答請求,如果一個(gè)php腳本所產(chǎn)生的頁面大小為256KB,那么會分配4個(gè)64KB的緩沖區(qū)來緩存,如果頁面大小大于256KB,那么大于256KB的部分會緩存到fastcgi_temp_path指定的路徑中,但是這并不是好方法,因?yàn)閮?nèi)存中的數(shù)據(jù)處理速度要快于磁盤。一般這個(gè)值應(yīng)該為站點(diǎn)中php腳本所產(chǎn)生的頁面大小的中間值,如果站點(diǎn)大部分腳本所產(chǎn)生的頁面大小為256KB,那么可以把這個(gè)值設(shè)置為“8 32K”、“4 64k”等。
? fastcgi_busy_buffers_size 128k :建議設(shè)置為fastcgi_buffers的兩倍,繁忙時(shí)候的buffer。
? fastcgi_temp_file_write_size 128k :在寫入fastcgi_temp_path時(shí)將用多大的數(shù)據(jù)塊,默認(rèn)值是fastcgi_buffers的兩倍,該數(shù)值設(shè)置小時(shí)若負(fù)載上來時(shí)可能報(bào)502BadGateway。
? fastcgi_temp_path :緩存臨時(shí)目錄。
? fastcgi_intercept_errors on :這個(gè)指令指定是否傳遞4xx和5xx錯(cuò)誤信息到客戶端,或者允許nginx使用error_page處理錯(cuò)誤信息。注:靜態(tài)文件不存在會返回404頁面,但是php頁面則返回空白頁!
? fastcgi_cache_path /usr/local/nginx1.10/fastcgi_cachelevels=1:2
? keys_zone=cache_fastcgi:128minactive=1d max_size=10g :fastcgi_cache緩存目錄,可以設(shè)置目錄層級,比如1:2會生成16*256個(gè)子目錄,cache_fastcgi是這個(gè)緩存空間的名字,cache是用多少內(nèi)存(這樣熱門的內(nèi)容nginx直接放內(nèi)存,提高訪問速度),inactive表示默認(rèn)失效時(shí)間,如果緩存數(shù)據(jù)在失效時(shí)間內(nèi)沒有被訪問,將被刪除,max_size表示最多用多少硬盤空間。
? fastcgi_cache cache_fastcgi :#表示開啟FastCGI緩存并為其指定一個(gè)名稱。開啟緩存非常有用,可以有效降低CPU的負(fù)載,并且防止502的錯(cuò)誤放生。cache_fastcgi為proxy_cache_path指令創(chuàng)建的緩存區(qū)名稱。
? fastcgi_cache_valid 200 302 1h :#用來指定應(yīng)答代碼的緩存時(shí)間,實(shí)例中的值表示將200和302應(yīng)答緩存一小時(shí),要和fastcgi_cache配合使用。
? fastcgi_cache_valid 301 1d :將301應(yīng)答緩存一天。
? fastcgi_cache_valid any 1m :將其他應(yīng)答緩存為1分鐘。
? fastcgi_cache_min_uses 1 :該指令用于設(shè)置經(jīng)過多少次請求的相同URL將被緩存。
? fastcgi_cache_key http://request_uri :該指令用來設(shè)置web緩存的Key值,nginx根據(jù)Key值md5哈希存儲.一般根據(jù)request_uri(請求的路徑)等變量組合成proxy_cache_key 。
? fastcgi_pass :指定FastCGI服務(wù)器監(jiān)聽端口與地址,可以是本機(jī)或者其它。
總結(jié):
nginx的緩存功能有:proxy_cache / fastcgi_cache
? proxy_cache的作用是緩存后端服務(wù)器的內(nèi)容,可能是任何內(nèi)容,包括靜態(tài)的和動態(tài)。
? fastcgi_cache的作用是緩存fastcgi生成的內(nèi)容,很多情況是php生成的動態(tài)的內(nèi)容。
? proxy_cache緩存減少了nginx與后端通信的次數(shù),節(jié)省了傳輸時(shí)間和后端寬帶。
? fastcgi_cache緩存減少了nginx與php的通信的次數(shù),更減輕了php和數(shù)據(jù)庫(mysql)的壓力。
這就是 LNMP 環(huán)境的基本請求流程。
在 Linux 中,F(xiàn)astCGI 接口即為 socket ,這個(gè) socket 可以是文件 socket,也可以是 IP socket。
fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301 1d; fastcgi_cache_valid any 1m;
為指定的應(yīng)答代碼指定緩存時(shí)間,如上例中將200,302 應(yīng)答緩存一小時(shí),301 應(yīng)答緩存1 天,其他為1 分鐘。
`fastcgi_cache_min_uses 1;`
緩存在fastcgi_cache_path 指令inactive 參數(shù)值時(shí)間內(nèi)的最少使用次數(shù),如上例,如果在5 分鐘內(nèi)某文件1 次也沒有被使用,那么這個(gè)文件將被移除。
`fastcgi_cache_use_stale error timeout invalid_header http_500;`
8、gzip 調(diào)優(yōu)
Nginx gzip 壓縮模塊提供了壓縮文件內(nèi)容的功能,用戶請求的內(nèi)容在發(fā)送到客戶端之前,Nginx 服務(wù)器會根據(jù)一些具體的策略實(shí)施壓縮,以節(jié)約網(wǎng)站出口帶寬,同時(shí)加快數(shù)據(jù)傳輸效率,來提升用戶訪問體驗(yàn)。
需要壓縮的對象有 html 、js 、css 、xml 、shtml ,圖片和視頻盡量不要壓縮,因?yàn)檫@些文件大多都是已經(jīng)壓縮過的,如果再壓縮可能反而變大。
另外,壓縮的對象必須大于 1KB,由于壓縮算法的特殊原因,極小的文件壓縮后可能反而變大。
使用gzip壓縮功能,可能為我們節(jié)約帶寬,加快傳輸速度,有更好的體驗(yàn),也為我們節(jié)約成本,所以說這是一個(gè)重點(diǎn)。
Nginx啟用壓縮功能需要你來ngx_http_gzip_module模塊,apache使用的是mod_deflate。
一般我們需要壓縮的內(nèi)容有:文本,js,html,css,對于圖片,視頻,flash什么的不壓縮,同時(shí)也要注意,我們使用gzip的功能是需要消耗CPU的!
gzip on; gzip_min_length 2k; gzip_buffers 4 32k; gzip_http_version 1.1; gzip_comp_level 6; gzip_typestext/plain text/css text/javascriptapplication/json application/javascript application/x-javascriptapplication/xml; gzip_vary on;gzip_proxied any; gzip on; #開啟壓縮功能
http { gzip on; # 開啟壓縮功能 gzip_min_length 1k; # 允許壓縮的對象的最小字節(jié) gzip_buffers 4 32k; # 壓縮緩沖區(qū)大小,表示申請4個(gè)單位為32k的內(nèi)存作為壓縮結(jié)果的緩存 gzip_http_version 1.1; # 壓縮版本,用于設(shè)置識別HTTP協(xié)議版本 gzip_comp_level 9; # 壓縮級別,1級壓縮比最小但處理速度最快,9級壓縮比最高但處理速度最慢 gzip_types text/plain application/x-javascript text/css application/xml; # 允許壓縮的媒體類型 gzip_vary on; # 該選項(xiàng)可以讓前端的緩存服務(wù)器緩存經(jīng)過gzip壓縮的頁面,例如用代理服務(wù)器緩存經(jīng)過Nginx壓縮的數(shù)據(jù) }
? gzip_min_length 1k
:設(shè)置允許壓縮的頁面最小字節(jié)數(shù),頁面字節(jié)數(shù)從header頭的Content-Length中獲取,默認(rèn)值是0,不管頁面多大都進(jìn)行壓縮,建議設(shè)置成大于1K,如果小與1K可能會越壓越大。
? gzip_buffers 4 32k
:壓縮緩沖區(qū)大小,表示申請4個(gè)單位為32K的內(nèi)存作為壓縮結(jié)果流緩存,默認(rèn)值是申請與原始數(shù)據(jù)大小相同的內(nèi)存空間來存儲gzip壓縮結(jié)果。
? gzip_http_version 1.1
:壓縮版本,用于設(shè)置識別HTTP協(xié)議版本,默認(rèn)是1.1,目前大部分瀏覽器已經(jīng)支持GZIP解壓,使用默認(rèn)即可。
? gzip_comp_level 6
:壓縮比例,用來指定GZIP壓縮比,1壓縮比最小,處理速度最快,9壓縮比最大,傳輸速度快,但是處理慢,也比較消耗CPU資源。
? gzip_types text/css text/xml application/javascript
:用來指定壓縮的類型,‘text/html’類型總是會被壓縮。默認(rèn)值: gzip_types text/html
(默認(rèn)不對js/css文件進(jìn)行壓縮)
? 壓縮類型,匹配MIME型進(jìn)行壓縮;
? 不能用通配符 text/*;
? text/html默認(rèn)已經(jīng)壓縮 (無論是否指定);
? 設(shè)置哪壓縮種文本文件可參考 conf/mime.types。
? gzip_vary on :varyheader支持,改選項(xiàng)可以讓前端的緩存服務(wù)器緩存經(jīng)過GZIP壓縮的頁面,例如用Squid緩存經(jīng)過nginx壓縮的數(shù)據(jù)。
9、expires 緩存調(diào)優(yōu)
Nginx expires 的功能就是給用戶訪問的靜態(tài)內(nèi)容設(shè)定一個(gè)過期時(shí)間。
當(dāng)用戶第一次訪問這些內(nèi)容時(shí),會把這些內(nèi)容存儲在用戶瀏覽器本地,這樣用戶第二次及以后繼續(xù)訪問該網(wǎng)站時(shí),瀏覽器會檢查加載已經(jīng)緩存在用戶瀏覽器本地的內(nèi)容,就不會去服務(wù)器下載了,直到緩存的內(nèi)容過期或被清除。
不希望被緩存的內(nèi)容:廣告圖片、網(wǎng)站流量統(tǒng)計(jì)工具、更新很頻繁的文件。
緩存期限參考:新浪緩存 15 天,京東緩存 25 年,淘寶緩存 10 年。
緩存,主要針對于圖片,css,js等元素更改機(jī)會比較少的情況下使用,特別是圖片,占用帶寬大,我們完全可以設(shè)置圖片在瀏覽器本地緩存365d,css,js,html可以緩存?zhèn)€10來天,這樣用戶第一次打開加載慢一點(diǎn),第二次,就非常快了!緩存的時(shí)候,我們需要將需要緩存的拓展名列出來, Expires緩存配置在server字段里面。
location ~* .(ico|jpe?g|gif|png|bmp|swf|flv)$ {expires 30d;#log_not_found off;access_log off;} location ~* .(js|css)$ {expires 7d;log_not_found off;access_log off;}
注:log_not_found off;是否在error_log中記錄不存在的錯(cuò)誤。默認(rèn)是。
總結(jié):
expire功能優(yōu)點(diǎn):
? expires可以降低網(wǎng)站購買的帶寬,節(jié)約成本;
? 同時(shí)提升用戶訪問體驗(yàn);
? 減輕服務(wù)的壓力,節(jié)約服務(wù)器成本,是web服務(wù)非常重要的功能。
expire功能缺點(diǎn):
? 被緩存的頁面或數(shù)據(jù)更新了,用戶看到的可能還是舊的內(nèi)容,反而影響用戶體驗(yàn)。
解決辦法:第一個(gè)縮短緩存時(shí)間,例如:1天,但不徹底,除非更新頻率大于1天;第二個(gè)對緩存的對象改名。
網(wǎng)站不希望被緩存的內(nèi)容:
? 網(wǎng)站流量統(tǒng)計(jì)工具;
? 更新頻繁的文件(google的logo)。
完整配置文件
server { listen 80; server_name www.abc.com abc.com; root html/www; location ~ .*.(gif|jpg|jpeg|png|bmp|swf|js|css)$ # 緩存的對象 { expires 3650d; # 緩存期限為 10 年 } }
10、防盜鏈
防盜鏈:簡單地說,就是其它網(wǎng)站未經(jīng)許可,通過在其自身網(wǎng)站程序里非法調(diào)用其他網(wǎng)站的資源,然后在自己的網(wǎng)站上顯示這些調(diào)用的資源,使得被盜鏈的那一端消耗帶寬資源 。
通過 HTTP referer 實(shí)現(xiàn)防盜鏈。
防止別人直接從你網(wǎng)站引用圖片等鏈接,消耗了你的資源和網(wǎng)絡(luò)流量,那么我們的解決辦法由幾種:
1、水印,品牌宣傳,你的帶寬,服務(wù)器足夠;
2、 防火墻,直接控制,前提是你知道IP來源;
3、防盜鏈策略下面的方法是直接給予404的錯(cuò)誤提示。
#第一種,匹配后綴 location ~ .*.(gif|jpg|jpeg|png|bm|swf|flv|rar|zip|gz|bz2)$ { # 指定需要使用防盜鏈的媒體資源 access_log off; # 不記錄日志 expires 15d; # 設(shè)置緩存時(shí)間 valid_referers none blocked *.test.com *.abc.com; # 表示僅允許這些域名訪問上面的媒體資源 if ($invalid_referer) { # 如果域名不是上面指定的地址就返回403 return 403 } } #第二種,綁定目錄 location /images { root /web/www/img; vaild_referers none blocked *.spdir.com *.spdir.top; if ($invalid_referer) { return 403; } }
`location ~*^.+.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {valid_referers noneblocked www.benet.com benet.com;if($invalid_referer) { #return 302 http://www.benet.com/img/nolink.jpg; return 404; break;}access_log off;}`
參數(shù)可以使如下形式:
? none :意思是不存在的Referer頭(表示空的,也就是直接訪問,比如直接在瀏覽器打開一個(gè)圖片)。
? blocked :意為根據(jù)防火墻偽裝Referer頭,如:“Referer:XXXXXXX”。
? server_names :為一個(gè)或多個(gè)服務(wù)器的列表,0.5.33版本以后可以在名稱中使用“*”通配符。
11、內(nèi)核參數(shù)優(yōu)化
net.ipv4.tcp_max_tw_buckets = 6000
timewait 的數(shù)量,默認(rèn)是180000。
net.ipv4.ip_local_port_range = 1024 65000
允許系統(tǒng)打開的端口范圍。
net.ipv4.tcp_tw_recycle = 1
啟用timewait 快速回收。
net.ipv4.tcp_tw_reuse = 1
開啟重用。允許將TIME-WAIT sockets 重新用于新的TCP 連接。
net.ipv4.tcp_syncookies = 1
開啟SYN Cookies,當(dāng)出現(xiàn)SYN 等待隊(duì)列溢出時(shí),啟用cookies 來處理。
net.core.somaxconn = 262144
web 應(yīng)用中l(wèi)isten 函數(shù)的backlog 默認(rèn)會給我們內(nèi)核參數(shù)的net.core.somaxconn 限制到128,而nginx 定義的NGX_LISTEN_BACKLOG 默認(rèn)為511,所以有必要調(diào)整這個(gè)值。
net.core.netdev_max_backlog = 262144
每個(gè)網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時(shí),允許送到隊(duì)列的數(shù)據(jù)包的最大數(shù)目。
net.ipv4.tcp_max_orphans = 262144
系統(tǒng)中最多有多少個(gè)TCP 套接字不被關(guān)聯(lián)到任何一個(gè)用戶文件句柄上。如果超過這個(gè)數(shù)字,孤兒連接將即刻被復(fù)位并打印出警告信息。這個(gè)限制僅僅是為了防止簡單的DoS 攻擊,不能過分依靠它或者人為地減小這個(gè)值,更應(yīng)該增加這個(gè)值(如果增加了內(nèi)存之后)。
net.ipv4.tcp_max_syn_backlog = 262144
記錄的那些尚未收到客戶端確認(rèn)信息的連接請求的最大值。對于有128M 內(nèi)存的系統(tǒng)而言,缺省值是1024,小內(nèi)存的系統(tǒng)則是128。
net.ipv4.tcp_timestamps = 0
時(shí)間戳可以避免序列號的卷繞。一個(gè)1Gbps 的鏈路肯定會遇到以前用過的序列號。時(shí)間戳能夠讓內(nèi)核接受這種“異常”的數(shù)據(jù)包。這里需要將其關(guān)掉。
net.ipv4.tcp_synack_retries = 1
為了打開對端的連接,內(nèi)核需要發(fā)送一個(gè)SYN 并附帶一個(gè)回應(yīng)前面一個(gè)SYN 的ACK。也就是所謂三次握手中的第二次握手。這個(gè)設(shè)置決定了內(nèi)核放棄連接之前發(fā)送SYN+ACK 包的數(shù)量。
net.ipv4.tcp_syn_retries = 1
在內(nèi)核放棄建立連接之前發(fā)送SYN 包的數(shù)量。
net.ipv4.tcp_fin_timeout = 1
如 果套接字由本端要求關(guān)閉,這個(gè)參數(shù)決定了它保持在FIN-WAIT-2 狀態(tài)的時(shí)間。對端可以出錯(cuò)并永遠(yuǎn)不關(guān)閉連接,甚至意外當(dāng)機(jī)。缺省值是60 秒。2.2 內(nèi)核的通常值是180 秒,3你可以按這個(gè)設(shè)置,但要記住的是,即使你的機(jī)器是一個(gè)輕載的WEB 服務(wù)器,也有因?yàn)榇罅康乃捞捉幼侄鴥?nèi)存溢出的風(fēng)險(xiǎn),F(xiàn)IN- WAIT-2 的危險(xiǎn)性比FIN-WAIT-1 要小,因?yàn)樗疃嘀荒艹缘?.5K 內(nèi)存,但是它們的生存期長些。
net.ipv4.tcp_keepalive_time = 30
當(dāng)keepalive 起用的時(shí)候,TCP 發(fā)送keepalive 消息的頻度。缺省是2 小時(shí)。
? fs.file-max =
999999:這個(gè)參數(shù)表示進(jìn)程(比如一個(gè)worker進(jìn)程)可以同時(shí)打開的最大句柄數(shù),這個(gè)參數(shù)直線限制最大并發(fā)連接數(shù),需根據(jù)實(shí)際情況配置。
? net.ipv4.tcp_max_tw_buckets = 6000
:這個(gè)參數(shù)表示操作系統(tǒng)允許TIME_WAIT套接字?jǐn)?shù)量的最大值,如果超過這個(gè)數(shù)字,TIME_WAIT套接字將立刻被清除并打印警告信息。該參數(shù)默認(rèn)為180000,過多的TIME_WAIT套接字會使Web服務(wù)器變慢。注:主動關(guān)閉連接的服務(wù)端會產(chǎn)生TIME_WAIT狀態(tài)的連接
? net.ipv4.ip_local_port_range = 1024 65000 :允許系統(tǒng)打開的端口范圍。
? net.ipv4.tcp_tw_recycle = 1 :啟用timewait快速回收。
? net.ipv4.tcp_tw_reuse = 1 :開啟重用。允許將TIME-WAIT
sockets重新用于新的TCP連接。這對于服務(wù)器來說很有意義,因?yàn)榉?wù)器上總會有大量TIME-WAIT狀態(tài)的連接。
? net.ipv4.tcp_keepalive_time =
30:這個(gè)參數(shù)表示當(dāng)keepalive啟用時(shí),TCP發(fā)送keepalive消息的頻度。默認(rèn)是2小時(shí),若將其設(shè)置的小一些,可以更快地清理無效的連接。
? net.ipv4.tcp_syncookies = 1 :開啟SYN
Cookies,當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookies來處理。
? net.core.somaxconn = 40960 :web 應(yīng)用中 listen 函數(shù)的 backlog 默認(rèn)會給我們內(nèi)核參數(shù)的。
? net.core.somaxconn :限制到128,而nginx定義的NGX_LISTEN_BACKLOG
默認(rèn)為511,所以有必要調(diào)整這個(gè)值。注:對于一個(gè)TCP連接,Server與Client需要通過三次握手來建立網(wǎng)絡(luò)連接.當(dāng)三次握手成功后,我們可以看到端口的狀態(tài)由LISTEN轉(zhuǎn)變?yōu)镋STABLISHED,接著這條鏈路上就可以開始傳送數(shù)據(jù)了.每一個(gè)處于監(jiān)聽(Listen)狀態(tài)的端口,都有自己的監(jiān)聽隊(duì)列.監(jiān)聽隊(duì)列的長度與如somaxconn參數(shù)和使用該端口的程序中l(wèi)isten()函數(shù)有關(guān)。somaxconn定義了系統(tǒng)中每一個(gè)端口最大的監(jiān)聽隊(duì)列的長度,這是個(gè)全局的參數(shù),默認(rèn)值為128,對于一個(gè)經(jīng)常處理新連接的高負(fù)載
web服務(wù)環(huán)境來說,默認(rèn)的 128 太小了。大多數(shù)環(huán)境這個(gè)值建議增加到 1024 或者更多。大的偵聽隊(duì)列對防止拒絕服務(wù) DoS
攻擊也會有所幫助。
? net.core.netdev_max_backlog = 262144
:每個(gè)網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時(shí),允許送到隊(duì)列的數(shù)據(jù)包的最大數(shù)目。
? net.ipv4.tcp_max_syn_backlog = 262144
:這個(gè)參數(shù)標(biāo)示TCP三次握手建立階段接受SYN請求隊(duì)列的最大長度,默認(rèn)為1024,將其設(shè)置得大一些可以使出現(xiàn)Nginx繁忙來不及accept新連接的情況時(shí),Linux不至于丟失客戶端發(fā)起的連接請求。
? net.ipv4.tcp_rmem = 10240 87380 12582912
:這個(gè)參數(shù)定義了TCP接受緩存(用于TCP接受滑動窗口)的最小值、默認(rèn)值、最大值。
? net.ipv4.tcp_wmem = 10240 87380
12582912:這個(gè)參數(shù)定義了TCP發(fā)送緩存(用于TCP發(fā)送滑動窗口)的最小值、默認(rèn)值、最大值。
? net.core.rmem_default = 6291456:這個(gè)參數(shù)表示內(nèi)核套接字接受緩存區(qū)默認(rèn)的大小。
? net.core.wmem_default = 6291456:這個(gè)參數(shù)表示內(nèi)核套接字發(fā)送緩存區(qū)默認(rèn)的大小。
? net.core.rmem_max = 12582912:這個(gè)參數(shù)表示內(nèi)核套接字接受緩存區(qū)的最大大小。
? net.core.wmem_max = 12582912:這個(gè)參數(shù)表示內(nèi)核套接字發(fā)送緩存區(qū)的最大大小。
? net.ipv4.tcp_syncookies = 1:該參數(shù)與性能無關(guān),用于解決TCP的SYN攻擊。
下面貼一個(gè)完整的內(nèi)核優(yōu)化設(shè)置:
fs.file-max = 999999 net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 net.ipv4.tcp_max_tw_buckets = 6000 net.ipv4.tcp_sack = 1 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_rmem = 10240 87380 12582912 net.ipv4.tcp_wmem = 10240 87380 12582912 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.netdev_max_backlog = 262144 net.core.somaxconn = 40960net.ipv4.tcp_max_orphans = 3276800 net.ipv4.tcp_max_syn_backlog = 262144 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_synack_retries = 1 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 94500000 915000000 927000000 net.ipv4.tcp_fin_timeout = 1 net.ipv4.tcp_keepalive_time = 30 net.ipv4.ip_local_port_range = 1024 65000
執(zhí)行sysctl -p使內(nèi)核修改生效。
`/sbin/sysctl -p`
12、關(guān)于系統(tǒng)連接數(shù)的優(yōu)化
linux 默認(rèn)值 open files為1024。查看當(dāng)前系統(tǒng)值:
# ulimit -n 1024
#ulimit Cu 1024
說明server只允許同時(shí)打開1024個(gè)文件。
使用ulimit -a 可以查看當(dāng)前系統(tǒng)的所有限制值,使用ulimit -n 可以查看當(dāng)前的最大打開文件數(shù)。
新裝的linux 默認(rèn)只有1024 ,當(dāng)作負(fù)載較大的服務(wù)器時(shí),很容易遇到error: too many open files。
解決方法:
使用 ulimit Cn 65535 可即時(shí)修改,但重啟后就無效了。(注ulimit -SHn 65535 等效 ulimit -n 65535 ,-S 指soft ,-H 指hard)
需要將其改大。
有如下三種修改方式:
1、在/etc/rc.local 中增加一行 ulimit -SHn 65535
2、在/etc/profile 中增加一行 ulimit -SHn 65535
3、在/etc/security/limits.conf 最后增加:
* soft nofile 65535 * hard nofile 65535 * soft noproc 65535 * hard noproc 65535
具體使用哪種,在 CentOS 中使用第1 種方式無效果,使用第3 種方式有效果,而在Debian 中使用第2 種有效果
# ulimit -n 65535
# ulimit -u 65535
備注:ulimit 命令本身就有分軟硬設(shè)置,加-H 就是硬,加-S 就是軟默認(rèn)顯示的是軟限制。
soft 限制指的是當(dāng)前系統(tǒng)生效的設(shè)置值。hard 限制值可以被普通用戶降低。但是不能增加。soft 限制不能設(shè)置的比 hard 限制更高。只有 root 用戶才能夠增加 hard 限制值。
13、配置默認(rèn)主頁
location / { index index.html index.htm index.php l.php; autoindex off; }
14、配置反向代理
location / { proxy_pass http://localhost:8888; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
15、調(diào)整最大連接數(shù)
控制 Nginx 單個(gè)進(jìn)程允許的最大連接數(shù)的參數(shù)為 worker_connections ,這個(gè)參數(shù)要根據(jù)服務(wù)器性能和內(nèi)存使用量來調(diào)整。
進(jìn)程的最大連接數(shù)受 Linux 系統(tǒng)進(jìn)程打開的最大文件數(shù)的限制,只有執(zhí)行了 “ulimit -HSn 65535” 之后,worker_connections 才能生效。
連接數(shù)包括代理服務(wù)器的連接、客戶端的連接等,Nginx 總并發(fā)連接數(shù) = worker_processes * worker_connections。總數(shù)保持在 3w 左右即可。
worker_processes 2; worker_cpu_affinity 01 10; user nginx nginx; events { use epoll; worker_connections 15000; }
16、綁定 Nginx 進(jìn)程到不同的 CPU 上
默認(rèn)情況下,Nginx 的多個(gè)進(jìn)程有可能跑在某一個(gè) CPU 或 CPU 的某一核上,導(dǎo)致 Nginx 進(jìn)程使用硬件的資源不均,因此綁定 Nginx 進(jìn)程到不同的 CPU 上是為了充分利用硬件的多 CPU 多核資源。
[root@localhost ~]# grep -c processor /proc/cpuinfo # 查看CPU核數(shù) 2 worker_processes 2; # 2核CPU的配置 worker_cpu_affinity 01 10; worker_processes 4; # 4核CPU的配置 worker_cpu_affinity 0001 0010 0100 1000; worker_processes 8; # 8核CPU的配置 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 1000000; [root@localhost ~]# /usr/local/nginx/sbin/nginx -t [root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload
17、限制上傳文件的大小
client_max_body_size 用于設(shè)置最大的允許客戶端請求主體的大小。 在請求頭中有 "Content-Length" ,如果超過了此配置項(xiàng),客戶端會收到 413 錯(cuò)誤,即請求的條目過大。 http { client_max_body_size 8m; # 設(shè)置客戶端最大的請求主體大小為 8 M }
18、操作系統(tǒng)優(yōu)化
1、配置文件/etc/sysctl.conf,如下:
sysctl -w net.ipv4.tcp_syncookies=1 #防止一個(gè)套接字在有過多試圖連接到達(dá)時(shí)引起過載 sysctl -w net.core.somaxconn=1024 #默認(rèn)128,連接隊(duì)列 sysctl -w net.ipv4.tcp_fin_timeout=10 #timewait的超時(shí)時(shí)間 sysctl -w net.ipv4.tcp_tw_reuse=1 #os直接使用timevait的連接 sysctl -w net.ipv4.tcp_tw_recycle=0 #回收禁用
2、配置文件/etc/security/limits.conf,如下:
hard nofile 204800 soft nofile 204800 soft core unlimited soft stack 204800 或者 #針對root?戶,soft僅提醒,hard限制,nofile打開最??件數(shù) # *代表所有?戶 * soft nofile 25535 * hard nofile 25535 root soft nofile 65535 root hard nofile 65535 #針對Nginx進(jìn)程 worker_rlimit_nofile 65535;
內(nèi)核參數(shù)優(yōu)化
[root@web01 ROOT]# vim /etc/sysctl.conf net.ipv4.ip_local_port_range = 10240 61000 #調(diào)整系統(tǒng)能使?的端?數(shù)量 net.core.somaxconn = 1024 #默認(rèn)128,連接隊(duì)列 net.ipv4.tcp_fin_timeout = 10 #time_wait的超時(shí)時(shí)間 net.ipv4.tcp_tw_reuse = 1 #重新使?time_wait的連接 net.ipv4.tcp_timestamps = 1 [root@web01 ROOT]# sysctl -p
# NGINX優(yōu)化
https://www.jianshu.com/p/0cac2af781b4
Nginx性能優(yōu)化實(shí)踐
1.性能優(yōu)化概述
2.系統(tǒng)性能優(yōu)化
3.代理服務(wù)優(yōu)化
4.靜態(tài)資源優(yōu)化
? 4.1 靜態(tài)資源緩存
? 4.2 靜態(tài)資源讀取
? 4.3 靜態(tài)資源壓縮
? 4.4 靜態(tài)資源防盜鏈
? 4.5 靜態(tài)資源防爬?
? 4.6 CPU親和配置
5.Nginx配置總結(jié)
6.PHP服務(wù)優(yōu)化
? 6.1 PHP配置?件
? 6.2 PHP監(jiān)控模塊
? 6.3 PHP?志管理
? 6.4 PHP最終配置
影響Nginx性能的?些指標(biāo)
1.硬件層 需要了解: 磁盤損壞、磁盤速率。
1.網(wǎng)絡(luò)層 需要了解: 網(wǎng)絡(luò)帶寬、網(wǎng)絡(luò)是否丟包、因?yàn)檫@些都會影響http的請求與調(diào)?。
2.系統(tǒng)層 需要了解: 系統(tǒng)負(fù)載、系統(tǒng)內(nèi)存,以及系統(tǒng)整體的穩(wěn)定性。
3.服務(wù)層 需要了解: 連接與請求的限速,同時(shí)還需要根據(jù)業(yè)務(wù)形態(tài)做對應(yīng)的服務(wù)設(shè)置。
4.程序?qū)?需要了解: 接口性能、處理速度、程序執(zhí)行效率。
5.數(shù)據(jù)層 需要了解: 數(shù)據(jù)庫。
代理服務(wù)優(yōu)化
通常Nginx作為代理服務(wù),負(fù)責(zé)代理?戶的請求,那么在代理的過程中建議開啟HTTP?連接,?于減少握?次數(shù),降低服務(wù)器損耗。
1.連接語法示例,(應(yīng)層優(yōu)化)
Syntax:keepalive connections; Default:— Context:upstream Syntax:keepalive_requests number; #keepalive_requests設(shè)置通過?個(gè)keepalive連 接提供的最?請求數(shù)。在發(fā)出最?請求數(shù)后,將關(guān)閉連接。 Default:keepalive_requests100; Context:upstream Syntax:keepalive_timeout timeout; #keepalive_timeout超時(shí),在此期間與代理服務(wù)器的 空閑keepalive連接將保持打開狀態(tài)。 Default:keepalive_timeout60s; Context:upstream
2.配置Nginx代理服務(wù)使??連接?式NGINX ?持 Keepalive ?連接
upstream http_backend { server 127.0.0.1:8080; server 127.0.0.1:8081; keepalive 32; #Nginx到應(yīng)?服務(wù)器的連接池??最?的空閑?連接數(shù)。也就是最 多有32個(gè)空閑的?連接 keepalive_requests 100; #Nginx到應(yīng)?應(yīng)?服務(wù)器的?個(gè)?連接最多可承載處理的HTTP請求 個(gè)數(shù),最多處理100個(gè),到100個(gè)后?動關(guān)閉該連接,有需要Nginx會再?成新的?連接 keepalive_time 60s; #keepalive_timeout超時(shí),在60s時(shí)間內(nèi)代理服務(wù)器的空閑 keepalive連接將保持打開狀態(tài) } server { ... location /http/ { proxy_pass http://http_backend; proxy_http_version 1.1; #這?設(shè)置了proxy代理的協(xié)議,如果沒有設(shè)置的化 默認(rèn)是1.0。只有http1.1后才增加了?連接的?持。 proxy_set_header Connection ""; #清除“connection”頭字段,是清理從 Client 過來的 http header,因?yàn)榧词故?Client 和 NGINX 之間是短連接,NGINX 和 upstream 之間也 是可以開啟?連接的。這種情況下必須清理來? Client 請求中的 “Connection” header。 #proxy_params代理優(yōu)化參數(shù)[此前已講,不再復(fù)述] proxy_set_header Host $http_host; proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for; proxy_connect_timeout 30s; # 代理連接web超時(shí)時(shí)間 proxy_read_timeout 60s; # 代理等待web響應(yīng)超時(shí)時(shí)間 proxy_send_timeout 60s; # web回傳數(shù)據(jù)?代理超時(shí)時(shí)間 proxy_buffering on; # 開啟代理緩沖區(qū),web回傳數(shù)據(jù)?緩沖區(qū),代理邊收邊傳返回 給客戶端 proxy_buffer_size 32k; # 代理接收web響應(yīng)的頭信息的緩沖區(qū)?? proxy_buffers 4 128k; # 緩沖代理接收單個(gè)?連接內(nèi)包含的web響應(yīng)的數(shù)量和?? #異常后的超時(shí)與重試機(jī)制 proxy_next_upstream error timeout http_500 http_502 http_503 http_504; # 重試upstream中的下?臺后端 proxy_next_upstream_timeout 6s; #重試次數(shù)的總時(shí)間超出了6s proxy_next_upstream_tries 3; #重試3次(但因?yàn)橹耙呀?jīng)請求1次了,所以還能重試2次), 則表示重試失敗 } }
對于fastcgi服務(wù)器,需要設(shè)置fastcgi_keep_conn以便保持?連接
upstream fastcgi_backend { server 127.0.0.1:9000; keepalive 16; #Nginx到應(yīng)?服務(wù)器的連接池??最?的空閑?連接數(shù)。也就是最多有16個(gè)空 閑的?連接 } server { ... location /fastcgi/ { fastcgi_pass fastcgi_backend; fastcgi_keep_conn on; #開啟保持?連接 fastcgi_connect_timeout 600; #指定連接到后端FastCGI的超時(shí)時(shí)間 fastcgi_send_timeout 600; #向FastCGI傳送請求的超時(shí)時(shí)間 fastcgi_read_timeout 600; #指定接收FastCGI應(yīng)答的超時(shí)時(shí)間 fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; #異常后的超時(shí)與重試機(jī)制 fastcgi_next_upstream error timeout http_500 http_502 http_503 http_504; #重試upstream中的下?臺后端 fastcgi_next_upstream_timeout 6s; #重試次數(shù)的總時(shí)間超出了6s fastcgi_next_upstream_tries 3; #重試了3次(因?yàn)橹耙呀?jīng)請求1次了,所以還能重試2 次),則表示重試失敗. } }
CPU親和配置
CPU親和(affinity)減少進(jìn)程之間不斷頻繁切換,減少性能損耗,其實(shí)現(xiàn)原理是將CPU核?和Nginx?作進(jìn)程綁定?式,把每個(gè)worker進(jìn)程固定對應(yīng)的cpu上執(zhí)?,減少切換cpu的cache miss,獲得更好的性能。
1.查看當(dāng)前CPU物理狀態(tài)
[root@nginx ~]# lscpu |grep "CPU(s)" CPU(s): 24 On-line CPU(s) list: 0-23 NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22 NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23 #本次演示服務(wù)器為兩顆物理cpu,每顆物理CPU12個(gè)核?, 總共有24個(gè)核?
2.將Nginx worker進(jìn)程綁?不同的核?上,官?建議與cpu的核?保持?致
# 第?種綁定組合?式 worker_processes 24; worker_cpu_affinity 000000000001 000000000010 000000000100 000000001000 000000010000 000000100000 000001000000 000010000000 000100000000 001000000000 010000000000 10000000000; # 第?種?式(使?較少) worker_processes 2; worker_cpu_affinity 101010101010 010101010101; # 最佳?式綁定?式 worker_processes auto; worker_cpu_affinity auto;
3.查看 nginx worker 進(jìn)程綁定?對應(yīng) cpu
ps-eopid,args,psr|grep[n]ginx
? 1
4.設(shè)置nginx worker進(jìn)程的靜態(tài)優(yōu)先級,盡可能讓nginx?直使?cpu
worker_priority number; #默認(rèn)值是0,可以設(shè)置為-20,減少cpu上下?切換的次數(shù)
Nginx配置總結(jié)
1.Nginx通?的主配置?件nginx.conf,包含靜態(tài)資源優(yōu)化
[root@nginx ~]# cat nginx.conf user www; # nginx進(jìn)程啟動?戶 worker_processes auto; #與cpu核??致即可 worker_cpu_affinity auto; # cpu親和 error_log /var/log/nginx/error.log warn; #錯(cuò)誤?志 pid /run/nginx.pid; worker_rlimit_nofile 35535; #每個(gè)work能打開的?件描述符,調(diào)整?1w以上,負(fù)荷較?建議 2-3w events { use epoll; # 使?epoll?效?絡(luò)模型 worker_connections 10240; # 限制每個(gè)worker進(jìn)程能處理多少個(gè)連接,10240x[cpu核 ?] } http { include mime.types; default_type application/octet-stream; charset utf-8; # 統(tǒng)?使?utf-8字符集 # 定義?志格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; # 訪問?志 server_tokens off; # 禁?瀏覽器顯示nginx版本號 client_max_body_size 200m; # ?件上傳??限制調(diào)整 # ?件?效傳輸,靜態(tài)資源服務(wù)器建議打開 sendfile on; tcp_nopush on; # ?件實(shí)時(shí)傳輸,動態(tài)資源服務(wù)建議打開,需要打開keepalived tcp_nodelay on; keepalive_timeout 65; # Gzip 壓縮 gzip on; gzip_complevel 2; gzip_disable "MSIE [1-6]."; gzip_http_version 1.1; gzip_types .....; # 虛擬主機(jī) include /etc/nginx/conf.d/*.conf; }
一個(gè)簡單的nginx 配置文件:
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 204800; events { use epoll; worker_connections 204800; } 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 4k; fastcgi_buffers 8 4k; fastcgi_busy_buffers_size 8k; fastcgi_temp_file_write_size 8k; 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 backup.aiju.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; } }
擴(kuò)展
Nginx優(yōu)化配置詳解
基本參數(shù)優(yōu)化
server_tokens off; #關(guān)閉在錯(cuò)誤頁面中的nginx版本號,安全性是有好處的 sendfile on; #傳輸文件時(shí)發(fā)揮作用 tcp_nopush on; #一個(gè)數(shù)據(jù)包里發(fā)送所有頭文件 tcp_nodelay on; #不緩存數(shù)據(jù) keepalive_timeout 10; #在這個(gè)超時(shí)時(shí)間過后關(guān)閉客戶端鏈接 client_header_timeout 10; #設(shè)置請求頭的超時(shí)時(shí)間 client_body_timeout 10; #設(shè)置請求體的超時(shí)時(shí)間 reset_timeout_connection on; #開啟關(guān)閉不響應(yīng)的客戶端連接功能,釋放客戶端所占的內(nèi)存空間 send_timeout 10; #客戶端的響應(yīng)超時(shí)時(shí)間。如果在這段時(shí)間內(nèi),客戶端沒有讀取任何數(shù)據(jù),nginx就會關(guān)閉連接。 #limit_conn_zone 設(shè)置用于保存各種key(比如當(dāng)前連接數(shù))的共享內(nèi)存的參數(shù)。5m就是5兆字節(jié),這個(gè)值應(yīng)該被設(shè)置的足夠大以存儲(32K5)32byte狀態(tài)或者(16K5)64byte狀態(tài)。 limit_conn #為給定的key設(shè)置最大連接數(shù)。這里key是addr,我們設(shè)置的值是100,也就是說我們允許每一個(gè)IP地址最多同時(shí)打開有100個(gè)連接。 default_type #設(shè)置文件使用的默認(rèn)的MIME-type。 charset #設(shè)置我們的頭文件中的默認(rèn)的字符集
Gzip壓縮優(yōu)化
gzip_types #壓縮的文件類型 text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript gzip on; #采用gzip壓縮的形式發(fā)送數(shù)據(jù) gzip_disable"msie6" #為指定的客戶端禁用gzip功能 gzip_static; #壓縮前查找是否有預(yù)先gzip處理過的資源 gzip_proxied any; #允許或者禁止壓縮基于請求和響應(yīng)的響應(yīng)流 gzip_min_length 1000; #設(shè)置對數(shù)據(jù)啟用壓縮的最少字節(jié)數(shù) gzip_comp_level 6; #設(shè)置數(shù)據(jù)的壓縮等級
FastCGI參數(shù)優(yōu)化
fastcgi_cache_path /data/ngx_fcgi_cache #緩存路徑 levels=2:2 #目錄結(jié)構(gòu)等級 keys_zone=ngx_fcgi_cache:512m #關(guān)鍵字區(qū)域存儲時(shí)間 inactive=1d #非活動刪除時(shí)間 fastcgi_connect_timeout 240; #連接到后端fastcgi的超時(shí)時(shí)間 fastcgi_send_timeout 240; #建立連接后多久不傳送數(shù)據(jù)就斷開 fastcgi_read_timeout 240; #接收fastcgi應(yīng)答的超時(shí)時(shí)間 fastcgi_buffer_size 64k; #指定讀取fastcgi應(yīng)答緩沖區(qū)大小 fastcgi_buffers 4 64k; #指定本地緩沖區(qū)大小(緩沖FaseCGI應(yīng)答請求) fastcgi_busy_buffers_size 128k; #繁忙時(shí)的buffer,可以是fastcgi_buffer的兩倍 fastcgi_temp_file_write_size 128k; #在寫入緩存文件時(shí)用多大的數(shù)據(jù)塊,默認(rèn)是fastcgi_buffer的兩倍 fastcgi_cache mingongge; #開啟緩存時(shí)指定一個(gè)名稱 fastcgi_cache_valid 200 302 1h; #指定應(yīng)答碼200 302 緩存一小時(shí) fastcgi_cache_valid 301 1d; #指定應(yīng)答碼301緩存一天 fastcgi_cache_valid any 1m; #指定其它應(yīng)答碼緩存一月
其它參數(shù)優(yōu)化
open_file_cache #指定緩存最大數(shù)目以及緩存的時(shí)間 open_file_cache_valid #在open_file_cache中指定檢測正確信息的間隔時(shí)間 open_file_cache_min_uses #定義了open_file_cache中指令參數(shù)不活動時(shí)間期間里最小的文件數(shù) open_file_cache_errors #指定了當(dāng)搜索一個(gè)文件時(shí)是否緩存錯(cuò)誤信息 location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ #指定緩存文件的類型 { expires 3650d; #指定緩存時(shí)間 } location ~ .*.(js|css)?$ { expires 3d; } expires有個(gè)缺點(diǎn)就是如果更新WEB數(shù)據(jù)后,用戶沒有清理緩存,會看到舊的數(shù)據(jù),因此建議將時(shí)間設(shè)置短一點(diǎn)
優(yōu)化后完整的配置文件
user www; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofile 100000; events { worker_connections 2048; multi_accept on; use epoll; } http { server_tokens off; sendfile on; tcp_nopush on; tcp_nodelay on; access_log off; error_log /var/log/nginx/error.log crit; keepalive_timeout 10; client_header_timeout 10; client_body_timeout 10; reset_timedout_connection on; send_timeout 10; limit_conn_zone $binary_remote_addr zone=addr:5m; limit_conn addr 100; include /etc/nginx/mime.types; default_type text/html; charset UTF-8; gzip on; gzip_disable "msie6"; gzip_proxied any; gzip_min_length 1000; gzip_comp_level 6; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; open_file_cache max=100000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
Nginx踩坑總結(jié)
摘要: 顯示亂碼問題server { listen 80; server_name example.com; root /var/www/example; location / { charset utf-8; #一般是在個(gè)別的location中加入此項(xiàng),具體情況具體對待 rewrite .* /index.html break; }}index顯示列表(一般為企業(yè)內(nèi)部使用)可在在location server 或 http段中加入autoindex on;// …
顯示亂碼問題
server { listen 80; server_name example.com; root /var/www/example; location / { charset utf-8; #一般是在個(gè)別的location中加入此項(xiàng),具體情況具體對待 rewrite .* /index.html break; } }
index顯示列表(一般為企業(yè)內(nèi)部使用)
可在在location server 或 http段中加入
autoindex on;//自動顯示目錄 autoindex_exact_size off;//人性化方式顯示文件大小否則以byte顯示 autoindex_localtime on;//按服務(wù)器時(shí)間顯示,否則以gmt時(shí)間顯示
location用法
=:對URI做精確匹配; tlocation = / { tt... t} ~:對URI做正則表達(dá)式模式匹配,區(qū)分字符大小寫; ~*:對URI做正則表達(dá)式模式匹配,不區(qū)分字符大小寫; ^~:對URI的左半部分做匹配檢查,不區(qū)分字符大小寫; 不帶符號:匹配起始于此uri的所有的url; location /lizi { tt... t} t例如www.example.com/lizi/xxx/xxx t只要是路徑以/lizi開頭的都匹配,這種一般用于最后的通用匹配。
_注意:匹配優(yōu)先級:=, ^~, ~/~,不帶符號;_*
具體匹配方式 http://seanlook.com/2015/05/17/nginx-location-rewrite/
常用優(yōu)化配置
1.網(wǎng)絡(luò)連接的優(yōu)化:
只能在events模塊設(shè)置,用于防止在同一一個(gè)時(shí)刻只有一個(gè)請求的情況下,出現(xiàn)多個(gè)睡眠進(jìn)程會被喚醒但只能有一個(gè)進(jìn)程可獲得請求的尷尬,如果不優(yōu)化,在多進(jìn)程的nginx會影響以部分性能。
events { accept_mutex on; #優(yōu)化同一時(shí)刻只有一個(gè)請求而避免多個(gè)睡眠進(jìn)程被喚醒的設(shè)置,on為防止被同時(shí)喚醒,默認(rèn)為off,因此nginx剛安裝完以后要進(jìn)行適當(dāng)?shù)膬?yōu)化。 }
2.隱藏ngxin版本號:
當(dāng)前使用的nginx可能會有未知的漏洞,如果被黑客使用將會造成無法估量的損失,但是我們可以將nginx的版本隱藏,如下:
server_tokensoff;#在http 模塊當(dāng)中配置
3.選擇事件驅(qū)動模型:
Nginx支持眾多的事件驅(qū)動,比如select、poll、epoll,只能設(shè)置在events模塊中設(shè)置:
events { accept_mutex on; multi_accept on; use epoll; #使用epoll事件驅(qū)動,因?yàn)閑poll的性能相比其他事件驅(qū)動要好很多 }
4.配置單個(gè)工作進(jìn)程的最大連接數(shù):
通過worker_connections number;進(jìn)行設(shè)置,numebr為整數(shù),number的值不能大于操作系統(tǒng)能打開的最大的文件句柄數(shù),使用ulimit -n可以查看當(dāng)前操作系統(tǒng)支持的最大文件句柄數(shù),默認(rèn)為為1024.
events { worker_connections 102400; #設(shè)置單個(gè)工作進(jìn)程最大連接數(shù)102400 }
5.配置允許sendfile方式傳輸文件:
是由后端程序負(fù)責(zé)把源文件打包加密生成目標(biāo)文件,然后程序讀取目標(biāo)文件返回給瀏覽器;這種做法有個(gè)致命的缺陷就是占用大量后端程序資源,如果遇到一些訪客下載速度巨慢,就會造成大量資源被長期占用得不到釋放(如后端程序占用的CPU/內(nèi)存/進(jìn)程等),很快后端程序就會因?yàn)闆]有資源可用而無法正常提供服務(wù)。通常表現(xiàn)就是 nginx報(bào)502錯(cuò)誤,而sendfile打開后配合location可以實(shí)現(xiàn)有nginx檢測文件使用存在,如果存在就有nginx直接提供靜態(tài)文件的瀏覽服務(wù),因此可以提升服務(wù)器性能.
sendfile on; # 可以配置在http、server或者location模塊,配置如下: sendfile_max_chunk 512k; #Nginxg工作進(jìn)程每次調(diào)用sendfile()傳輸?shù)臄?shù)據(jù)最大不能超出這個(gè)值,默認(rèn)值為0表示無限制,可以設(shè)置在http/server/location模塊中。
6.會話保持時(shí)間:
用戶和服務(wù)器建立連接后客戶端分配keep-alive鏈接超時(shí)時(shí)間,服務(wù)器將在這個(gè)超時(shí)時(shí)間過后關(guān)閉鏈接,我們將它設(shè)置低些可以讓ngnix持續(xù)工作的時(shí)間更長,1.8.1默認(rèn)為65秒,一般不超過120秒。
keepalive_timeout 65 60; #后面的60為發(fā)送給客戶端應(yīng)答報(bào)文頭部中顯示的超時(shí)時(shí)間設(shè)置為60s:如不設(shè)置客戶端將不顯示超時(shí)時(shí)間。 Keep-Alive:timeout=60 #瀏覽器收到的服務(wù)器返回的報(bào)文 如果設(shè)置為0表示關(guān)閉會話保持功能,將如下顯示: Connection:close #瀏覽器收到的服務(wù)器返回的報(bào)文
7.配置nginx worker進(jìn)程最大打開文件數(shù)
`worker_rlimit_nofile 65535;`
8.配置nginx gzip壓縮實(shí)現(xiàn)性能優(yōu)化
圖片、視頻(流媒體)等文件盡量不要壓縮,因?yàn)檫@些文件大多都是經(jīng)過壓縮的,如果再壓縮很可能不會減小或減小很少,或者有可能增大,而在壓縮時(shí)還會消耗大量的CPU、內(nèi)存資源
gzip on; #表示開啟壓縮功能 gzip_min_length 1k; #表示允許壓縮的頁面最小字節(jié)數(shù),頁面字節(jié)數(shù)從header頭的Content-Length中獲取。默認(rèn)值是0,表示不管頁面多大都進(jìn)行壓縮,建議設(shè)置成大于1K。如果小于1K可能會越壓越大 gzip_buffers 432k; #壓縮緩存區(qū)大小 gzip_http_version 1.1; #壓縮版本 gzip_comp_level 9; #壓縮比率 gzip_types text/css text/xml application/javascript; #指定壓縮的類型 gzip_vary on; #vary header支持
9.nginx expires功能
為用戶訪問網(wǎng)站的內(nèi)容設(shè)定一個(gè)過期時(shí)間,當(dāng)用戶第一次訪問到這些內(nèi)容時(shí),會把這些內(nèi)容存儲在用戶瀏覽器本地,這樣用戶第二次及之后繼續(xù)訪問該網(wǎng)站,瀏覽器就會檢查已經(jīng)緩存在用戶瀏覽器本地的內(nèi)容,就不會去瀏覽器下載了,直到緩存的內(nèi)容過期或者被清除為止。
## Add expires header according to URI(path or dir). location ~ ^/(images|javascript|js|css|flash|media|static)/ { expires 360d; }
常用正則(跟Linux上的正則沒什么區(qū)別)
. : 匹配除換行符以外的任意字符 ? : 重復(fù)0次或1次 + : 重復(fù)1次或更多次 * : 重復(fù)0次或更多次 d :匹配數(shù)字 ^ : 匹配字符串的開始 $ : 匹配字符串的結(jié)束 {n} : 重復(fù)n次 {n,} : 重復(fù)n次或更多次 [c] : 匹配單個(gè)字符c [a-z] : 匹配a-z小寫字母的任意一個(gè)
類似分組():小括號()之間匹配的內(nèi)容,可以在后面通過2表示的是前面第二個(gè)()里的內(nèi)容。正則里面容易讓人困惑的是轉(zhuǎn)義特殊字符。
rewrite實(shí)例
http { # 定義image日志格式 log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status; # 開啟重寫日志 rewrite_log on; server { root /home/www; location / { # 重寫規(guī)則信息 error_log logs/rewrite.log notice; # 注意這里要用‘’單引號引起來,避免{} rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*).(png|jpg|gif)$' /data?file=$3.$4; # 注意不能在上面這條規(guī)則后面加上“l(fā)ast”參數(shù),否則下面的set指令不會執(zhí)行 set $image_file $3; set $image_type $4; } location /data { # 指定針對圖片的日志格式,來分析圖片類型和大小 access_log logs/images.log mian; root /data/images; # 應(yīng)用前面定義的變量。判斷首先文件在不在,不在再判斷目錄在不在,如果還不在就跳轉(zhuǎn)到最后一個(gè)url里 try_files /$arg_file /image404.html; } location = /image404.html { # 圖片不存在返回特定的信息 return 404 "image not foundn"; } }
if語句塊
例子是網(wǎng)上找的,if語句塊長用在做單獨(dú)的限制,如限制訪問特定的資源,然后對此類請求做處理,rewire或者deny或者proxy_pass等等。
if ($http_user_agent ~ MSIE) {proxy_pass rewrite ^(.*)$ /msie/$1 break; } //如果UA包含"MSIE",rewrite請求到/msid/目錄下 if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } //如果cookie匹配正則,設(shè)置變量$id等于正則引用部分 if ($request_method = POST) { return 405; } //如果提交方法為POST,則返回狀態(tài)405(Method not allowed)。return不能返回301,302 if ($slow) { limit_rate 10k; } //限速,$slow可以通過 set 指令設(shè)置 if (!-f $request_filename){ break; proxy_pass http://127.0.0.1; } //如果請求的文件名不存在,則反向代理到localhost 。這里的break也是停止rewrite檢查 if ($args ~ post=140){ rewrite ^ http://example.com/ permanent; } //如果query string中包含"post=140",永久重定向到example.com location ~* .(gif|jpg|png|swf|flv)$ { valid_referers none blocked www.jefflei.com www.leizhenfang.com; if ($invalid_referer) { return 404; } //防盜鏈 }
https
定義一個(gè)新的server,配置如下,必須的配置有l(wèi)isten ,server_name, ssl ,ssl_certificate, ssl_certificate_key,一般配置的時(shí)候我都是直接復(fù)制,然后改主機(jī)名,證書私鑰文件,日志路徑,root的根目錄這幾項(xiàng)。
如果想讓訪問80的轉(zhuǎn)到443,可用rewrite語句
listen 443; server_name agent.t.jlhcar.com; ssl on; ssl_certificate, "/usr/local/certificate/agent.t.jlhcar.com.pem";證書 ssl_certificate_key "/usr/local/certificate/agent.t.jlhcar.com.key";私鑰 ssl_session_cache shared1m; ssl_session_timeout 10m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256ECDHHIGH!aNULL!ADH:!RC4; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2;協(xié)議 ... //日志以及root根目錄的其他配置 server { listen 80; server_name agent.xxx.com; rewrite ^/(.*)$ https://agent.xxx.com/$1; }
注意:曾經(jīng)遇到過這么一個(gè)坑,http轉(zhuǎn)https的時(shí)候會將POST轉(zhuǎn)換為GET請求,此時(shí)需要這樣配置
server { listen 80; server_name dev-payment.xxxx.cn; return 307 https://dev-payment.xxxx.cn$request_uri; }
php后端處理(fastcgi)
location ~ .php($|/) { fastcgi_pass unix:/dev/shm/php-fpm.unix; //最重要的一項(xiàng),根據(jù)實(shí)際情況來配置(根據(jù)php的配置文件listen的配置來配置,其值可以是一個(gè)域名、IP地址:端口、或者是一個(gè)Unix的Socket文件。 ) fastcgi_index index.php; //當(dāng)請求以/結(jié)尾的時(shí)候,會將請求傳遞給所設(shè)置的index.php文件處理。 fastcgi_split_path_info ^(.+.php)(.*)$; //Nginx默認(rèn)獲取不到PATH_INFO的值,得通過fastcgi_split_path_info指定定義的正則表達(dá)式來給$fastcgi_path_info賦值。 fastcgi_param PATH_INFO $fastcgi_path_info; // fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi.conf; }
示例鏈接//segmentfault.com/q/1010000010786459
負(fù)載均衡和反向代理
在http配置段要配置一個(gè)upstream
upstream ucart{ server 119.29.48.27:80; server 119.29.48.27:80; } 注意:nginx中不識別_(下劃線),否則會出現(xiàn)400錯(cuò)誤
然后再server配置段,將所需要處理的請求反向代理至后端服務(wù)器,在可根據(jù)需要和服務(wù)器配置情況來定義權(quán)重,實(shí)現(xiàn)負(fù)載均衡
location /ucarapi/ { proxy_pass http://ucar_t/; proxy_connect_timeout 3; //連接超時(shí)時(shí)間 proxy_read_timeout 30; proxy_set_header Host tapi.51ucar.cn; //HTTP頭信息,后端服務(wù)器根據(jù)此來找到特定虛擬主機(jī) proxy_set_header X-Real-IP $remote_addr; //HTTP頭信息,真實(shí)IP proxy_set_header X-Scheme $scheme; }
鏈接:https://blog.csdn.net/u014748504/article/details/108530756
-
cpu
+關(guān)注
關(guān)注
68文章
11051瀏覽量
216240 -
進(jìn)程
+關(guān)注
關(guān)注
0文章
207瀏覽量
14239 -
nginx
+關(guān)注
關(guān)注
0文章
167瀏覽量
12517
原文標(biāo)題:Nginx性能優(yōu)化終極指南:從配置調(diào)參到內(nèi)核參數(shù),保姆級教程
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Linux上Nginx獲得最佳性能的8種方法
Linux運(yùn)維Nginx軟件優(yōu)化之安全優(yōu)化
Linux運(yùn)維Nginx軟件優(yōu)化之Nginx性能優(yōu)化
Linux運(yùn)維Nginx軟件優(yōu)化之日志優(yōu)化
液晶電視終極選購技巧指南
Nginx的詳細(xì)知識點(diǎn)講解

Nginx 如何實(shí)現(xiàn)高性能低消耗

玩轉(zhuǎn)Nginx日志管理:高效排查問題的終極指南
如何通過優(yōu)化Nginx配置來提高網(wǎng)絡(luò)環(huán)境的安全性
Nginx配置終極指南

評論