能否在网站访客与Cloudflare CDN之间部署Nginx反向代理并实现多端口差异化处理?
能否在网站访客与Cloudflare CDN之间部署Nginx反向代理并实现多端口差异化处理?
当然可以实现!你的需求完全合理,而且用Nginx配置起来其实挺直接的,我给你一步步拆解怎么做:
核心思路
简单来说,就是给你的VPS上的Nginx单独配置80、443端口的反向代理规则,把这两个端口的请求直接转发到Cloudflare的边缘节点;其他端口不用额外配置,让VPS上的邮件、监控等服务直接监听处理就行,Nginx不会插手这些端口的流量。
具体配置步骤
1. 准备Nginx配置文件
先在你的VPS上创建一个清晰的配置文件,比如/etc/nginx/conf.d/proxy-to-cloudflare.conf(比用IP命名好记多了),然后分端口写规则:
80端口(HTTP请求)配置
直接用Nginx的HTTP反向代理模块,配置如下:
server { listen 80; # 这里可以填你的VPS公网IP,或者如果域名已经解析到VPS,也可以写域名 server_name your-vps-public-ip your-domain.com; location / { # 替换成Cloudflare分配给你域名的边缘节点IP(也可以直接写你的域名,因为Cloudflare已经接管了解析,用IP会更高效) proxy_pass http://cloudflare-edge-ip; # 这几行非常重要!不然Cloudflare和你的源站拿到的访客IP会是VPS的IP,影响日志和安全策略 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
443端口(HTTPS请求)配置
这里有两种可选方案,选哪种看你的需求:
- 方案一:TCP流量透传(推荐)
用Nginx的Stream模块直接透传443端口的TCP流量到Cloudflare,不需要在VPS上配置SSL证书,非常省事。
首先要确保你的Nginx安装了Stream模块(大部分发行版默认安装),然后在/etc/nginx/nginx.conf的http块外面添加Stream配置:stream { server { listen 443; proxy_pass cloudflare-edge-ip:443; } } - 方案二:HTTP模块反向代理
如果需要在VPS上对HTTPS请求做一些额外处理(比如修改请求头、缓存等),可以用这个方案,但需要给VPS上的域名配置SSL证书(比如用Let's Encrypt的certbot生成免费证书)。配置如下:server { listen 443 ssl; server_name your-vps-public-ip your-domain.com; # 替换成你的证书路径 ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; location / { proxy_pass https://cloudflare-edge-ip; # 同样要配置这些头信息 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
2. 其他端口的处理
完全不需要额外配置!只要你在VPS上部署的邮件、监控等服务监听了对应的端口(比如25、143、8080等),并且VPS的防火墙开放了这些端口,访客的请求就会直接被这些服务接收处理,Nginx不会拦截这些端口的流量,完美实现差异化处理。
关键注意事项
- 记得把你的域名解析地址改成VPS的公网IP,这样访客才会先访问到你的VPS Nginx
- 无论用哪种443端口的配置方式,都要确保Cloudflare的边缘IP是正确的(可以通过
nslookup your-domain.com查询,Cloudflare会返回它的边缘节点IP) - 配置完后一定要测试Nginx配置的正确性:
sudo nginx -t,如果显示test is successful,再重载配置:sudo systemctl reload nginx - 检查VPS的防火墙(比如ufw、firewalld),确保开放了80、443以及你需要使用的其他端口
这样配置完成后,就完全符合你的需求了:访客的80/443请求会经过VPS Nginx转发到Cloudflare,再到你的源站;其他端口的请求直接由VPS上的对应服务处理~
备注:内容来源于stack exchange,提问作者Aleksandar Pushevich




