背景
我的博客运行在甲骨文云的 ARM 实例中,甲骨文云东京区域用的是 NTT 线路,这条线路对联通和移动用户应该还算比较友好,但是对于尊贵的电信用户来说简直是折磨。没错,我就是电信用户,1000M下行/100M上行的网络丢包率高达60%,加载完网站起码要15秒,这简直没法用。
手头上还有一台 DMIT 的服务器,洛杉矶 CN2 GIA 的线路,对三网都很友好,于是便计划使用这台服务器作为网站的中转机。
下面是 Debian 系统使用 Nginx 实现四层反代的教程,将 DMIT 服务器 80、443 端口的流量转发至 Oracle Cloud 的网站服务器。以下教程基于 Debian 12 系统,CentOS 系统部分命令或许不一样,可以根据实际替换。操作前需要确保你的中转机没有任何服务或网站使用80、443端口,如果你反代的服务并不需要使用这两个端口可以忽略,网站中转机默认使用80、443端口。
所谓四层负载均衡就是使用IP加端口的方式进行路由转发,属于网络层;七层负载均衡一般是基于请求URL地址的方式进行代理转发,属于应用层;四层的性能要优于七层,这是我的理解。
中转机 Nginx 配置四层转发
1.编辑 nginx 主配置文件
nano /etc/nginx/nginx.conf
2.在 events{} 和 http{} 两个代码块之间插入代码:
# stream 规则
stream {
# stream TCP_80的分流规则
upstream TCP_80 {
# 后端服务器的IPv4地址
server 222.222.222.222:80;
# 后端服务器的IPv6地址
server [2600:a101:a101:a101::aa]:80;
}
# stream TCP_443的分流规则
upstream TCP_443 {
# 后端服务器的IPv4地址
server 222.222.222.222:443;
# 后端服务器的IPv6地址
server [2600:a101:a101:a101::bb]:443;
}
# 监听服务配置
server {
# 监听本机IPv4的80端口
listen 80;
# 监听本机IPv6的80端口
listen [::]:80;
# 代理连接超时设定
proxy_connect_timeout 60s;
# 反代流量到名称为 TCP_80 stream 模块
proxy_pass TCP_80;
# 开启 protocol 代理协议,传递客户端IP到后端服务器。
proxy_protocol on;
}
# 监听服务配置
server {
# 监听本机IPv4的443端口
listen 443;
# 监听本机IPv6的443端口
listen [::]:443;
# 代理连接超时设定
proxy_connect_timeout 60s;
# 反代流量到名称为 TCP_443 stream 模块
proxy_pass TCP_443;
# 开启 protocol 代理协议,传递客户端IP到后端服务器。
proxy_protocol on;
}
}
3.测试 nginx 配置文件是否正确
nginx -t
4.重启 nginx
systemctl restart nginx
后端网站服务器开启 protocol 协议
前面的中转机配置中,我们开启了 protocol 协议用于传送客户端的IP地址,避免网站无法获取用户IP地址信息。如果你不需要获取客户端IP,可以不做这一步,但是上一步的两段 proxy_protocol on; 代码需要注释或删除。
1.编辑 nginx 主配置文件
nano /etc/nginx/nginx.conf
在 http {} 内添加以下代码:
# 从代理服务器(IPv4)获取客户端IP
set_real_ip_from 111.111.111.111;
# 从代理服务器(IPv6)获取客户端IP
set_real_ip_from 2600:a101:a101:a101::aa;
# 设定客户端IP地址从 proxy_protocol 标头获取
real_ip_header proxy_protocol;
2.重新加载 nginx 配置文件
systemctl reload nginx
3.修改各个站点的监听配置,在监听部分的配置添加 proxy_protocol 协议。
HTTP 示例:listen 80 proxy_protocol;
HTTPS 示例:listen 443 ssl http2 proxy_protocol;
修改网站的 DNS 解析
网站的中转服务设定好了以后,需要将域名的解析IP改为中转机的IP,这样就可以实现中转加速了。