当前位置: 首页 > article >正文

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. 解压。
sudo tar -zxvf nginx-1.18.0.tar.gz
  1. 进入 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 # 安装
  1. 修改 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;
    }
}
  1. 启动 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 # 查看服务进程
  1. 增加定时任务配置,定期清理 nginx 日志
写个定时任务把 nginx 的日志清一清  /etc/crontab
*  *    * * *   root    echo 1 > /www/wwwlogs/dimc.byted.org.log
*  *    * * *   root    echo 1 > /www/wwwlogs/dimc.byted.org.error.log

nginx 配置中最关键的参数

  1. listen [::]:80; # 这里表示你要监听所有 IPv6 的 80 端口流量。
    
  2. 让 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


http://www.kler.cn/a/564115.html

相关文章:

  • 淘宝商品搜索API实战:Elasticsearch分词与排序算法优化
  • 【数字图像处理三】图像变换与频域处理
  • 矩阵营销的 AI 进化:DeepSeek 如何助力批量运营账号?
  • 使用 Apache Dubbo 释放 DeepSeek R1 的全部潜力
  • Linux nc 命令详解
  • 如何下载MinGW-w64到MATLAB
  • Java集合性能优化面试题
  • 【Linux】CentOS7停服之后配置yum镜像源
  • Ubuntu 下通过 Docker 部署 Nginx 服务器
  • Ubuntu指令(一)
  • 如何优化Redis性能:从理论到实践
  • 苹果折叠屏iPhone突破折痕难题 或将在2026年发布
  • git 常用功能
  • AI快速变现之路,AI视频创作
  • Nacos 服务挂掉时如何恢复配置并访问缓存
  • 机器学习数学基础:31.信度与重测
  • Unity:应用关闭时执行函数方法
  • 如何合理使用Python爬虫按关键字搜索VIP商品:代码示例与实践指南
  • 软件测试八股文,软件测试常见面试合集【附答案】
  • Linux 系统串口配置及权限设置详解