首页 / Nginx / Nginx配置详解

Nginx配置详解:反向代理、负载均衡、HTTPS

Nginx 是一款高性能的 HTTP 服务器和反向代理服务器,以其高并发、低内存占用和丰富的功能模块著称。从个人博客到大型互联网架构,Nginx 几乎无处不在。本文将深入讲解 Nginx 的核心配置,包括反向代理、负载均衡、HTTPS 配置以及性能与安全优化,所有配置示例均可直接用于生产环境。

一、Nginx 配置文件结构

Nginx 的配置采用模块化、层次化的结构,理解其组织方式是写好配置的前提。主配置文件通常位于 /etc/nginx/nginx.conf

nginx# 全局块:影响 Nginx 整体运行
user www-data;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

# events 块:影响网络连接
events {
    worker_connections 10240;
    use epoll;
    multi_accept on;
}

# http 块:配置 HTTP 服务器
http {
    # 导入 mime 类型
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    # 日志格式
    log_format main '$remote_addr - $remote_user [$time_local] '
                     '"$request" $status $body_bytes_sent '
                     '"$http_referer" "$http_user_agent"';
    access_log /var/log/nginx/access.log main;

    sendfile        on;
    tcp_nopush      on;
    keepalive_timeout 65;

    # 导入子配置(每个站点一个文件)
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

最佳实践:不要把所有配置都堆在 nginx.conf 里。把全局配置放在主文件,每个站点单独放在 conf.d/ 目录下,通过 include 引入,便于管理和维护。

二、静态网站配置

最基础的应用是用 Nginx 托管静态网站。下面是一个完整的静态站点配置:

nginx# /etc/nginx/conf.d/1630.top.conf
server {
    listen 80;
    listen [::]:80;
    server_name 1630.top www.1630.top;
    root /var/www/1630.top/dist;
    index index.html;

    # 访问日志
    access_log /var/log/nginx/1630.top.access.log;
    error_log  /var/log/nginx/1630.top.error.log;

    # 主 location
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 静态资源缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # gzip 压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_types text/plain text/css application/json
               application/javascript text/xml application/xml
               application/xml+rss text/javascript image/svg+xml;

    # 安全头
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
    add_header Referrer-Policy "strict-origin-when-cross-origin";

    # 自定义 404 页面
    error_page 404 /404.html;
}

三、反向代理配置

反向代理是 Nginx 最常用的功能之一。它接收客户端请求,转发给后端服务,再把响应返回给客户端。这样可以隐藏后端服务、实现负载均衡、统一处理 SSL 等。

nginxserver {
    listen 80;
    server_name api.1630.top;

    # 客户端上传文件大小限制
    client_max_body_size 50m;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;

        # 传递真实客户端信息
        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;

        # WebSocket 支持
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # 超时设置
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }

    # 不同路径代理到不同服务
    location /api/ {
        proxy_pass http://127.0.0.1:8080/;
    }

    location /static/ {
        alias /var/www/static/;
        expires 7d;
    }
}

四、负载均衡

当单台服务器无法承受流量时,需要多台服务器分担请求。Nginx 的 upstream 模块提供了强大的负载均衡能力。

4.1 负载均衡策略

策略 说明
轮询(默认)按顺序逐一分配请求
weight按权重分配,权重越高分配越多
ip_hash按客户端 IP 哈希,同一 IP 固定访问同一台
least_conn分配给连接数最少的服务器
fair(第三方)按响应时间分配,响应快的多分配

4.2 完整负载均衡配置

nginxhttp {
    # 定义后端服务器组
    upstream backend {
        # ip_hash;  # 取消注释启用 IP 哈希
        # least_conn;  # 取消注释启用最少连接

        server 192.168.1.10:8080 weight=3;
        server 192.168.1.11:8080 weight=2;
        server 192.168.1.12:8080 weight=1;

        # 备用服务器,主服务器都挂了才启用
        server 192.168.1.13:8080 backup;

        # 健康检查参数
        # max_fails: 失败次数  fail_timeout: 失败时间窗口
        # server 192.168.1.14:8080 max_fails=3 fail_timeout=30s;

        # 长连接配置(减少握手开销)
        keepalive 32;
    }

    server {
        listen 80;
        server_name app.1630.top;

        location / {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

五、HTTPS 配置

HTTPS 已是现代网站的标配。借助 Let's Encrypt 可以免费获取 SSL 证书。下面是完整的 HTTPS 配置,包含 HTTP 自动跳转。

5.1 使用 Let's Encrypt 申请证书

bash# 安装 certbot
sudo apt install -y certbot python3-certbot-nginx

# 申请证书并自动配置 Nginx
sudo certbot --nginx -d 1630.top -d www.1630.top

# 测试自动续期(证书有效期 90 天)
sudo certbot renew --dry-run

# 手动续期
sudo certbot renew

5.2 完整 HTTPS 配置

nginx# HTTP 跳转到 HTTPS
server {
    listen 80;
    server_name 1630.top www.1630.top;
    # 永久重定向到 HTTPS
    return 301 https://$host$request_uri;
}

# HTTPS 主配置
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name 1630.top www.1630.top;

    # 证书路径
    ssl_certificate     /etc/letsencrypt/live/1630.top/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/1630.top/privkey.pem;

    # SSL 优化配置
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # 只使用安全的协议和加密套件
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    # HSTS:强制浏览器使用 HTTPS
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

    root /var/www/1630.top/dist;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }

    # OCSP 装订,加速证书验证
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
}

六、性能调优

合理的性能调优可以让 Nginx 承受更高的并发,响应更快。

nginx# /etc/nginx/nginx.conf 全局优化
worker_processes auto;        # 与 CPU 核心数一致
worker_rlimit_nofile 65535;  # 最大文件描述符

events {
    worker_connections 10240;
    use epoll;
    multi_accept on;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    keepalive_timeout 65;
    keepalive_requests 1000;

    # 缓冲区优化
    client_body_buffer_size 10K;
    client_header_buffer_size 1K;
    client_max_body_size 10m;
    large_client_header_buffers 2 1K;

    # FastCGI 缓冲(配合 PHP 等使用)
    fastcgi_buffers 16 16K;
    fastcgi_buffer_size 32K;
}

同时需要调整系统内核参数,编辑 /etc/sysctl.conf

bash# /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
fs.file-max = 1000000

# 使配置生效
sudo sysctl -p

七、安全加固

7.1 隐藏版本号

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

7.2 限制访问与防 CC

nginx# 限制单个 IP 的连接数和请求速率
limit_conn_zone $binary_remote_addr zone=conn:10m;
limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s;

server {
    # 每个 IP 最多 10 个并发连接
    limit_conn conn 10;

    # 每秒 10 个请求,突发 20 个
    limit_req zone=req burst=20 nodelay;

    # 禁止访问敏感文件
    location ~ /\.(git|env|ht) {
        deny all;
    }

    # 限制只允许特定 IP 访问后台
    location /admin/ {
        allow 192.168.1.0/24;
        allow 10.0.0.0/8;
        deny all;
        proxy_pass http://127.0.0.1:8080;
    }
}

八、常用运维命令

bash# 测试配置语法是否正确
sudo nginx -t

# 重新加载配置(不中断服务)
sudo nginx -s reload

# 启动 / 停止 / 重启
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx

# 查看状态
sudo systemctl status nginx

# 查看编译参数(了解已安装的模块)
nginx -V

# 平滑升级 Nginx
sudo nginx -s quit && sudo systemctl start nginx

九、完整生产配置示例

下面整合上述内容,给出一个可直接用于生产环境的完整配置:

nginx# /etc/nginx/conf.d/1630.top.conf
# HTTP 跳转 HTTPS
server {
    listen 80;
    server_name 1630.top www.1630.top;
    return 301 https://$host$request_uri;
}

# HTTPS 主站
server {
    listen 443 ssl http2;
    server_name 1630.top www.1630.top;

    ssl_certificate     /etc/letsencrypt/live/1630.top/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/1630.top/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    root /var/www/1630.top/dist;
    index index.html;
    server_tokens off;

    gzip on;
    gzip_types text/css application/javascript application/json image/svg+xml;

    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Strict-Transport-Security "max-age=63072000" always;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|svg|woff2?)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    location /api/ {
        proxy_pass http://127.0.0.1:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

总结

本文系统讲解了 Nginx 的配置文件结构、静态网站托管、反向代理、负载均衡、HTTPS 配置以及性能与安全优化。Nginx 的强大之处在于其模块化和灵活性,几乎能满足所有 Web 服务场景的需求。掌握这些核心配置后,你就能搭建出高性能、高可用、安全的 Web 服务架构。

在实际运维中,建议养成几个好习惯:每次修改配置后先用 nginx -t 测试语法,再 reload 生效;善用 include 拆分配置文件;定期检查访问日志发现异常流量;及时更新 Nginx 版本修复安全漏洞。希望本文能帮助你在 Nginx 的使用上更进一步。