目 录CONTENT

文章目录

Nginx

解小风
2025-09-12 / 0 评论 / 1 点赞 / 5 阅读 / 23482 字

简介说明

Nginx 是一款高性能的开源 Web 服务器和反向代理服务器,以其出色的性能、稳定性和低资源消耗而闻名,广泛应用于各种规模的网站和应用程序中。


主要功能

  • Web 服务器:提供静态文件服务,支持高并发访问

  • 反向代理:将客户端请求转发到后端服务器,实现负载分担

  • 负载均衡:在多个后端服务器之间分配请求,提高系统可用性

  • SSL/TLS 终端:处理 HTTPS 加密连接,减轻后端服务器负担

  • 缓存服务:提供内容缓存功能,加速响应速度

  • API 网关:统一管理和路由 API 请求


适用场景

  • 高并发 Web 应用的前端代理

  • 微服务架构中的 API 网关

  • 静态资源服务器

  • 多服务器集群的负载均衡器

  • HTTPS 证书管理和 SSL 卸载


安装部署

# 资源需求
Docker_v20+
Docker-Compose_v2.0+

# 准备文件夹(分别为 配置、网页文件、日志、ssl证书 文件夹)
sudo mkdir -p /home/faramita/nginx-xie/conf
sudo mkdir -p /home/faramita/nginx-xie/html
sudo mkdir -p /home/faramita/nginx-xie/logs
sudo mkdir -p /home/faramita/nginx-xie/ssl
sudo chmod 777 -R /home/faramita/nginx-xie
# 准备配置文件 /home/faramita/nginx-xie/conf/nginx.conf

# Nginx 主要依靠配置不同的配置文件 nginx.conf 来实现不同的功能
# 因此配置文件 nginx.conf 的具体内容,在之后不同的功能处详细介绍
# 此处假设配置文件 nginx.conf 已准备完毕
# /home/faramita/nginx-xie/docker-compose.yml 文件如下
version: '3.1'
services:
  nginx:
    image: nginx:latest
    container_name: nginx-xie
    restart: always
    ports:
      # 自定义服务端口
      - '9080:9999'
      # http 端口
      - '80:80'
      # https 端口
      - '443:443'
    privileged: true
    volumes:
      - ./conf/nginx.conf:/etc/nginx/nginx.conf
      - ./logs:/var/log/nginx
      - ./html:/html
      - ./ssl:/etc/nginx/ssl

# 一键安装并启动
sudo docker-compose up -d
# 若 nginx-xie 容器并未运行成功,可前往 ./logs 文件夹中查看日志来寻找失败原因

使用 Tips

上传文件大小

# nginx 反向代理默认传输文件大小为 1M,可通过以下配置更改
client_max_body_size 100M;

# 将上述代码配置在不同地方则具有不同的作用域,可以根据具体需求配置,示例如下:
events {worker_connections 1024;}
http {
    # 作用在整个 http 全局
    client_max_body_size 100M;
    server {
        listen 9801;
        server_name www.jusdot.cn;
        # 作用在整个 server 块
        client_max_body_size 100M;
        location / {
            # 作用在整个 路由 块
            client_max_body_size 100M;
            proxy_pass http://127.0.0.1:9099/;
        }
    }
}

超时配置

# 针对需要长时间处理的服务,配置合适的超时时间
http {
    server {
        location /api/ {
            # 连接后端服务器的超时时间
            proxy_connect_timeout 60s;
            # 向后端服务器发送请求的超时时间
            proxy_send_timeout 300s;
            # 从后端服务器读取响应的超时时间
            proxy_read_timeout 300s;
            # 客户端请求体读取超时时间
            client_body_timeout 60s;
            # 客户端请求头读取超时时间
            client_header_timeout 60s;
        }
    }
}

缓冲区优化

# 针对大文件传输或流式响应,可以调整缓冲区设置
http {
    server {
        location /upload/ {
            # 关闭代理缓冲,适用于流式传输
            proxy_buffering off;
            proxy_request_buffering off;
            
            # 或者调整缓冲区大小(适用于需要缓冲的场景)
            # proxy_buffer_size 64k;
            # proxy_buffers 8 64k;
            # proxy_busy_buffers_size 128k;
        }
    }
}

日志配置

# 自定义日志格式,便于监控和调试
http {
    # 定义日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for" '
                   'rt=$request_time uct="$upstream_connect_time" '
                   'uht="$upstream_header_time" urt="$upstream_response_time"';

    server {
        # 使用自定义日志格式
        access_log /var/log/nginx/access.log main;
        error_log /var/log/nginx/error.log warn;
        
        # 针对特定路径使用不同的日志
        location /api/ {
            access_log /var/log/nginx/api_access.log main;
        }

        # 关闭某些路径的访问日志(如健康检查)
        location /health {
            access_log off;
        }
    }
}

反向代理

准备配置文件

# 配置文件 /home/faramita/nginx-xie/conf/nginx.conf 如下
events {worker_connections 1024;}
http {
    # 设置传输文件大小
    client_max_body_size 100m;

    # 定义日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for" '
                   'rt=$request_time uct="$upstream_connect_time" '
                   'uht="$upstream_header_time" urt="$upstream_response_time"';

    server {
        # (外部访问)监听容器内 9999 端口
        # 因为在 docker-compose.yml 文件中的 ports 部分设置了 '9080:9999'
        # 按需自定义,与 docker-compose.yml 文件中的端口设置保持一致
        listen 9999;

        # (外部访问)url ,即之后用此 url 来访问,可以是 IP 或 域名
        # 配置域名:该域名必须真实存在且已配置解析到 Nginx 部署所在的服务器上
        server_name www.jusdot.cn;
        # 配置 IP :Nginx 部署所在的服务器的 IP
        # server_name 192.168.1.100;
        # 混合多个配置 :以空格隔开,这样 IP 和 域名 都可以访问
        # server_name 192.168.1.100 www.jusdot.cn;
        # 通配符 或 不配置 :如果不需要特定的 server_name ,可以直接 省略该行 或 使用通配符
        # 匹配任何主机名:是指用户输入的任何地址来者不拒(如 IP, www.jusdot.cn, jusdot.cn),但前提是这些请求能到达 Nginx 所在服务器
        # server_name _;

        # 代理路由
        location / {
            # 需要转发的路由,可以代理到任何可达的网络地址,包括:
            # 本机服务: 127.0.0.1
            # 本机其他容器: 172.17.x.x
            # 局域网其他服务器: 192.168.1.105
            # 公网其他服务: api.example.com
            # 只要网络是通的,就能正常转发请求
            proxy_pass http://192.168.1.105:1001/;

            # 设置代理头,确保后端服务能正确获取客户端信息
            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;
        }
        # 上述配置效果:
        # 用户访问 http://www.jusdot.cn:9080/ 等于访问 http://192.168.1.105:1001/
        # 整体访问流程如下:
        # 用户访问: http://www.jusdot.cn:9080/
        #     ↓
        # DNS 解析: www.jusdot.cn → 192.168.1.100 (Nginx 所在的宿主机 IP)
        #     ↓
        # 请求到达: 宿主机端口 9080
        #     ↓
        # Docker 转发: 宿主机 192.168.1.100:9080 → 容器:9999
        #     ↓
        # Nginx 接收: 容器内 Nginx (监听 9999)
        #     ↓
        # server_name 匹配: 匹配到 www.jusdot.cn
        #     ↓
        # proxy_pass 代理转发: http://192.168.1.105:1001
        #     ↓
        # 请求响应: 到达 192.168.1.105:1001 响应请求

        # 代理路由
        location /faramita {
            # 需要转发的路由
            proxy_pass http://192.168.11.100:9080/;

            # 设置代理头,确保后端服务能正确获取客户端信息
            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;
        }
        # 上述配置效果:
        # 用户访问 http://www.jusdot.cn:9080/faramita 等于访问 http://192.168.11.100:9080/

        # 代理路由
        location /cealum {
            # 需要转发的路由
            proxy_pass http://192.168.11.100:7210/;
            
            # 设置代理头,确保后端服务能正确获取客户端信息
            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;
        }
        # 上述配置效果:
        # 用户访问 http://www.jusdot.cn:9080/cealum 等于访问 http://192.168.11.100:7210/

        # 代理路由
        location /app/reader {
            # 需要转发的路由
            proxy_pass http://www.test.com:10098/app/myreader/;
            
            # 设置代理头,确保后端服务能正确获取客户端信息
            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;
        }
        # 上述配置效果:
        # 用户访问 http://www.jusdot.cn:9080/app/reader 等于访问 http://www.test.com:10098/app/myreader/
    }

    # 若需要代理多个域名,则配置多个 server 块即可
    # server {
    #     listen xxx;
    #     server_name api.example.com;
    #     ...
    # }
}

反向代理+HTTPS

(Step1)获取 SSL 证书

# 假设已有 阿里云 域名:jusdot.cn
# 前往 阿里云控制台 - 数字证书管理服务(SSL) - 免费开启 SSL 证书 - SSL 证书 - 免费证书 - 创建证书 - 证书申请:
# 证书绑定域名:www.faramita.jusdot.cn(之后使用 https 的域名)
# 域名验证方式:自动DNS验证(阿里云的域名可以自动验证,非阿里云的域名,选择手动验证并按照提示操作即可)
# 联系人:XX
# 所在地:XX
# 密钥算法:RSA
# CSR生成方式:系统生成
# 提交审核(一般5分钟之内),审核通过后证书显示已签发
# 点击下载 - 选择 Nginx 类型证书下载
# 将下载的证书解压后,重命名为域名(易于理解):
www.faramita.jusdot.cn.pem
www.faramita.jusdot.cn.key
# 将证书文件放入 /home/faramita/nginx-xie/ssl 文件夹内,如:
/home/faramita/nginx-xie/ssl/www.faramita.jusdot.cn.pem
/home/faramita/nginx-xie/ssl/www.faramita.jusdot.cn.key

(Step2)准备配置文件

# 配置文件 /home/faramita/nginx-xie/conf/nginx.conf 如下
events {worker_connections 1024;}
http {
    # 设置传输文件大小
    client_max_body_size 100m;

    # 定义日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for" '
                   'rt=$request_time uct="$upstream_connect_time" '
                   'uht="$upstream_header_time" urt="$upstream_response_time"';

    server {
        # (外部访问)监听容器内 443 端口
        # 因为在 docker-compose.yml 文件中的 ports 部分设置了 '443:443'
        # 按需自定义,与 docker-compose.yml 文件中的端口设置保持一致
        listen 443 ssl;

        # (外部访问)url ,即之后用此 url 来访问,由于要使用 https ,所以此处只设置 域名
        # 配置域名:该域名必须真实存在且已配置解析到 Nginx 部署所在的服务器上
        server_name www.faramita.jusdot.cn;

        # .pem 和 .key 证书路径
        # 注意证书路径一定要为容器内路径 (/etc/nginx/ssl/**),因为在 docker-compose.yml 文件中映射了文件夹 ./ssl:/etc/nginx/ssl
        ssl_certificate /etc/nginx/ssl/www.faramita.jusdot.cn.pem;
        ssl_certificate_key /etc/nginx/ssl/www.faramita.jusdot.cn.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;

        # 代理路由
        location / {
            # 需要转发的路由,可以代理到任何可达的网络地址,包括:
            # 本机服务: 127.0.0.1
            # 本机其他容器: 172.17.x.x
            # 局域网其他服务器: 192.168.1.105
            # 公网其他服务: api.example.com
            # 只要网络是通的,就能正常转发请求
            proxy_pass http://192.168.1.105:1001/;

            # 设置代理头,确保后端服务能正确获取客户端信息
            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;
        }
        # 上述配置效果:
        # 用户访问 https://www.faramita.jusdot.cn/ 等于访问 http://192.168.1.105:1001/
        # 整体访问流程如下:
        # 用户访问: https://www.faramita.jusdot.cn/
        #     ↓
        # DNS 解析: www.faramita.jusdot.cn → 192.168.1.100 (Nginx 所在的宿主机 IP)
        #     ↓
        # 请求到达: 宿主机端口 443
        #     ↓
        # Docker 转发: 宿主机 192.168.1.100:443 → 容器:443
        #     ↓
        # Nginx 接收: 容器内 Nginx (监听 443)
        #     ↓
        # server_name 匹配: 匹配到 www.faramita.jusdot.cn
        #     ↓
        # proxy_pass 代理转发: http://192.168.1.105:1001
        #     ↓
        # 请求响应: 到达 192.168.1.105:1001 响应请求

        # 代理路由
        location /faramita {
            # 需要转发的路由
            proxy_pass http://192.168.11.100:9080/;

            # 设置代理头,确保后端服务能正确获取客户端信息
            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;
        }
        # 上述配置效果:
        # 用户访问 https://www.faramita.jusdot.cn/faramita 等于访问 http://192.168.11.100:9080/

        # 代理路由
        location /cealum {
            # 需要转发的路由
            proxy_pass http://192.168.11.100:7210/;
            
            # 设置代理头,确保后端服务能正确获取客户端信息
            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;
        }
        # 上述配置效果:
        # 用户访问 https://www.faramita.jusdot.cn/cealum 等于访问 http://192.168.11.100:7210/

        # 代理路由
        location /app/reader {
            # 需要转发的路由
            proxy_pass http://www.test.com:10098/app/myreader/;
            
            # 设置代理头,确保后端服务能正确获取客户端信息
            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;
        }
        # 上述配置效果:
        # 用户访问 https://www.faramita.jusdot.cn/app/reader 等于访问 http://www.test.com:10098/app/myreader/
    }

    # 禁止 http 访问(按需开启,取消注释即可)
    # server {
    #     # 同时监听 80 端口(http)
    #     listen 80;
    #     server_name www.faramita.jusdot.cn;
    #     # 将所有 http 的请求强制转发为 https
    #     rewrite ^(.*)$ https://$server_name$1 permanent;
    # }
    # 上述配置效果:
    # 用户无法访问 http://www.faramita.jusdot.cn/ (因为所有 http 请求都会强制转发为 https,实现了禁止 http 访问)

    # 若需要代理多个域名,则配置多个 server 块即可
    # 每个域名都可以同时监听 80 端口(http) 和 443 端口(https) 
    # server {
    #     listen 80;
    #     server_name api.example.com;
    # }
    # server {
    #     listen 443 ssl;
    #     server_name api.example.com;
    #     ...
    #     ssl_certificate xxx.pem;
    #     ssl_certificate_key xxx.key;
    #     ...
    # }
}

负载均衡

准备配置文件

# 配置文件 /home/faramita/nginx-xie/conf/nginx.conf 如下
# 实现效果:
#   服务器集群共 3 台 GPU 服务器
#   每台 GPU 服务器有 2 张 GPU 卡(如 RTX3090)
#   每张 GPU 卡都运行了一个服务(如声音克隆服务),url 如 http://192.168.1.10:12321/AIVoice/TTS/CosyVoice2/xxx
#   但由于 AI 服务比较耗显存,因此实际上一张卡只能支持 2 并发
#   所以需要限制:客户端在调用服务器集群服务时,每张卡只接受 2 个并发请求,每台服务器只接受 2×2=4 个并发请求,服务器集群只接受 3×4=12 个并发请求
#   最终 GPU 集群提供统一的服务访问 url ,如 http://www.jusdot.cn:9080/AIVoice/TTS/CosyVoice2/xxx

events {
    # 增加连接数以支持更多并发
    worker_connections 2048;
    use epoll;
    multi_accept on;
    worker_rlimit_nofile 65535;
}

http {
    # 设置传输文件大小
    client_max_body_size 100M;

    # WebSocket 连接升级映射(预留扩展,不影响 HTTP 服务)
    map $http_upgrade $connection_upgrade {
        default upgrade;  # 当客户端发送 Upgrade 头时,设置为 upgrade
        '' close;         # 当没有 Upgrade 头时,设置为 close(普通 HTTP 请求)
    }

    # 限制整个服务器集群的总并发连接数(优先级最高),分配 10MB 内存存储状态
    limit_conn_zone $server_name zone=cluster_conn_limit:10m;

    # (可选)限制单个客户端 IP 的并发连接数,防止某个客户端占用过多资源,分配 10MB 内存存储状态
    limit_conn_zone $binary_remote_addr zone=client_conn_limit:10m;

    # 定义服务器集群(直接代理到每台服务器的每张 GPU 卡的服务)
    upstream tts_cluster {
        # 使用最少连接数负载均衡算法
        least_conn;

        # 服务器 01 (192.168.1.10) - 2 张 GPU 卡 - 每张卡限制 2 并发
        server 192.168.1.10:12321 max_conns=2 weight=1 max_fails=3 fail_timeout=30s;  # 服务器 01 - GPU 0 服务
        server 192.168.1.10:12322 max_conns=2 weight=1 max_fails=3 fail_timeout=30s;  # 服务器 01 - GPU 1 服务

        # 服务器 02 (192.168.1.11) - 2 张 GPU 卡 - 每张卡限制 2 并发
        server 192.168.1.11:12321 max_conns=2 weight=1 max_fails=3 fail_timeout=30s;  # 服务器 02 - GPU 0 服务
        server 192.168.1.11:12322 max_conns=2 weight=1 max_fails=3 fail_timeout=30s;  # 服务器 02 - GPU 1 服务

        # 服务器 03 (192.168.1.12) - 2 张 GPU 卡 - 每张卡限制 2 并发
        server 192.168.1.12:12321 max_conns=2 weight=1 max_fails=3 fail_timeout=30s;  # 服务器 03 - GPU 0 服务
        server 192.168.1.12:12322 max_conns=2 weight=1 max_fails=3 fail_timeout=30s;  # 服务器 03 - GPU 1 服务

        # 保持连接活跃,减少频繁建立连接的开销(仅适用于 HTTP/1.1 连接)
        keepalive 64;
    }

    # 定义日志格式(针对 TTS 集群优化)
    log_format cluster '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" '
                      'upstream_addr=$upstream_addr '
                      'upstream_response_time=$upstream_response_time '
                      'request_time=$request_time '
                      'server_name=$server_name '
                      'connections_active=$connections_active '
                      'upstream_status=$upstream_status '
                      'upstream_connect_time=$upstream_connect_time';

    # 服务器配置
    server {
        # (外部访问)监听容器内 9999 端口
        # 因为在 docker-compose.yml 文件中的 ports 部分设置了 '9080:9999'
        # 按需自定义,与 docker-compose.yml 文件中的端口设置保持一致
        listen 9999;

        # (外部访问)url ,即之后用此 url 来访问,可以是 IP 或 域名
        # 配置域名:该域名必须真实存在且已配置解析到 Nginx 部署所在的服务器上
        server_name www.jusdot.cn;
        # 配置 IP :Nginx 部署所在的服务器的 IP
        # server_name 192.168.1.100;
        # 混合多个配置 :以空格隔开,这样 IP 和 域名 都可以访问
        # server_name 192.168.1.100 www.jusdot.cn;
        # 通配符 或 不配置 :如果不需要特定的 server_name ,可以直接 省略该行 或 使用通配符
        # 匹配任何主机名:是指用户输入的任何地址来者不拒(如 IP, www.jusdot.cn, jusdot.cn),但前提是这些请求能到达 Nginx 所在服务器
        # server_name _;

        # 访问日志
        # 使用自定义格式记录集群访问日志,包含上游服务器信息和响应时间
        access_log /var/log/nginx/cosyvoice_cluster_access.log cluster;
        # 错误日志,用于排查集群故障
        error_log /var/log/nginx/cosyvoice_cluster_error.log;

        # 超时设置(通用配置,适合大多数服务)
        # 连接超时:建立连接等待时间
        proxy_connect_timeout 30s;
        # 发送超时:发送请求数据等待时间
        proxy_send_timeout 60s;
        # 读取超时:读取响应数据等待时间
        proxy_read_timeout 60s;

        # 缓冲区设置(通用配置,适合普通服务)
        # 开启响应缓冲:提高传输效率,减少后端压力
        proxy_buffering on;
        # 开启请求缓冲:支持大文件上传
        proxy_request_buffering on;
        # 设置合理的缓冲区大小
        proxy_buffer_size 4k;
        proxy_buffers 8 4k;

        # 代理路由
        location /AIVoice/TTS/CosyVoice2/ {
            # 限制整个服务器集群的总并发连接数(优先级最高),如:3台服务器 × 2张卡 × 2并发 = 12 总并发
            limit_conn cluster_conn_limit 12;

            # (可选)限制单个客户端 IP 的并发连接数,防止某个客户端占用过多资源
            limit_conn client_conn_limit 6;

            # 当超过并发连接限制时,返回 503 错误
            limit_conn_status 503;

            # 将请求转发给上游服务器集群
            proxy_pass http://tts_cluster/AIVoice/TTS/CosyVoice2/;

            # 设置代理头,确保后端服务能正确获取客户端信息
            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;

            # HTTP/1.1 协议支持
            proxy_http_version 1.1;

            # WebSocket 支持配置(预留扩展)
            # 当客户端请求 WebSocket 升级时,转发 Upgrade 头到后端服务
            proxy_set_header Upgrade $http_upgrade;
            # 根据是否有 Upgrade 头来设置 Connection 头( upgrade 或 close )
            proxy_set_header Connection $connection_upgrade;

            # 故障转移配置
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_next_upstream_tries 3;
            proxy_next_upstream_timeout 30s;

            # 流式 TTS 服务专用配置(覆盖 server 块的通用配置)
            # 禁用 gzip 压缩:避免压缩延迟,确保实时传输
            gzip off;
            # 关闭代理缓冲:确保流式音频数据实时传输
            proxy_buffering off;
            # 关闭请求缓冲:支持大文本输入的实时传输
            proxy_request_buffering off;
            # 延长超时时间:支持长时间流式传输
            proxy_read_timeout 300s;
            proxy_send_timeout 300s;
            # 设置小缓冲区:减少内存占用,提高响应速度
            proxy_buffer_size 4k;
            proxy_buffers 8 4k;
        }
        # 上述配置效果:
        # 用户访问 http://www.jusdot.cn:9080/AIVoice/TTS/CosyVoice2/xxx 等于访问 GPU 集群服务
        # 整体访问流程如下:
        # 用户访问: http://www.jusdot.cn:9080/AIVoice/TTS/CosyVoice2/xxx
        #     ↓
        # DNS 解析: www.jusdot.cn → 192.168.1.100 (Nginx 所在的宿主机 IP)
        #     ↓
        # 请求到达: 宿主机端口 9080
        #     ↓
        # Docker 转发: 宿主机 192.168.1.100:9080 → 容器:9999
        #     ↓
        # Nginx 接收: 容器内 Nginx (监听 9999)
        #     ↓
        # server_name 匹配: 匹配到 www.jusdot.cn
        #     ↓
        # 并发限制检查: 检查集群总并发(≤12) 和 单IP并发(≤6)
        #     ↓
        # 负载均衡: 选择最少连接的 GPU 服务(3台×2卡×2并发=12总并发)
        #     ↓
        # proxy_pass 代理转发: http://选中的GPU服务器:端口/AIVoice/TTS/CosyVoice2/xxx
        #     ↓
        # 流式响应: 实时音频数据流式传输回用户

        # 集群状态监控端点
        location /cluster/status {
            access_log off;
            add_header Content-Type application/json;
            return 200 '{"status": "healthy", "cluster": "tts_cluster", "timestamp": "$time_iso8601", "total_capacity": 12, "servers": 3, "gpus_per_server": 2, "concurrent_per_gpu": 2}';
        }
        # 上述配置效果:
        # 访问 http://www.jusdot.cn:9080/cluster/status 返回集群状态信息,用于监控系统整体运行状态和负载能力
        # 包含:集群健康状态、总容量(12并发)、服务器数量(3台)、GPU配置等 JSON 格式数据

        # 健康检查端点
        location /health {
            access_log off;
            return 200 "healthy\n";
            add_header Content-Type text/plain;
        }
        # 上述配置效果:
        # 访问 http://www.jusdot.cn:9080/health 返回简单健康状态(不记录访问日志,减少不必要的日志写入)
        # 返回纯文本 "healthy",用于负载均衡器或监控系统的心跳检测

        # 错误页面处理
        error_page 502 503 504 @error_page;
        location @error_page {
            internal;
            add_header Content-Type application/json always;
            return 503 '{"error": {"code": "service_unavailable", "message": "超出并发限制,服务器过载,请稍后重试", "type": "cluster_overload", "timestamp": "$time_iso8601"}}';
        }
        # 上述配置效果:
        # 当后端服务返回 502/503/504 错误或触发并发限制时,返回统一的 JSON 错误信息
        # 包含错误代码、友好提示、错误类型和时间戳

        # 默认错误处理
        error_page 404 @not_found;
        location @not_found {
            internal;
            add_header Content-Type application/json always;
            return 404 '{"error": {"code": "not_found", "message": "请求的资源不存在", "type": "not_found", "timestamp": "$time_iso8601"}}';
        }
        # 上述配置效果:
        # 当访问不存在的路径时,返回结构化的 JSON 错误信息
        # 替代默认的 Nginx 404 页面,保持 API 响应格式一致性
    }
}

1

评论区