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

背景

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

搭建步骤

  1. 在 nginx 官网下载稳定版本的 nginx 包。https://nginx.org/en/download.html
  2. 解压。
bash 复制代码
sudo tar -zxvf nginx-1.18.0.tar.gz
  1. 进入 nginx 目录并进行安装。
bash 复制代码
cd nginx-1.18.0
apt-get update
sudo apt-get install libpcre3-dev
./configure --prefix=/usr/local/nginx --with-stream
make # 编译
make install # 安装
  1. 修改 nginx 配置信息。
bash 复制代码
cd ../conf
cp nginx.conf nginx.conf.bak
vim nginx.conf
bash 复制代码
# 设置 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;
    }
}
  1. 启动 nginx
bash 复制代码
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 # 查看服务进程
  1. 增加定时任务配置,定期清理 nginx 日志
bash 复制代码
写个定时任务把 nginx 的日志清一清  /etc/crontab
*  *    * * *   root    echo 1 > /www/wwwlogs/dimc.byted.org.log
*  *    * * *   root    echo 1 > /www/wwwlogs/dimc.byted.org.error.log

nginx 配置中最关键的参数

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

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

bash 复制代码
# 设定连接的 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
相关推荐
web136885658712 小时前
Nginx 负载均衡详解
运维·nginx·负载均衡
秋の水6 小时前
Ubuntu 安装 Nginx并配置反向代理
nginx·ubuntu
圣心7 小时前
nginx 配置https
运维·nginx·https
小彭爱学习7 小时前
Nginx的安装和部署以及Nginx的反向代理与负载均衡
nginx·scala·负载均衡
obboda8 小时前
nginx反向代理以及负载均衡(常见案例)
java·nginx·负载均衡
Gerald Kwok8 小时前
nginx 正向代理与反向代理
nginx
月半大熊猫1 天前
本地?线上?分布式系统前后端架构、部署、联调指南,突破技术
网关·nginx·gateway·代理·分布式系统
我吃西红柿111 天前
Docker(Nginx)部署Vue
vue.js·nginx·docker
drebander2 天前
Docker 与 Nginx:容器化 Web 服务器
前端·nginx·docker