最近在配置 docker 容器時,發現 nginx 的內存占用特別高,后來發現是因為在之前對性能做優化的時候配置不合理導致的,重新梳理了一遍配置。
以下是一個推薦配置,worker_connections 要尤其注意,配置過高可能會導致內存過高
# 設置 nginx 的工作進程數量(默認值:1) # 最大為CPU的邏輯處理器數量,比如6核心12線程的CPU,最大設置就是12,如果是6核心6線程,則為6。 # 需要考慮系統資源分配,每多一個運行進程,內存占用都要多一份(比如一個進程為400M,兩個就是400M*2=800M) worker_processes 1; # 設置 nginx 最大文件描述符打開限制 # 在 Linux 系統中,每建立一個連接都是打開一個文件描述符(作為反向代理或負載均衡連接數量會翻倍,因為內外各一個) # 所以文件的打開限制決定了 nginx 的最大連接數(應大於 worker_processes * worker_connections) # 此處配置需要參考系統的限制(ulimit -n),不能超過系統的最大限制 worker_rlimit_nofile 65535; events { # 此為 Linux 系統特為處理大批量文件描述符而作改進的 poll 事件模型 use epoll; # 設置每個工作進程可處理的最大連接數量 # 此設置將直接影響工作進程的內存固定占用,每個連接大概占用內存 0.4~0.5KB 左右 # 此值應小於 worker_connections / worker_processes worker_connections 65535; # 允許同時接受多個網絡連接 multi_accept on; } http { # 配置文件類型映射,以及默認的 mime 類型 include mime.types; default_type application/octet-stream; # 設置請求頭緩沖區大小,超過后會使用下面的配置大小 # client_header_buffer_size 1K # 設置更大的請求頭緩沖區大小,如果請求頭超出可能會返回 HTTP 414 # large_client_header_buffers 8K # 設置請求體緩沖區大小,大於此緩沖區大小的,將寫入磁盤文件 # client_body_buffer_size 16K # 設置請求體最大大小(此項影響上傳文件的最大大小) client_max_body_size 1000m; # 提供了一種減少拷貝次數,提升文件傳輸性能的方法。(靜態文件由內核直接發送給 socket,而不是由進程讀取到內存再發送) sendfile on; # 降低數據包發送頻率,當數據包滿時再發送,減少網絡數據包數量,降低網絡擁塞情況,僅在 sendfile on 時生效 tcp_nopush on; # 為 http 請求保持 tcp 連接,避免短時間內多次 http 請求反復三次握手來建立 tcp 連接 # 配置保持連接的數量(默認值:100) keepalive_requests 100; # 配置保持連接的時長 keepalive_timeout 10; gzip on; # 開啟 gzip,會增加對 cpu 的資源消耗 gzip_min_length 1k; # 低於 1kb 的資源不壓縮 gzip_comp_level 2; # 壓縮級別 1-9,越大壓縮率越高,同時消耗 cpu 資源也越多。 # 需要壓縮哪些響應類型的資源,多個空格隔開。有些格式的文件壓縮效率較低,不建議壓縮。 gzip_types text/plain application/json application/javascript application/x-javascript text/javascript text/xml text/css; gzip_disable "MSIE [1-6]\."; # 配置禁用 gzip 條件,支持正則。此處表示 ie6 及以下不啟用 gzip(因為 ie 低版本不支持) gzip_vary on; # 配置添加 Vary 響應頭 # 暫不知道用途,主要用來解決:could not build the proxy_headers_hash 錯誤 proxy_headers_hash_max_size 51200; proxy_headers_hash_bucket_size 6400; server { listen 80; server_name demo.psy-cloud.com; location * { return 404; } } }