Nginx功能篇24—后端备份服务器

概述

本章,您将了解到当 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 代理服务器的可用性,读者不要混淆了。

Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇