優化Nginx內存使用需從配置調整、緩存優化、連接管理、系統級設置等多維度入手,以下是具體步驟:
worker_processes
設為服務器CPU核心數(可通過grep processor /proc/cpuinfo | wc -l
查看),或使用auto
讓Nginx自動適配。例如:worker_processes auto;
這能充分利用多核CPU,避免進程過多導致的上下文切換開銷。events
塊中調整worker_connections
(每個工作進程的最大并發連接數),需結合服務器內存和網絡帶寬設置(如1024-4096)。例如:events {
worker_connections 1024;
use epoll; # Linux系統下推薦使用epoll事件模型,提升并發處理效率
}
http
塊中添加:gzip on;
gzip_comp_level 6; # 壓縮級別(1-9,6為平衡壓縮率與速度的最佳值)
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1024; # 僅壓縮大于1KB的文件
expires
和add_header
設置瀏覽器緩存,減少重復請求對內存的消耗。例如:location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ {
expires 365d; # 緩存1年
add_header Cache-Control "public, no-transform";
}
keepalive_timeout 30s;
client_header_timeout
(請求頭超時)、client_body_timeout
(請求體超時)和send_timeout
(響應超時),避免空閑連接堆積。例如:client_header_timeout 10s;
client_body_timeout 10s;
send_timeout 10s;
合理配置緩沖區參數,避免內存過度分配。在http
或server
塊中添加:
client_body_buffer_size 16k; # 處理請求體的緩沖區大?。J8k/16k)
client_header_buffer_size 1k; # 處理請求頭的緩沖區大小
client_max_body_size 8m; # 允許上傳的最大文件大?。ǜ鶕I務需求調整)
worker_rlimit_nofile
限制每個worker進程的最大文件描述符數(間接控制內存),例如:worker_rlimit_nofile 65535;
echo "1000000000" > /sys/fs/cgroup/memory/nginx/memory.limit_in_bytes
echo $(pgrep -f nginx) > /sys/fs/cgroup/memory/nginx/cgroup.procs
ssl_session_cache shared:SSL:20m; # 共享內存緩存大小
ssl_session_timeout 10m; # 會話超時時間
ssl_session_tickets off; # 關閉會話票證(可選,進一步減少內存)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
top
、htop
或ps
命令查看Nginx進程的內存占用(RES
字段):ps -eo pid,comm,rss | grep nginx
Valgrind
工具檢測內存泄漏(需在測試環境運行):valgrind --tool=memcheck --leak-check=full /usr/sbin/nginx -g "daemon off;"
limit_conn
模塊限制單個IP的并發連接數,緩解內存壓力:limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 20; # 每個IP最多20個并發連接
reload
平滑重啟(不中斷服務)或restart
強制重啟:sudo systemctl reload nginx # 平滑重啟
sudo systemctl restart nginx # 強制重啟
通過以上步驟,可系統性優化Ubuntu上Nginx的內存使用,提升服務器性能和穩定性。需根據實際業務負載調整參數,避免過度優化。