优化Nginx内存使用需从配置调整、内核参数、缓存策略、监控排查等多维度入手,以下是具体步骤:
Worker进程是Nginx处理请求的核心,合理配置可避免内存浪费:
worker_processes auto;
),避免过多进程导致内存碎片。1024
或更高(需结合系统资源调整),但需避免单个进程占用过多内存。keepalive_timeout 30s;
),减少空闲连接占用的内存。过大的缓冲区会占用大量内存,需根据实际需求调整:
client_body_buffer_size 16k;
),默认8k
或16k
足够,避免设置过大。large_client_header_buffers 4 8k;
),减少大请求头(如URL过长)的内存消耗。client_max_body_size 10m;
),避免大文件上传导致内存溢出。proxy_buffers 8 16k;
),减少代理请求时的内存占用(每个连接约128KB
)。缓存可减少重复请求的内存消耗:
sendfile
、expires
和add_header
指令,避免重复读取文件:location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
sendfile on;
tcp_nopush on;
expires 7d;
access_log off;
add_header Cache-Control "public";
}
proxy_cache_path
或fastcgi_cache_path
配置缓存路径与大小(如proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;
),并限制单个缓存项大小(如proxy_cache_max_range_offset 1m;
)。内核参数直接影响内存分配与回收效率:
echo 10 > /proc/sys/vm/swappiness
),建议设置为10-30
(值越低,越优先使用物理内存)。net.ipv4.tcp_tw_reuse = 1
、net.ipv4.tcp_tw_recycle = 1
),减少Timewait状态占用的内存(需注意:tcp_tw_recycle
在NAT环境下可能导致连接问题,建议仅在非NAT环境中使用)。net.core.somaxconn = 1024
),避免连接堆积导致内存耗尽。gzip on;
并设置压缩级别(如gzip_comp_level 5;
),减少传输数据量,降低内存消耗。top
、htop
或ps
命令查看Nginx进程的RES
(实际物理内存)占用,识别内存占用过高的进程:top -p $(pgrep nginx | tr '\n' ',')
ps -eo pid,comm,rss | grep nginx
pmap
查看单个Nginx进程的内存映射,定位内存占用高的模块:pmap -x $(pgrep nginx | head -n1) | tail -n 10
error_log /var/log/nginx/error.log debug;
),检查malloc
/free
记录。Valgrind
工具(需在测试环境):valgrind --leak-check=full /usr/sbin/nginx -g "daemon off;"
,定位内存泄漏点。limit_conn_zone
限制每个IP的并发连接数(如limit_conn_zone $binary_remote_addr zone=perip:10m;
、limit_conn perip 20;
),避免单个IP占用过多内存。proxy_cache off;
)或SSL会话缓存(注释ssl_session_cache
行),缓解内存压力。nginx -s reload
)释放内存,若问题持续则强制重启(systemctl restart nginx
)。通过以上步骤,可系统性优化Ubuntu下Nginx的内存使用,提升服务器性能与稳定性。需根据实际业务场景调整参数,避免过度优化导致服务质量下降。