有个朋友买了一台阿里云轻量服务器,跟着教程把Nginx装好了、WordPress也部署完了,在服务器上curl localhost能看到页面,兴奋地拿手机打开浏览器输入服务器IP,结果转了半天提示"无法访问此网站"。他截图发过来问我:"是不是服务器买错了?"我说你先别急,先数一下从你的浏览器到你服务器上的Nginx,中间到底过了几道关卡。
服务器网站从搭建到能被外网访问,需要打通这6个环节
| 1 | Web服务正在运行且监听正确端口 — Nginx/Apache/IIS已启动,监听80/443端口 |
| 2 | 云平台安全组/防火墙放行对应端口 — 阿里云安全组、腾讯云防火墙默认拦截所有入站流量 |
| 3 | 服务器内部防火墙允许端口通过 — firewalld/iptables/SELinux 可能拦截 |
| 4 | 服务器有公网IP,或通过穿透方案暴露到公网 — 没有公网IP需要用frp/Tunnel等方案 |
| 5 | 域名DNS解析指向服务器IP — A记录或CNAME正确配置,DNS已生效 |
| 6 | 域名已完成ICP备案(国内服务器) — 未备案域名使用国内服务器80/443端口会被运营商拦截 |
这6个环节,只要有一个没打通,浏览器里看到的就永远是"无法访问"。反过来理解,只要这6个都通了,你的网站就一定能在公网上被任何人打开。接下来把这6步拆开,每一步讲清楚具体怎么操作、卡住了怎么看。
一、先确认Web服务真的在跑,而且监听的是对外的网卡
服务器上部署完网站之后,第一件事不是急着去浏览器里测试,而是在服务器本地先验证。用curl或者wget在服务器上请求自己的IP,能返回页面内容才算Web服务正常。
# 本地测试Web服务是否正常curl http://localhost# 测试外网IP能否访问(用服务器自己的公网IP)curl http://你的服务器公网IP# 查看Nginx是否在监听80端口netstat -tlnp | grep :80# 或者用ss命令ss -tlnp | grep :80这里有个容易被忽略的坑:Nginx监听的是127.0.0.1还是0.0.0.0?如果listen配置写的是127.0.0.1:80,那只有服务器本机能访问,外网请求根本进不来。正确的是listen 80;或者listen 0.0.0.0:80;,表示监听所有网卡。去nginx.conf里看一眼server块的listen指令,如果发现写死了127.0.0.1,改掉然后nginx -s reload。

注意:curl localhost能返回内容 ≠ 外网一定能访问。localhost走的是127.0.0.1回环接口,不经过任何防火墙和安全组。它只能证明"Nginx在运行",不能证明"外网能到达Nginx"。
二、云平台安全组——80%的人卡在这一步
如果你用的是阿里云、腾讯云、华为云等任何国内云服务商,默认情况下所有入站流量都是被拦截的。服务器买好之后,云平台的安全组(阿里云)/防火墙(腾讯云轻量)里只有22端口(SSH)是默认开放的,80和443端口需要手动添加。
| 云服务商 | 配置入口 | 需要开放的端口 |
|---|---|---|
| 阿里云ECS | 实例 → 安全组 → 配置规则 → 入方向 | 80(TCP)、443(TCP) |
| 腾讯云轻量 | 实例 → 防火墙 → 添加规则 | 80(TCP)、443(TCP) |
| 华为云ECS | 实例 → 安全组 → 入方向规则 | 80(TCP)、443(TCP) |
| AWS EC2 | 实例 → Security Groups → Inbound rules | 80(TCP)、443(TCP) |
| 搬瓦工/Vultr等 | 通常默认全开放,无需额外配置 | — |
添加规则时注意:授权对象填0.0.0.0/0,表示允许所有IP访问。如果你只想自己先测试,可以填你当前的公网IP,但后面正式上线还是要改成0.0.0.0/0。端口范围写80/80和443/443,协议选TCP。添加完规则之后等几秒生效,然后用你电脑浏览器访问http://服务器公网IP,如果能出现Nginx默认页面或你的网站首页,说明安全组这关过了。
排查技巧:安全组放行了但还是不通?打开命令行,用 telnet 服务器IP 80 测试。如果显示"Connected"说明端口通了;如果一直"Connecting"然后超时,说明端口还是被拦着,回去检查安全组规则。
三、服务器内部防火墙——安全组放行了还不够
云平台的安全组是在云网络层面拦截,服务器操作系统内部还有自己的防火墙。CentOS 7+用的是firewalld,Ubuntu用的是ufw。如果服务器内部防火墙没放行80/443,即使安全组规则正确,请求到了服务器门口也会被操作系统挡回去。
# CentOS/RHEL 用 firewalldfirewall-cmd --permanent --add-service=httpfirewall-cmd --permanent --add-service=httpsfirewall-cmd --reload# 查看已放行的服务firewall-cmd --list-services# Ubuntu/Debian 用 ufwufw allow 80/tcpufw allow 443/tcp# 查看规则ufw status# 还有一个隐形杀手:SELinux# 如果SELinux处于enforcing模式,可能阻止Nginx访问文件getenforce# 临时关闭测试:setenforce 0# 永久关闭:修改 /etc/selinux/config 中 SELINUX=disabledSELinux是个容易被忽略的坑。很多教程教你直接关掉SELinux,但如果服务器有安全要求不能关,就需要配置SELinux策略允许httpd访问网络和文件:setsebool -P httpd_can_network_connect on,并且确保网站目录的SELinux上下文正确:chcon -R -t httpd_sys_content_t /var/www/html/。
四、有没有公网IP,决定了访问路径完全不同
前面的三步解决的是"服务器能接收外部请求"的问题。但如果你的服务器根本没有公网IP——比如家里的树莓派、公司内网的测试机、或者某些NAT后的VPS——那前面全配对了也白搭,因为外网根本没有路径到达你的机器。这种情况下,需要一条"隧道"把内网服务暴露到公网。
有公网IP的路径
用户浏览器 → DNS解析 → 服务器公网IP → 云安全组 → 服务器防火墙 → Nginx → 网站
链路短,延迟低,配置完就能用
没有公网IP的路径
用户浏览器 → 中转服务器(公网)→ 穿透隧道 → 内网机器 → Nginx → 网站
需要额外的中转节点,延迟略高,但能让内网机器被访问
三种主流的内网穿透方案,适用场景不同:
| 方案 | 原理 | 门槛 | 费用 | 适用场景 |
|---|---|---|---|---|
| frp | 一台有公网IP的服务器做中转,内网机器主动连接,建立隧道 | 中等,需要有一台公网服务器 | 公网服务器月费30-50元 | 长期项目、需要固定端口、对延迟敏感 |
| Cloudflare Tunnel | 通过Cloudflare全球网络中转,内网运行cloudflared客户端 | 低,无需自己买服务器 | 免费 | 个人项目、测试环境、免备案需求 |
| ngrok/花生壳 | 商业穿透服务,提供固定域名和隧道 | 最低,开箱即用 | 免费版有限制,付费几十到几百/月 | 临时演示、开发调试、不想折腾配置 |
Cloudflare Tunnel 值得单独说一下:完全免费,不需要自己买公网服务器,不需要开放任何端口,自动提供HTTPS证书,还自带DDoS防护。缺点是所有流量走Cloudflare网络,国内访问速度不稳定;而且你的域名DNS必须托管在Cloudflare。如果你做的是面向海外的网站或个人项目,这是性价比最高的方案。
五、域名解析——让用户不用记IP地址
前面四步搞完,用IP地址已经能访问网站了。但没人会记一串数字,所以需要绑定域名。域名解析的本质就是告诉全世界的DNS服务器:"当有人输入www.你的域名.com时,请把它翻译成你的服务器IP地址"。
最常用的两条DNS记录:
A记录:把域名指向一个IPv4地址。比如 www → 123.123.123.123
CNAME记录:把域名指向另一个域名。比如 www → your-server.example.com(如果用的是CDN或Cloudflare Tunnel会用到)
添加A记录时注意两个细节:主机记录填@表示裸域名(xxx.com不带www),填www表示带www的子域名。通常两个都加,一个指向@,一个指向www。TTL值(生存时间)建议首次配置设600(10分钟),等确认解析正确后再改回600或3600。改完DNS记录之后不是立刻生效的,因为有缓存。可以用nslookup 你的域名或者ping 你的域名来检查是否已经解析到正确IP。

DNS解析了但浏览器还是打不开?先别怀疑DNS的问题。90%的情况DNS已经生效了,是你本地DNS缓存没刷新。Windows下打开命令行执行 ipconfig /flushdns 清除缓存。Mac下执行 sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder。如果还不行,换一个DNS服务器试试(比如114.114.114.114或8.8.8.8),确认是不是你的运营商DNS还没更新。
六、国内服务器绕不开的一关:ICP备案
如果你用的是国内服务器(阿里云、腾讯云国内节点等),域名没备案的话,即使前面五步全做对了,访问网站时也会被运营商的备案拦截系统挡住,浏览器显示的是"该网站未备案"的拦截页面。这不是你的服务器配置有问题,是工信部要求国内服务器必须先备案才能用80/443端口对外提供Web服务。
国内服务器(必须备案)
· 域名需要ICP备案(约15-20个工作日)
· 个人备案不能放商业内容、不能有评论交互功能
· 备案期间域名不能访问(可以先用IP测试)
· 备案后每年需注意保持信息更新
海外服务器(免备案)
· 域名无需备案,买了就能用
· 国内用户访问速度较慢(物理距离+跨境带宽)
· 高峰期可能被QoS限速
· 适合面向海外用户、个人博客、测试环境
如果你用的是宝塔面板或类似工具建站,备案前想先测试网站能不能正常访问,有一个临时方案:用非标准端口。比如把Nginx监听端口改成8080或8888,然后在云安全组里放行这个端口,用 http://IP:8080 访问。备案系统通常只拦截80和443端口,非标准端口不受影响。但注意这只是临时测试方案,正式上线还是得走备案流程。
一个小提示:域名注册商和服务器提供商可以不是同一家。比如域名在阿里云注册的,服务器用腾讯云的,备案需要在腾讯云(服务器提供商)那边提交,不是在域名注册商那边。很多人搞混了,在域名那边提交了发现审核不通过。
七、加个HTTPS——现在浏览器没小锁等于没上线
网站能访问了,但浏览器地址栏显示的是"不安全"三个字。2026年了,Chrome和Edge对没有HTTPS的网站会直接标红警告,用户看到基本就关掉了。好在现在有Let's Encrypt免费SSL证书,配合Certbot工具几分钟就能搞定。
# 安装Certbot(以Ubuntu+Nginx为例)apt install certbot python3-certbot-nginx# 自动配置SSL证书(会自动修改Nginx配置)certbot --nginx -d 你的域名.com -d www.你的域名.com# 测试自动续期(证书90天有效期,Certbot会自动续)certbot renew --dry-run如果你用的是宝塔面板,更简单:在网站设置里点"SSL" → "Let's Encrypt" → 勾选域名 → 一键申请。宝塔会自动完成域名验证和Nginx配置,还会设置定时任务自动续期。
HTTPS配置好后别忘了做一件事:在Nginx里加一条规则,把所有HTTP(80端口)的请求301重定向到HTTPS(443端口)。否则用户手动输入http://网址还是能看到"不安全"的页面。在Nginx的80端口server块里加一句:return 301 https://$host$request_uri;
八、一条命令快速排查:你的问题出在哪个环节
网站搭好访问不了的时候,按这个顺序从里到外排查,每一步都能定位到具体问题:
| 排查步骤 | 操作 | 预期结果 | 如果失败,问题在 |
|---|---|---|---|
| 1 | 服务器上 curl localhost | 返回网站HTML | Nginx/Web服务没运行或配置错误 |
| 2 | 服务器上 curl 公网IP | 返回网站HTML | Nginx监听地址不是0.0.0.0 |
| 3 | 外部电脑 telnet 公网IP 80 | Connected | 安全组/防火墙未放行 |
| 4 | 外部电脑 nslookup 域名 | 解析到正确IP | DNS未配置或未生效 |
| 5 | 浏览器访问 http://域名 | 显示网站内容 | 备案拦截(国内服务器) |
这套排查流程覆盖了90%以上的"服务器搭好了网站访问不了"问题。按顺序走一遍,基本都能定位到具体卡在哪个环节。
如果排查下来一切正常但还是访问不了,可能是运营商层面的问题。有些地区的宽带运营商会封禁80/443端口的入站流量(尤其是家庭宽带),这种情况需要换端口或者用CDN中转。还有少数情况是域名被墙或DNS污染,需要用itdog.cn之类的工具做全国多节点测试来确认。
不想手动折腾这么多配置,也可以考虑用建站系统来简化。比如UC建站系统底层基于WordPress,部署好之后自带Nginx优化配置、自动HTTPS、SEO友好的HTML直出,域名绑定和安全组配置都有可视化引导。重点是独立部署,服务器、域名、数据库全部自己掌控,源码完全自主,不会出现"建站平台倒闭了网站也没了"的情况。对于想快速上线又不想被绑定到某个SaaS平台的人来说,这种方式省掉了大量手动配置的时间。
说穿了,服务器搭网站这件事,难的不是搭建本身——装个宝塔面板、点几下鼠标,谁都能把网站跑起来。真正卡住大部分人的是"跑起来了但外面看不到",然后不知道从哪下手排查。记住那条链路:Web服务 → 监听地址 → 安全组 → 系统防火墙 → 公网IP/穿透 → DNS → 备案,从内到外一个一个过,总能找到断点。
