最近研究了一下Nginx的詳細配置,Nginx作爲各大互聯網網站必備的負載神器,和硬件負載相比成本更加低廉,同時可以提高系統性能、增強系統的健壯性、提高系統有效服務時長、降低系統出錯的可能性,所以備受青睞。
Nginx的配置包括了user,worker_process,worker_rlimit_nofile,event,http等關鍵配置節點,總結導圖如下:
詳細的各個節點配置信息如下:
user nginx; 用戶和用戶組
worker_processes 4; #工作進程,根據硬件調整,大於等於cpu核數
worker_cpu_affinity 0001 0010 0100 1000; cpu內核(二進制,不同的站位對應不同的內核)
worker_rlimit_nofile 65536; 指定進程可以打開的最大描述符:數目。
events {
use epoll; #使用epoll的I/O 模型 多路複用
worker_connections 30000; #工作進程的最大連接數量,根據硬件調整,和前面工作進程配合起來用,儘量大,但是別把cpu跑到100%就行 ;每個進程允許的最多連接數, 理論上每臺nginx服務器的最大連接數爲worker_processes*worker_connections
}
http {
include mime.types; #設定mime類型,類型由mime.type文件定義
default_type application/octet-stream;
log_format mainWeb '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$proxy_add_x_forwarded_for" $request_time';
$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;
$remote_user:用來記錄客戶端用戶名稱;
$time_local: 用來記錄訪問時間與時區;
$request: 用來記錄請求的url與http協議;
$status: 用來記錄請求狀態;成功是200,
$body_bytes_s ent :記錄發送給客戶端文件主體內容大小;
$http_referer:用來記錄從那個頁面鏈接訪問過來的;
$http_user_agent:記錄客戶毒啊瀏覽器的相關信息;
$x_forwarded_for信息,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務器地址;
access_log logs/access.log mainWeb; #需要用access_log指令指定日誌文件的存放路徑;
proxy_set_header Host $Host;
proxy_set_header X-Real_Ip $remote_addr; $remote_addr客戶端ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
real_ip_header X-Forwarded-For;
sendfile on;
#sendfile指令指定 nginx 是否調用sendfile 函數(zero copy 方式)來輸出文件,
對於普通應用,必須設爲on。
如果用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡IO處理速度,降低系統uptime。
keepalive_timeout 65; #keepalive超時時間。
#gzip 相關是對網絡發包數據壓縮的配置,文件壓縮、提高效率
gzip on;
gzip_min_length 500;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/javascript text/css text/plain text/x-json application/xml application/x-javascript;
#server_tag IIS/7.0;
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn_log_level info;
client_max_body_size 5m; //設定通過nginx上傳文件的大小
upstream tomcats {
server 127.0.0.1:8080;
}
nginx的upstream目前支持4種方式的分配
1、輪詢(默認)
每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。
2、weight
指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的情況。
例如:
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
2、ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。
例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
3、fair(第三方)
按後端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream backend {
server server1;
server server2;
fair;
}
4、url_hash(第三方)
按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。
例:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
tips:
upstream bakend{#定義負載均衡設備的Ip及設備狀態
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
在需要使用負載均衡的server中增加
proxy_pass http://bakend/;
每個設備的狀態設置爲:
1.down表示單前的server暫時不參與負載
2.weight默認爲1.weight越大,負載的權重就越大。
3.max_fails:允許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤
4.fail_timeout:max_fails次失敗後,暫停的時間。
5.backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。
nginx支持同時設置多組的負載均衡,用來給不用的server來使用。
client_body_in_file_only設置爲On 可以講client post過來的數據記錄到文件中用來做debug
client_body_temp_path設置記錄文件的目錄 可以設置最多3層目錄
location對URL進行匹配.可以進行重定向或者進行新的代理 負載均衡
server {
listen 80; #配置監聽端口
server_name _; #配置訪問域名
if ( $request_method !~ GET|POST|HEAD ) {
return 403;
}
location /NginxStatus {
allow 10.0.0.0/8;
allow 172.0.0.0/8;
deny all;
stub_status on;
access_log off;
}
location / {
proxy_read_timeout 65;
proxy_pass http://tomcats ; //在需要使用負載均衡的server中增加 proxy_pass http://bakend/;
if ($uri !~ ^/luckymapiproxy){ //$uri等同於當前request中的URI,可不同於初始值,例如內部重定向時或使用index
rewrite ^/(.*)$ /luckymapiproxy/$1;
}
#rewrite ^/$ /ucsimage/;
#rewrite ^/healthCheck.jsp$ /luckycenteros/healthCheck.jsp;
}
}
}
以上便是瞭解到的nginx的配置信息,結合項目中的實踐情況,瞭解每一個參數的含義和制約條件,才能夠更好地理解和梳理。
[參考文章] https://blog.csdn.net/tjcyjd/article/details/50695922