概述
本章,您将了解到当 Nginx 作为反向代理的代理服务器时,如何将后端服务器配置成备份服务器。
Q:什么是后端备份服务器?
当 Nginx 作为反向代理的代理服务器时,默认所有后端服务器都处于可用的活跃状态,但为了让这组后端服务器具有故障转移等功能,可以将部分后端服务器标记为备份节点(备份服务器)。相关说明:
- 主服务器(Primary server) - 活跃且能正常处理用户请求的一个或多个后端服务器(没有使用
backup参数) - 备份服务器(Backup server) - 处于空闲非活跃状态且不处理用户请求,仅在 所有主服务器出现故障时 才会开始工作(使用了
backup参数)
使用限制
backup 参数仅在使用轮询负载规则时才生效。如果您在 upstream 上下文中使用了 ip_hash、least_conn 或 random 等指令,backup 参数将被忽略。配置示例
基础配置示例
您需要在 upstream 上下文中对对应的后端服务器配置 backup 参数,比如:
...
events {
...
}
...
http {
...
# 定义名称为 backend1 的上游服务器
upstream backend1 {
server 192.168.100.30 max_fails=3 fail_timeout=60s; # 主服务器 1
server 192.168.100.35 max_fails=3 fail_timeout=60s; # 主服务器 2
server 192.168.100.40 max_fails=3 fail_timeout=60s; # 主服务器 3
server 192.168.100.45 max_fails=3 fail_timeout=60s backup; # 备份服务器
}
...
server {
...
location / {
...
}
}
}
工作机制:
- 默认情况 - 被 Nginx 代理服务器转发的请求只在主服务器 1、主服务器 2、主服务器 3 这三台服务器进行分发,备份服务器不工作也不处理用户的请求
- 故障触发 - 只有当所有主服务器都被 Nginx 判定为不可用(Down)时,Nginx 才会激活备份服务器并向其转发请求
- 自动恢复(其他主服务器需要配置
max_fails和fail_timeout才能生效) -fail_timeout既可以设置在指定时间内与后端服务器的通信次数,也可以设置后端服务器出现故障时的不可用时间(部分文档将此过程称为 "静默期")。静默期结束后,Nginx 会在后续请求到达时对故障的任一主服务器进行试探;若试探成功(请求正常返回),则将其标记为可用并切回流量,备份服务器重新进入到空闲非活跃状态
生产环境中的配置示例
...
events {
...
}
http {
...
# 定义了名为 backend1 的一组后端服务器(未指定任何负载策略,默认使用轮询)
upstream backend1 {
server 192.168.100.30 max_fails=3 fail_timeout=60s; # 主服务器 1
server 192.168.100.35 max_fails=3 fail_timeout=60s; # 主服务器 2
server 192.168.100.40 max_fails=3 fail_timeout=60s; # 主服务器 3
server 192.168.100.45 max_fails=3 fail_timeout=60s backup; # 备份服务器
}
...
# 代理缓存核心配置
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:50m inactive=1h max_size=1g use_temp_path=off;
...
server {
listen 192.168.100.20:80;
server_name my-tests.com www.my-tests.com;
# 重定向跳转
return 301 https://www.my-tests.com$request_uri;
}
server {
listen 192.168.100.20:443 ssl http2 backlog=8000 reuseport;
server_name www.my-tests.com;
# SSL/TLS 证书相关的配置
ssl_certificate /usr/local/nginx/ssl/fullchain.pem;
ssl_certificate_key /usr/local/nginx/ssl/my_privkey.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 15m;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# 在代理层统一设置压缩响应
gzip on;
gzip_vary on;
gzip_buffers 32 4K;
gzip_comp_level 5;
gzip_types text/plain text/css text/xml application/json application/javascript application/xml application/xhtml+xml image/svg+xml application/x-font-ttf application/x-font-opentype application/vnd.ms-fontobject font/woff;
gzip_min_length 256;
# 连接优化相关统一设置
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
proxy_next_upstream error timeout http_502 http_504;
# 安全风险控制统一设置
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
location / {
...
# 代理缓存(以 proxy_cache 开头的指令)
proxy_cache my_cache;
proxy_cache_key "$scheme$host$request_uri";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid 500 502 503 504 10s;
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
proxy_cache_background_update on;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
# 添加自定义的调试响应头
add_header X-Cache-Status $upstream_cache_status always;
# 在请求转发给后端服务器之前对 HTTP 请求头进行设置
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_set_header Accept-Encoding ""; # 禁止后端压缩
# 指向一组服务器
proxy_pass http://backend1;
}
location /download {
proxy_pass http://backend1;
# 代理缓冲相关指令
proxy_buffering on;
proxy_request_buffering on;
proxy_buffer_size 4k;
proxy_buffers 16 8k;
proxy_busy_buffers_size 32k;
proxy_max_temp_file_size 1024m;
proxy_temp_file_write_size 8k;
proxy_temp_path /var/buffer/nginx/temp;
}
}
}
此处涉及到的 Nginx 功能有:
-
基础功能
- 重定向
- 压缩响应
- SSL/TLS 证书配置
- 内置变量
- location 匹配 URI 中的普通前缀匹配(无修饰符)
-
反向代理
- 代理缓存
- 代理缓冲
- 负载均衡和负载规则
- 被动健康检查
- 后端服务器的自动故障转移
常见误区
需要注意的是,本文所提到的内容只是提高后端服务器的可用性,并不是提高 Nginx 代理服务器的可用性,读者不要混淆了。
版权声明:「自由转载-保持署名-非商业性使用-禁止演绎 3.0 国际」(CC BY-NC-ND 3.0)
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论










