最近在配置 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; } } }