Nginx采用多进程模型(master-worker),worker_processes 数量需与CPU核心数匹配(如worker_processes auto;),避免过多进程导致内存浪费。worker_connections(单个worker的最大连接数)需结合系统资源调整(如worker_connections 1024;),建议不超过ulimit -n(系统最大文件描述符数)的1/4~1/2,防止单个进程占用过多内存。
缓冲区过大是内存浪费的主要原因之一,需根据业务需求合理配置:
client_body_buffer_size(请求体,默认8k~16k)、client_header_buffer_size(请求头,默认1k)、large_client_header_buffers(大型请求头,默认4×8k),可根据请求大小调整(如client_body_buffer_size 8k; large_client_header_buffers 4 8k;);proxy_buffer_size(代理响应头,默认内存页大小,约8k)、proxy_buffers(代理响应内容,默认8×内存页大小)、proxy_busy_buffers_size(高负载时的响应缓冲区),建议减小缓冲区数量或大小(如proxy_buffers 8 16k; proxy_busy_buffers_size 32k;);ssl_buffer_size(默认16k),可减小至8k以降低内存开销。长连接会持续占用内存,需通过超时设置加速连接释放:
keepalive_timeout 30s;,默认75s);keepalive_requests 1000;,默认100),超过后强制关闭连接;client_header_timeout(请求头读取,默认60s)、client_body_timeout(请求体读取,默认60s)、send_timeout(响应发送,默认60s),避免因客户端异常导致内存长期占用。sendfile on;(零拷贝传输)和tcp_nopush on;(优化数据包发送)减少内存拷贝;proxy_cache_path配置多级缓存(如proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:100m inactive=24h max_size=10g;),提高缓存命中率,减少源站请求对内存的消耗;proxy_buffering off;(关闭代理缓冲),直接流式传输内容。HTTPS流量会增加内存开销,需调整SSL参数:
ssl_session_cache shared:SSL:20m;(共享内存缓存,减少重复握手的内存消耗)和ssl_session_timeout 10m;(缩短会话有效期,释放缓存内存);ssl_protocols TLSv1.2 TLSv1.3;)并使用高效加密算法(如ssl_ciphers HIGH:!aNULL:!MD5;),降低加密过程中的内存占用。/etc/sysctl.conf,设置net.ipv4.tcp_tw_reuse = 1(重用TIME_WAIT连接)、net.ipv4.tcp_fin_timeout = 30(缩短FIN超时时间)、vm.swappiness = 10(减少交换分区使用,优先回收内存),提升系统内存管理效率;sendfile on;(零拷贝传输)和aio on;(异步I/O,需Linux内核支持),减少内存拷贝和阻塞,提高内存利用率。top、ps(如ps -o pid,rss,command -p $(pgrep nginx))查看Nginx进程内存占用,或使用Prometheus+Grafana监控内存指标(总内存、每个worker内存、缓存命中率);error_log /var/log/nginx/error.log debug;开启调试日志,或逐步禁用第三方模块定位问题;limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn perip 20;)、关闭高内存功能(如proxy_cache off;)、平滑重启Nginx(nginx -s reload)释放内存。