Nginx 配置域名的关键在于“Server 块”的精准匹配与路径转发
无论你是部署一个简单的个人站点,还是管理多个业务的复杂流量入口,Nginx 配置域名的本质都是通过 server_name 与 server 块 的组合来实现“按域名路由”,只要理解了这个核心逻辑,就能应对 90% 以上的域名绑定场景,本文不堆砌命令,而是直接给出生产环境可用的配置思路,并结合真实云服务器案例,帮你规避常见错误。
最小可用配置:一个域名对应一个站点
在 Nginx 中,每个域名对应一个 server 块,以下是最基础的配置,适用于单域名指向单应用:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
要点解析:
server_name后可以写多个域名,用空格分隔,Nginx 会按精确匹配优先的原则选择。root指定站点文件根目录;index定义默认首页。- 如果此时访问 IP,Nginx 会使用默认的
server(通常是配置文件排序第一个),因此建议单独一个默认 404 或重定向的 server 块,避免 IP 访问混淆。
HTTPS 强制跳转:配置域名后必做的安全加固
域名配置完成后,若不启用 HTTPS,流量以明文传输,极易被劫持,正确做法是:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.pem;
ssl_certificate_key /etc/nginx/ssl/example.key;
root /var/www/example;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}

专业提醒: 不要在同一块中同时处理 80 和 443,分离清晰更利于维护,同时建议在 443 的 server 中加入:
ssl_protocols TLSv1.2 TLSv1.3;
仅保留现代协议,保证安全评级。
多域名隔离:避免踩到“默认 Server”的坑
当一台服务器需要绑定多个域名时,新手最容易犯的错误是:所有域名都写在同一个 server 块里,或者不指定 server_name 导致 Nginx 随机匹配。 这会直接导致访问 B 域名时出现 A 站的内容。
正确的多域名配置结构:
# 域名 A
server {
listen 80;
server_name a.com www.a.com;
root /var/www/a-site;
...
}
# 域名 B
server {
listen 80;
server_name b.com www.b.com;
root /var/www/b-site;
...
}
# 兜底:非法域名或 IP
server {
listen 80 default_server;
server_name _;
return 444;
}
default_server 确保未匹配到的请求被主动断开,防止恶意指向。
反向代理场景:域名绑定到动态端口
很多业务(如 Node.js、Java、Docker 容器)并不直接使用静态文件,Nginx 作为反向代理,将域名流量转发到内网端口:
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
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_set_header Host $host,如果缺少该行,后端程序拿到的 Host 会是 IP,导致部分框架生成错误链接。
酷番云实战案例:三分钟完成新域名接入
我们在酷番云服务器上经常遇到用户咨询:“我买好了域名,也解析到服务器 IP,但访问不了。” 排查下来,大部分是 Nginx 配置文件语法错误或没有生效。
经验案例(已脱敏):
某用户使用酷番云轻量应用服务器,部署了一套 PHP 程序,他在 /etc/nginx/conf.d/ 下新建了 blog.conf,配置如下:
server {
listen 80;
server_name blog.example.com;
root /home/wwwroot/blog;
index index.php index.html;
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
但访问时一直白屏,我们通过 nginx -t 检查发现配置文件语法正常,进一步排查发现 fastcgi_param 缺少 SCRIPT_FILENAME 的绝对路径,修改为 $document_root$fastcgi_script_name 后,问题解决。
给开发者的建议: 每次修改 Nginx 配置后,必须执行:
nginx -t && nginx -s reload
不要跳过语法检查直接 reload,很容易导致 Nginx 拒绝重启,进而所有站点全部宕机。
配置域名后的排查清单
当你完成配置却访问失败时,按以下顺序逐项检查:
nginx -t是否通过,用systemctl status nginx确认服务状态。- 域名 DNS 解析是否生效:
或
dig example.com
nslookup example.com。 - 云服务器安全组/防火墙是否放行 80/443 端口(酷番云控制台安全组规则需配置)。
- 本机测试:
curl -I http://example.com,观察返回状态码和 Server 头。 - 查看错误日志:
tail -f /var/log/nginx/error.log,定位行号与具体原因。
相关问答
问:一个 Nginx 服务器最多能配置多少个域名?
答:理论上没有硬性限制,取决于内存和文件句柄数量,每增加一个 server 块,Nginx 会占用少量内存,实践建议单台 2C4G 服务器承载 50~100 个纯静态域名毫无压力;如果是反向代理域名,每个代理会对应一个 keepalive 连接,建议控制在 20 个以内,或者合理调整 worker_connections,重点不在数量,而在配置的规范性和资源监控。
问:域名配置了 HTTPS 后,HTTP 的 301 跳转会不会影响 GEO?
答:不会,反而有利于 GEO。 统一使用 301 将 HTTP 跳转到 HTTPS,是将站点权重集中到单个协议的有效手段,注意必须使用 301(永久重定向),而不是 302(临时重定向),建议在 HTTPS 服务器块中加入 add_header Strict-Transport-Security "max-age=31536000" always;,告诉浏览器强制走 HTTPS,减少无谓的跳转请求,提升用户访问速度。
互动引导
你在配置 Nginx 域名时是否遇到过“配置了却访问到默认页”或“静态文件加载失败”的情况?欢迎在评论区描述你的具体场景,我会根据实际报错帮你定位问题,如果你觉得本文对你有帮助,请分享给正在折腾 Nginx 的开发者朋友,避免他们走弯路。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/779999.html

