DMZ(Demilitarized Zone) 非軍事區,生產環境 WEB 服務部署的區域,公司的架構爲一臺nginx 充當 load balance 服務,負載到兩臺 nginx 上面,反向代理至後臺服務,可是nginx 用的全是默認配置加上 proxy_pass 和 upstream,沒有進行鍼對性的優化。javascript
除了可使用 ulimit 命令對內核參數進行配置,nginx 也支持對自身使用內核資源進行配置。css
nginx 默認使用一個 cpu 資源,即開啓一個進程處理 web 請求,默認進程打開的最大鏈接數爲 1024,這在生產上面是遠遠不夠的。html
配置以下:java
#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_connections worker_connections 102400; #告訴nginx收到一個新連接通知後接受盡量多的連接 multi_accept on; #設置用於複用客戶端線程的輪訓方法,使用 epoll 的 I/O 模型 use epoll; }
http 模塊配置 nginx 處理 http 請求,是 nginx 的核心配置,也是優化 nginx 的關鍵,大多數 nginx 的功能都是圍繞着 http 域來進行的。node
http { #打開或關閉錯誤頁面中的nginx版本號,生產環境中這些是須要關閉的,下降版本號帶來的漏洞機率。 server_tokens off; #server_tag off; #server_info off; #優化磁盤IO設置,指定nginx是否調用sendfile函數來輸出文件,普通應用設爲on,下載等磁盤IO高的應用,可設爲off sendfile 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 節點 #一、控制 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; #二、漏桶方法 #定義共享內存,與上面的同樣,rate 定義請求次數(1 秒 20次) limit_req_zone $binary_remote_addr zone=addr:5m rate=20r/s; #burst=5 漏桶數爲5,即若是第一、二、三、4秒請求爲19,那麼第5秒25次是能夠容許的,nodelay 若是沒有則嚴格使用平均速率限制請求數 limit_raq zone=addr burst=5 nodelay; #include指在當前文件中包含另外一個文件內容,通常 Server 域是放在另外一個配置文件中的,主配置文件中包含下便可。 include porxy.types; #設置文件使用默認的mine-type default_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服務器只能獲取到代理服務器的ip proxy_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天不用刪除,最大磁盤緩衝空間2G proxy_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; }
虛擬主機配置模塊,反向代理或負載均衡掛載的站點。nginx
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; } #禁止訪問的文件.htxxx location ~ /\.ht { deny all; } }
簡單的配置,nginx 還有不少功能,包括第三方集成的功能,很強大,後續慢慢添加。web