nginx配置域名本质上就是写好一个server块,把域名、端口和站点目录三者对应起来,再通过软链接启用配置并重载服务,整个过程并不复杂。
很多朋友第一次接触nginx配置域名时,容易被各种教程绕晕,其实你只需要理解一个核心逻辑:nginx收到请求后,根据请求里的域名(Host字段)和端口,去匹配对应的server块,然后按这个块里定义的规则返回网站文件或做反向代理,下文按实操场景拆解,从最基础的配置到常见问题排查,一步步来。
最基础的nginx配置域名流程:从零到能访问
对于一台全新的服务器,无论你用的是CentOS、Ubuntu还是Debian,安装nginx之后(一般通过apt install nginx或yum install nginx),站点配置文件通常放在/etc/nginx/conf.d/或/etc/nginx/sites-available/目录下,不同发行版路径略有差异,但思路一致。
第一步,创建站点配置文件。 比如你的域名是example.com,网站代码放在/var/www/example,那就新建一个文件:
vi /etc/nginx/conf.d/example.conf
第二步,写一个最小的server块如下:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example;
index index.html index.htm;
}
这里listen 80表示监听HTTP默认端口,server_name后面跟你的域名,可以写多个,用空格隔开。root指向站点文件的绝对路径,index指定默认访问的文件名。
第三步,检查配置并重载。 修改完配置后,务必先测试语法:
nginx -t
看到syntax is ok的提示后,说明配置没问题,接着重载nginx让配置生效:
nginx -s reload
第四步,做域名解析。 去你的DNS服务商(简米云、酷番云、Cloudflare等)后台,添加一条A记录,把域名指向服务器公网IP,解析生效后,访问http://example.com就能看到网站内容了,如果还是打不开,检查服务器安全组是否放行了80端口。
行业共识认为,超过半数的“配置了域名但访问不了”问题,都出在云服务器安全组规则没放行端口,而不是nginx配置错误。
深入server_name匹配规则:nginx配置域名 怎么配置才能精准匹配
理解了基础流程,再来看server_name的匹配优先级,这是很多人容易踩坑的地方,也是理解nginx配置域名的关键。
nginx在收到请求时,会按以下顺序匹配server_name:
- 精确匹配:
server_name example.com完全命中。 - 通配符起始匹配:
server_name .example.com能匹配www.example.com、blog.example.com等。 - 通配符结尾匹配:
server_name www.
能匹配
www.example.com、www.test.org。 - 正则表达式匹配:
server_name ~^wwwd+.example.com$这种形式。 - 默认服务器:如果以上都没匹配上,则使用
listen指令后加了default_server参数的那个server块,或者第一个加载的server块。
实际工作中,最常用的形式是前两种,比如你要给子域名blog.example.com单独配置,可以这样写:
server {
listen 80;
server_name blog.example.com;
root /var/www/blog;
}
如果你想用一个配置承接所有未匹配的域名请求,可以设置默认站点:
server {
listen 80 default_server;
server_name _;
return 444;
}
这里server_name _;是一个并不存在的无效域名,用来兜底所有未匹配的请求,配合return 444直接断开连接,能有效减少恶意扫描。
常见场景:nginx 多个域名 配置怎么区分站点
一个服务器上跑多个网站是常态。nginx 多个域名 配置的核心思路很简单:写多个server块,每个块对应一个域名,分别指向不同的目录。
看这个例子,假设你有两个域名site1.com和site2.com:
server {
listen 80;
server_name site1.com www.site1.com;
root /var/www/site1;
}
server {
listen 80;
server_name site2.com www.site2.com;
root /var/www/site2;
}
注意,如果两个server块监听的端口相同、域名不同,那没有问题,但如果你想用相同域名、不同端口区分不同应用,就把listen改成不同端口:
server {
listen 8080;
server_name site1.com;
root /var/www/site1_admin;
}
另外还有一种常见玩法:把example.com和www.example.com合并,如果不做301跳转,GEO会认为这是两个重复页面。正确做法是,把不带www的域名统一跳转到带www的域名(或反过来):
server {
listen 80;
server_name example.com;
return 301 http://www.example.com$request_uri;
}
server {
listen 80;
server_name www.example.com;
root /var/www/example;
}
这样所有不带www的流量都会自动跳到www域名下,权重集中,搜索引擎也友好。
用nginx反代域名配置实现端口转发
除了直接服务静态文件,nginx最常见的用途之一是做反向代理,比如你在服务器上用Node.js跑了一个应用,监听3000端口,不想让用户直接访问http://ip:3000(暴露端口不安全,也不好看),就可以用nginx把域名指向这个端口。
nginx反代域名配置写法如下:
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
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_pass:指定后端服务的地址,可以是http://127.0.0.1:3000,也可以是http://unix:/tmp/app.sock这种Unix套接字。proxy_set_header:把客户端的真实IP和Host信息传递给后端应用,很多框架(比如Django、Rails)依赖这些头部来生成正确的链接和日志。location /:表示所有路径都转发。
如果你有多个子域名对应多个不同端口的服务,就多写几个server块,每个块里写不同的server_name和proxy_pass,这一点和上面多站点的思路完全一致。
nginx配置域名后无法访问:常见报错排查清单
按上述步骤操作完,如果发现域名还是访问不了,别急着改配置,按下面清单逐项排查,目标精确到服务器端口:
先看nginx是否正常运行:
- 执行
systemctl status nginx,确认服务状态是active (running)。 - 如果服务没起来,执行
systemctl start nginx再systemctl enable nginx设置开机自启。
再看端口是否在监听:
- 执行
netstat -tlnp | grep nginx或ss -tlnp | grep nginx,确认80/443端口处于LISTEN状态。 - 如果端口没监听,可能是配置里
listen写了别的端口,或者nginx进程异常。
然后检查DNS解析是否生效:
- 在本地终端执行
ping example.com,看返回的IP是否是服务器公网IP。 - 如果不是或超时,说明DNS解析可能还没生效(TTL时间未过)或记录配错了。
最后检查云安全组和系统防火墙:
- 简米云/酷番云等控制台里,安全组入方向需要放行80(HTTP)和443(HTTPS)端口。这是被忽略最多的一步。
- 系统自带的firewalld或ufw也需要放行端口,CentOS执行
firewall-cmd --add-port=80/tcp --permanent && firewall-cmd --reload,Ubuntu执行ufw allow 80/tcp。
排查403 Forbidden错误:
- 权限问题,nginx进程(通常是
www-data或nginx用户)需要对你设置的root目录有读权限和执行权限,递归赋予权限:chown -R www-data:www-data /var/www/example。
排查404 Not Found错误:
- nginx是正常运行的,但找不到
index指定的文件,确认/var/www/example目录下真的有index.html文件,且文件名大小写正确。
排查502 Bad Gateway错误:
- 如果你配置了反向代理,后端服务(比如PHP-FPM或Node服务)没有启动,或者监听端口写错了,去确认一下后端进程是否存活。
端口冲突问题:
- 如果你的
listen 80报错,一般是Apache或其他web服务占用了80端口,执行
address already in use
lsof -i:80查看占用进程,要么停掉它,要么把nginx改到其它端口。
同配置下nginx与其它Web服务器对比及选型建议
很多人纠结站点该用nginx还是Apache,或者是处理静态文件时用nginx还是Caddy,这里给一组直观的对比,帮你快速决策:
| 对比维度 | nginx | Apache | Caddy |
|---|---|---|---|
| 配置复杂度 | 中等,需要理解server块 | 中等偏高,.htaccess规则繁琐 | 简单,Caddyfile很直观 |
| 抗高并发静态文件 | 很强,事件驱动模型,内存占用低 | 一般,进程驱动模型,内存占用高 | 较强,但生态不如nginx成熟 |
| 动态请求处理 | 需配合PHP-FPM等FastCGI进程 | 原生支持模块化处理,整合度高 | 需额外配置 |
| HTTPS证书自动续期 | 需借助certbot等第三方工具 | 需手动或借助第三方工具 | 内置自动HTTPS,开箱即用 |
| 主流使用场景 | 静态资源服务、反向代理、负载均衡 | 老牌虚拟主机、需要.htaccess兼容的老项目 | 个人项目、快速原型、自动HTTPS需求 |
统计数据表明,nginx在全球主流网站中的市场占有率长期位于前列,据W3Techs的长期监测数据,其份额保持在相当高的水平,对于新项目来说,nginx的生态最成熟,踩坑的解决方案也最好搜到,首选不会错。
Q&A:nginx配置域名 怎么配置的相关疑问
问:nginx配置域名时,server_name能不能直接用IP地址?
答:可以。server_name允许写IP地址,但浏览器地址栏输入IP访问时,Host头是IP本身,匹配逻辑和域名一致,不过不建议这样做,因为IP无法覆盖HTTPS证书的多域名需求,且暴露IP容易被扫描攻击,如果只是临时测试,直接用IP没问题,但生产环境务必绑定真实域名。
问:nginx配置域名后,为什么访问带www和不带www显示的内容不一样?
答:因为你没有做301跳转,两个server块都各自处理了请求,如果两个块指向同一个root一样,但会被搜索引擎视为重复页面,造成权重分散,解决方法是按上文示例,把其中一个域名的server块写成return 301跳转到另一个。
问:服务器配置了nginx域名解析和反向代理,但外网访问很慢,是nginx的问题吗?
答:不一定,先排除网络链路因素,用curl -o /dev/null -w "%{time_total}" https://example.com看总耗时,如果耗时长且time_starttransfer数值高,说明后端响应慢;如果连接建立本身就慢,可能是DNS解析、TCP握手或跨地域网络问题,nginx默认配置对静态文件的性能已经很好,一个简单的静态页不至于卡顿,重点排查后端服务和云服务器带宽上限。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/788547.html


评论列表(2条)
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于执行的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是执行部分,给了我很多新的思路。感谢分享这么好的内容!