优化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的内存使用,提升服务器性能与稳定性。需根据实际业务场景调整参数,避免过度优化导致服务质量下降。