背景
在实际生产过程中,由于各种原因,我们的在线服务搭建在火山云服务器上,使用火山云包括 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 使用长连接,防止高并发场景下因连接数消耗完导致的性能瓶颈。
# 设定连接的 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
到此这篇关于nginx搭建ipv6 ->ipv4反向代理服务器的实现的文章就介绍到这了,更多相关nginx ipv6反向代理ipv4内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论