Nginx 全维度优化方案

基础配置→网络IO→静态资源→反向代理→安全→架构六个维度讲解

一、基础进程与连接优化

核心思路:让Nginx充分利用服务器CPU和内存资源

  1. worker进程数优化

    # 最优值:等于CPU核心数(或auto自动检测)
    worker_processes auto;
    
    # 绑定CPU核心(避免进程切换开销,性能提升10%-20%)
    worker_cpu_affinity auto;
    

    面试说:Nginx是多进程模型,每个worker进程独立运行,绑定CPU核心可以减少上下文切换,提高CPU利用率。

  2. 文件描述符限制

    # 每个worker进程最大打开文件数(建议10240-65535)
    worker_rlimit_nofile 65535;
    

    面试说:Nginx每个连接都占用一个文件描述符,默认1024太小,高并发下会出现"too many open files"错误。

  3. 最大连接数优化

    events {
        # 每个worker进程最大并发连接数
        worker_connections 10240;
        
        # 开启一次性接受多个连接
        multi_accept on;
        
        # 使用epoll事件模型(Linux下最高效,默认开启)
        use epoll;
    }
    

    面试说:Nginx总并发数 = worker_processes × worker_connections,epoll是事件驱动模型,不会随着连接数增加而性能下降。


二、网络IO与TCP传输优化

核心思路:减少网络传输开销,提高数据传输效率

  1. 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处理静态文件快的核心原因,它直接在内核态传输数据,不用经过用户态,避免了两次数据拷贝。

  2. 长连接优化

    http {
        # 客户端长连接超时时间(默认75s,建议30-60s)
        keepalive_timeout 60s;
        
        # 一个长连接最多处理的请求数
        keepalive_requests 1000;
    }
    

    面试说:长连接可以减少TCP三次握手和四次挥手的次数,对于频繁请求的客户端,能大幅降低连接建立开销。


三、静态资源优化(Nginx最擅长,必做)

核心思路:让静态资源尽可能快地返回给客户端,减少后端压力

  1. 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%,传输速度大幅提升。

  2. 浏览器缓存优化

    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%以上的静态资源请求。

  3. 静态资源分离

    server {
        # 所有静态资源由Nginx直接处理
        location /static/ {
            root /var/www/;
            expires 30d;
        }
        
        # 动态请求转发给后端
        location /api/ {
            proxy_pass http://backend;
        }
    }
    

    面试说:动静分离是Nginx最常用的架构,把静态资源交给Nginx处理,动态请求转发给Tomcat/Node.js等后端,充分发挥各自的优势。


四、反向代理优化(最常用场景,面试重点)

核心思路:减少Nginx与后端服务器的交互开销,提高代理效率

  1. 后端长连接复用

    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%以上。

  2. 代理缓存优化

    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;
            }
        }
    }
    

    适用场景:不常变化的接口(比如商品列表、新闻详情),可以大幅减少后端服务器的压力。

  3. 超时参数优化

    server {
        location /api/ {
            proxy_pass http://backend;
            
            # 连接后端超时时间(默认60s,建议5-10s)
            proxy_connect_timeout 5s;
            
            # 后端响应超时时间
            proxy_read_timeout 10s;
            
            # 发送请求给后端超时时间
            proxy_send_timeout 10s;
        }
    }
    

    面试说:设置合理的超时时间,可以避免后端服务挂掉时,Nginx的连接被长时间占用,导致整个服务雪崩。


五、安全与稳定性优化

核心思路:防止恶意攻击,提高系统稳定性

  1. 隐藏版本信息

    http {
        # 隐藏Nginx版本号
        server_tokens off;
    }
    

    面试说:隐藏版本号可以防止攻击者利用已知的版本漏洞进行攻击。

  2. 限流防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错误。

  3. 禁止访问敏感文件

    server {
        location ~* \.(git|svn|env|bak|sql)$ {
            deny all;
        }
    }
    
  4. 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;
    }
    

六、架构层面优化(高并发场景)

  1. Nginx集群:用LVS或DNS轮询做前端负载均衡,多台Nginx同时提供服务,提高整体吞吐量。
  2. CDN加速:把静态资源放到CDN上,让用户就近访问,大幅降低源站压力。
  3. 七层负载均衡:用Nginx的upstream模块做后端服务的负载均衡,支持轮询、权重、IP哈希等算法。
  4. 动静分离+缓存:静态资源Nginx处理+CDN,动态接口Nginx代理+缓存,后端只处理核心业务逻辑。

面试标准回答话术

"我会从六个维度对Nginx进行优化:

  1. 基础配置:调整worker进程数等于CPU核心数,绑定CPU核心,提高文件描述符和最大连接数限制;
  2. 网络IO:开启sendfile零拷贝,优化TCP参数,开启长连接;
  3. 静态资源:开启Gzip压缩,设置浏览器缓存,实现动静分离;
  4. 反向代理:开启与后端的长连接复用,设置合理的超时时间,对不常变化的接口做代理缓存;
  5. 安全优化:隐藏版本号,配置限流防止CC攻击,禁止访问敏感文件;
  6. 架构层面:采用Nginx集群,结合CDN加速,进一步提高系统的并发能力和稳定性。"

需要我给你一个生产环境可用的完整Nginx优化配置文件吗?

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐