nginx完全支持“域名加端口”这种访问方式,但关键在于分清楚两个概念:端口由listen指令负责,域名由server_name负责,二者配合才能实现预期效果。
很多人在配置时把端口写进server_name里,结果怎么调都不生效,这里把nginx域名加端口的配置逻辑拆开讲清楚,顺便解决几个常见的访问失败问题。
nginx域名加端口怎么配置?先理解listen规则
nginx的每个server块,本质上是一套“监听条件 + 匹配规则”的组合,监听条件由listen指定,匹配规则由server_name指定,举一个最简单的例子:
server {
listen 8080;
server_name example.com;
root /var/www/example;
}
配置完成后,访问http://example.com:8080就能命中这个server块,这里的关键是:端口只写在listen里,不写在server_name里,如果你写成server_name example.com:8080,nginx会把它当成一个普通域名去匹配,结果就是找不到对应站点,甚至报错。
端口写在server_name里为什么报错
这是新手最容易踩的坑,server_name的值本质上是一个域名,不是“域名加端口”的组合,nginx处理请求时,会从请求头中解析出Host字段,拿其中的域名部分去匹配server_name,端口部分则由listen来匹配,你可以这样理解:
- listen管“入口”这台服务器上哪个端口接收请求
- server_name管“门牌”进入端口后,哪个域名对应的站点来处理
两者的职责互不重叠,你可以在一个server块里写多个listen,也可以写多个server_name,但域名加端口的绑定关系,是靠“同一个server块同时包含这两个指令”来实现的,不是靠把端口拼进域名。
正确的域名加端口配置写法
实际操作路径如下:
- 先确认你的服务监听在哪个端口,比如应用跑在8080
- 在nginx配置目录下新建一个server块,
listen 8080; - server_name写你要访问的完整域名,比如
www.example.com - 配置location根路径,指向你的应用文件或代理地址
- 执行
nginx -t检查配置语法 - 执行
nginx -s reload让配置生效
如果你有多个域名,但想共用同一个后端应用,可以在同一个server块里写多个server_name:
server {
listen 8080;
server_name example.com www.example.com;
...
}
这样两个域名加8080端口都能访问到同一个服务,下面是几种常见场景的访问形式对比:
| 配置场景 | 监听设置 | 最终访问方式 |
|---|---|---|
| 标准80端口 | listen 80 | http://example.com |
| 自定义业务端口 | listen 8080 | http://example.com:8080 |
| 多域名共用80端口 | listen 80 + 多个server_name | 各自域名访问,无需端口 |
| 多域名共用自定义端口 | listen 8080 + 多个server_name | 各自域名加8080访问 |
nginx一个端口多个域名配置:靠server_name区分
不少场景下,你可能会遇到“一个端口要跑多个域名”的需求,比如一台云服务器上,80端口既要放A站又要放B站,nginx的做法是配置多个server块,每个server块监听相同的80端口,但server_name分别指定不同域名。
server {
listen 80;
server_name site-a.com;
root /var/www/site-a;
}
server {
listen 80;
server_name site-b.com;
root /var/www/site-b;
}
请求进来后,nginx先看端口是否为80,再看请求头携带的域名是哪个,命中对应的server_name,如果你的多个域名共用一个自定义端口,比如都跑在8080,原理完全一样:
server {
listen 8080;
server_name demo-a.com;
root /var/www/demo-a;
}
server {
listen 8080;
server_name demo-b.com;
root /var/www/demo-b;
}
行业共识认为,这种“同端口多域名”的方式是最干净的方案,需要注意的是,域名必须正确解析到这台服务器的公网IP上,如果解析没生效,访问demo-a.com:8080时浏览器无法找到服务器,nginx自然也就无法处理请求。
同端口多域名配置容易遇到的坑
最典型的问题是:所有server块都监听同一个端口,但访问时却永远命中第一个server块,这通常是因为你漏了其中一个server_name,或者输错了域名,nginx匹配server_name时是精确匹配优先,如果找不到完全一致的域名,就会落到默认的第一个server块或default_server上。
解决办法是给每个server块都用curl -H "Host: demo-a.com" http://服务器IP:8080单独测试,看返回内容是否是预期站点,这个命令可以帮你绕过域名解析问题,直接验证nginx的server_name匹配逻辑。
nginx域名不带端口访问:80端口的隐藏逻辑
为什么大多数网站都不用输入端口?因为浏览器对HTTP协议有一个默认约定:http://默认走80端口,https://默认走443端口,你访问http://example.com,实际上浏览器访问的是http://example.com:80,只是地址栏省略了。
如果你的nginx服务跑在8080端口,直接输入http://example.com会访问失败,因为请求被发到了80端口,而80端口上没有服务在监听。
想实现免端口访问,思路有两条
第一条:直接把服务改成监听80端口,修改listen为80,前提是80端口没有被其他服务占用,这是最直接的办法,适合业务相对简单的场景。
第二条:用一个前置nginx监听80端口,再把请求转发给后面的8080服务,这种方式更灵活,适合已经有多个服务在跑、不想重新调整的情况,比如家族式配置:
server { listen 80; server_name example.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
这样用户访问http://example.com时,nginx在80端口接收请求,内部转发到8080端口处理,域名保留在地址栏中,用户无感知。
端口被省略时,Host头里还带端口吗
具体情况是:浏览器访问http://example.com时,请求头中的Host是example.com,不包含端口;访问http://example.com:8080时,Host变成example.com:8080,nginx的server_name匹配会忽略端口部分,只拿域名部分比对,这个细节在调试排查时很有用。
nginx反向代理域名端口转发:内网服务也能藏起来
实际部署中,很多后端服务不会直接暴露给用户,而是让nginx做反向代理,对外只开一个入口,最常见的做法是:用户访问api.example.com,不着端口,nginx接到请求后转发给内网的某个端口。
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://192.168.1.100:8080;
proxy_set_header Host $host;
}
}
这里的关键操作是proxy_set_header Host $host,如果你不设置这项,后端服务拿到的Host可能是0.0.1,导致后端按域名做路由时出错,用$host表示保留用户请求中的原始域名。
另外一种场景是:你有多个内网服务,想分别用不同域名对外提供服务,全部通过nginx统一转发。
- 用户访问
blog.example.com,转发到内网0.0.1:3000 - 用户访问
api.example.com,转发到内网0.0.1:8080
每个服务一个server块,监听80端口,server_name区分域名,用户始终不需要输入端口。
外网端口转发到内网指定端口
如果你的需求反过来用户访问http://example.com:8080,nginx再把它转发到内网的某个端口,写法一样简单:
server {
listen 8080;
server_name example.com;
location / {
proxy_pass http://10.0.0.5:3306;
}
}
需要注意,对外端口不一定等于内网端口,你完全可以把外网的8080转发到内网的3306或任意其他端口,nginx只负责把请求接进来,再按规则转出去。
nginx服务器域名端口号修改后访问失败怎么办
端口一旦改动,最容易出现的问题就是“服务明明起了,但外部访问不到”,很多情况下不是nginx配置问题,而是下面几个环节出了岔子。
第一步:按顺序排查配置
首先检查nginx配置是否真的生效,改完配置后,务必要执行nginx -t,这个命令会告诉你配置有没有语法错误,如果输出syntax is ok,再执行nginx -s reload让新配置加载。
第二步,查看端口是否在监听:

ss -lntp | grep 8080
如果这条命令没有输出,说明nginx没有监听8080,这时候回头看listen指令是否写对,nginx是否真的reload成功。
第三步,本机自测,在服务器上执行:
curl http://127.0.0.1:8080
如果本机能返回内容,说明nginx配置正常,问题出在外部访问链路。
第二步:检查防火墙和安全组
云服务器(如简米云、酷番云、华为云)默认只放行少量端口,据统计,大多数云厂商的安全组规则只放行了80和443端口,自定义端口需要手动添加放行规则,去云控制台找到安全组或防火墙页面,添加入方向规则,放行你使用的端口号,来源IP按需填写。
本机防火墙也要检查,CentOS系统常见的是firewalld:
firewall-cmd --list-ports
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
如果这些都没问题,再看看SELinux是否拦截,CentOS系统默认开启SELinux时,nginx可能无法绑定非标准端口,你可以执行setenforce 0临时验证,如果关掉后能访问,再考虑调整SELinux策略。
第三步:确认没有端口冲突
一个端口在同一时间只能被一个进程监听,如果你改了nginx配置后发现reload失败,提示address already in use,说明端口被其他进程占用,用lsof -i:8080或ss -lntp找出占用进程,要么停掉它,要么把nginx的listen改成别的端口。
核心结论回顾
nginx不但支持域名加端口访问,而且这是它最基础的能力之一,记住一句话:listen负责端口,server_name负责域名,两者搭配就能正确处理example.com:8080这种请求,如果想把端口隐藏,就用80端口加反向代理,如果用户需要直接访问非80端口,确保安全组、防火墙和listen三处全部对齐。
nginx域名加端口访问2026常见问题
nginx域名加端口访问不了怎么办?
按顺序做三件事:先用nginx -t确认配置语法和listen端口,再用ss -lntp确认nginx真正监听该端口,最后检查云安全组和本机防火墙是否放行,如果本机curl能通而外网不通,问题大概率在安全组规则。
域名加端口对网站GEO有影响吗?
搜索引擎爬虫默认抓取80和443端口的内容,对非标准端口的收录权重普遍较低,据公开技术社区的普遍反馈,正式运营的网站尽量使用默认端口,自定义端口更适合测试环境和内部管理系统,不过nginx完全支持这种用法,技术上没有障碍。
一个nginx可以同时支持多域名多端口吗?
可以,你可以在一个server块里写多个listen和多个server_name,也可以为每个“域名加端口”组合单独写一个server块,nginx通过监听端口和请求中的Host域名双重匹配来决定流量落到哪个站点,多套组合可以共存于同一台服务器。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/909730.html


评论列表(2条)
读了这篇文章,我深有感触。作者对端口的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
@大甜3630:这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是端口部分,给了我很多新的思路。感谢分享这么好的内容!