以CentOS 之 nginx的設定檔是在 /etc/nginx/nginx.conf: [. s2 p; v0 P/ q
一般來說 nginx 配置文件中對優化比較有作用的為以下幾項:: e; v' a, E/ K9 K/ q* v1 `2 I. C
worker_processes 8;5 @, j9 K8 v3 p& u5 g0 _6 ?
nginx 進程數,建議按照 cpu 數目來指定,一般為它的倍數。
+ ?2 w: ?# j$ xworker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;( p+ F/ N' O# W2 I9 j
為每個進程分配 cpu,上例中將 8 個進程分配到 8 個 cpu,當然可以寫多個,或者將一個進程分配到多個 cpu。
6 X6 {4 K F( `" t& j9 pworker_rlimit_nofile 102400;
2 L Q6 l o2 j* z3 ]* C這個指令是指當一個 nginx 進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與 nginx 進程數
j" t* Q8 | N% y8 L+ Q) b相除,但是 nginx 分配請求並不是那麼均勻,所以最好與 ulimit -n 的值保持一致。7 r' `: M2 r# U0 A1 T" x' D. O9 @
use epoll;
5 s% R$ o: q. \2 f6 J5 w- v, j3 ?) L使用 epoll 的 I/O 模型,這個不用說了吧。
& @& {( c+ B7 v: s6 ]( N/ W0 Hworker_connections 102400;
# o' @3 I+ b5 O y每個進程允許的最多連接數,理論上每台 nginx 服務器的最大連接數為 worker_processes*worker_connections。; V% E6 n9 W( \* J# k- O8 ?
keepalive_timeout 60;
1 @! e7 z- c8 k, Y; \keepalive 超時時間。5 p) y) C4 f$ e
client_header_buffer_size 4k;6 W, x2 W9 p1 ?3 }8 [
客戶端請求頭部的緩衝區大小,這個可以根據你的系統分頁大小來設置,一般一個請求的頭部大小不會超過 1k,不過由
% p) _+ H# e7 p於一般系統分頁都要大於 1k,所以這裡設置為分頁大小。分頁大小可以用命令 getconf PAGESIZE 取得。
( I) J. f6 [1 F" Popen_file_cache max=102400 inactive=20s;
: H; c9 s2 t' a& W5 O這個將為打開文件指定緩存,默認是沒有啟用的,max 指定緩存數量,建議和打開文件數一致,inactive 是指經過多長時
: J/ H4 E% O# f: p% r間文件沒被請求後刪除緩存。
* F! j0 m; H! C. y) qopen_file_cache_valid 30s;
. u3 V4 K- W. ~這個是指多長時間檢查一次緩存的有效信息。5 c, R5 R: B9 O- d
open_file_cache_min_uses 1;
- }) {- l6 w$ d( [- hopen_file_cache 指令中的 inactive 參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打
1 U( {4 J* J9 ], `' `開的,如上例,如果有一個文件在 inactive 時間內一次沒被使用,它將被移除。
" I+ q/ z/ p* Z
! r" Z: {( k9 O( q+ M' w: {' V9 D/ U9 Y0 t5 x: M
關於內核參數的優化:
. w$ L( Y5 g4 \6 f! f, `" Enet.ipv4.tcp_max_tw_buckets = 6000; D) F3 d. e9 U$ B! f1 s/ r
timewait 的數量,默認是 180000。
, _( k# J: c2 i9 }net.ipv4.ip_local_port_range = 1024 65000& Q! y1 c _6 a/ `7 O% j. D" ]
允許系統打開的端口範圍。
2 E6 u6 V. S: f: y; hnet.ipv4.tcp_tw_recycle = 1# Q9 v+ ?2 l( f6 f/ N
啟用 timewait 快速回收。
- u, O& L; k0 o- ~net.ipv4.tcp_tw_reuse = 1$ m: R! b/ y+ |8 `+ j
開啟重用。允許將 TIME-WAIT sockets 重新用於新的 TCP 連接。
% L: i9 A G9 l5 { \( ^9 Wnet.ipv4.tcp_syncookies = 1
0 s0 ]5 @6 U- X% z7 _$ I開啟 SYN Cookies,當出現 SYN 等待隊列溢出時,啟用 cookies 來處理。) p9 W' i- E6 V3 G- {: H
net.core.somaxconn = 262144
; u: T5 Z0 Q t4 Uweb 應用中 listen 函數的 backlog 默認會給我們內核參數的 net.core.somaxconn 限製到 128,而 nginx 定義的' N3 T1 V) I# H. S! r# m
NGX_LISTEN_BACKLOG 默認為 511,所以有必要調整這個值。. t% A) @$ `3 _9 @5 H
net.core.netdev_max_backlog = 262144
) _5 h8 t) d/ p+ t. f# L; \0 v% b每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。
6 Q3 G1 V. q5 _. g ]; r: Z9 q) Tnet.ipv4.tcp_max_orphans = 262144 x+ K" q- O) L
系統中最多有多少個 TCP 套接字不被關聯到任何一個用戶文件句柄上。如果超過這個數字,孤兒連接將即刻被復位並打: n6 A3 o) G) K& y; v( z& u
印出警告信息。這個限制僅僅是為了防止簡單的 DoS 攻擊,不能過分依靠它或者人為地減小這個值,更應該增加這個值+ q+ B( U2 v1 W* k0 Z; [8 ]
(如果增加了內存之後)。
; \" [/ I+ S5 Y2 ]' B# cnet.ipv4.tcp_max_syn_backlog = 2621448 H' J! }. ~. s: ~( f# n9 e) W! z" h
記錄的那些尚未收到客戶端確認信息的連接請求的最大值。對於有 128M 內存的系統而言,缺省值是 1024,小內存的系) s& h$ U0 K1 c- x. P
統則是 128。4 g5 c+ H' @ j, ~" n/ W
net.ipv4.tcp_timestamps = 0
& h D1 ?- d" O( s8 }時間戳可以避免序列號的捲繞。一個 1Gbps 的鏈路肯定會遇到以前用過的序列號。時間戳能夠讓內核接受這種“異常”的
3 k/ t: [/ b/ ]數據包。這裡需要將其關掉。 P3 a9 p3 q- n! _6 v& r- v+ V
net.ipv4.tcp_synack_retries = 1
/ r2 o- @- f7 E為了打開對端的連接,內核需要發送一個 SYN 並附帶一個回應前面一個 SYN 的 ACK。也就是所謂三次握手中的第二次
& F5 S' f; M, Z握手。這個設置決定了內核放棄連接之前發送 SYN+ACK 包的數量。
! ?( h& M% |5 ~* R! `5 E0 Enet.ipv4.tcp_syn_retries = 1
: R7 r3 ? j2 D( E; U0 V在內核放棄建立連接之前發送 SYN 包的數量。
! K/ o/ x0 H3 r# Tnet.ipv4.tcp_fin_timeout = 1
- L0 ?* @/ K4 G. I C$ e J如果套接字由本端要求關閉,這個參數決定了它保持在 FIN-WAIT-2 狀態的時間。對端可以出錯並永遠不關閉連接,甚
1 T0 u) `; W x) D6 e, z; }至意外當機。缺省值是 60 秒。2.2 內核的通常值是 180 秒,你可以按這個設置,但要記住的是,即使你的機器是一個輕
+ z8 _4 K g; ^9 w載的 WEB 服務器,也有因為大量的死套接字而內存溢出的風險,FIN- WAIT-2 的危險性比 FIN-WAIT-1 要小,因為它最
. @+ F; |5 c6 `: @6 D3 m多只能吃掉 1.5K 內存,但是它們的生存期長些。( n3 J; D( P0 C( k1 m
net.ipv4.tcp_keepalive_time = 30+ q( s: w: i% n I- f1 H
當 keepalive 起用的時候,TCP 發送 keepalive 消息的頻度。缺省是 2 小時。
9 j1 w5 G |% v h! C# X% j+ Z
* f' y" M) H+ O2 e5 s
+ Z q6 }6 M' q+ U( y8 h- q下面貼一個完整的內核優化設置:, b1 [- f$ B6 D5 ?3 l
net.ipv4.ip_forward = 04 ]5 G( f5 h1 o P
net.ipv4.conf.default.rp_filter = 1
z/ L; h6 h1 E. pnet.ipv4.conf.default.accept_source_route = 0
, a. E7 y" \# I9 S* u, lkernel.sysrq = 0/ S5 G* g% l5 [" F
kernel.core_uses_pid = 1
& ^3 f* }+ h% \7 Unet.ipv4.tcp_syncookies = 1
8 \) E/ S; S' ~1 ]+ g; c. n! rkernel.msgmnb = 65536
6 b# U2 a' k, y2 X6 ]7 hkernel.msgmax = 655367 p/ \' L4 c6 A/ j, j1 b
kernel.shmmax = 68719476736
9 F: l- t' f7 [) P4 t( Qkernel.shmall = 4294967296
& @5 S- ?3 U5 V) w7 n) }net.ipv4.tcp_max_tw_buckets = 6000
7 z% D) }1 ?6 X; w& I7 Knet.ipv4.tcp_sack = 1
/ K# K7 D: d1 l2 znet.ipv4.tcp_window_scaling = 1
* _ W, R; W4 i4 {: Y) lnet.ipv4.tcp_rmem = 4096 87380 4194304/ c) K2 H3 U6 n# |
net.ipv4.tcp_wmem = 4096 16384 4194304
5 ?" j- j; K2 Q# E5 N2 Ynet.core.wmem_default = 8388608
& \4 ^6 H7 c2 K2 R- G( Nnet.core.rmem_default = 8388608
; x! e; f' T; n& Cnet.core.rmem_max = 16777216: o& L/ i. p( I$ ~; U7 Q R
net.core.wmem_max = 167772160 _$ Q `3 i4 [' L [0 @
net.core.netdev_max_backlog = 262144" j2 b+ P: P( M. e, W
net.core.somaxconn = 262144( n2 u4 E4 D# B; n+ R
net.ipv4.tcp_max_orphans = 3276800
. ]8 ~3 n- x4 S) Lnet.ipv4.tcp_max_syn_backlog = 262144! K N: u/ c5 J2 e5 C. A2 H7 X1 k8 i
net.ipv4.tcp_timestamps = 0
: V! _1 E- p4 j% Znet.ipv4.tcp_synack_retries = 1
! E1 X; I; g1 }net.ipv4.tcp_syn_retries = 1+ w& D' l3 I- S7 V# Y3 I
net.ipv4.tcp_tw_recycle = 1; j4 K& E& H7 r1 K9 d' n6 v
net.ipv4.tcp_tw_reuse = 15 l+ {, W4 ~1 a R6 l
net.ipv4.tcp_mem = 94500000 915000000 9270000005 J7 c, G$ Y2 l7 F M4 x) V
net.ipv4.tcp_fin_timeout = 18 G% _5 n! x7 F! R, B$ \0 Y* E
net.ipv4.tcp_keepalive_time = 30
X- B: ]; k0 ?4 v. @- mnet.ipv4.ip_local_port_range = 1024 65000
$ b3 `) O4 B, V% l G# ~9 E' w
, b* Z: _; G2 A/ t
" H$ D1 T9 y7 g3 [下面是一個簡單的 nginx 配置文件:nginx.conf0 r6 J# v5 b0 H* K
user www www;
* c( Z2 d1 r0 ~' kworker_processes 8;
% V6 {/ |6 t( _) J! j6 p Jworker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;3 x! O$ Z. s }/ A7 m$ |& P. S
error_log /www/log/nginx_error.log crit;
6 r7 D5 e7 J5 b8 I" w- z( }" Lpid /usr/local/nginx/nginx.pid;+ J3 q* |4 |' t! r
worker_rlimit_nofile 204800;; c. E) y! [6 e$ u4 t& E0 ^
events
" d- `! C: y2 F{' x# j, {; G4 J9 c0 Q
use epoll;
, E n6 ? z9 z; k1 U/ _! ? worker_connections 204800;$ i- D- I( {0 l2 L4 l
}9 R8 @" m3 |5 ^" v# l
http
9 W- ]( ^% }4 K1 }3 D{
% N& g+ B) U7 q- O3 i1 e. o! ^! V) Uinclude mime.types;
+ F7 ^: f, y( O3 u default_type application/octet-stream;/ l! G7 ]# a8 A
charset utf-8;/ t% i0 q# m! S5 n/ y
server_names_hash_bucket_size 128;( C: d4 v t1 x7 p2 [" R
client_header_buffer_size 2k;6 {& g/ m: e# T) k" h4 i2 A
large_client_header_buffers 4 4k;
% |% W4 G% z4 M% @( O client_max_body_size 8m;
0 v& V/ I7 ^' s sendfile on;
7 L& \9 t& u+ |( Z' g; R- B% n6 o2 t tcp_nopush on;
0 I% I7 _% i2 s5 r. L6 w- T keepalive_timeout 60;" O9 q$ n8 ?! l% d: P+ e ?
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
w' [( _. S$ j, j5 r fastcgi_connect_timeout 300;& {- d8 |9 R( K4 Q- Y) z+ r: w
fastcgi_send_timeout 300; D( v6 i! Y5 y8 F1 C
fastcgi_read_timeout 300;
1 @0 f5 L `" U, j. A9 H5 J fastcgi_buffer_size 16k;
4 m, k. B* M+ D) k; H, K& c fastcgi_buffers 16 16k;' `% X/ B- @5 N
fastcgi_busy_buffers_size 16k;) i2 Y4 u7 j6 B7 J+ Z
fastcgi_temp_file_write_size 16k;
5 T3 P, v @: ?5 l$ u8 H" F7 Z fastcgi_cache TEST;
- E" A7 ^6 J/ s) ]: c, @' t fastcgi_cache_valid 200 302 1h;0 V2 I- p' y7 L1 H
fastcgi_cache_valid 301 1d;" y) } b/ G( J( a5 X3 `0 s3 u
fastcgi_cache_valid any 1m;
; Y: v( j( _% [, r fastcgi_cache_min_uses 1;1 o! F7 K) m& J1 [0 V% L! \5 j
fastcgi_cache_use_stale error timeout invalid_header http_500;
2 `3 d$ t0 M2 @ open_file_cache max=204800 inactive=20s;
& O$ {+ Z# L1 J9 K open_file_cache_min_uses 1;/ [8 Q8 T: |" ^( y4 T0 g0 A
open_file_cache_valid 30s;: u9 s: Q [; c4 _/ A' G% j
tcp_nodelay on;
+ M8 C; I, ^- h1 S* n9 j/ D) x gzip on;( A0 L( V' ^, H/ V; Z6 j
gzip_min_length 1k;" l7 R% Q! | W$ x6 y! [
gzip_buffers 4 16k;% {1 @5 F' u3 q6 A4 u
gzip_http_version 1.0;
1 ?! C' f8 L! M9 r$ R& b gzip_comp_level 2;
! M7 ^$ K: I9 [& B gzip_types text/plain application/x-javascript text/css application/xml;
X: E n; `' {+ O& @3 @6 X Y4 h gzip_vary on;2 |0 {( W) W5 y8 {
server
, ^ G8 O: R# Z s% f# f {% H& p1 @" B; R5 N! }' W% X$ U
listen 8080;
$ b1 o0 A% @+ R: _/ c" @& P: N server_name backup.aiju.com;
x) g" }) k) L' Z- W: X1 ?8 i, W$ j index index.php index.htm;6 H L2 T4 ` p$ h; o* s6 [
root /www/html/;
$ G* J7 n) k. J: r! A location /status
$ g% T# p8 p6 s+ f3 Z) k {, `7 k5 I, X5 y B
stub_status on;
t- F9 a: l O! W; B }; G& q+ y4 G4 P& w# e
location ~ .*\.(php|php5)?$
. Q5 h7 j: v& Z {
; l5 \; q3 T- [& q! Y$ b( H fastcgi_pass 127.0.0.1:9000;
7 u( p* n" Y" P, N' @. k0 u t8 u fastcgi_index index.php;
$ B. q, D, P* w7 ?& F include fcgi.conf;% K! s9 {; E+ z$ _9 a1 f
}2 ], I2 i& y( g8 s" d- [1 K$ Y
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$7 @5 k9 Z% \5 n: W4 c2 N: s" Y
{
: f7 Z4 p8 G# I$ o( J! u expires 30d;( x, ?1 _# \6 {! ~& l/ C0 A4 m
}( F- p% a% v2 W% I: W0 i% d- X; O- j
log_format access '$remote_addr - $remote_user [$time_local] "$request" '" H9 R3 T c/ u
'$status $body_bytes_sent "$http_referer" ''"$http_user_agent" $http_x_forwarded_for';( q$ G. A9 T0 W) m# w; M
access_log /www/log/access.log access;
- i4 j/ i6 ^) H- g }, Z ~2 m! d5 i
}( O% V# t) }- m6 L! N; m# `
6 R) Q3 ^& d9 G' G" T1 `/ l關於 FastCGI 的幾個指令:
( ?8 K0 G6 k1 tfastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
, \5 Q I6 L" @3 }0 w9 U. Y& J/ J' Q這個指令為 FastCGI 緩存指定一個路徑,目錄結構等級,關鍵字區域存儲時間和非活動刪除時間。 R3 i0 o5 s5 p9 [
fastcgi_connect_timeout 300;) p2 J- i- P+ X
指定連接到後端 FastCGI 的超時時間。3 S2 Q6 B- j0 m
fastcgi_send_timeout 300;7 {/ h- V% W# Q6 G0 J
向 FastCGI 傳送請求的超時時間,這個值是指已經完成兩次握手後向 FastCGI 傳送請求的超時時間。: ?* i' g+ W: |; Z P; L+ Q0 V; N1 g
fastcgi_read_timeout 300;
- f* A1 q* O% ?' }- @接收 FastCGI 應答的超時時間,這個值是指已經完成兩次握手後接收 FastCGI 應答的超時時間。8 L8 r! z. L! X5 p
fastcgi_buffer_size 16k;
e/ u# @' r; R1 I& v指定讀取 FastCGI 應答第一部分需要用多大的緩衝區,這裡可以設置為 fastcgi_buffers 指令指定的緩衝區大小,上面的) @: f B/ r% h! K, ]: f
指令指定它將使用 1 個 16k 的緩衝區去讀取應答的第一部分,即應答頭,其實這個應答頭一般情況下都很小(不會超過5 B2 G8 s$ m& R
1k),但是你如果在 fastcgi_buffers 指令中指定了緩衝區的大小,那麼它也會分配一個 fastcgi_buffers 指定的緩衝區大
; Q8 E$ C5 q+ }% B5 [2 R4 N3 H# \/ ~小去緩存。
% |7 ~6 j; Q; j& P Hfastcgi_buffers 16 16k;
. V' _/ f0 i" C2 X) J指定本地需要用多少和多大的緩衝區來緩衝 FastCGI 的應答,如上所示,如果一個 php 腳本所產生的頁面大小為 256k,6 \ {2 P7 E B: `1 y8 Y, d
則會為其分配 16 個 16k 的緩衝區來緩存,如果大於 256k ,增大於 256k 的部分會緩存到 fastcgi_temp 指定的路徑中,0 X+ q) `) W' w( r& |/ q
當然這對服務器負載來說是不明智的方案,因為內存中處理數據速度要快於硬盤,通常這個值的設置應該選擇一個你的: F5 @5 D' [* u- ]! @2 u' Q& a) c
站點中的 php 腳本所產生的頁面大小的中間值,比如你的站點大部分腳本所產生的頁面大小為 256k 就可以把這個值設7 Z4 x1 P4 I2 N& f
置為 16 16k,或者 4 64k 或者 64 4k,但很顯然,後兩種並不是好的設置方法,因為如果產生的頁面只有 32k,如果用 4, g/ [# M P7 m) X( h
64k 它會分配 1 個 64k 的緩衝區去緩存,而如果使用 64 4k 它會分配 8 個 4k 的緩衝區去緩存,而如果使用 16 16k 則它
! @; C' {' }/ e, D會分配 2 個 16k 去緩存頁面,這樣看起來似乎更加合理。- t7 ~; G" N# b% V
fastcgi_busy_buffers_size 32k;
5 s; n0 G; N: U; f這個指令我也不知道是做什麼用,只知道默認值是 fastcgi_buffers 的兩倍。
- o' H. {; Z) k' f% H7 Jfastcgi_temp_file_write_size 32k;
/ d" a2 d9 x* r在寫入 fastcgi_temp_path 時將用多大的數據塊,默認值是 fastcgi_buffers 的兩倍。
/ k. n% [- N$ nfastcgi_cache TEST1 A9 P7 K; j) C. Q" m; G+ |
開啟 FastCGI 緩存並且為其製定一個名稱。個人感覺開啟緩存非常有用,可以有效降低 CPU 負載,並且防止 502 錯誤。1 s7 G, S6 @" {, a* ]
但是這個緩存會引起很多問題,因為它緩存的是動態頁面。具體使用還需根據自己的需求。0 j2 k* k. g3 |9 I( k
fastcgi_cache_valid 200 302 1h;
% [# R+ g- `8 y4 ?; x$ @8 Gfastcgi_cache_valid 301 1d;6 j/ u, J+ S& y7 ~4 s$ F+ W
fastcgi_cache_valid any 1m;
- B. t# d! m5 y! J4 R% x: k5 I為指定的應答代碼指定緩存時間,如上例中將 200,302 應答緩存一小時,301 應答緩存 1 天,其他為 1 分鐘。
4 D! l$ ]: l6 M" J4 N2 ?! ` T+ Xfastcgi_cache_min_uses 1;! e0 K5 J4 Z Q) Q
緩存在 fastcgi_cache_path 指令 inactive 參數值時間內的最少使用次數,如上例,如果在 5 分鐘內某文件 1 次也沒有被
2 P& W4 E# X# {$ H l2 E使用,那麼這個文件將被移除。
# x6 D6 X' g, F' ffastcgi_cache_use_stale error timeout invalid_header http_500;
, K$ [8 M4 M9 o" A! | U不知道這個參數的作用,猜想應該是讓 nginx 知道哪些類型的緩存是沒用的。+ R, D( r$ D7 K+ @. }7 V( O
以上為 nginx 中 FastCGI 相關參數,另外,FastCGI 自身也有一些配置需要進行優化,如果你使用 php-fpm 來管理
+ a! {: R! }. C; S9 KFastCGI,可以修改配置文件中的以下值:
7 p5 o) D# I( ` @# d. ^<value name="max_children">60</value>
0 Q; m, O6 w0 d% l& e0 \* O同時處理的並發請求數,即它將開啟最多 60 個子線程來處理並發連接。; b; J* {% j5 }$ R* k Y
<value name="rlimit_files">102400</value>$ r+ j% D, M* _. n5 W, C
最多打開文件數。
1 [$ ^$ u/ O. F1 o0 l1 M<value name="max_requests">204800</value>7 R- e8 n% g* C3 Y$ ^
每個進程在重置之前能夠執行的最多請求數。
1 f6 X4 a6 B8 L# R- p% k5 z/ e8 V" G( f2 ?; l& n. j
8 W+ [! R# i" _# [" f2 b5 B* A. {
參考資料:
1 U* D, B% Z! }7 ^+ Z! a5 R& uhttp://demo.ckan.org/dataset/daf ... /download/nginx.pdf3 ]1 T' |$ i4 C
http://blog.chinaunix.net/u3/105004/showart_2087155.html
3 ]; G: Q0 H9 r/ }0 i7 ~* E# Y3 ]http://nginx.179401.cn/% R6 ^8 P6 p; b/ [. Y4 {
http://blog.s135.com/nginx_php_v5/$ y9 Y7 m: L& {2 d! @4 ~1 h1 S
http://xyz.cinc.biz/2015/09/linux-nginx-php-fpm-connection.html9 x5 d( G" J" G' l; s( A' m, F
https://www.netroby.com/view/31287 ] r- B' _8 b1 a- r* k K. g
fastcgi 快取:2 s: I$ k# _; g+ U2 \
https://www.cnxct.com/several-reminder-in-nginx-fastcgi_cache-and-php-session_cache_limiter/7 ~$ H0 j' l3 }! l, `0 E
其他:
/ I( {+ r* O- L& \- K- b/ anginx設定檔內參數的詳細說明: http://nginx.org/en/docs/http/ng ... l#keepalive_timeout- t. Q3 C/ J: U1 K% s- Q0 @
nginx優化:http://www.jianshu.com/p/2184654ba4b2 V4 O& O2 P( w# t9 W& }0 o( N
gzip壓縮功能以減少網路傳輸檔案大小:http://wenzhixin.net.cn/2013/11/10/server_gzip_on: ?5 O, p2 v* \$ J7 {
5 } _, h1 n( l+ `
- A" n, R" @8 m0 }' {
6 v' z" \7 X1 W( r
! k/ L7 s a% X. X! H
|
|