英文原文:agiletesting.blogspot.jp,編譯:扶凱
對於想學 Nginx 的新人,這是一個非常不錯的簡明指導。
Google 上有豐富的 Nginx 的教程和樣本配置檔案,但很多時候時候,配置這些是需要一些技巧。
Include 檔案
不要在您的主 nginx.conf 檔案中配置所有的東西,你需要分成幾個較小的檔案。您的同事會很感激你的。比如我的結構,我定義我的 upstream 的 pool 的為一個檔案,和一個檔案定義 location 處理伺服器上其它的應用。
例子:
upstreams.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
upstream cluster1 { fair; server app01:7060; server app01:7061; server app02:7060; server app02:7061; } upstream cluster2 { fair; server app01:7071; server app01:7072; server app02:7071; server app02:7072; } |
locations.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
location / { root /var/www; include cache-control.conf; index index.html index.htm; } location /services/service1 { proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; add_header Pragma "no-cache"; proxy_pass http://cluster1/; } location /services/service2 { proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; add_header Pragma "no-cache"; proxy_pass http://cluster2/service2; } |
servers.conf
1 2 3 4 |
server { listen 80; include locations.conf; } |
現在,你的 nginx.conf 看起來非常的乾淨和簡單(仍然可以分開更多,來更包括檔案,比如分離gzip的配置選項)
nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
worker_processes 4; worker_rlimit_nofile 10240; events { worker_connections 10240; use epoll; } http { include upstreams.conf; include mime.types; default_type application/octet-stream; log_format custom '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" "$http_x_forwarded_for" $request_time'; access_log /usr/local/nginx/logs/access.log custom; proxy_buffering off; sendfile on; tcp_nopush on; tcp_nodelay on; gzip on; gzip_min_length 10240; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml application/xml+rss image/svg+xml application/x-font-ttf application/vnd.ms-fontobject; gzip_disable "MSIE [1-6]\."; # proxy cache config proxy_cache_path /mnt/nginx_cache levels=1:2 keys_zone=one:10m inactive=7d max_size=10g; proxy_temp_path /var/tmp/nginx_temp; proxy_next_upstream error; include servers.conf; } |
這 nginx.conf 檔案是使用了一些不太常見的配置選項,它值得指出其中一些重要的。
多個 worker 的配置(程式)
如果你的 Nginx 是多個 CPU 和多核,需要配置成多核的數量比較好:
1 |
worker_processes 4; |
增加開啟的檔案控制程式碼
如果 Nginx 服務很大的流量,增加最大可以開啟的檔案控制程式碼還是很有用的,因為預設只有 1024 個.可以使用 ‘ulimit -n’ 看到當前系統中的設定.
1 |
worker_rlimit_nofile 10240; |
定製的日誌
可以看看 log_format 和 access_log 二個選項的設定. 通常我們有幾個引數最常使用,象 “$http_x_forwarded_for” 可以見到 load balancer 的裝置之前的 IP, 還有 “$request_time” 可以見到 Nginx 來處理這個主動所花的時間.
壓縮
壓縮對於文字非常非常的有用.
1 2 3 4 5 |
gzip on; gzip_min_length 10240; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml application/xml+rss image/svg+xml application/x-font-ttf application/vnd.ms-fontobject; gzip_disable "MSIE [1-6]\."; |
代理的選項
這些選項可以在每個 location 中設定.
1 2 3 4 5 6 7 |
proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; add_header Pragma "no-cache"; |
這個中加了一個定製的引數,就是 ‘no-cache’,這樣就不會使用 cache 的內容了.
代理的 Cache
使用 Nginx 可以給一些檔案來 cache 到本地來當 Cache 的伺服器,需要設定 proxy_cache_path 和 proxy_temp_path 在你的 HTTP 的 directive 中.在 location 中配置.如果有你想 cache 的內容的話.
1 2 3 4 |
proxy_cache_path /mnt/nginx_cache levels=1:2 keys_zone=one:10m inactive=7d max_size=10g; proxy_temp_path /var/tmp/nginx_temp; |
這可能還想增加一些其它的引數
1 2 3 4 5 6 |
proxy_cache one; proxy_cache_key mylocation.$request_uri; proxy_cache_valid 200 302 304 10m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m; proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504 http_404; |
HTTP caching options
有時你想使用其它的東西來做 Cache ,你可能需要指定怎麼樣 cache. 你可以給 cache 的資訊的檔案 include 到你的 root 的 location 中:
1 2 3 4 5 |
location / { root /var/www; include cache-control.conf; index index.html index.htm; } |
你可以指定不同的頭到於不同的檔案
1 2 3 4 5 6 7 8 9 |
# default cache 1 day expires +1d; if ($request_uri ~* "^/services/.*$") { expires +0d; add_header Pragma "no-cache"; } if ($request_uri ~* "^/(index.html)?$") { expires +1h; } |
SSL
如果你要配置 ssl 的連線的話
1 2 3 4 5 6 7 8 |
server { server_name www.example.com; listen 443; ssl on; ssl_certificate /usr/local/nginx/ssl/cert.pem; ssl_certificate_key /usr/local/nginx/ssl/cert.key; include locations.conf; } |