Linux服务器Nginx反向代理配置实战:负载均衡与SSL证书自动化部署

Nginx反向代理是服务器运维中最常见的基础设施配置之一。通过Nginx实现负载均衡SSL证书自动化管理,能够有效提升Web服务的可用性和安全性。本文以Nginx 1.24+版本为基础,覆盖upstream负载均衡配置、Let’s Encrypt证书自动签发续期、以及HTTPS安全加固的完整流程。

Nginx反向代理基础配置

反向代理的核心是将客户端请求转发到后端服务器,后端服务器对客户端不可见。基础配置结构如下:

# /etc/nginx/nginx.conf
http {
    upstream backend {
        server 192.168.1.10:8080 weight=3;
        server 192.168.1.11:8080 weight=2;
        server 192.168.1.12:8080 weight=1 backup;
    }

    server {
        listen 80;
        server_name api.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 5s;
            proxy_read_timeout 60s;
            proxy_send_timeout 30s;
        }
    }
}

weight参数控制请求分配比例,backup标记的服务器仅在主服务器全部不可用时才接收请求。

负载均衡策略配置与选型

Nginx支持多种负载均衡算法,适用于不同的业务场景:

轮询(默认):按顺序依次分配请求,适合后端服务器性能相近的场景。

upstream backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

最少连接数:将请求分配到当前连接数最少的服务器,适合请求处理时间差异较大的场景。

upstream backend {
    least_conn;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

IP哈希:基于客户端IP的哈希分配,保证同一客户端始终访问同一后端服务器,适合有会话状态的场景。

upstream backend {
    ip_hash;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

一致性哈希:使用nginx_upstream_consistent_hash模块,在后端服务器增减时最小化缓存失效范围。

健康检查与会话保持配置

Nginx开源版不主动检测后端服务器健康状态,请求转发到不可用服务器时会返回502错误。可以通过max_fails和fail_timeout参数实现被动健康检查:

upstream backend {
    server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
}

max_fails=3表示30秒内失败3次后,该服务器在fail_timeout时间内不再接收新请求。对于需要主动健康检查的场景,可以使用nginx_upstream_check_module或Nginx Plus。

会话保持(Session Sticky)通过sticky cookie实现:

upstream backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    sticky cookie_name route_domain expires=1h domain=.example.com httponly;
}

Let’s Encrypt SSL证书自动化部署

使用Certbot工具自动签发和续期Let’s Encrypt免费SSL证书,是实现HTTPS自动化的主流方案。

安装Certbot并签发证书:

# 安装certbot
apt update && apt install -y certbot python3-certbot-nginx

# 签发证书并自动修改Nginx配置
certbot --nginx -d api.example.com -d www.example.com \
  --non-interactive --agree-tos --email admin@example.com \
  --redirect

Certbot会自动在Nginx配置中添加443端口监听、证书路径和HTTP到HTTPS的301重定向。

SSL安全加固配置

默认的Certbot配置已满足基本安全要求,但可以进一步加固:

server {
    listen 443 ssl http2;
    server_name api.example.com;

    ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;

    # 仅使用TLS 1.2和1.3
    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 on;

    # 会话缓存
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # HSTS
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

    # 安全响应头
    add_header X-Frame-Options DENY always;
    add_header X-Content-Type-Options nosniff always;
    add_header X-XSS-Protection "1; mode=block" always;
}

证书自动续期配置

Let’s Encrypt证书有效期为90天,需定期续期。Certbot安装后默认创建systemd timer自动续期,但可以额外配置续期后的Nginx重载:

# /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
#!/bin/bash
nginx -t && systemctl reload nginx
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

手动测试续期流程:

certbot renew --dry-run

完整生产环境配置示例

整合负载均衡、SSL和反向代理的完整配置:

http {
    upstream backend {
        least_conn;
        server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
        server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
        server 192.168.1.12:8080 max_fails=3 fail_timeout=30s backup;
    }

    # HTTP重定向到HTTPS
    server {
        listen 80;
        server_name api.example.com;
        return 301 https://$host$request_uri;
    }

    # HTTPS反向代理
    server {
        listen 443 ssl http2;
        server_name api.example.com;

        ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
        ssl_protocols TLSv1.2 TLSv1.3;

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

        location /health {
            access_log off;
            return 200 "ok\n";
            add_header Content-Type text/plain;
        }
    }
}

常见问题排查

502 Bad Gateway:后端服务未启动或端口不通。使用curl直接请求后端地址确认服务状态,检查防火墙规则是否放行对应端口。

SSL握手失败:确认证书文件路径正确,检查证书是否过期。使用openssl s_client -connect api.example.com:443验证证书链完整性。

证书续期失败:80端口需对公网开放(Let’s Encrypt通过HTTP-01验证域名所有权)。确认Nginx配置中80端口的server_name与证书域名一致。

负载不均匀:使用ip_hash时,客户端IP过于集中会导致不均匀。可以考虑改用least_conn或一致性哈希策略。通过Nginx的stub_status模块监控各upstream的请求分布。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-nginx-fan-xiang-dai-li-pei-zhi-shi-zhan-fu/

(0)
小编小编
上一篇 23小时前
下一篇 23小时前

相关推荐