温馨提示×

Ubuntu上Nginx性能优化技巧

小樊
41
2025-11-09 11:35:41
栏目: 智能运维

Ubuntu上Nginx性能优化技巧

1. 进程模型调优:匹配CPU资源,提升并发处理能力

Nginx的进程模型是其高性能的核心基础,需合理配置以充分利用服务器CPU资源。

  • worker_processes:设置为auto,让Nginx自动检测服务器CPU核心数(如4核服务器会启动4个工作进程),避免手动配置的资源浪费或不足。
  • worker_cpu_affinity:配合auto使用,将每个工作进程绑定到独立的CPU核心,减少进程切换的开销,提升CPU缓存命中率。
  • worker_rlimit_nofile:设置为65535或更高,突破系统默认的文件描述符限制(Ubuntu默认通常为1024),确保高并发时不会因文件描述符耗尽而拒绝请求。
  • events块配置
    • worker_connections 4096:每个工作进程的最大并发连接数(需根据服务器内存调整,每连接约消耗2-4KB内存);
    • multi_accept on:让工作进程一次性接受所有新连接,减少accept系统调用的次数;
    • use epoll:采用Linux高效的epoll事件驱动模型(适用于高并发场景),替代传统的select/poll模型。

2. 传输效率优化:减少数据传输开销

通过优化传输层的配置,降低网络延迟和带宽占用。

  • sendfile on:启用零拷贝技术,直接将文件从磁盘通过内核缓冲区发送到网卡,避免数据在用户态和内核态之间的多次复制,显著提升静态文件(如图片、CSS、JS)的传输效率。
  • tcp_nopush on:与sendfile配合使用,仅在数据包填满时才发送,避免小数据包的频繁传输,提高网络利用率。
  • client_body_buffer_size 16k:请求体缓冲区大小(默认8k或16k),根据上传文件的大小调整(如16k可满足多数小型表单提交需求),避免频繁的内存分配。
  • client_header_buffer_size 4k + large_client_header_buffers 4 32k:处理大请求头(如包含大量Cookie的请求),避免因缓冲区不足导致的请求拒绝。

3. 缓存策略优化:减少重复计算与IO

通过缓存静态资源和代理响应,降低后端服务器的压力。

  • 静态资源缓存:针对图片、CSS、JS等静态文件,配置expiresCache-Control头部,让浏览器缓存文件,减少重复请求。示例:
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
      expires 365d;  # 浏览器缓存1年
      add_header Cache-Control "public, max-age=31536000";
    }
    
  • open_file_cache:开启文件缓存,缓存文件描述符、大小、修改时间等信息,加速静态文件的访问。示例:
    open_file_cache max=1000 inactive=20s;  # 缓存1000个文件,20秒未访问则失效
    open_file_cache_valid 30s;             # 每30秒验证缓存有效性
    open_file_cache_min_uses 2;            # 至少被访问2次才缓存
    
  • 代理缓存:针对动态内容(如PHP、API),配置代理缓存,减少后端服务器的请求压力。示例:
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;
    location / {
      proxy_cache my_cache;
      proxy_cache_valid 200 302 10m;  # 200/302状态码缓存10分钟
      proxy_cache_valid 404 1m;       # 404状态码缓存1分钟
      proxy_cache_use_stale error timeout updating;  # 缓存过期或更新时仍可使用旧缓存
    }
    

4. 操作系统调优:解决系统级瓶颈

调整Ubuntu内核参数,优化TCP连接管理和文件系统性能。

  • 文件描述符限制:编辑/etc/security/limits.conf,添加以下内容,提升用户和root的最大文件描述符数:
    * soft nofile 65535
    * hard nofile 65535
    root soft nofile 65535
    root hard nofile 65535
    
  • TCP/IP堆栈优化:编辑/etc/sysctl.conf,添加以下配置并执行sudo sysctl -p生效:
    net.core.somaxconn = 65535  # 监听队列的最大长度(避免SYN洪水攻击导致连接被拒绝)
    net.ipv4.ip_local_port_range = 1024 65535  # 临时端口范围(扩大端口可用数量)
    net.ipv4.tcp_tw_reuse = 1     # 快速回收TIME-WAIT状态的连接(提升TCP连接复用率)
    net.ipv4.tcp_fin_timeout = 30 # TIME-WAIT状态的超时时间(默认60秒,缩短减少资源占用)
    

5. HTTP/2协议优化:提升传输效率

HTTP/2相比HTTP/1.1支持多路复用、头部压缩等特性,能显著提升页面加载速度。

  • 启用HTTP/2:在server块中修改listen指令,添加http2参数:
    listen 443 ssl http2;  # 必须配合SSL证书使用(HTTP/2通常在加密连接上运行)
    
  • SSL优化:配置安全的SSL协议和会话复用,减少SSL握手开销。示例:
    ssl_protocols TLSv1.2 TLSv1.3;  # 仅使用TLS 1.2及以上安全协议
    ssl_session_cache shared:SSL:10m;  # 会话缓存(10MB),存储SSL会话信息
    ssl_session_timeout 10m;           # 会话超时时间(10分钟)
    

6. Keepalive优化:减少TCP握手开销

Keepalive通过保持客户端与服务器的连接,避免频繁的TCP三次握手和四次挥手,提升并发性能。

  • keepalive_timeout:设置连接保持时间(如65秒),超过该时间未活动的连接将被关闭。
  • keepalive_requests:每个连接允许的最大请求数(如100次),达到次数后连接将被关闭。示例:
    http {
      keepalive_timeout 65;
      keepalive_requests 100;
    }
    

7. 负载均衡:分散请求压力

对于高流量场景,通过Nginx的反向代理功能将请求分发到多个后端服务器,提升整体处理能力。

  • upstream配置:定义后端服务器组,支持轮询、权重、IP哈希等负载均衡算法。示例:
    http {
      upstream backend {
        server backend1.example.com weight=3;  # 权重3,处理更多请求
        server backend2.example.com;
        server backend3.example.com;
      }
      server {
        listen 80;
        location / {
          proxy_pass http://backend;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
        }
      }
    }
    

0