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

news2025/2/27 22:47:51

背景

在实际生产过程中,由于各种原因,我们的在线服务搭建在火山云服务器上,使用火山云包括 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.coloradmin.cn/o/2307071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

湖北中医药大学谱度众合(武汉)生命科技有限公司研究生工作站揭牌

2025年2月11日,湖北中医药大学&谱度众合(武汉)生命科技有限公司研究生工作站揭牌仪式在武汉生物技术研究院一楼101会议室举行,湖北中医药大学研究生院院长刘娅教授、基础医学院院长孔明望教授、基础医学院赵敏教授、基础医学院…

面试基础---深入解析 AQS

深入解析 AQS:从源码到实践,剖析 ReentrantLock 和 Semaphore 的实现 引言 在 Java 并发编程中,AbstractQueuedSynchronizer(AQS)是一个核心框架,它为构建锁和其他同步器提供了基础支持。ReentrantLock 和…

从 0 到 1,用 Python 构建超实用 Web 实时聊天应用

从 0 到 1,用 Python 构建超实用 Web 实时聊天应用 本文深入剖析如何运用 Python 的 Flask 框架与 SocketIO 扩展,搭建一个功能完备的 Web 实时聊天应用。从环境搭建、前后端代码实现,到最终运行展示,逐步拆解关键步骤&#xff0…

Vue2+Element实现Excel文件上传下载预览【超详细图解】

目录 一、需求背景 二、落地实现 1.文件上传 图片示例 HTML代码 业务代码 2.文件下载 图片示例 方式一:代码 方式二:代码 3.文件预览 图片示例 方式一:代码 方式二:代码 一、需求背景 在一个愉快的年后&#xff…

[记录贴] 火绒奇怪的进程保护

最近一次更新火绒6.0到最新版,发现processhacker的结束进程功能无法杀掉火绒的进程,弹窗提示如下: 可能是打开进程时做了权限过滤,火绒注册了两个回调函数如下: 但奇怪的是,在另外一台机器上面更新到最新版…

【蓝桥杯】每天一题,理解逻辑(1/90)【Leetcode 移动零】

文章目录 题目解析讲解算法原理【双指针算法思路】(数组下标充当指针)如何划分和执行过程大致 代码详情 题目解析 题目链接:https://leetcode.cn/problems/move-zeroes/description/ 题目意思解析 把所有的零移动到数组的末尾保持非零元素的相对顺序 理解了这两层…

pycharm远程连接服务器运行pytorch

Linux部署pytorch 背景介绍 不同的开源代码可能需要不同的实验环境和版本,这时候的确体现出Anaconda管理环境的好处了,分别搞一个独立环境方便管理。 有的教程建议选择较旧的版本,但笔者建议在条件允许的情况下安装最新版,本次…

java练习(41)

ps:题目来自力扣 最接近的三数之和 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 import java.util.Arrays;class Solut…

PDF扫描档智能方向识别:多模型投票机制的实践测试 救活古典书籍

2025-02-22 20:10物联全栈123 尊敬的诸位!我是一名物联网工程师。关注我,持续分享最新物联网与AI资讯和开发实战。期望与您携手探寻物联网与 AI 的无尽可能 RAG知识库搭建的过程中,扫描档pdf的支持和准确率一直是个大家都不愿主动提起的事情…

轻松搭建:使用Anaconda创建虚拟环境并在PyCharm中配置

一、使用Anaconda创建虚拟环境 1. 安装Anaconda 2..conda常用的命令 3. 创建虚拟环境-以搭建MachineVision为例 4. 激活虚拟环境 5. 安装依赖包 二、PyCharm配置环境 在进行Python项目开发时,合理的环境管理是必不可少的,特别是当你在多个项目中…

驱动开发系列39 - Linux Graphics 3D 绘制流程(二)- 设置渲染管线

一:概述 Intel 的 Iris 驱动是 Mesa 中的 Gallium 驱动,主要用于 Intel Gen8+ GPU(Broadwell 及更新架构)。它负责与 i915 内核 DRM 驱动交互,并通过 Vulkan(ANV)、OpenGL(Iris Gallium)、或 OpenCL(Clover)来提供 3D 加速。在 Iris 驱动中,GPU Pipeline 设置 涉及…

MinIO整合SpringBoot实现文件上传、下载

文章目录 配置1. 部署MinIO服务2. 整合SpringBoot 功能实现1. 文件上传2. 文件下载 总结 配置 1. 部署MinIO服务 这里以docker为例: 安装minio命令docker run -p 9000:9000 -p 9001:9001 \ --name minio \ -v /path/to/data:/data \ -e "MINIO_ROOT_USERmin…

FreeRTOS(3)列表List

在 FreeRTOS 的源码中大量地使用了列表和列表项,因此想要深入学习 FreeRTOS,列表和列表项是必备的基础知识。这里所说的列表和列表项,是 FreeRTOS 源码中 List 和 List Item 的 直译,事实上, FreeRTOS 中的列表和列表项…

C++和OpenGL实现3D游戏编程【连载23】——几何着色器和法线可视化

欢迎来到zhooyu的C++和OpenGL游戏专栏,专栏连载的所有精彩内容目录详见下边链接: 🔥C++和OpenGL实现3D游戏编程【总览】 1、本节实现的内容 上一节课,我们在Blend软件中导出经纬球模型时,遇到了经纬球法线导致我们在游戏中模型光照显示问题,我们在Blender软件中可以通过…

Harmony开发笔记(未完成)

一、感想 作为一名拥有11年经验的Android开发者,我亲历了Android从高速发展到如今面临“僧多粥少”的过程。技术的世界瞬息万变,没有一种技术能够让人依赖一辈子。去年初,我自学了鸿蒙系统,并顺利通过了鸿蒙官方的初级和高级认。…

【Java面试】创建线程有哪几种方式

目录 1.继承Thread类 2.实现Runnable接口 3.实现Callable接口和FutureTask 4.使用Executor框架(线程池) Java并发编程中不同接口和类之间的关系 总结 1.继承Thread类 优点: 简单直观。直接继承Thread类,可以方便地使用Threa…

在Linux环境下利用MTCNN进行人脸检测(基于ncnn架构)

概述 本文将详细介绍如何在Linux环境下部署MTCNN模型进行人脸检测,并使用NCNN框架进行推理。 1. CMake的安装与配置 下载CMake源码 前往CMake官网下载,找到适合您系统的最新版本tar.gz文件链接,或者直接通过wget下载:CMake官方…

AI数字人系统源码部署解决方案!!!

一、开场白 如今,科技的步伐越来越快,数字人已经从想象中走进了我们的现实生活。它们在娱乐、教育、医疗等多个领域大放异彩。了解数字人的代码开发技术,能让我们更好地理解其工作原理,为那些想在这一领域大展拳脚或者用数字人技…

W803|联盛德|WM IoT SDK2.X测试|(1)开箱:开发板及说明

前几天关注的联盛德微电子新推出了WM IoT SDK2.X,正式发布后,邀请用户参加“免费试用,赢千元大礼”活动,填写信息,等待统一发送,很快收到了板子。 活动地址:联盛德微电子WM IoT SDK2.X正式发布…

2.✨java练习1(熟悉“类”)

1. A B - AcWing题库 问题描述 输入两个整数&#xff0c;求这两个整数的和是多少。 输入格式 输入两个整数A,B&#xff0c;用空格隔开 输出格式 输出一个整数&#xff0c;表示这两个数的和 数据范围 0≤A,B≤1e8 C #include <iostream> // 包含标准输入输出库 using n…