nginx配置總結

1. 全局配置

user nginx ngnix;

#運行nginx進程的用戶與組

worker_process 2;

#啓動幾個worker進程

error_log logs/error.log;

#定義錯誤訪問日誌的路徑

pid  logs/nginx.pid;

#定義pid文件的路徑

worker_rlimit_nofile 8192;

#每個worker進程啓動可以打開的文件數目

events {

worker_connections 4096;

#每個worker可以接收的請求連接數。

}


2. 日誌配置

log_format   main '$remote_addr - $remote_user [$time_local]  $status '

'"$request" $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

#定義日誌的記錄格式,此格式的名字爲main。


3. 虛擬主機配置

server {

listen    80;

#監聽的地址與端口,後面可以跟參數,如listen 192.168.0.11:443 ssl。

server_name node1.yonchin.com;

#定義虛擬服務器的名字。

access_log logs/node1.access.log main;

#訪問路徑,和記錄格式。

root html;

#文檔根目錄,可以是絕對路徑也可以是相對路徑。

}


4. 訪問控制

location /status {

deny 192.168.0.11;

allow 192.168.0.0/24;

allow 10.128.1.0/16;

deny all;

#acl規則是從上到下的依此生效的。

}


5. 基本認證

location /status {

auth_basic    "Nginx Status Info";

#登陸時顯示的信息。

auth_basic_user_file /etc/nginx/.htpasswd;

#定義密碼認證文件,允許訪問/status這個URI用戶和對應的密碼。

}

.htpasswd的創建:

htpasswd -cm /etc/nginx/.htpasswd user1


6. 狀態信息

location /status {

stub_status    on;

#開啓狀態信息的查看功能。

access_log off;

#關閉訪問/status的日誌。

allow 192.168.0.12;

#僅允許192.168.0.12這個地址訪問。

deny all;

}


7. gzip 配置

gzip    on;

#開啓對響應報文的壓縮功能。

gzip_buffers 168k;

#壓縮響應報文所使用的緩衝區個數以及每個緩衝區的大小。

gzip_comp_level 6;

#壓縮的程度,1-9壓縮比例依此增加,不必太高要不浪費CPU時鐘。

gzip_disable    "MSIE [1-6]\.";

#對不支持壓縮功能的瀏覽器,禁用gzip功能。

gzip_min_length 1024;

#響應報文最小多大,可以對其使用gzip功能。

gzip_http_version 1.1;

#對哪個http協議的版本,進行壓縮。

gzip_proxied expired no-cache no-store private;

#對來自後端的哪種響應頭域的響應報文進行壓縮,即當nginx本身爲代理服務器的時候。

gzip_types text/plain application/xml;

#對哪種類型的響應文件需要進行壓縮。

gzip_vary on;

#在響應頭部信息中,添加一個頭信息爲"Vary: Accept-Encoding"


8. rewrite配置

域名跳轉:

server {

listen 80;

server_name node1.yonchin.com;

rewrite    ^/     http://node2.yonchin.com;

#將對node1.yonchin.com的所有請求都重定向到http://node2.yonchin.com上。

}

指定路徑跳轉:

location / {

rewrite^/forum/?$    /bbs/ permanent;

#將對/forum下面的URI的訪問永久重定向到/bbs/上。rewrite後面可以跟的參數有4種:

last:表示匹配完rewrite規則後,不再繼續進行後面rewrite的匹配。但所匹配到的URL會去查找一個合適的location指令所定義的內容。所以,這個參數不用在location上下文中,否則容易產生死循環。

break:表示匹配完rewrite規則後,不再繼續進行後面rewrite的匹配。這個參數可以用在location上下文中。

redirect:會返回302的臨時重定向代碼。如果重定向後的URL不是以http://或https://開頭的話,可以使用這個參數。

permanent:返回一個301的永久重定向代碼。

}


9. https配置

server {

listen 443 ssl;

#監聽443端口並開啓ssl功能。或者直接使用ssl on;也可以開啓ssl。

server_name    node1.yonchin.com;

index    index.html;

#主頁文件。

root    /www

ssl_protocols    SSLv3 TLSv1 TLSv1.1 TLSv1.2;

#定義ssl所支持的協議。

ssl_ciphers    AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;

#啓用加密算法。

ssl_certificate    /etc/nginx/nginx.crt;

#公鑰的路徑。

ssl_certificate_key    /etc/nginx/nginx.key;

#私鑰的路徑。

ssl_session_timeout    10m;

#定義客戶端重用緩存中ssl會話參數的超時時長。

ssl_session_cache    shared:SSL:10m;

#定義緩存ssl會話參數的類型和大小。類型分builtin和shared兩種,builtin表示每個worker進程單獨使用一個緩存,shared表示所有的worker進程共享一個緩存。建議使用shared類型。

}

建立證書:

(umask 077; openssl genrsa -out nginx.key 1024)

openssl req -new -X509 -key ngnix.key -out nginx.crt


10. proxy配置

http {

proxy_set_header Host$host;

#向代理服務發往後端的請求頭域中,添加客戶端所請求的主機名。

proxy_set_header   X-Real-IP    $remote_addr;

#向代理服務發往後端的請求頭域中,添加X-Real-IP頭域,值爲$remote_addr即客戶端IP。

proxy_set_header  X-Forwarded-For    $proxy_add_x_forwarded_for;

#將$remote_addr的值追加到X-Forwareded-For請求頭域後面。如果沒有X-Forwareded-For請求頭域,則$proxy_add_x_forwarded_for的值與$remote_addr的值相等。

client_max_body_size  10m;

#客戶端請求的請求體的最大大小。

client_body_buffer_size  128k;

#客戶端請求體可以使用的緩衝大小。

proxy_buffering  on;

#開啓代理對後端服務器響應數據的緩衝功能。

proxy_connect_timeout  90;

#代理服務器與後端連接建立的超時時間。

proxy_send_timeout  90;

#代理服務器向後端服務器發送請求的超時時間。

proxy_read_timeout  90;

#代理服務器接收後端服務器響應的超時時間。

proxy_buffers  4 64k;

#對於每個連接,所能使用的緩衝區的個數以及每個緩衝區的大小。

proxy_buffer_size  128k;

#表示可以接受後端服務器所響應的最大數據。

proxy_busy_buffers_size    128k;

#表示緩存中的響應數據要發送到客戶端時,所使用的緩衝大小。

proxy_temp_file_write_size  128k;

#如果一次可寫入臨時文件的數據大小。

server {

listen 80;

server_name  node1.yonchin.com;

location / {

proxy_pass  http://192.168.0.12;

}

}

}

緩存所代理的數據:

http {

proxy_cache_path  /data/nginx/cache  levels=1:2 keys_zone=static:10m inactive=24h max_size=1g;

#定義緩存路徑,幾級的緩存目錄,緩存區域的名稱和大小,多長時間處於非活動狀態時可以刪除,最大緩存多少數據。

server {

proxy_pass  http://192.168.0.12;

proxy_set_header  Host $host;

proxy_cache  static;

#使用上面定義的緩存區域。

proxy_cache_valid  200 302 1d;

#不同的響應碼的緩存時長。

proxy_cache_valid   any 1m;

#除了200,302外,其他的所有響應碼緩存1分鐘。

prox_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;

#表示出現那種情況的時候可以使用緩存中過期的數據。

}

}

11. 負載均衡

算法:

rr :輪詢,默認即是這種算法。

wrr :加權輪詢,需要添加weight參數。

ip_hash :基於客戶端IP地址的hashing來進行請求的負載均衡。

least_conn :基於最少的活動連接數對請求負載均衡。

例子:

http {

upstream backend {

server 192.168.0.11    weight=2;

server 192.168.0.12    weight=3;

server 127.0.0.1 backup;

#backup表示正常情況下,127.0.0.1不提供服務,只有在所有的其他server宕機後才使用它。

}

或:

upstream backend {

ip_hash;

server 192.168.0.11;

server 192.168.0.12 down;

#down參數表示此後端服務器不可用,常與ip_hash算法結合使用。

server 127.0.0.1 backup;

server {

location / {

proxy_pass http://backend;

}

}

}


12. 動靜分離

upstream dynamic {

server 192.168.0.12;

server 192.168.0.13;

}

server {

listen 80;

server_name node1.yonchin.com;

index index.html;

root /usr/shard/nginx/html;

location ~* \.(html|gif|jpg|jpeg|png|bmp|swf|flv|mp3|wma)$ {

expires 5d;

#在響應給客戶端的響應頭部,添加"Expires"和"Cache-Control"響應頭部,此處表示對匹配到的文件在客戶端緩存5天。

}

location ~* \.php$ {

proxy_pass http://dynamic;

}

}

或:

upstream static {

server 192.168.0.11;

}

upstream dynamic {

server 192.168.0.12;

server 192.168.0.13;

}

server {

location ~* \.(html|gif|jpg|jpeg|png|bmp|swf|flv|mp3|wma) {

proxy_pass http://static;

}

location ~* \.php$ {

proxy_pass http://dynamic;

}

}


13. 防盜鏈

location ~* \.(png|gif|jpg|jpeg|ico|swf|flv|wma|wmv|mp3|asf|rar|zip)$ {

valid_referersnone blocked server_names 

*.myselfsite.com 

~\.google\. ~\.baidu\.;

}

#請求頭中不包含Referer頭域的,經過防火牆或代理服務器Referer被刪除的,有Referer且屬於server_name指令中定義的,Referer頭域中是*.myselfsite.com的,包含google和baidu字段的,都允許訪問。

if ($invalid_referer){

return 403;

#如果Referer中的URL不匹配指令valid_referers中定義的內容,那麼$invalid_referer的值將爲真,就會返回給客戶端403的錯誤。

}


14. 後端健康監測

軟件:tengine-2.0.1.tar.gz

系統:CentOS6.5

安裝:

./configure   --user=nginx   --group=nginx     --with-http_flv_module   --with-http_stub_status_module   --with-http_gzip_static_module --enable-mods-shared=all --with-file-aio  --with-http_sysguard_module --with-pcre

make && make install

配置:

http {

upstream webs {

server 192.168.0.12;

server 192.168.0.13;

check interval=3000 rise=2 fall=5 timeout=1000 type=http;

#interval:發送健康監測的時間間隔。

#rise:如果連續成功檢測2次,服務器就被認爲是up。

#fall:如果連續失敗檢測5次,服務器就被認爲是down。

#timeout:健康檢測的超時時間。

#type:健康檢查包的類型。支持tcp、ssl_hello、http、mysql、ajp。

check_http_send "HEAD / HTTP/1.0\r\n\r\n";

#健康檢測的內容。注意HTTP協議的版本是1.0。1.1的版本無法正常檢測後端。

check_http_expect_alive http_2xx http_3xx;

#後端返回什麼狀態碼,就認爲是健康的。還支持http_4xx和http_5xx。

}

server {

location / {

proxy_pass    http://webs;

}

location /status {

check_status;

#顯示服務器的健康狀態頁面。

access_log    off;

allow 192.168.0.0/24;

denyall;

}

}

}

15. 過載保護

環境同上。

http {

dso {

load ngx_http_sysguard_module;

#動態加載sysguard模塊

}

server {

sysguard on;

#開啓sysguard功能。

sysguard_load load=2*0.5 action=/test.html;

#如果CPU的平均負載率超過2*0.5則就顯示/test.html這個頁面的內容。2表示CPU的個數爲兩個,0.5可以理解爲每個CPU的的單獨負載。

sysguard_mem swapratio=20% action=/test.html;

#如果swap分區的使用率超過20%的話,就返回test.html這個頁面內容。

sysguard_mem free=100Maction=/test.html;

#如果空閒內存少於100M的話,就返回test.html這個頁面內容。當然也可以直接返回錯誤狀態碼,例如:

server {

sysguard on;

sysguard load=1.5 action=/loadlimit;

location /loadlimit {

return 503;

}

}

}

}


16. 常用命令行

日誌輪轉:

mv access.log access.log.0

kill -USR1 `cat master.nginx.pid`

#USR1這個信號,就是告訴nginx主進程重新打開一個日誌文件。

在線升級nginx:

kill -USR2 `cat master.nginx.pid`

平滑重啓:

kill -HUP `cat master.nginx.pid`

從容關閉工作進程:

kill -WINCH `cat master.nginx.pid`

從容關閉:

kill -QUIT `cat master.nginx.pid`

#從容的意思就是等所有的連接斷開後,在關閉進程。


17. 與PHP FPM結合的配置

location ~ \.php$ {

fastcgi_pass 192.168.0.12:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;

include fastcgi_params;

}


在文件fastcgi_params中加入下面一行配置:

fastcgi_paramSCRIPT_FILENAME $document_root$fastcgi_script_name;

:此處也可以不加上面的一行配置,但是fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;這行中的/scripts需要改成php-fpm服務器上的文檔的存放路徑。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章