tid=48521&以CentOS 之 nginx的設定檔是在 /etc/nginx/nginx.conf
# @; W/ M( n6 C$ t一般來說 nginx 配置文件中對優化比較有作用的為以下幾項:& V1 E) }8 {* I
worker_processes 8;
; f/ `+ O# a/ u. }1 f; T' f3 Lnginx 進程數,建議按照 cpu 數目來指定,一般為它的倍數。
0 l( |( ~9 }* Z( t# f9 W& Pworker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
4 N* @7 }$ m0 V. d3 V/ \( n0 k) t6 Q為每個進程分配 cpu,上例中將 8 個進程分配到 8 個 cpu,當然可以寫多個,或者將一個進程分配到多個 cpu。
5 M. d" {% H1 r9 e* d; v" k2 kworker_rlimit_nofile 102400;
! t. H; J, a j2 |9 Q; P這個指令是指當一個 nginx 進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與 nginx 進程數
9 F( j5 `& e& a相除,但是 nginx 分配請求並不是那麼均勻,所以最好與 ulimit -n 的值保持一致。+ v* i# H* p0 P* ?$ ^- r# M9 Z
use epoll;7 W# l9 l& [. ]
使用 epoll 的 I/O 模型,這個不用說了吧。& @5 A. e9 k: S8 O
worker_connections 102400;
) @1 y. \2 t3 t$ t( k8 x每個進程允許的最多連接數,理論上每台 nginx 服務器的最大連接數為 worker_processes*worker_connections。
7 x+ h% |. k& Tkeepalive_timeout 60;
& Y9 ?& j9 M$ O: K3 ]+ y+ ykeepalive 超時時間。
+ f4 H4 ?! P9 u( q% C* c3 oclient_header_buffer_size 4k;2 N$ I; M1 t! _- C7 g+ d
客戶端請求頭部的緩衝區大小,這個可以根據你的系統分頁大小來設置,一般一個請求的頭部大小不會超過 1k,不過由# W- z9 j/ u- N2 h$ z, b1 u
於一般系統分頁都要大於 1k,所以這裡設置為分頁大小。分頁大小可以用命令 getconf PAGESIZE 取得。( f4 h" A( J. p, j) R4 [
open_file_cache max=102400 inactive=20s;
9 r$ {3 P$ |, F* M4 v4 T這個將為打開文件指定緩存,默認是沒有啟用的,max 指定緩存數量,建議和打開文件數一致,inactive 是指經過多長時
Q1 b. h. S# }! r/ y間文件沒被請求後刪除緩存。5 k. Q: P9 r. v5 c# J
open_file_cache_valid 30s;. C( _, Z! f! F6 S! q: B2 @
這個是指多長時間檢查一次緩存的有效信息。
$ z- A& u/ V% Y5 p7 C% iopen_file_cache_min_uses 1;
' w! X' m2 Q* c6 Qopen_file_cache 指令中的 inactive 參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打( W7 ] O: `) {' H. b
開的,如上例,如果有一個文件在 inactive 時間內一次沒被使用,它將被移除。
; L7 T3 t9 W& A
6 g4 `, J* D' x c
1 \+ U. Q0 {$ }1 x6 o: M- H關於內核參數的優化:
* T: q: L5 u' s9 `net.ipv4.tcp_max_tw_buckets = 6000
2 J4 z- W+ [7 D# X, Y, utimewait 的數量,默認是 180000。
# }* q! c5 n6 X2 O# X* Xnet.ipv4.ip_local_port_range = 1024 65000
6 o* c, \* E1 o" f S允許系統打開的端口範圍。. A' N" D7 i* Z4 F1 M, f) r3 @
net.ipv4.tcp_tw_recycle = 1, E2 s. r0 }' ^
啟用 timewait 快速回收。7 F' S, @- Q' M" b
net.ipv4.tcp_tw_reuse = 1
- p( k K" ~/ ^3 Z' h開啟重用。允許將 TIME-WAIT sockets 重新用於新的 TCP 連接。& ^) ^! G8 c, @/ V
net.ipv4.tcp_syncookies = 1
W } e4 h# |5 H# J+ e開啟 SYN Cookies,當出現 SYN 等待隊列溢出時,啟用 cookies 來處理。
4 \8 F4 H! J2 j& _2 t9 U& ynet.core.somaxconn = 262144* f. ?, j( Q- L% d1 Z
web 應用中 listen 函數的 backlog 默認會給我們內核參數的 net.core.somaxconn 限製到 128,而 nginx 定義的 c/ C; ?1 c R; F3 k. V$ g
NGX_LISTEN_BACKLOG 默認為 511,所以有必要調整這個值。
% ] r3 F0 F K7 Bnet.core.netdev_max_backlog = 262144
# H8 M+ H" c* C" D) u$ L每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。 |. F: \; l% b( v
net.ipv4.tcp_max_orphans = 262144& D/ Y, w" ]: d( X/ v
系統中最多有多少個 TCP 套接字不被關聯到任何一個用戶文件句柄上。如果超過這個數字,孤兒連接將即刻被復位並打# Z: O. X! X/ \
印出警告信息。這個限制僅僅是為了防止簡單的 DoS 攻擊,不能過分依靠它或者人為地減小這個值,更應該增加這個值
' B8 b" O: o S7 j: F(如果增加了內存之後)。9 z: c( I0 d2 P. _( L1 V" z
net.ipv4.tcp_max_syn_backlog = 2621448 N# {! Y4 G ~' z3 m* _ X$ S4 d
記錄的那些尚未收到客戶端確認信息的連接請求的最大值。對於有 128M 內存的系統而言,缺省值是 1024,小內存的系3 B9 ] J2 \5 Z- v# i" y$ f" h
統則是 128。1 L$ o, T3 b9 |3 I+ N
net.ipv4.tcp_timestamps = 0
8 D& W! r* U/ X: ~( V7 h時間戳可以避免序列號的捲繞。一個 1Gbps 的鏈路肯定會遇到以前用過的序列號。時間戳能夠讓內核接受這種“異常”的$ g- A0 _" P% f1 O& v8 c
數據包。這裡需要將其關掉。: i- d7 `0 u% b9 _+ d3 U$ K
net.ipv4.tcp_synack_retries = 1% U; _( ~# ^/ `) `; ]
為了打開對端的連接,內核需要發送一個 SYN 並附帶一個回應前面一個 SYN 的 ACK。也就是所謂三次握手中的第二次
# P- M' f Y5 p0 T7 H握手。這個設置決定了內核放棄連接之前發送 SYN+ACK 包的數量。
9 g- B0 [, q4 Gnet.ipv4.tcp_syn_retries = 1
, s7 a8 P/ |5 l在內核放棄建立連接之前發送 SYN 包的數量。/ k% {( B/ |: W* e) U
net.ipv4.tcp_fin_timeout = 1
5 B! G7 B# F U1 m如果套接字由本端要求關閉,這個參數決定了它保持在 FIN-WAIT-2 狀態的時間。對端可以出錯並永遠不關閉連接,甚
D9 X& k& w- i. o$ O1 V G$ |至意外當機。缺省值是 60 秒。2.2 內核的通常值是 180 秒,你可以按這個設置,但要記住的是,即使你的機器是一個輕
# |1 q; c3 W1 j' x2 x載的 WEB 服務器,也有因為大量的死套接字而內存溢出的風險,FIN- WAIT-2 的危險性比 FIN-WAIT-1 要小,因為它最6 U# Z6 I* ]: B
多只能吃掉 1.5K 內存,但是它們的生存期長些。4 l! g5 k r# O6 S$ b
net.ipv4.tcp_keepalive_time = 30
0 o. m& h+ i4 e當 keepalive 起用的時候,TCP 發送 keepalive 消息的頻度。缺省是 2 小時。( J! ^8 J5 N( @0 V+ z' w
( s4 K6 y d x6 c8 D7 ~6 q1 U! z& \' l! k5 p. h* w
下面貼一個完整的內核優化設置:( L1 f/ k! C3 I. b6 A9 `+ B
net.ipv4.ip_forward = 0
' R) k% G+ `5 ^$ j7 Y" [+ Qnet.ipv4.conf.default.rp_filter = 1
( U# |! T- A+ _+ X! Nnet.ipv4.conf.default.accept_source_route = 0
& e. ^2 U+ V# L2 u" Bkernel.sysrq = 0
( d! N; P- B6 P2 y( ~kernel.core_uses_pid = 1
+ U! m1 w" h' o8 o: xnet.ipv4.tcp_syncookies = 1) ^9 @9 Z, F1 y0 ^) G5 v
kernel.msgmnb = 655363 h, D& p( Y) T
kernel.msgmax = 65536, V; [( A1 y% u
kernel.shmmax = 68719476736
! w" S' i9 P- Kkernel.shmall = 4294967296
9 }+ {6 h- v5 a+ }net.ipv4.tcp_max_tw_buckets = 6000+ \4 K; `0 Z* p Z: c: t
net.ipv4.tcp_sack = 1
. V" G& ~8 i3 _3 p; Dnet.ipv4.tcp_window_scaling = 1: D" F* x2 b+ g Y! u/ [+ J
net.ipv4.tcp_rmem = 4096 87380 4194304
5 h; i0 ^- w: r, `net.ipv4.tcp_wmem = 4096 16384 4194304
% r1 ]3 q" S3 F& \: Y& w& I; knet.core.wmem_default = 8388608) v6 y% S, M' E
net.core.rmem_default = 8388608 Q( y4 |0 Q3 H8 ^# `3 J
net.core.rmem_max = 16777216% q- y% k2 J8 e, t9 x; Y( M
net.core.wmem_max = 16777216( l( [: M, U' i
net.core.netdev_max_backlog = 2621446 G* Q$ r9 s) b
net.core.somaxconn = 262144% G _2 A9 g n, p, [
net.ipv4.tcp_max_orphans = 32768006 l. \% T% Y- f/ H
net.ipv4.tcp_max_syn_backlog = 262144; ]/ R8 h$ G6 g8 U; |$ s
net.ipv4.tcp_timestamps = 00 `# C: w9 y; C# S2 @
net.ipv4.tcp_synack_retries = 1
/ D1 j+ ?, _- a( W2 |6 R7 N9 \net.ipv4.tcp_syn_retries = 1
* b; J3 |8 _5 B( Tnet.ipv4.tcp_tw_recycle = 1
5 E ^; t" A$ X' ]net.ipv4.tcp_tw_reuse = 1
6 ?! |) q$ d y. m1 Z0 C. P' G! Tnet.ipv4.tcp_mem = 94500000 915000000 927000000
4 S% [! Q* F; c7 dnet.ipv4.tcp_fin_timeout = 1& y2 f7 J! K7 e+ L6 k' _
net.ipv4.tcp_keepalive_time = 30( S7 B+ x* c1 t- I
net.ipv4.ip_local_port_range = 1024 65000
. u9 O& a4 R. t$ s0 I) l- j' _* |7 ?( `! E+ [" f& x( o6 E
( t; V( {! a- p( M" I6 F
下面是一個簡單的 nginx 配置文件:nginx.conf; M( `9 N! G+ }0 l8 V
user www www;, \) C8 o1 Y6 Y/ {" Z) L" ]& {
worker_processes 8;
. [6 F. H! W4 _' \+ S0 `worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;8 y- N% _! J5 U2 P
error_log /www/log/nginx_error.log crit;& h4 H0 x2 y* F7 h& ~
pid /usr/local/nginx/nginx.pid;& H' a/ r7 C4 o1 V) |/ k1 R
worker_rlimit_nofile 204800;
( I& Z8 E+ [6 z( C3 Eevents0 l# h' }+ ?8 c. l: g) ~2 f
{/ p6 ^9 d% |$ R# H4 u. @
use epoll;
W2 |" u: V* U1 w z( ]$ L+ Y+ G worker_connections 204800;% d. Y' {' U( Q7 f% z
}
! g6 ~: y2 X& [) k' D. hhttp
3 K0 i9 k! L0 L3 k# L1 y3 `& `{+ b5 z8 P: I! s0 e6 C# G3 w. [
include mime.types;
' S0 q. @- _; ^3 f0 `4 u& t default_type application/octet-stream;' d- Y0 B7 F: E
charset utf-8;' W9 U. P/ Y: }
server_names_hash_bucket_size 128;
+ R, N, s( ]3 f% O% P& q client_header_buffer_size 2k;* H# e1 H. b, i% ^. P* `: K+ e: k* t
large_client_header_buffers 4 4k;; x& f9 ~# C3 ?/ g+ x. V
client_max_body_size 8m;
! V1 e% O$ M4 o sendfile on;7 D1 ^6 x& p' ]2 I+ X9 u
tcp_nopush on;- m2 f4 }$ [& x* x% ?2 b6 @
keepalive_timeout 60;
" O; L/ ~+ k# v* r. [ fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;7 x; q& W+ H+ [, A+ I% v! |
fastcgi_connect_timeout 300;
P/ m- @3 L0 ^. ~1 a fastcgi_send_timeout 300;) e/ N; \6 Y4 A. z+ k: {1 H
fastcgi_read_timeout 300;
: ^' e1 e9 n9 n0 \, ] fastcgi_buffer_size 16k;
. l4 H7 R3 D5 j* J( b E% z fastcgi_buffers 16 16k;- L" K8 t) @, p1 O& l
fastcgi_busy_buffers_size 16k;
) f) n* {% L) S7 Z fastcgi_temp_file_write_size 16k;6 B X4 b, ?7 o+ u5 F1 s- P: r" k5 p
fastcgi_cache TEST;1 R2 h9 N% G5 T# L( b) a9 \% s- v
fastcgi_cache_valid 200 302 1h;' g5 Y9 _6 S B+ J8 _! |
fastcgi_cache_valid 301 1d;
& r* L' L- g( \' p8 F I, \ fastcgi_cache_valid any 1m;$ {+ U! b3 U' y1 D' d
fastcgi_cache_min_uses 1;" q. \/ N9 H2 D( M0 c/ f
fastcgi_cache_use_stale error timeout invalid_header http_500;) x, m* K8 z; X( w
open_file_cache max=204800 inactive=20s;
7 }& z" i/ d% Q open_file_cache_min_uses 1;6 W, W, U) ?# F8 j! O, f* _ I
open_file_cache_valid 30s;. D L$ J4 D x2 f/ D3 {
tcp_nodelay on;
1 K2 O3 f; w; o3 W- S1 v N gzip on;
$ ?* c7 S" w- |" x gzip_min_length 1k;) a4 J2 s# {2 p) v
gzip_buffers 4 16k;! K; @& i& x, }( g* ^. t1 S( v
gzip_http_version 1.0;" I1 {, y; A O) u1 @2 _3 S( o
gzip_comp_level 2;
- ^6 n+ t- |0 T T+ v gzip_types text/plain application/x-javascript text/css application/xml;) L' z) U6 I" A& r+ e
gzip_vary on;
6 ], z* I6 `, k# \% X: {5 @ server
2 ?2 u; A% s1 s {6 A7 L" u9 A6 m
listen 8080;
l# \: Y% v8 \* y1 d+ J server_name backup.aiju.com;) u! C; w, { N0 I
index index.php index.htm;
9 B: F. c2 O7 w- s, }2 ~ root /www/html/;& Q# T3 T+ t) f8 D ^7 |, c
location /status
* X- B% P4 c; A. } {+ a* S t$ h% P; v3 B! E- ^0 T
stub_status on;0 d1 }0 F' L: l/ L
}
( ~' {& V7 I$ x3 y location ~ .*\.(php|php5)?$
0 t0 f3 p3 S8 h" _: V$ X+ p {
Z/ b, A+ D3 O% G. A1 B. X fastcgi_pass 127.0.0.1:9000;
. c* r$ T# m( \; e/ m$ r) z fastcgi_index index.php;& ^& E d! [! B: m
include fcgi.conf;5 t8 [! [: }/ z6 a
}
7 t6 W* V* k9 t4 \3 b location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$0 e E: ^& J: I% W0 ~1 r( b7 s
{
9 N% R+ |9 ~5 V- w/ [. u& n7 p expires 30d;) E0 \0 r( I1 s' {9 ~# Q9 T# \5 A
}% x- e" N: K7 j8 ^1 H, u
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
* D8 A# b2 ~+ L/ l$ U {# | '$status $body_bytes_sent "$http_referer" ''"$http_user_agent" $http_x_forwarded_for';) w l' M5 w$ I+ T4 ?
access_log /www/log/access.log access;/ n6 X8 p r& D' t4 ]; b
}
* E4 w, q- b5 u; q" B; ^8 i. \" G}
0 }( E2 p7 _8 r. v( e
! x9 {- o# w$ b+ j) c關於 FastCGI 的幾個指令:: i! I. D2 C u9 ^# n; O! E
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;0 i) j( C4 _1 y: c5 C
這個指令為 FastCGI 緩存指定一個路徑,目錄結構等級,關鍵字區域存儲時間和非活動刪除時間。
! ^* [' k6 Z& t, `$ B, }1 a: A6 Nfastcgi_connect_timeout 300;
8 ] B9 P# K( a$ m2 z' L% |6 T4 H. U指定連接到後端 FastCGI 的超時時間。
m3 T6 @2 i p4 P7 [7 h6 R) Vfastcgi_send_timeout 300;% ?2 w1 B' k( Q$ Q
向 FastCGI 傳送請求的超時時間,這個值是指已經完成兩次握手後向 FastCGI 傳送請求的超時時間。
7 u7 {, W, }! |: {! X7 Jfastcgi_read_timeout 300;' b8 ]9 A! ~3 G
接收 FastCGI 應答的超時時間,這個值是指已經完成兩次握手後接收 FastCGI 應答的超時時間。
& E& X8 z- H! K3 `5 Sfastcgi_buffer_size 16k;. C- u9 b" m7 y$ j. U
指定讀取 FastCGI 應答第一部分需要用多大的緩衝區,這裡可以設置為 fastcgi_buffers 指令指定的緩衝區大小,上面的" ^2 {& ^! A$ c( P+ C
指令指定它將使用 1 個 16k 的緩衝區去讀取應答的第一部分,即應答頭,其實這個應答頭一般情況下都很小(不會超過. R" }) j- H5 S& e: ~
1k),但是你如果在 fastcgi_buffers 指令中指定了緩衝區的大小,那麼它也會分配一個 fastcgi_buffers 指定的緩衝區大4 H* }1 V2 @8 C' A9 m/ P5 w1 N
小去緩存。
0 E& |. _8 N! R. N' `: `; \! m! W& _" zfastcgi_buffers 16 16k;: e6 I8 [ E% e1 l, F5 W7 `
指定本地需要用多少和多大的緩衝區來緩衝 FastCGI 的應答,如上所示,如果一個 php 腳本所產生的頁面大小為 256k,7 A, U" t) J. e/ E0 f! X3 T
則會為其分配 16 個 16k 的緩衝區來緩存,如果大於 256k ,增大於 256k 的部分會緩存到 fastcgi_temp 指定的路徑中,
9 F# Y4 t/ J; I7 f. b6 Q: { B當然這對服務器負載來說是不明智的方案,因為內存中處理數據速度要快於硬盤,通常這個值的設置應該選擇一個你的
1 E( [8 [# Y2 Z" n8 C站點中的 php 腳本所產生的頁面大小的中間值,比如你的站點大部分腳本所產生的頁面大小為 256k 就可以把這個值設
9 Q" f, G( A% B3 ~. A! ~- M置為 16 16k,或者 4 64k 或者 64 4k,但很顯然,後兩種並不是好的設置方法,因為如果產生的頁面只有 32k,如果用 4
' L/ L4 N% z1 ^' P64k 它會分配 1 個 64k 的緩衝區去緩存,而如果使用 64 4k 它會分配 8 個 4k 的緩衝區去緩存,而如果使用 16 16k 則它) } U* Z/ |/ Q( z* |3 S
會分配 2 個 16k 去緩存頁面,這樣看起來似乎更加合理。* N8 S8 j- h# h% m( |
fastcgi_busy_buffers_size 32k;7 e% q, K. v: [/ r
這個指令我也不知道是做什麼用,只知道默認值是 fastcgi_buffers 的兩倍。
q' Y8 c- S* x1 e2 \ Zfastcgi_temp_file_write_size 32k;
+ Y7 I$ }2 q1 w9 a+ y在寫入 fastcgi_temp_path 時將用多大的數據塊,默認值是 fastcgi_buffers 的兩倍。
5 q# @* q* ]) L9 ?: i u* Wfastcgi_cache TEST
/ J' J7 {, d: X/ a" |開啟 FastCGI 緩存並且為其製定一個名稱。個人感覺開啟緩存非常有用,可以有效降低 CPU 負載,並且防止 502 錯誤。
9 e0 e% i* L k+ W. G但是這個緩存會引起很多問題,因為它緩存的是動態頁面。具體使用還需根據自己的需求。
) z) |( u6 a2 h4 Z J4 p( Ofastcgi_cache_valid 200 302 1h;
9 _; Q0 P$ _4 r, \0 Rfastcgi_cache_valid 301 1d;
* G0 I" B* c& S, ufastcgi_cache_valid any 1m;. H% ^" a/ u. N- E* n+ @* o# [- U
為指定的應答代碼指定緩存時間,如上例中將 200,302 應答緩存一小時,301 應答緩存 1 天,其他為 1 分鐘。7 X8 a1 \% z$ t4 D% d4 F9 }& K f
fastcgi_cache_min_uses 1;$ d; y1 x& @7 [. s; l
緩存在 fastcgi_cache_path 指令 inactive 參數值時間內的最少使用次數,如上例,如果在 5 分鐘內某文件 1 次也沒有被; D5 _( c* q" \+ G, v% K. J
使用,那麼這個文件將被移除。
$ ]( s1 u' J; `+ Tfastcgi_cache_use_stale error timeout invalid_header http_500;8 i/ B* k4 E+ U% z/ }
不知道這個參數的作用,猜想應該是讓 nginx 知道哪些類型的緩存是沒用的。- o2 X4 C8 u3 F- T; L+ B
以上為 nginx 中 FastCGI 相關參數,另外,FastCGI 自身也有一些配置需要進行優化,如果你使用 php-fpm 來管理" }7 ]" A- g9 N
FastCGI,可以修改配置文件中的以下值:! L5 _) j3 F4 ~$ \5 A k8 y
<value name="max_children">60</value>9 C C4 C/ j* _- H6 ?5 |
同時處理的並發請求數,即它將開啟最多 60 個子線程來處理並發連接。
9 \2 C/ L" `' }. d<value name="rlimit_files">102400</value>
D1 w: P; u! V* {! p最多打開文件數。
; ^8 A$ W$ a+ y) \) ^<value name="max_requests">204800</value>
! `# M0 N3 A: \9 ?) `4 x1 _6 t, F; b每個進程在重置之前能夠執行的最多請求數。
) r! R! z- b5 s8 T) B& {! |, s3 T( p* ?" {1 Z, H% Y
1 L& U/ ^ O) @ g
參考資料:
0 `% I. m4 l/ ~8 vhttp://demo.ckan.org/dataset/daf ... /download/nginx.pdf
. e" L. B% S# k* ?; ghttp://blog.chinaunix.net/u3/105004/showart_2087155.html
0 T& |' n b9 I1 f' qhttp://nginx.179401.cn/5 @8 g5 [/ y/ j. `2 n
http://blog.s135.com/nginx_php_v5/; j! |% }+ E$ k) y# d+ d$ N
http://xyz.cinc.biz/2015/09/linux-nginx-php-fpm-connection.html
+ u5 Q) L9 E& ]3 Ghttps://www.netroby.com/view/3128" y+ U, Z) f$ f5 M0 y5 S& d! q5 {
fastcgi 快取:
+ o8 i' P c$ u2 jhttps://www.cnxct.com/several-reminder-in-nginx-fastcgi_cache-and-php-session_cache_limiter/
- y. i! T& a J& o2 h其他:
6 K. Z2 x c0 p2 W, N1 lnginx設定檔內參數的詳細說明: http://nginx.org/en/docs/http/ng ... l#keepalive_timeout1 _: z5 m$ _9 U- Y
nginx優化:http://www.jianshu.com/p/2184654ba4b2
4 a$ S% ?* M+ {% hgzip壓縮功能以減少網路傳輸檔案大小:http://wenzhixin.net.cn/2013/11/10/server_gzip_on
/ m$ \- n3 T0 g1 E: z. ?6 g% S0 Z4 v9 G+ z; I0 h/ }. i
x4 L7 i3 I$ H0 q8 H) E0 U5 y
, y3 n1 X* }& [
9 M. m& C; Y# @/ r |