云计算百科
云计算领域专业知识百科平台

nginx 搭建 IPv6 -> IPv4 反向代理服务器

背景

在实际生产过程中,由于各种原因,我们的在线服务搭建在火山云服务器上,使用火山云包括 ECS、CLB、PLB 等组件进行网络通信,并且通过专线接受来自某公司内部流量。但是在大概 22~23 年,某公司要把所有网络流量变为 IPv6 往下发,火山云的 CLB 和 PLB 还不支持 IPv6,那我们就面临着断流的风险。经调研和学习,了解到可以通过 nginx 来搭建一个反向代理服务里,把 IPv6 的流量转成 IPv4 往下发,这样就解决了我们的问题。本篇文章也是记录一下当时的搭建过程和步骤,以及踩过的坑。

搭建步骤

  • 在 nginx 官网下载稳定版本的 nginx 包。https://nginx.org/en/download.html
  • 解压。
  • sudo tar -zxvf nginx-1.18.0.tar.gz

  • 进入 nginx 目录并进行安装。
  • cd nginx-1.18.0
    apt-get update
    sudo apt-get install libpcre3-dev
    ./configure –prefix=/usr/local/nginx –with-stream
    make # 编译
    make install # 安装

  • 修改 nginx 配置信息。
  • cd ../conf
    cp nginx.conf nginx.conf.bak
    vim nginx.conf

    # 设置 nginx 运行的用户(通常为 nobody 或 www-data)
    # user nobody;

    # 指定 nginx 的工作进程数量,auto 表示自动根据 CPU 核心数调整
    worker_processes auto;

    # 设定错误日志路径及日志级别(默认是 error,可选 notice、info 等)
    #error_log logs/error.log;
    #error_log logs/error.log notice;
    #error_log logs/error.log info;

    # 指定 nginx 运行时的 PID 文件存放路径
    # pid logs/nginx.pid;

    events {
    # 每个 worker 进程允许的最大并发连接数
    worker_connections 65535;
    }

    http {
    # 引入 MIME 类型配置文件,确保 nginx 识别各种文件类型
    include mime.types;

    # 设置默认的 MIME 类型,避免未识别的文件变成纯文本
    default_type application/octet-stream;

    # 定义日志格式($remote_addr:客户端 IP,$request:请求内容,$status:状态码等)
    # log_format main '$remote_addr – $remote_user [$time_local] "$request" '
    # '$status $body_bytes_sent "$http_referer" '
    # '"$http_user_agent" "$http_x_forwarded_for"';

    # 指定访问日志存储路径及使用的日志格式
    # access_log logs/access.log main;

    # 启用 sendfile 以优化文件传输性能
    sendfile on;

    # 结合 sendfile 使用,减少 TCP 发送延迟(但可能影响小数据包传输)
    # tcp_nopush on;

    # 设定连接的 Keep-Alive 超时时间(0 代表关闭 keep-alive)
    # keepalive_timeout 0;
    keepalive_timeout 120s;

    # 设定一个连接内最大请求数,避免长连接占用过多资源
    keepalive_requests 100000;

    # 启用 gzip 压缩,提高传输效率(默认关闭)
    # gzip on;

    server {
    # 监听 IPv4 80 端口(默认情况下,这行被注释)
    # listen 80;

    # 监听 IPv4 443 端口(用于 HTTPS,默认情况下被注释)
    # listen 443;

    # 监听 IPv6 80 端口(默认启用)
    listen [::]:80;

    # 服务器的域名(需要修改为你的实际域名)
    server_name aaa.bbb.ccc;

    # 访问日志存储路径
    access_log /www/wwwlogs/aaa.bbb.ccc.log;

    # 错误日志存储路径
    error_log /www/wwwlogs/aaa.bbb.ccc.error.log;

    location / {
    # 代理请求使用 HTTP/1.1(避免 HTTP/1.0 造成的连接复用问题)
    proxy_http_version 1.1;

    # 代理请求时设置 Host 头,防止后端服务因 Host 变更异常
    proxy_set_header Host aaa.bbb.ccc:80;

    # 传递客户端真实 IP
    proxy_set_header X-Real-IP $remote_addr;

    # 清空 Connection 头,防止 nginx 误处理长连接
    proxy_set_header Connection "";

    # 传递客户端远程地址(用于后端日志分析)
    proxy_set_header REMOTE-HOST $remote_addr;

    # 传递 X-Forwarded-For,记录代理链中的所有 IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # 代理请求转发到 upstream 定义的 backend 服务器
    proxy_pass http://backend;
    }
    }

    upstream backend {
    # 配置上游服务器(负载均衡后端)
    # 这里的 IP 为 nginx 下发流量的后端服务器 IP(可以添加多个)
    server 192.0.0.1:80 weight=10 max_fails=5;

    # keepalive 连接池大小,减少 TCP 连接建立的开销
    keepalive 100000;
    }
    }

  • 启动 nginx
  • mkdir -p /www/wwwlogs
    /usr/local/nginx/sbin/nginx

    /usr/local/nginx/sbin/nginx -s stop

    /usr/local/nginx/sbin/nginx -s reload

    ps -ef | grep nginx # 查看服务进程

  • 增加定时任务配置,定期清理 nginx 日志
  • 写个定时任务把 nginx 的日志清一清 /etc/crontab
    * * * * * root echo 1 > /www/wwwlogs/dimc.byted.org.log
    * * * * * root echo 1 > /www/wwwlogs/dimc.byted.org.error.log

    nginx 配置中最关键的参数

  • listen [::]:80; # 这里表示你要监听所有 IPv6 的 80 端口流量。
  • 让 nginx 使用长连接,防止高并发场景下因连接数消耗完导致的性能瓶颈。

    参考文档:https://blog.51cto.com/lookingdream/2487955

  • # 设定连接的 Keep-Alive 超时时间(0 代表关闭 keep-alive)
    # keepalive_timeout 0;
    keepalive_timeout 120s;

    # 设定一个连接内最大请求数,避免长连接占用过多资源
    keepalive_requests 100000;

    proxy_http_version 1.1; # 在 http 1.1 版本之后才支持长连接,所以这一点非常重要
    proxy_set_header Connection ""; # 设置 Connection 为长连接,默认为 no

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » nginx 搭建 IPv6 -> IPv4 反向代理服务器
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!