前言
? ? DMZ(Demilitarized Zone) 非軍事區,生產環境 WEB 服務部署的區域,公司的架構為一臺nginx 充當 load balance 服務,負載到兩臺 nginx 上面,反向代理至后臺服務,但是nginx 用的全是默認配置加上 proxy_pass?和 upstream,沒有進行針對性的優化。
?
nginx 進程配置
? ? 除了可以使用 ulimit 命令對內核參數進行配置,nginx 也支持對自身使用內核資源進行配置。
? ? nginx 默認使用一個 cpu 資源,即開啟一個進程處理 web 請求,默認進程打開的最大連接數為 1024,這在生產上面是遠遠不夠的。
? ? 配置如下:
????
#user user nobody; #pid file pid logs/nginx.pid;#--------------------------- 進程--------------------------- #worker進程數,通常設置參考服務器 CPU 數量,auto為自動檢測 #worker_process 1; worker_processes auto; #進程分配的 cpu worker_cpu_affinity 000000001 00000010 00000100 00010000 00100000 01000000 10000000; #worker進程打開最大文件描述符數,最好與 ulimit -u 保持一致 worker_rlimit_nofile 100000; #全局錯誤日志 error_log logs/error.log;#events模塊中包含nginx中所有處理連接的設置 events {#worker進程同時打開的最大連接數,理論上每臺 nginx 服務器的最大連接數為 worker_process * worker_connectionsworker_connections 102400;#告訴nginx收到一個新鏈接通知后接受盡可能多的鏈接multi_accept on;#設置用于復用客戶端線程的輪訓方法,使用 epoll 的 I/O 模型use epoll; }
?
http 域配置
? ? http 模塊配置 nginx 處理 http 請求,是 nginx 的核心配置,也是優化 nginx 的關鍵,大多數 nginx 的功能都是圍繞著 http 域來進行的。
????
http {#打開或關閉錯誤頁面中的nginx版本號,生產環境中這些是需要關閉的,降低版本號帶來的漏洞概率。server_tokens off;#server_tag off;#server_info off;#優化磁盤IO設置,指定nginx是否調用sendfile函數來輸出文件,普通應用設為on,下載等磁盤IO高的應用,可設為offsendfile on;#設置nginx在一個數據包里發送所有頭文件,而不是一個接一個的發送tcp_nopush on;#設置nginx不要緩存數據,而是一段一段的發送,當需要及時發送數據時,就應該給應用設置這個屬性,這樣發送一小塊數據信息時就不能立即得到返回值tcp_nodelay on;#---------------------------日志---------------------------#設置nginx是否記錄訪問日志,關閉這個可以讓讀取磁盤IO操作更快access_log on;#設置nginx只記錄嚴重錯誤#error_log logs/error.log crit;#定義日志格式,變量的意思另附博客詳解,定義的日志格式可在 access_log logs/access.log main 中選取log_format main '$remote_addr - $remote_user [$time_local] '' "$request" $status $body_bytes_sent '' "$http_referer" "$http_user_agent" ';log_format porxy '$http_x_forwarded_for - $remote_user [$time_local] '' "$request" $status $body_bytes_sent '' "$http_referer" "$http_user_agent" ';?#設置日志文件緩存(默認是 off),max 設置緩存中最大文件描述符數量,inactive 存活時間,valid 檢查頻率,min_users 在 inactive 時間內最少使用次數,達到的日志文件描述符記入緩存open_log_file_cache max=1000 inactive=20s valid=1m min_users=2;??#記錄重寫日志rewrite_log off;????????#給客戶端分配keep-alive鏈接超時時間keepalive_timeout 30;#--------------------------- 限流 ---------------------------#limit_conn 和 limit_req 可添加到特定 Server 或 location 節點#1、控制 session#設置用戶保存各種key的共享內存的參數,5m指的是5兆,$binary_remote_addr 根據遠程客戶端地址,$server_name 根據服務器名稱limit_conn_zone $binary_remote_addr zone=addr:5m;#為給定的key設置最大的連接數,這里的key是addr,設定的值是100,根據上面的定義說允許每一個IP地址最多同時打開100個連接,如果共享內存定義的是 $server_name 那么這里是允許服務器最多同時打開100個連接。limit_conn addr 100;#限制流量limit_rate 100k;#2、漏桶方法#定義共享內存,與上面的一樣,rate 定義請求次數(1 秒 20次)limit_req_zone $binary_remote_addr zone=addr:5m rate=20r/s;#burst=5 漏桶數為5,即如果第1、2、3、4秒請求為19,那么第5秒25次是可以允許的,nodelay 如果沒有則嚴格使用平均速率限制請求數limit_raq zone=addr burst=5 nodelay;#include指在當前文件中包含另一個文件內容,一般 Server 域是放在另一個配置文件中的,主配置文件中包含下即可。include porxy.types;#設置文件使用默認的mine-typedefault_type text/html;#設置默認字符集charset UTF-8;#-----------------------------gzip 數據-----------------------------#設置nginx采用gzip壓縮的形式發送數據,減少發送數據量,但會增加請求處理時間及CPU處理時間,需要權衡gzip on;#加vary給代理服務器使用,針對有的瀏覽器支持壓縮,有個不支持,根據客戶端的HTTP頭來判斷是否需要壓縮gzip_vary on;#nginx在壓縮資源之前,先查找是否有預先gzip處理過的資源#gzip_static on;#為指定的客戶端禁用gzip功能gzip_disable "MSIE[1-6]\.";#允許或禁止壓縮基于請求和相應的響應流,any代表壓縮所有請求gzip_proxied any;#設置對數據啟用壓縮的最少字節數,如果請求小于10240字節則不壓縮,會影響請求速度gzip_min_length 10240;#設置數據壓縮等級,1-9之間,9最慢壓縮比最大gzip_comp_level 2;#設置需要壓縮的數據格式gzip_types text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml application/xml+rss; #-----------------------------cache 文件-----------------------------#開發緩存的同時也指定了緩存文件的最大數量,20s如果文件沒有請求則刪除緩存open_file_cache max=100000 inactive=20s;#指多長時間檢查一次緩存的有效信息open_file_cache_valid 60s;#文件緩存最小的訪問次數,只有訪問超過5次的才會被緩存open_file_cache_min_uses 5;#當搜索一個文件時是否緩存錯誤信息open_file_cache_errors on;#允許客戶端請求的最大單文件字節數client_max_body_size 8m;#沖區代理緩沖用戶端請求的最大字節數client_header_buffer_size 32k;#-----------------------------代理-----------------------------proxy_redirect off;#后端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP,如果不配置那么web服務器只能獲取到代理服務器的ipproxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#nginx跟后端服務器連接超時時間(代理連接超時)proxy_connect_timeout 60;#連接成功后,后端服務器響應時間(代理接收超時)proxy_read_timeout 120;#后端服務器數據回傳時間(代理發送超時)proxy_send_timeout 20;#設置代理服務器(nginx)保存用戶頭信息的緩沖區大小proxy_buffer_size 32k;#proxy_buffers緩沖區,網頁平均在32k以下的設置proxy_buffers 4 128k;#高負荷下緩沖大小(proxy_buffers*2)proxy_busy_buffers_size 256k;#設定緩存文件夾大小,大于這個值,將從upstream服務器傳proxy_temp_file_write_size 256k;#1G內存緩沖空間,3天不用刪除,最大磁盤緩沖空間2Gproxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:1024m inactive=3d max_size=2g;#-----------------------------負載均衡-----------------------------#設定負載均衡服務器列表參考博客 nginx 負載均衡配置upstream myServer{#后端服務器訪問規則#ip_hash;server 192.168.0.1:10001 weight=3 max_files=2 file_timeout=30;server 192.168.0.2:10002 weight=3 max_conns=10000;server 192.168.0.3:10003 weight=4;server 192.168.0.4:10004 backup;}
?
Server 域配置
? ? 虛擬主機配置模塊,反向代理或負載均衡掛載的站點。
????
server {#虛擬主句監聽的端口listen 80;#定義訪問的域名server_name www.myserver.com;#設定本虛擬主機的訪問日志,使用 main 格式access_log logs/myserver.com.access.log main;#可以在 Server 域中配置限流,具體通過什么方式限流是前面建立共享內存區時定義的,這里只是配置具體限流多少limit_raq zone=addr burst=5 nodelay;limit_conn addr 100; #默認請求# 語法規則:location [=|~|~*|^~] /uri/ {...} 先匹配普通location,在匹配正則location# = 開頭表示精確匹配# ^~ 開頭表示uri以某個常規字符串開頭,理解為匹配url路徑即可,無需考慮編解碼# ~ 開頭表示區分大小寫的正則匹配# ~* 開頭表示不區分大小寫的正則匹配# !~ 開頭表示區分大小寫的不匹配的正則# !~* 開頭表示不區分大小寫的不匹配的正則# / 通用匹配,任何請求都會被匹配到location / {#定義服務器的默認網站根目錄位置root html;#定義首頁索引文件的名稱index index.html index.htm;#使用 myServer 負載均衡服務器組proxy_pass http://myServer;#當然也可以在 location 域中配置限流limit_raq zone=addr burst=5 nodelay;limit_conn addr 100; }#定義錯誤提示頁面error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}#靜態文件,nginx自己處理location ~ ^/(images|javascript|js|css|flash|media|static)/{root /var/www/virtual/htdocs;#過期時間1天expires 1d;#關閉媒體文件日志access_log off;log_not_found off;}#設定查看Nginx狀態的地址location /NginxStatus {#!stub_status on; #無此關鍵字access_log off;auth_basic "NginxStatus";auth_basic_user_file conf/htpasswd;}#禁止訪問的文件.htxxxlocation ~ /\.ht {deny all;}}
?
? ? 簡單的配置,nginx 還有很多功能,包括第三方集成的功能,很強大,后續慢慢添加。