tid=48521&以CentOS 之 nginx的設定檔是在 /etc/nginx/nginx.conf. ^0 g$ C. l7 L* _, j4 S
一般來說 nginx 配置文件中對優化比較有作用的為以下幾項:6 j/ [; z7 E6 T, N. ]# j0 V: K
worker_processes 8;
! ^4 C5 }, t! f$ D3 s7 ^nginx 進程數,建議按照 cpu 數目來指定,一般為它的倍數。
6 n- L4 K9 J2 d4 r: E# cworker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;* @1 D. r- f% b. `7 e: Y! w
為每個進程分配 cpu,上例中將 8 個進程分配到 8 個 cpu,當然可以寫多個,或者將一個進程分配到多個 cpu。4 W6 N f6 J( \, v7 n7 H- o- L
worker_rlimit_nofile 102400;! _% Z; J0 l; \# n, N& U1 P
這個指令是指當一個 nginx 進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與 nginx 進程數
1 E$ R% d- [0 S7 Q相除,但是 nginx 分配請求並不是那麼均勻,所以最好與 ulimit -n 的值保持一致。4 F4 a0 N+ x0 c) ~
use epoll;
_* Q8 w6 ?" W) V" V使用 epoll 的 I/O 模型,這個不用說了吧。
' t* u7 _4 u: \) k$ G! K% K# Nworker_connections 102400;
+ H3 e& m- W4 l% R7 G" I每個進程允許的最多連接數,理論上每台 nginx 服務器的最大連接數為 worker_processes*worker_connections。
: U0 e x7 O' e, D- ~, I7 H: {" Fkeepalive_timeout 60;* b& Y- K6 ?0 Z9 n% `
keepalive 超時時間。7 R2 x5 Q' c* L, H( d1 ^
client_header_buffer_size 4k;0 L) n3 O% a' a0 c6 [; a
客戶端請求頭部的緩衝區大小,這個可以根據你的系統分頁大小來設置,一般一個請求的頭部大小不會超過 1k,不過由$ v: _7 }+ T: Y d
於一般系統分頁都要大於 1k,所以這裡設置為分頁大小。分頁大小可以用命令 getconf PAGESIZE 取得。
9 ]- I. z# K0 ?4 Z+ t: d: K8 T4 q2 @open_file_cache max=102400 inactive=20s;
& v2 l8 Y% W- {! |/ s4 \# h這個將為打開文件指定緩存,默認是沒有啟用的,max 指定緩存數量,建議和打開文件數一致,inactive 是指經過多長時) u3 o$ v, c# @* H; a+ b
間文件沒被請求後刪除緩存。" c* z/ s4 k# ^$ V6 g' G% g
open_file_cache_valid 30s; o4 z3 `: l$ E5 O! H: A b
這個是指多長時間檢查一次緩存的有效信息。4 B; r$ }4 j9 l3 _7 J, {
open_file_cache_min_uses 1; c7 Q/ c/ z( ?$ u; q
open_file_cache 指令中的 inactive 參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打& c6 _- i! e1 P& V! r
開的,如上例,如果有一個文件在 inactive 時間內一次沒被使用,它將被移除。' T0 b: v8 o8 e5 v
/ U, \9 D' Y% o
8 b6 l; l6 F0 s7 ^3 J關於內核參數的優化:
& I; }# g R9 n, xnet.ipv4.tcp_max_tw_buckets = 60007 n! G1 t7 o [5 T$ ]2 U9 c/ U8 e
timewait 的數量,默認是 180000。" R, L- y( q; T* g* X$ z- r& |; v
net.ipv4.ip_local_port_range = 1024 65000, V. J7 X) Y- @* i- E
允許系統打開的端口範圍。
% F K6 }" c3 m5 Fnet.ipv4.tcp_tw_recycle = 1% T' E( w" r2 a# L1 A5 _, T
啟用 timewait 快速回收。, m! Z1 S V& J+ K, S& c
net.ipv4.tcp_tw_reuse = 1
% n C% V$ J& |開啟重用。允許將 TIME-WAIT sockets 重新用於新的 TCP 連接。' C7 Z8 E. ?, ^# S5 ~0 V/ K; X
net.ipv4.tcp_syncookies = 14 j1 @: ~6 M0 w/ s6 T7 n
開啟 SYN Cookies,當出現 SYN 等待隊列溢出時,啟用 cookies 來處理。
8 S' n c1 F# g" bnet.core.somaxconn = 262144! R* t1 t4 k0 N
web 應用中 listen 函數的 backlog 默認會給我們內核參數的 net.core.somaxconn 限製到 128,而 nginx 定義的
% b7 j# G0 A, _5 NNGX_LISTEN_BACKLOG 默認為 511,所以有必要調整這個值。 k/ k% ^5 s3 ~% V6 T" C6 s
net.core.netdev_max_backlog = 262144
7 H9 O1 O% W! ~2 e, O* }每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。
/ U8 N/ i- A ?: \' ^2 H# x" A( vnet.ipv4.tcp_max_orphans = 262144+ z! j' M8 r3 J( H+ ^. _
系統中最多有多少個 TCP 套接字不被關聯到任何一個用戶文件句柄上。如果超過這個數字,孤兒連接將即刻被復位並打
) U5 Q7 K/ z: a印出警告信息。這個限制僅僅是為了防止簡單的 DoS 攻擊,不能過分依靠它或者人為地減小這個值,更應該增加這個值
0 h. w! F6 g2 `(如果增加了內存之後)。
7 C; F0 D9 v+ Enet.ipv4.tcp_max_syn_backlog = 2621440 k |9 K5 j1 }
記錄的那些尚未收到客戶端確認信息的連接請求的最大值。對於有 128M 內存的系統而言,缺省值是 1024,小內存的系1 j9 e5 x5 ?+ c6 k- u% r: W5 @( u
統則是 128。
& d( W$ N- P3 w/ S/ a+ r! M# Znet.ipv4.tcp_timestamps = 0% X: a; O* L( l
時間戳可以避免序列號的捲繞。一個 1Gbps 的鏈路肯定會遇到以前用過的序列號。時間戳能夠讓內核接受這種“異常”的- S: T; F" a y. R6 q+ G% [, c
數據包。這裡需要將其關掉。. \! }6 G; g S5 K+ ?
net.ipv4.tcp_synack_retries = 1, S) Z# M/ k( I
為了打開對端的連接,內核需要發送一個 SYN 並附帶一個回應前面一個 SYN 的 ACK。也就是所謂三次握手中的第二次0 W8 y+ x) x0 J: s. d# K
握手。這個設置決定了內核放棄連接之前發送 SYN+ACK 包的數量。$ u0 m$ G6 r, _7 F4 ]
net.ipv4.tcp_syn_retries = 11 Y4 M+ e* W7 c" b
在內核放棄建立連接之前發送 SYN 包的數量。* X- ~5 Z* @/ {! Q
net.ipv4.tcp_fin_timeout = 1
6 F/ S* q& j6 E, B0 A9 B. G如果套接字由本端要求關閉,這個參數決定了它保持在 FIN-WAIT-2 狀態的時間。對端可以出錯並永遠不關閉連接,甚% {9 D# j4 C! ~3 K/ U3 v+ q( E0 S
至意外當機。缺省值是 60 秒。2.2 內核的通常值是 180 秒,你可以按這個設置,但要記住的是,即使你的機器是一個輕" v5 T3 b+ o8 |$ |# k8 g
載的 WEB 服務器,也有因為大量的死套接字而內存溢出的風險,FIN- WAIT-2 的危險性比 FIN-WAIT-1 要小,因為它最
3 ]) b( }" Z$ R0 L# j b' Y6 ?" s多只能吃掉 1.5K 內存,但是它們的生存期長些。
, T& L3 k9 |# H$ w: Bnet.ipv4.tcp_keepalive_time = 30) j$ E$ p, M' b, ]
當 keepalive 起用的時候,TCP 發送 keepalive 消息的頻度。缺省是 2 小時。
0 X& q$ O; D0 j( B9 Q
. Z0 q& z u- F% r4 M, p) f( i
' x4 @2 Q/ v5 f% c下面貼一個完整的內核優化設置:
& q# f+ w0 Z' y; Wnet.ipv4.ip_forward = 0/ c% y/ A3 s8 ^3 w4 d
net.ipv4.conf.default.rp_filter = 1
S6 D& X8 D& y; v! v! v$ Inet.ipv4.conf.default.accept_source_route = 02 |+ F! l- B1 V
kernel.sysrq = 0+ Z M6 x7 D' W+ K! Y
kernel.core_uses_pid = 12 y# w! X3 c0 z
net.ipv4.tcp_syncookies = 1
$ V$ ~' Z ]+ U& B; ckernel.msgmnb = 65536
* |& E" z- Y* s2 {' V' _% {kernel.msgmax = 65536
0 p a) b7 x: J; w; bkernel.shmmax = 68719476736) n( \9 K: `; H
kernel.shmall = 4294967296
7 \( _0 W C# P$ Qnet.ipv4.tcp_max_tw_buckets = 6000
! }( l: C8 s' l9 m6 B# h# d! o# }$ |net.ipv4.tcp_sack = 1
6 }7 ^/ }9 x$ b4 w, V1 g+ `( ?- ]net.ipv4.tcp_window_scaling = 1
* t% V# Q5 r6 k( vnet.ipv4.tcp_rmem = 4096 87380 4194304# v0 C8 w' V; p
net.ipv4.tcp_wmem = 4096 16384 4194304
6 p5 Q7 e! ~, ` lnet.core.wmem_default = 8388608
% `9 q3 z9 Z$ R# D" bnet.core.rmem_default = 8388608
" W9 m5 [/ o# Z q k! Wnet.core.rmem_max = 16777216
; ~, M; [0 |% G# Wnet.core.wmem_max = 16777216
8 ~- ]& p- [ R$ S unet.core.netdev_max_backlog = 262144
. [- [" ^! Z" T1 Hnet.core.somaxconn = 2621440 M/ B r- U6 h$ e5 T- @
net.ipv4.tcp_max_orphans = 3276800+ p; a7 O* e( M7 s3 F2 B: |" C
net.ipv4.tcp_max_syn_backlog = 262144
0 Z* ?, W; w# H4 x7 snet.ipv4.tcp_timestamps = 0+ W" S: b( a V. y, H& H
net.ipv4.tcp_synack_retries = 1' G: y4 t# h3 k- B1 Z
net.ipv4.tcp_syn_retries = 14 O W7 T2 q5 K$ m6 H6 j, z
net.ipv4.tcp_tw_recycle = 1
2 e. n8 e! N! ]" w$ C7 b nnet.ipv4.tcp_tw_reuse = 1: r9 d, l6 J4 a& X, \
net.ipv4.tcp_mem = 94500000 915000000 927000000
0 g N5 u9 V$ T; ?net.ipv4.tcp_fin_timeout = 1' {' X( V( j% m4 y; a
net.ipv4.tcp_keepalive_time = 30
% U1 f9 T. H( t6 Cnet.ipv4.ip_local_port_range = 1024 65000
+ G' p# \3 a F4 p' c9 E0 W7 Y
; j0 {8 ], S3 Q) Z. F& A$ o5 ]3 k' y2 |# f1 B1 z
下面是一個簡單的 nginx 配置文件:nginx.conf
! I0 Z' F, J2 @9 m; p. Ruser www www;* P0 i( z) [; i8 x4 S1 T* ]: ^0 h$ ~
worker_processes 8;
' c6 L! e. U( r8 |; V# Jworker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;
# t7 r5 N6 K! o6 g# s5 qerror_log /www/log/nginx_error.log crit;
" t$ [9 O/ r* A& hpid /usr/local/nginx/nginx.pid;
! ~% n: K5 ]- r! Aworker_rlimit_nofile 204800;1 K. J/ C z/ ]# d s" c, g
events
: Y" p6 ^' I% k2 I; v{ A9 P% F; a; h
use epoll;
, G6 _5 ?+ @4 U; o# c4 X worker_connections 204800;$ m6 m0 {- ]5 O& Q- W9 o; x
}1 \: y8 X7 N6 D3 p
http
6 X+ {0 i! l7 p$ y+ t# f& q{" h& M& c& u x) A
include mime.types;
" G9 u% | K# t! x3 Q3 v default_type application/octet-stream;
9 K/ Z& J5 l* b& T charset utf-8;; T8 c# J% W7 h, G# F
server_names_hash_bucket_size 128;- P# \' g J3 `7 L) ]
client_header_buffer_size 2k;. L% c M2 [& N, J9 z
large_client_header_buffers 4 4k;) Y9 g/ \4 ^( Q& F8 k
client_max_body_size 8m;
7 r* W, j# j* D' Y+ L6 @ sendfile on;
, X- S- g2 }9 F) K9 ~& Q8 [ tcp_nopush on;- A- p. i' h6 ^0 U! Y/ u
keepalive_timeout 60;' N% w$ n5 Y* l D% b2 |3 B
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;! _; F& @" m9 c2 V2 \8 z9 X. A5 Q
fastcgi_connect_timeout 300;, n0 T a8 q; o% t
fastcgi_send_timeout 300;3 ~" p2 o7 D* R" E1 I6 }
fastcgi_read_timeout 300;
$ c, l6 R$ z& H/ X2 o2 @ fastcgi_buffer_size 16k;
9 C) Z: B; P: m2 Q5 q1 s; v fastcgi_buffers 16 16k;
+ S6 C3 Y6 H# | fastcgi_busy_buffers_size 16k;
$ H: Z) h- u: f) E+ g5 ] fastcgi_temp_file_write_size 16k;
1 f$ [# f, k4 L, A* P fastcgi_cache TEST;7 D) m9 N' L- ^3 C- ^9 |
fastcgi_cache_valid 200 302 1h;
1 g. E+ x1 H+ T/ {+ s, r$ H- Z fastcgi_cache_valid 301 1d;9 P. M( p6 v+ W$ G3 E0 j
fastcgi_cache_valid any 1m;
) _; k2 l: I9 k9 b# |' p S fastcgi_cache_min_uses 1;
; R; f, c- a% ` fastcgi_cache_use_stale error timeout invalid_header http_500;4 T2 s) {) V/ j* C% S! T1 _
open_file_cache max=204800 inactive=20s;$ r1 c/ _! z9 E; x4 o0 Z
open_file_cache_min_uses 1;
3 C0 U! ]! Z+ b8 t open_file_cache_valid 30s;
$ j: G& f: ^7 Q5 s% J tcp_nodelay on;
; H# W% o& M* T& R gzip on;# H" r2 B4 n( x9 s' f# m
gzip_min_length 1k;* g% J+ I# P/ b" m3 g; x
gzip_buffers 4 16k;
( G0 O6 u0 g$ U gzip_http_version 1.0;9 X7 I1 b5 X- o, b6 [+ P4 [; o
gzip_comp_level 2;, n5 P* o+ V G" \* q
gzip_types text/plain application/x-javascript text/css application/xml;# D& T& s7 w1 Y4 i0 G. e
gzip_vary on;
/ s z7 b+ Z+ h) S5 l$ D& v' [0 b server
+ _% J7 {, f2 T {
6 h9 B8 }. x, J* x listen 8080;
- T& o6 e- V2 P0 I; Z( R! x server_name backup.aiju.com;
: L- H5 [6 e9 Y" P: X; k index index.php index.htm;
, R) Y% N6 C1 h) Z) ] f, |2 Z root /www/html/;
" c! G: ^7 P4 e1 p& U" ~; J$ H0 V+ X5 U location /status
- O4 u' t- k& v* I! K {- _- L) N* w( b, P6 R" p: ?. y
stub_status on;
9 k" w. G2 K# a. V" n. x }2 Q/ O% F- E! |' {' [
location ~ .*\.(php|php5)?$
: g3 ^: B( ^8 F( @; R {0 r( X; ?* i+ u4 k+ c
fastcgi_pass 127.0.0.1:9000;
+ ?$ ~$ j% B* C' H0 d) y H1 r$ U fastcgi_index index.php;$ C. y9 J, b3 R( f, T
include fcgi.conf;+ Q9 l/ `. T" O o1 j
}
! f/ n; `% U) \6 e% k! g location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
8 {: X( B# r8 Q {: p: T: [2 a! l$ J5 w" T/ L( f
expires 30d;) v, W8 P9 p& L( S
}
; [" m8 ~# R( ~2 z6 A) u log_format access '$remote_addr - $remote_user [$time_local] "$request" '/ D% L9 |) t/ a7 i
'$status $body_bytes_sent "$http_referer" ''"$http_user_agent" $http_x_forwarded_for';5 L' m1 r( A6 b3 E2 a7 k
access_log /www/log/access.log access;
: c {3 z* }% t }
* y/ d. ?, z9 T! l% j}" W: \6 ~. R" z
O) x6 |+ }2 l/ r
關於 FastCGI 的幾個指令:1 N- ^8 L1 p& r% \. _$ Y
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
; D, u4 @0 b# [$ A7 t這個指令為 FastCGI 緩存指定一個路徑,目錄結構等級,關鍵字區域存儲時間和非活動刪除時間。
, I$ K' z# M% A6 Vfastcgi_connect_timeout 300;
! a; [9 S- S4 Z) p指定連接到後端 FastCGI 的超時時間。( _/ i+ G! Y+ `: C$ l7 s
fastcgi_send_timeout 300;1 P2 H: S1 O- q, b& M2 M7 T3 {) `
向 FastCGI 傳送請求的超時時間,這個值是指已經完成兩次握手後向 FastCGI 傳送請求的超時時間。
, C" O1 c V" A4 Y# P6 Kfastcgi_read_timeout 300;
. M& ?0 [2 U% \8 p7 s; X l8 n接收 FastCGI 應答的超時時間,這個值是指已經完成兩次握手後接收 FastCGI 應答的超時時間。; J4 A% t( E$ d+ Z8 t
fastcgi_buffer_size 16k;3 R. o( Y( i6 u
指定讀取 FastCGI 應答第一部分需要用多大的緩衝區,這裡可以設置為 fastcgi_buffers 指令指定的緩衝區大小,上面的, |6 X( G+ t0 w8 q* Z# h8 {# z
指令指定它將使用 1 個 16k 的緩衝區去讀取應答的第一部分,即應答頭,其實這個應答頭一般情況下都很小(不會超過
/ n" c! l& w; S' i" l1k),但是你如果在 fastcgi_buffers 指令中指定了緩衝區的大小,那麼它也會分配一個 fastcgi_buffers 指定的緩衝區大. Q1 Y, `4 ~! z/ @) ]7 X
小去緩存。
! G4 |2 X1 c( @6 M' ]fastcgi_buffers 16 16k;
8 e* M V; ?4 T指定本地需要用多少和多大的緩衝區來緩衝 FastCGI 的應答,如上所示,如果一個 php 腳本所產生的頁面大小為 256k,
7 c5 l& R! R+ H9 S; b$ S則會為其分配 16 個 16k 的緩衝區來緩存,如果大於 256k ,增大於 256k 的部分會緩存到 fastcgi_temp 指定的路徑中,
, a2 Z0 }; X/ G$ ?1 i" ^當然這對服務器負載來說是不明智的方案,因為內存中處理數據速度要快於硬盤,通常這個值的設置應該選擇一個你的2 M2 j; {) K& m1 N: X7 W# t
站點中的 php 腳本所產生的頁面大小的中間值,比如你的站點大部分腳本所產生的頁面大小為 256k 就可以把這個值設0 F' P' v) v) r6 Q" Z, P
置為 16 16k,或者 4 64k 或者 64 4k,但很顯然,後兩種並不是好的設置方法,因為如果產生的頁面只有 32k,如果用 40 w: J3 y# U5 m$ J
64k 它會分配 1 個 64k 的緩衝區去緩存,而如果使用 64 4k 它會分配 8 個 4k 的緩衝區去緩存,而如果使用 16 16k 則它0 x- K; ^: {3 x' ]
會分配 2 個 16k 去緩存頁面,這樣看起來似乎更加合理。
2 s8 Y. x6 ?$ S: D8 b6 hfastcgi_busy_buffers_size 32k;9 W4 G% w6 B5 ] R. x3 Z( X
這個指令我也不知道是做什麼用,只知道默認值是 fastcgi_buffers 的兩倍。
2 t0 [) u$ m0 D+ ]: H7 ifastcgi_temp_file_write_size 32k;6 R5 m4 Y$ S% p' i
在寫入 fastcgi_temp_path 時將用多大的數據塊,默認值是 fastcgi_buffers 的兩倍。
6 U- ?: e$ f5 j/ \- j! M+ nfastcgi_cache TEST0 b) e- p. ]& ~6 t, _8 [
開啟 FastCGI 緩存並且為其製定一個名稱。個人感覺開啟緩存非常有用,可以有效降低 CPU 負載,並且防止 502 錯誤。
! a; U2 v6 S: W( q但是這個緩存會引起很多問題,因為它緩存的是動態頁面。具體使用還需根據自己的需求。
0 C _; I4 r4 Z6 kfastcgi_cache_valid 200 302 1h;/ [1 h3 r' I. X$ i: v/ R
fastcgi_cache_valid 301 1d;3 m- \# F$ C; s
fastcgi_cache_valid any 1m;
" z1 k& r0 X) t) @7 F為指定的應答代碼指定緩存時間,如上例中將 200,302 應答緩存一小時,301 應答緩存 1 天,其他為 1 分鐘。# @; w5 l+ I: _
fastcgi_cache_min_uses 1;
- [; I H1 ?' I2 \2 M緩存在 fastcgi_cache_path 指令 inactive 參數值時間內的最少使用次數,如上例,如果在 5 分鐘內某文件 1 次也沒有被5 Q% s/ t/ \# v/ m- N7 J# ^& c
使用,那麼這個文件將被移除。6 i) K1 d" x8 V$ |2 ]2 [3 l
fastcgi_cache_use_stale error timeout invalid_header http_500;& z: V! W. u; N$ m; L
不知道這個參數的作用,猜想應該是讓 nginx 知道哪些類型的緩存是沒用的。
/ ^5 V- h! {5 f. c1 ]+ n" T以上為 nginx 中 FastCGI 相關參數,另外,FastCGI 自身也有一些配置需要進行優化,如果你使用 php-fpm 來管理9 Q$ |5 J. \# B. `5 o
FastCGI,可以修改配置文件中的以下值:
/ Z' A d. w0 [3 A, }% q u<value name="max_children">60</value>
5 y# Y8 _. z( {1 m, q同時處理的並發請求數,即它將開啟最多 60 個子線程來處理並發連接。
: v& w2 p( M4 z w5 d<value name="rlimit_files">102400</value>
; Y$ E% a& C, C' J% j最多打開文件數。
: G H# D3 }( F" M& k( v<value name="max_requests">204800</value>
; a2 v3 B0 o( ~每個進程在重置之前能夠執行的最多請求數。
! k* Y9 Q* I/ T3 Z7 S: Z# x0 r
g C0 k" A; A4 L- {6 {' N1 [& P1 l8 J# `( x z) D
參考資料:
/ x: W5 X- ^+ [6 a& Vhttp://demo.ckan.org/dataset/daf ... /download/nginx.pdf
v8 z" E8 ?0 Rhttp://blog.chinaunix.net/u3/105004/showart_2087155.html
7 _6 w7 F' {* J: S. Jhttp://nginx.179401.cn/4 N* r0 l4 M# a# J1 P
http://blog.s135.com/nginx_php_v5/1 |' l3 N6 y5 c2 c- i/ B* d t; t7 N
http://xyz.cinc.biz/2015/09/linux-nginx-php-fpm-connection.html
* b$ O2 j/ F' h+ b) Whttps://www.netroby.com/view/3128
( j' R5 y$ Y# d' O7 x$ K) dfastcgi 快取:
+ h" ]3 K% L. l& g1 X7 i b: Y# Vhttps://www.cnxct.com/several-reminder-in-nginx-fastcgi_cache-and-php-session_cache_limiter/
4 W. p& i1 U, Z- Q' q4 A2 G5 N其他:
6 T8 n) I$ N1 [+ mnginx設定檔內參數的詳細說明: http://nginx.org/en/docs/http/ng ... l#keepalive_timeout( d! s- D$ ]" ?& |' Q
nginx優化:http://www.jianshu.com/p/2184654ba4b2- Y" h1 e7 T6 I' ^0 E- _ _
gzip壓縮功能以減少網路傳輸檔案大小:http://wenzhixin.net.cn/2013/11/10/server_gzip_on1 @! c: R6 }" ?
9 s8 T7 M, n: A+ V) o2 m* f% e
) k& u; ^2 n* |/ w9 O) b$ Q
5 T2 x K2 w' a& l% P) d
R3 S Y; M& V7 ]2 b" v w7 x |