温馨提示×

LNMP下Nginx配置优化

小樊
51
2025-10-07 12:58:24
栏目: 编程语言

LNMP环境下Nginx配置优化指南

1. 基础配置优化

  • 工作进程与连接数
    设置worker_processesauto(自动匹配CPU核心数)或手动指定(如4核CPU设为4),充分利⽤CPU资源;通过worker_connections调整每个工作进程的最大连接数(如10240),需结合worker_rlimit_nofile(设置为65535以上)避免“Too many open files”错误。示例:

    worker_processes auto;
    events {
        worker_connections 10240;
        use epoll;  # Linux下推荐使用epoll事件模型
        multi_accept on;  # 一次接受多个新连接
    }
    
  • 高效文件传输
    启用sendfile实现零拷贝传输,减少CPU消耗;配合tcp_nopush(仅在sendfile开启时有效)优化数据包发送,降低网络延迟。示例:

    http {
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;  # 禁用Nagle算法,减少延迟
    }
    
  • 压缩传输
    启用gzip压缩响应数据(如文本、JSON、JS等),减少传输体积(通常可压缩至原大小的30%-70%),提升页面加载速度。示例:

    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
    gzip_comp_level 6;  # 压缩级别(1-9,6为平衡值)
    gzip_min_length 1024;  # 仅压缩大于1KB的文件
    
  • 缓冲区调整
    合理设置请求体与头的缓冲区大小,避免大请求导致的内存溢出或磁盘I/O。示例:

    client_body_buffer_size 16k;  # 请求体缓冲区
    client_header_buffer_size 1k;  # 请求头缓冲区
    client_max_body_size 8m;  # 最大请求体大小(如上传文件限制)
    large_client_header_buffers 4 4k;  # 大请求头缓冲区
    
  • 日志优化
    关闭不必要的访问日志(如静态资源),将错误日志级别调整为crit(仅记录严重错误),减少磁盘I/O。示例:

    access_log off;  # 关闭访问日志(或指定路径)
    error_log /var/log/nginx/error.log crit;  # 错误日志级别
    

2. 高级功能优化

  • 静态资源缓存
    为静态文件(图片、CSS、JS等)设置浏览器缓存(expires)和Cache-Control头,减少重复请求。示例:

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d;  # 浏览器缓存30天
        add_header Cache-Control "public, no-transform";
    }
    
  • 代理缓存
    使用proxy_cache缓存后端响应(如PHP、API),降低后端服务器负载。示例:

    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 / {
            proxy_cache my_cache;
            proxy_pass http://backend;
            proxy_cache_valid 200 302 10m;  # 200/302状态码缓存10分钟
            proxy_cache_valid 404 1m;  # 404状态码缓存1分钟
        }
    }
    
  • 负载均衡
    通过upstream模块将请求分发到多个后端服务器,提升并发处理能力。常用算法:

    • round_robin(默认,轮询):适合后端服务器性能相近的场景;
    • least_conn(最少连接):适合长连接场景(如上传文件);
    • ip_hash(IP哈希):适合需要会话保持的应用(如登录状态)。示例:
    upstream backend {
        least_conn;  # 最少连接算法
        server 192.168.1.101:80;
        server 192.168.1.102:80;
    }
    server {
        location / {
            proxy_pass http://backend;
        }
    }
    
  • SSL/TLS优化
    启用HTTP/2(多路复用,提升传输效率);优化TLS配置(使用TLS 1.3、高性能加密套件);开启会话缓存(减少SSL握手时间)。示例:

    server {
        listen 443 ssl http2;  # 启用HTTP/2
        ssl_protocols TLSv1.3 TLSv1.2;  # 仅使用TLS 1.3/1.2
        ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384';  # 高性能加密套件
        ssl_session_cache shared:SSL:10m;  # 会话缓存
        ssl_session_timeout 10m;  # 会话超时时间
    }
    
  • 防恶意请求
    添加规则拦截常见压力测试工具(如ApacheBench、JMeter)和恶意请求(如空格注入),保护服务器安全。示例:

    if ($http_user_agent ~* (ApacheBench|WebBench|Jmeter)) {
        return 503;  # 返回服务不可用
    }
    if ($request_uri ~ " ") {
        return 444;  # 直接关闭连接(Nginx特有状态码)
    }
    

3. 操作系统级优化

  • 文件描述符限制
    修改/etc/security/limits.conf,增加Nginx进程的文件描述符限制(避免高并发下“Too many open files”错误)。示例:

    * soft nofile 65535
    * hard nofile 65535
    
  • 网络参数优化
    调整内核参数(如/etc/sysctl.conf),优化TCP连接处理:

    • net.core.somaxconn:增加连接队列长度(如65535);
    • net.ipv4.tcp_max_syn_backlog:增加SYN队列长度(如65535);
    • net.ipv4.tcp_tw_reuse:启用TIME_WAIT连接复用(减少连接建立时间);
    • net.ipv4.tcp_fastopen:启用TCP Fast Open(减少握手时间)。示例:
    sysctl -w net.core.somaxconn=65535
    sysctl -w net.ipv4.tcp_max_syn_backlog=65535
    sysctl -w net.ipv4.tcp_tw_reuse=1
    sysctl -w net.ipv4.tcp_fastopen=3
    
  • 硬件优化

    • 使用SSD替代HDD:提升静态资源访问速度(如图片、CSS);
    • 增加内存:提升缓存能力(如proxy_cachegzip缓存);
    • 使用多核CPU:结合worker_processesworker_cpu_affinity(将进程绑定到特定核心,减少上下文切换)。

4. 监控与调优

  • 核心监控指标
    通过nginx -t检查配置语法;使用tophtop监控CPU使用率;通过ss -s查看连接数;通过access_log分析QPS(每秒请求数)、响应时间($request_time)、错误率(4xx/5xx占比)。
  • 工具推荐
    使用Prometheus+Grafana搭建Nginx监控面板,实时查看性能指标;使用ab(Apache Benchmark)、wrk进行压力测试,模拟高并发场景。

以上优化措施需根据服务器硬件配置(CPU、内存、存储)、业务场景(静态/动态内容比例、并发量)进行调整,建议修改配置后通过nginx -t检查语法,再重启Nginx(systemctl restart nginx)使更改生效。

0