nginx域名绑定就是通过server_name指令将不同域名指向对应站点目录,配置核心在nginx.conf的server块中,改完必须重载配置才能生效。
nginx域名绑定怎么配置
很多第一次接触nginx的朋友,都会把“绑定域名”想成某种神秘操作,其实它和你租房时在门牌上写名字差不多nginx收到请求后,靠一张“门牌表”决定把流量送到哪个房间,这张门牌表就是配置文件里的server块,而门牌号就是server_name。
最基础的域名绑定写法
打开nginx配置文件,通常位于/etc/nginx/nginx.conf,或者在/etc/nginx/conf.d/目录下新建一个以.conf结尾的文件,一个最简单的绑定长这样:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example;
index index.html;
}
这里的server_name就是你绑定的域名,可以写一个,也可以写多个,用空格隔开,当用户访问example.com时,nginx会把这个请求交给这个server块处理,然后从/var/www/example目录里读取文件。
配置文件放哪里更合适
行业共识认为,把每个站点的配置独立拆分到conf.d目录下,比全部塞进nginx.conf更利于维护,比如创建/etc/nginx/conf.d/example.conf,写入上述内容,然后执行:
nginx -t # 检查语法是否正确
nginx -s reload # 重载配置
看到test is successful提示再重载,基本就不会出问题。
nginx一个ip绑定多个域名的完整步骤
服务器只有一个公网IP,但想跑好几个网站,这是最常见的场景,nginx的虚拟主机功能就是为了解决这个问题,原理很简单:共用同一个IP和80端口,nginx根据请求头里的Host字段来区分域名。
第一步:准备多个域名目录
假设你有两个域名:site1.com和site2.com,先分别建好网站根目录:
mkdir -p /var/www/site1
mkdir -p /var/www/site2
echo "This is site1" > /var/www/site1/index.html
echo "This is site2" > /var/www/site2/index.html
真实项目中你会放WordPress或前端打包后的文件,这里用测试页代替。
第二步:写两个server块
在同一个配置文件里,或者拆成两个独立文件,写入两个server块:
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块都监听80端口,但server_name不同,nginx收到请求后,会拿请求头里的域名去匹配server_name,匹配上谁就进谁。
第三步:处理默认站点和IP直访
如果你直接用IP访问服务器,nginx会匹配不到任何server_name,这时它会把请求交给default_server,你可以指定一个默认站点:
server {
listen 80 default_server;
server_name _;
return 444;
}
这里的server_name _是一个不匹配任何真实域名的写法,return 444表示直接关闭连接,这样IP访问和未知域名的请求都被挡在外面,防止别人把不相关的域名解析到你服务器上蹭流量。
测试和验证
改完配置后,在服务器上执行:
curl -H "Host: site1.com" http://127.0.0.1
curl -H "Host: site2.com" http://127.0.0.1
如果分别输出site1和site2的内容,说明绑定成功,再用浏览器访问真实验证一遍即可。
nginx域名绑定端口和其他注意事项
默认情况下web服务用80端口,但有些场景需要把域名绑定到特定端口,比如开发环境跑个8080,或者后端API用8443。
如何绑定非80端口
写法很简单,把listen后面的端口改掉:
server {
listen 8080;
server_name api.example.com;
root /var/www/api;
}
访问http://api.example.com:8080就能命中,注意用户如果不想带端口号,就需要在域名解析里做端口转发,或者用防火墙规则映射。
配置域名绑定ip时容易踩的坑
有的朋友以为server_name写IP地址就能绑定IP,其实不对,server_name专门用来匹配域名,IP匹配是靠listen指令里的IP前缀,比如服务器有多个IP地址,你想让不同IP访问不同站点:
server {
listen 192.168.1.10:80;
server_name example.com;
}
这样只有访问192.168.1.10这个IP的请求才会进这个块,但更常见的情况是多个域名解析到同一IP,按照前面说的server_name区分即可。
正则匹配和泛域名绑定
如果有很多二级域名,比如a.example.com、b.example.com,一个个写太麻烦,可以用正则:
server {
listen 80;
server_name ~^(?<sub>.+).example.com$;
root /var/www/$sub;
}
这里用到了命名捕获组,把二级域名前缀作为变量,动态指向对应目录,这个技巧在搭建多租户SaaS系统时很实用。

nginx域名绑定不上常见原因排查
配置看起来没问题,但域名就是不生效,大多数情况不是nginx的锅,而是下面几个环节出了问题。
DNS解析没生效
先在你本机执行:
dig site1.com +short
或者用nslookup site1.com,看返回的IP是不是服务器IP,如果不对,去域名注册商的DNS管理后台检查解析记录,国内云服务器还需要注意备案问题,域名没有备案的话,80端口会被运营商拦截,这是另一码事。
配置文件语法错误
改动后一定运行nginx -t,语法错误时nginx拒绝重载,但老配置还在跑,所以看起来“没生效”,常见错误包括漏写分号、花括号不匹配、root路径不存在。
缓存问题
浏览器缓存和本地DNS缓存都会让你误以为绑定失败,换个无痕窗口,或者用curl -H "Host: site1.com" http://服务器IP来测试,绕开DNS解析直接模拟请求。
防火墙没有放行端口
如果是云服务器,安全组规则里只开放了22端口和80端口,但你改用8080,那必然连不上,检查简米云/酷番云控制台的安全组入方向规则,同时确认服务器防火墙:
firewall-cmd --list-all # CentOS
ufw status # Ubuntu
nginx域名绑定和反向代理如何配合
很多场景下,nginx绑定域名后不是直接返回静态文件,而是把请求转发给后端的Node.js、Java或Python服务,这就是反向代理,绑定域名只是第一步。
一个典型的前后端分离配置
前端站点是静态文件,后端API走反向代理:
server {
listen 80;
server_name www.example.com;
root /var/www/frontend;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
这样api.example.com就绑定到了本地的3000端口服务,很多小程序后端和App接口都是这么部署的。
根据路径而不是域名来分流
如果只有一个域名,但想让它同时服务前端和后端,可以使用location路径匹配:
server {
listen 80;
server_name example.com;
location /api/ {
proxy_pass http://127.0.0.1:8080;
}
location / {
root /var/www/frontend;
}
}

百度GEO角度下的nginx域名绑定价值
从网站优化的角度来看,nginx域名绑定的合理性会直接影响搜索引擎抓取,多个域名指向同一个站点时,搜索引擎会视为重复内容,导致权重分散,行业共识认为,一个站点只保留一个主域名,其他域名做301跳转。
nginx实现域名统一跳转
如果你买了example.cn和example.com,想让所有流量都集中到.com,配置如下:
server {
listen 80;
server_name example.cn www.example.cn;
return 301 http://www.example.com$request_uri;
}
server {
listen 80;
server_name example.com www.example.com;
# 实际站点配置
}
这个301跳转把旧域名的权重转移到主域名上,避免被判定为重复站点,很多人忽略这一点,结果两个域名都有排名,但谁也不高。
强制HTTPS也是绑定的一部分
现在的百度GEO对HTTPS站点有偏好,配置好域名后,紧接着加上SSL证书,Let’s Encrypt免费证书配合certbot,一条命令就能搞定:
certbot --nginx -d example.com -d www.example.com
证书会自动续期,不需要额外维护,nginx域名绑定到这里基本就完整了。
常见问题解答
nginx域名绑定后不生效怎么办?
按顺序检查:先ping 域名看解析是否指向服务器,再curl -H "Host: 域名" http://服务器IP测试nginx配置,接着看nginx -t语法有没有错,最后确认防火墙和云安全组放行了对应端口,如果用了CDN,还要检查CDN回源地址是否正确。
nginx一个ip可以绑定多少个域名?
理论上不限制数量,实际取决于服务器性能,每个server块占用极小的内存,一台入门级云主机绑定几百个静态站点都没问题,但如果域名背后都是动态请求,就需要考虑并发能力了。
域名绑定和URL重写有什么区别?
域名绑定决定哪个域名能访问到哪个服务,URL重写是在请求进入后修改路径,举个例子,绑定是“你家门口挂了张三和李四的牌子”,重写是“张三来了直接领到客厅,李四来了领到书房”,两者常常配合使用,但解决的层级完全不同。
nginx域名绑定本身并不复杂,核心就是server_name和server块的组合,先把基础配置跑通,再逐步加上HTTPS、反向代理、负载均衡这些进阶玩法,遇到问题多看看错误日志,tail -f /var/log/nginx/error.log能帮你省下不少排查时间。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/779641.html

