Nginx 教程

纯干货教学,从零开始学习 Nginx

Nginx 性能优化

掌握 Nginx 服务器性能优化的方法和技巧

Nginx 性能优化概述

Nginx 以其高性能著称,但通过合理的配置和优化,可以进一步提升其性能表现。性能优化主要涉及以下几个方面:

  • 工作进程配置
  • 连接处理优化
  • 内存使用优化
  • 文件传输优化
  • 缓存优化
  • SSL/TLS 优化
  • 日志优化

工作进程配置优化

工作进程数量

# 主配置文件顶部
user nginx;
# 设置为 CPU 核心数
worker_processes auto;
# 绑定工作进程到特定 CPU 核心
worker_cpu_affinity auto;
# 最大打开文件数
worker_rlimit_nofile 65536;

事件模块配置

events {
    # 每个工作进程的最大连接数
    worker_connections 10240;
    # 使用 epoll 事件模型(Linux)
    use epoll;
    # 允许多个连接同时接受
    multi_accept on;
}

HTTP 核心优化

http {
    # 隐藏 Nginx 版本号
    server_tokens off;
    
    # 启用 sendfile
    sendfile on;
    # 启用 tcp_nopush
    tcp_nopush on;
    # 启用 tcp_nodelay
    tcp_nodelay on;
    
    # 连接超时设置
    keepalive_timeout 65;
    keepalive_requests 100;
    
    # 客户端请求体大小限制
    client_max_body_size 1m;
    
    # 缓冲区设置
    client_body_buffer_size 16k;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 8k;
    
    # 压缩配置
    gzip on;
    gzip_comp_level 6;
    gzip_min_length 1000;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_vary on;
    
    # 其他配置...
}

静态文件优化

server {
    listen 80;
    server_name example.com;
    root /var/www/html;
    
    # 静态文件缓存
    location ~* \.(jpg|jpeg|png|gif|css|js|ico|svg|woff|woff2|ttf|eot)$ {
        expires 30d;
        add_header Cache-Control "public, max-age=2592000";
        add_header Last-Modified "$date_gmt";
        add_header ETag "$etag";
        try_files $uri =404;
    }
    
    # 其他配置...
}

代理性能优化

http {
    # 代理缓存配置
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=proxy_cache:10m max_size=10g inactive=60m use_temp_path=off;
    
    server {
        listen 80;
        server_name example.com;
        
        location / {
            proxy_pass http://backend;
            
            # 代理头设置
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            
            # 代理超时设置
            proxy_connect_timeout 10;
            proxy_send_timeout 10;
            proxy_read_timeout 10;
            
            # 代理缓冲区设置
            proxy_buffers 16 16k;
            proxy_buffer_size 32k;
            
            # 启用代理缓存
            proxy_cache proxy_cache;
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
        }
    }
}

SSL/TLS 性能优化

server {
    listen 443 ssl http2;
    server_name example.com;
    
    # SSL 证书配置
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    
    # SSL 优化
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets on;
    ssl_session_ticket_key /etc/nginx/ssl/ticket.key;
    
    # OCSP 装订
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    
    # 其他配置...
}

日志优化

访问日志优化

http {
    # 访问日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    
    # 关闭访问日志(高流量网站)
    # access_log off;
    
    # 或使用缓冲区
    access_log /var/log/nginx/access.log main buffer=32k;
    
    # 错误日志
    error_log /var/log/nginx/error.log warn;
}

日志轮询

# 安装 logrotate
sudo apt install logrotate  # Ubuntu/Debian
sudo yum install logrotate  # CentOS/RHEL

# 配置文件:/etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    create 640 nginx nginx
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
    endscript
}

系统级优化

内核参数优化

# 编辑 /etc/sysctl.conf 文件

# 最大文件句柄数
fs.file-max = 65536

# TCP 优化
net.core.somaxconn = 65536
net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_max_tw_buckets = 65536
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.ip_local_port_range = 1024 65535

# 应用配置
sysctl -p

文件系统优化

# 使用 ext4 文件系统
# 挂载选项优化(/etc/fstab)
/dev/sda1 / ext4 defaults,noatime,nodiratime,errors=remount-ro 0 1

# 禁用不必要的服务
systemctl disable postfix
systemctl disable cups
systemctl disable avahi-daemon

性能监控

Nginx 状态监控

server {
    listen 80;
    server_name example.com;
    
    # 状态监控
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
    
    # 其他配置...
}

使用 Prometheus + Grafana 监控

# 安装 nginx-prometheus-exporter
git clone https://github.com/nginxinc/nginx-prometheus-exporter.git
cd nginx-prometheus-exporter
make build

# 运行 exporter
./nginx-prometheus-exporter -nginx.scrape-uri=http://localhost/nginx_status

# 配置 Prometheus 抓取
sudo nano /etc/prometheus/prometheus.yml
# 添加以下内容
scrape_configs:
  - job_name: 'nginx'
    static_configs:
      - targets: ['localhost:9113']

实践练习

练习1:基本性能优化

  1. 优化工作进程配置,设置为 CPU 核心数
  2. 调整事件模块配置,增加最大连接数
  3. 启用 sendfile、tcp_nopush 和 tcp_nodelay
  4. 测试优化前后的性能差异

练习2:静态文件优化

  1. 配置静态文件缓存
  2. 启用 gzip 压缩
  3. 测试静态文件加载速度

练习3:系统级优化

  1. 优化内核参数
  2. 配置日志轮询
  3. 监控系统资源使用情况

常见问题解答

Q: 如何测试 Nginx 性能?

A: 可以使用 ab(Apache Benchmark)、wrk 或 siege 等工具进行性能测试。

# 使用 ab 测试
ab -n 10000 -c 100 http://localhost/

# 使用 wrk 测试
wrk -t12 -c400 -d30s http://localhost/

Q: 如何确定最佳的工作进程数量?

A: 一般设置为 CPU 核心数,可以使用 auto 让 Nginx 自动检测。

Q: 如何处理高流量网站的性能问题?

A: 可以采用以下措施:

  • 启用缓存
  • 使用 CDN
  • 优化静态文件服务
  • 考虑使用负载均衡
  • 关闭不必要的日志