Nginx 一台服务器跑多网站:零基础虚拟主机配置教程
一台服务器想同时跑多个网站,核心做法是给每个域名配置一个独立的 server 块,并让 Nginx 根据请求里的域名(Host 头)分发到不同目录。
前提是每个域名都已解析到这台服务器的公网 IP,服务器 80 和 443 端口已放行。
下面按零基础也能照做的顺序展开。
先确认域名解析和端口这两件事
在写配置之前,先验证请求能不能到达这台服务器,否则配置对了也看不到结果。
- 在本地终端执行
ping 你的域名或nslookup 你的域名,返回的应该是服务器公网 IP。域名解析生效通常需要几分钟到几十分钟,刚加完记录不要急着排查 Nginx。 - 确认服务器防火墙和安全组放行了 80(HTTP)和 443(HTTPS)。云服务器控制台的“安全组”和系统内防火墙是两套,缺一个都会表现为“连接超时”。
- 确认 Nginx 已安装并运行:
nginx -v看版本,systemctl status nginx看状态。
目录规划建议提前想好,后面改路径会牵动配置。
常见做法是每个站点一个目录,例如 /www/site-a、/www/site-b,日志也分开存放,方便单独排查。
为每个站点写一个 server 块
Nginx 按 include 加载配置,主流发行版通常会把 /etc/nginx/conf.d/*.conf 或 /etc/nginx/sites-enabled/* 引入主配置。
多网站场景下,一个站点一个 .conf 文件最清晰,出问题也容易定位。
以 site-a.com 为例,新建 /etc/nginx/conf.d/site-a.conf:
server {
listen 80;
server_name site-a.com www.site-a.com;
root /www/site-a;
index index.html index.php;
access_log /var/log/nginx/site-a.access.log;
error_log /var/log/nginx/site-a.error.log;
location / {
try_files $uri $uri/ =404;
}
}
再为第二个域名建一个结构相同、
只改 server_name、root 和日志文件名的文件。关键点在于 server_name 要和用户实际访问的域名完全一致,www 和不带 www 要按需分别写进去,
或者用重定向统一。
改完配置先做语法检查,再平滑加载,不要直接重启:
nginx -t
systemctl reload nginx
nginx -t 报 syntax is ok 且 test is successful 才算通过。
如果报错,会直接指出文件名和行号,按提示改即可。
权限和默认站点这两个坑最容易翻车
配置看起来没问题但页面报 403,多数是权限问题。
Nginx 进程通常以 nginx 或 www-data 用户运行,站点目录需要让这个用户有读取和执行权限。
目录权限一般给 755,文件给 644,不要为了省事直接 chmod 777。
chown -R nginx:nginx /www/site-a
chmod -R 755 /www/site-a
具体用户名用 ps aux | grep nginx 确认,不同系统可能不一样。
另一个常见现象是“访问任意域名都跳到同一个网站”。
这通常是默认站点在起作用:当请求的域名没有匹配到任何 server_name 时,Nginx 会用第一个或标记了 default_server 的 server 块处理。
给默认站点单独建一个文件,只返回 444 或一个占位页,可以避免串站:
server {
listen 80 default_server;
server_name _;
return 444;
}
上 HTTPS 时别让证书只配了一个域名
如果站点要启用 HTTPS,每个域名需要单独配置 listen 443 ssl,并指向对应证书。
把 A 站点的证书用到 B 站点上,浏览器会报证书域名不匹配。
多站点共用一个证书文件时,要确认证书的 SAN(备用名称)字段确实覆盖了所有域名。
配置完用 nginx -t 验证,再用 curl -I https://站点域名 看返回头。
也可以用 openssl s_client -connect 域名:443 -servername 域名 检查实际返回的证书。
怎么验证多网站确实各走各的
最直接的验证方式是在每个站点目录放一个内容不同的 index.html,然后分别访问。
如果都显示正确,说明分发正常。
还可以用 curl 指定 Host 来测试,绕开本地 DNS 缓存:
curl -I -H "Host: site-a.com" http://服务器IP
返回的 HTTP/1.1 200 和页面内容能对上,就说明该域名的 server 块生效了。
如果返回 404,检查 root 路径和文件是否存在;
返回 403,回到权限部分检查。
常见疑问
一个 server 块里能写多个域名吗?
可以。server_name 后面用空格分隔多个域名,它们会共用同一个 root 和配置。适合主域名和 www 指向同一套程序的情况,内容不同的站点还是分开写更清楚。
改了配置为什么没生效?
先确认执行了 systemctl reload nginx。如果还不行,检查配置文件是否真的在 include 范围内,有些系统默认只加载 conf.d 下的 .conf 文件,文件名后缀不对不会被读取。
两个域名想跑在同一台服务器的不同端口上可以吗?
可以,把 listen 改成不同端口即可,但用户访问时需要带端口号。域名直接对应默认的 80/443 体验更好,端口方式更适合内部测试或临时服务。
多站点配置的本质是让域名、目录、证书三者一一对应。
先把解析和端口确认清楚,再一个站点一个配置文件地加,配合 nginx -t 和 curl 验证,绝大多数问题都能快速定位。