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服務器上的文檔的存放路徑。