Linux运维:nginx优化
Nginx 全维度优化方案
从基础配置→网络IO→静态资源→反向代理→安全→架构六个维度讲解
一、基础进程与连接优化
核心思路:让Nginx充分利用服务器CPU和内存资源
-
worker进程数优化
# 最优值:等于CPU核心数(或auto自动检测) worker_processes auto; # 绑定CPU核心(避免进程切换开销,性能提升10%-20%) worker_cpu_affinity auto;面试说:Nginx是多进程模型,每个worker进程独立运行,绑定CPU核心可以减少上下文切换,提高CPU利用率。
-
文件描述符限制
# 每个worker进程最大打开文件数(建议10240-65535) worker_rlimit_nofile 65535;面试说:Nginx每个连接都占用一个文件描述符,默认1024太小,高并发下会出现"too many open files"错误。
-
最大连接数优化
events { # 每个worker进程最大并发连接数 worker_connections 10240; # 开启一次性接受多个连接 multi_accept on; # 使用epoll事件模型(Linux下最高效,默认开启) use epoll; }面试说:Nginx总并发数 = worker_processes × worker_connections,epoll是事件驱动模型,不会随着连接数增加而性能下降。
二、网络IO与TCP传输优化
核心思路:减少网络传输开销,提高数据传输效率
-
TCP参数优化
http { # 开启TCP_NODELAY,禁用Nagle算法,减少小包延迟 tcp_nodelay on; # 开启TCP_NOPUSH,等数据包满了再发送,提高吞吐量 tcp_nopush on; # 开启sendfile,零拷贝传输文件(静态文件性能提升50%+) sendfile on; # sendfile配合使用,减少网络IO次数 sendfile_max_chunk 1m; }面试重点:sendfile零拷贝是Nginx处理静态文件快的核心原因,它直接在内核态传输数据,不用经过用户态,避免了两次数据拷贝。
-
长连接优化
http { # 客户端长连接超时时间(默认75s,建议30-60s) keepalive_timeout 60s; # 一个长连接最多处理的请求数 keepalive_requests 1000; }面试说:长连接可以减少TCP三次握手和四次挥手的次数,对于频繁请求的客户端,能大幅降低连接建立开销。
三、静态资源优化(Nginx最擅长,必做)
核心思路:让静态资源尽可能快地返回给客户端,减少后端压力
-
Gzip压缩优化
http { # 开启gzip压缩 gzip on; # 压缩级别(1-9,6是性能和压缩比的最佳平衡点) gzip_comp_level 6; # 压缩的文件类型 gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 禁用IE6以下的gzip(有bug) gzip_disable "MSIE [1-6]\."; # 告诉代理服务器缓存压缩和非压缩版本 gzip_vary on; }优化效果:文本文件体积减少60%-80%,传输速度大幅提升。
-
浏览器缓存优化
server { # 静态资源缓存1个月 location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control "public, no-transform"; } # HTML文件缓存1小时(防止更新不及时) location ~* \.(html|htm)$ { expires 1h; } }面试说:设置合理的缓存头,让浏览器缓存静态资源,后续请求直接从本地读取,不用再请求服务器,减少90%以上的静态资源请求。
-
静态资源分离
server { # 所有静态资源由Nginx直接处理 location /static/ { root /var/www/; expires 30d; } # 动态请求转发给后端 location /api/ { proxy_pass http://backend; } }面试说:动静分离是Nginx最常用的架构,把静态资源交给Nginx处理,动态请求转发给Tomcat/Node.js等后端,充分发挥各自的优势。
四、反向代理优化(最常用场景,面试重点)
核心思路:减少Nginx与后端服务器的交互开销,提高代理效率
-
后端长连接复用
upstream backend { server 192.168.1.10:8080; server 192.168.1.11:8080; # 开启与后端的长连接,每个worker进程保持100个空闲连接 keepalive 100; } server { location /api/ { proxy_pass http://backend; # 关闭Nginx与客户端的长连接,复用与后端的长连接 proxy_http_version 1.1; proxy_set_header Connection ""; } }面试说:默认情况下Nginx与后端是短连接,每次请求都要建立TCP连接。开启长连接复用后,可以减少大量的TCP握手开销,后端性能提升30%以上。
-
代理缓存优化
http { # 设置缓存路径、大小、层级、有效期 proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off; server { location /api/ { proxy_pass http://backend; # 开启缓存 proxy_cache my_cache; # 对200和304状态码的响应缓存10分钟 proxy_cache_valid 200 304 10m; # 缓存key proxy_cache_key $host$uri$is_args$args; # 添加缓存状态头,方便调试 add_header X-Cache-Status $upstream_cache_status; } } }适用场景:不常变化的接口(比如商品列表、新闻详情),可以大幅减少后端服务器的压力。
-
超时参数优化
server { location /api/ { proxy_pass http://backend; # 连接后端超时时间(默认60s,建议5-10s) proxy_connect_timeout 5s; # 后端响应超时时间 proxy_read_timeout 10s; # 发送请求给后端超时时间 proxy_send_timeout 10s; } }面试说:设置合理的超时时间,可以避免后端服务挂掉时,Nginx的连接被长时间占用,导致整个服务雪崩。
五、安全与稳定性优化
核心思路:防止恶意攻击,提高系统稳定性
-
隐藏版本信息
http { # 隐藏Nginx版本号 server_tokens off; }面试说:隐藏版本号可以防止攻击者利用已知的版本漏洞进行攻击。
-
限流防CC攻击
http { # 限制每个IP每秒最多10个请求 limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; # 限制每个IP最多同时建立10个连接 limit_conn_zone $binary_remote_addr zone=conn_limit:10m; server { # 应用限流规则 limit_req zone=req_limit burst=20 nodelay; limit_conn conn_limit 10; } }面试说:限流是防止CC攻击最有效的手段,burst参数允许突发请求,nodelay参数表示不延迟处理,直接返回503错误。
-
禁止访问敏感文件
server { location ~* \.(git|svn|env|bak|sql)$ { deny all; } } -
HTTPS优化
server { listen 443 ssl http2; # 开启TLS 1.3(比1.2快50%) ssl_protocols TLSv1.2 TLSv1.3; # 禁用弱加密算法 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # 开启会话复用 ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_session_tickets on; # 开启OCSP stapling ssl_stapling on; ssl_stapling_verify on; }
六、架构层面优化(高并发场景)
- Nginx集群:用LVS或DNS轮询做前端负载均衡,多台Nginx同时提供服务,提高整体吞吐量。
- CDN加速:把静态资源放到CDN上,让用户就近访问,大幅降低源站压力。
- 七层负载均衡:用Nginx的upstream模块做后端服务的负载均衡,支持轮询、权重、IP哈希等算法。
- 动静分离+缓存:静态资源Nginx处理+CDN,动态接口Nginx代理+缓存,后端只处理核心业务逻辑。
面试标准回答话术
"我会从六个维度对Nginx进行优化:
- 基础配置:调整worker进程数等于CPU核心数,绑定CPU核心,提高文件描述符和最大连接数限制;
- 网络IO:开启sendfile零拷贝,优化TCP参数,开启长连接;
- 静态资源:开启Gzip压缩,设置浏览器缓存,实现动静分离;
- 反向代理:开启与后端的长连接复用,设置合理的超时时间,对不常变化的接口做代理缓存;
- 安全优化:隐藏版本号,配置限流防止CC攻击,禁止访问敏感文件;
- 架构层面:采用Nginx集群,结合CDN加速,进一步提高系统的并发能力和稳定性。"
需要我给你一个生产环境可用的完整Nginx优化配置文件吗?
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)