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