服务器通过IP加端口可正常访问,但域名加端口提示连接超时(已接入Cloudflare)
嘿,我来帮你捋捋这个问题的根儿在哪——Cloudflare默认只代理80(HTTP)和443(HTTPS)这俩标准端口,你用的3000属于非标准端口,Cloudflare不会自动帮你转发这个端口的请求。所以当你敲domain.com:3000访问时,请求到Cloudflare那一步就被卡住了,自然就报连接超时;而直接用IP加端口的话,请求是直接打你服务器上的,绕开了Cloudflare,所以就能正常访问啦。
给你几个实用的解决思路,你可以根据自己的情况选:
换用Cloudflare支持的非标准端口
Cloudflare其实也支持一些特定的非标准端口,比如8080、8443这些。如果你能调整Nginx的监听端口,把配置里的listen 3000 ssl;改成listen 8443 ssl;(或者其他Cloudflare支持的HTTPS非标准端口),重启Nginx之后,再用domain.com:8443应该就能正常访问了。用Cloudflare Tunnel映射服务
这个方法更灵活,还不用在服务器上把3000端口暴露给公网。操作步骤大概是这样的:- 登录Cloudflare后台,找到“Zero Trust”板块创建一个隧道
- 在你的服务器上安装Cloudflare Tunnel的客户端(cloudflared)
- 配置隧道规则,把你的域名(比如主域名或者子域名
app.yourdomain.com)直接转发到localhost:3000
这样你以后直接用域名访问就行,连端口都不用加,安全性也更高。
把3000端口服务反向代理到443端口
既然Cloudflare默认代理443端口,那咱们可以在Nginx里加一个监听443的server块,把请求反向代理到3000的上游服务。比如你可以在现有配置基础上再加一段:
server { listen 443 ssl http2; server_name yourdomain.com; include /data/snippets/ssl-setup.conf; access_log /data/logs/web-domain.access.log; error_log /data/logs/web-domain.error.log warn; location / { proxy_cache_bypass $http_upgrade; proxy_set_header Host $http_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; proxy_read_timeout 900; proxy_pass http://web:3000; } }
配置完重启Nginx,之后直接用https://yourdomain.com就能访问到原来3000端口的服务了,体验还更好。
对了,如果你非要坚持用3000端口的话,就算你在服务器防火墙和Cloudflare防火墙里都开放了3000端口,Cloudflare也不会帮你代理这个端口的请求,还是得用上面的方法解决哦。
备注:内容来源于stack exchange,提问作者J K




