
当你拥有了第一台云服务器时,那种感觉,就如同得到了一块充满无限可能的“数字画布”。很多人的第一反应是,将自己最心爱的那个域名和网站部署上去,看着它在互联网上成功“点亮”。但是,随着你的项目增多、想法迸发,你可能会开始思考一个极具性价比的问题:我能在这同一台服务器上,再多放几个网站吗?比如,除了我的主博客之外,再放一个作品集网站,一个用于测试的开发站点,甚至帮朋友托管一个小页面?答案是,当然可以!而且,这正是云服务器的魅力所在——高效的资源利用。那种“一台服务器只能跑一个网站”的旧观念,早该被抛到九霄云外了。实现这一目标的关键技术,就是Web服务器的“虚拟主机”(Virtual Hosting)功能。今天,Hostol就以高性能Web服务器Nginx为例,为你详细解读云服务器如何搭建多站点架构?Nginx + 多域名部署方案详解,让你也能成为一名高效的“多站点架构师”。
核心原理揭秘:Nginx如何“一心多用”?
在开始动手之前,我们必须先理解Nginx这位“交通警察”是如何做到“一心多用”,能够在一台只有一个IP地址的服务器上,准确地将来自不同域名的访客引导到他们各自对应的网站的。这背后并没有什么真正的魔法,而是基于HTTP协议的一个核心机制。
关键指令:<code>server_name</code> 的魔力
当你通过浏览器访问一个网站(比如www.site-a.com
)时,你的浏览器会向服务器发送一个HTTP请求。在这个请求的头部信息(Headers)中,包含了一个非常重要的字段——Host
,它的值就是你访问的域名<code>www.site-a.com</code>。Nginx在收到这个请求后,它的核心工作之一就是查看这个Host
字段的值。然后,Nginx会拿着这个值,去审视自己所有的配置文件,寻找哪个<code>server</code>配置块中的<code>server_name</code>指令与这个域名匹配。一旦找到了匹配的<code>server</code>块,Nginx就会使用这个块里定义的所有规则(比如网站文件的根目录、日志文件路径、PHP处理方式等)来处理这个请求。如果没有找到精确匹配的,它会按照一定的规则选择一个默认的<code>server</code>块来处理。这个过程,就像一个大厦的智能前台。前台(Nginx)看到一封信(HTTP请求),会先看信封上的收件人姓名(Host
头),然后对照大厦的公司名录(<code>server_name</code>列表),准确地将信件投递到对应的公司(处理请求的<code>server</code>块)。所以,<code>server_name</code>指令,就是我们实现多站点部署的“魔法核心”。
Nginx的配置文件结构:模块化管理的最佳实践
直接把所有网站的配置都堆在主配置文件<code>nginx.conf</code>里,显然是一种混乱且难以维护的做法。幸运的是,Nginx(尤其是在Debian/Ubuntu等发行版中)推荐并默认采用了一种非常优雅的模块化管理方式:
- <code>/etc/nginx/sites-available/</code>:这个目录是存放你所有网站的独立配置文件的“草稿箱”或“仓库”。每个网站,我们都为它创建一个独立的配置文件(比如<code>site-a.com</code>, <code>site-b.com</code>)。
- <code>/etc/nginx/sites-enabled/</code>:这个目录是Nginx实际会去加载配置的“上线区”。我们不会直接在这里创建文件,而是通过在<code>sites-available</code>中创建好的配置文件的“快捷方式”(符号链接,Symbolic Link)来启用一个网站。
这样做的好处是什么?当你想要上线一个新网站时,只需在<code>sites-available</code>里写好配置,然后在<code>sites-enabled</code>里创建一个指向它的符号链接,再重载Nginx即可。想临时下线某个网站?只需删除<code>sites-enabled</code>里的那个符号链接(不会影响到<code>sites-available</code>里的原始配置文件),再重载Nginx。整个过程干净、利落、可逆,管理起来非常清晰。
实战演练:从零开始配置两个网站
理论讲完了,我们来点实际的。假设我们已经有了一台云服务器,并且拥有两个域名:site-a.com
和site-b.org
。我们的目标是在这台服务器上,让这两个域名分别展示不同的网站内容。
准备工作:创建网站目录与DNS解析
首先,我们需要为这两个网站分别创建存放网页文件的“家”。
- 创建网站根目录: Bash
sudo mkdir -p /var/www/site-a.com/html sudo mkdir -p /var/www/site-b.org/html
<code>-p</code>参数能确保在父目录不存在时自动创建。 - 创建测试页面: 为了能清晰地看到效果,我们为每个网站创建一个简单的<code>index.html</code>文件。 Bash
sudo nano /var/www/site-a.com/html/index.html
在里面写入:<code><h1>Welcome to Site A!</h1></code>。保存退出。 同样地,为<code>site-b.org</code>创建一个内容为<code><h1>Welcome to Site B!</h1></code>的首页。 - 设置目录权限: 为了确保Nginx有权限读取这些文件,我们需要设置正确的权限。一个常见的做法是将目录的所有者变更为Nginx的运行用户(通常是<code>www-data</code>)。 Bash
sudo chown -R www-data:www-data /var/www/site-a.com sudo chown -R www-data:www-data /var/www/site-b.org
- 配置DNS解析: 这是至关重要的一步。你必须登录到你的域名注册商的管理后台,为<code>site-a.com</code>(通常包括<code>www.site-a.com</code>)和<code>site-b.org</code>(通常包括<code>www.site-b.org</code>)都创建A记录,将它们指向你云服务器的公网IP地址。如果你在这一步遇到问题,可以参考我们关于<a href=”/blog/server-dns-troubleshooting-guide/”>DNS故障排查的指南</a>。
编写第一个站点的Nginx配置文件
现在,我们为<code>site-a.com</code>创建它的专属配置文件。
Bash
sudo nano /etc/nginx/sites-available/site-a.com
在打开的编辑器中,贴入以下基础配置:
Nginx
server {
listen 80;
listen [::]:80; # 同时监听IPv6地址
# 网站文件的根目录
root /var/www/site-a.com/html;
# 默认首页文件
index index.html index.htm;
# 这个server块负责处理的域名
# 可以写多个,用空格隔开
server_name site-a.com www.site-a.com;
location / {
# 尝试按顺序查找文件:先找精确匹配的文件($uri),再找同名目录($uri/),都找不到就返回404
try_files $uri $uri/ =404;
}
}
保存并退出。
编写第二个站点的Nginx配置文件
同理,我们为<code>site-b.org</code>创建配置文件:
Bash
sudo nano /etc/nginx/sites-available/site-b.org
贴入配置内容,注意修改<code>root</code>和<code>server_name</code>指令:
Nginx
server {
listen 80;
listen [::]:80;
root /var/www/site-b.org/html;
index index.html index.htm;
server_name site-b.org www.site-b.org;
location / {
try_files $uri $uri/ =404;
}
}
保存并退出。
“上线”网站:启用配置并测试
配置文件写好了,现在我们要把它们从“草稿箱”放到“上线区”。
- 创建符号链接: Bash
sudo ln -s /etc/nginx/sites-available/site-a.com /etc/nginx/sites-enabled/ sudo ln -s /etc/nginx/sites-available/site-b.org /etc/nginx/sites-enabled/
- 测试Nginx配置语法: 在重载服务前,先检查一下配置文件有没有语法错误,这是一个非常好的习惯! Bash
sudo nginx -t
如果看到<code>syntax is ok</code>和<code>test is successful</code>的字样,说明配置没问题。 - 重载Nginx服务: Bash
sudo systemctl reload nginx
<code>reload</code>命令会平滑地加载新配置,而不会中断已有的连接。
现在,打开你的浏览器,分别访问<code>http://site-a.com</code>和<code>http://site-b.org</code>,你应该能看到它们各自显示了不同的欢迎页面!恭喜你,你已经成功地在一台云服务器上搭建了多站点架构!
进阶话题:SSL证书与PHP支持
当然,现代网站光有HTTP是远远不够的,HTTPS加密和动态内容支持才是标配。
为多个站点配置独立的SSL证书 (HTTPS)
得益于SNI(服务器名称指示)技术,我们可以在同一个IP地址和端口上,为多个不同的域名配置各自独立的SSL证书。
你需要为每个域名都获取SSL证书(比如通过Certbot工具申请免费的Let’s Encrypt证书)。然后,修改每个站点的配置文件,增加对443端口(HTTPS)的监听和证书配置。
以<code>site-a.com</code>为例,修改后的<code>server</code>块可能长这样:
Nginx
server {
listen 80;
server_name site-a.com www.site-a.com;
# 将所有HTTP请求永久重定向到HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name site-a.com www.site-a.com;
root /var/www/site-a.com/html;
index index.html index.htm;
# SSL证书配置
ssl_certificate /etc/letsencrypt/live/site-a.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site-a.com/privkey.pem;
# 其他SSL优化配置...
location / {
try_files $uri $uri/ =404;
}
}
集成PHP-FPM:让你的多站点“动”起来
如果你的网站是动态的(比如WordPress博客),你需要配置Nginx将<code>.php</code>文件的请求转发给PHP-FPM(一个高效的PHP FastCGI管理器)来处理。你需要在每个需要PHP支持的站点的<code>server</code>块中,加入类似下面的<code>location</code>块:
Nginx
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# 确保fastcgi_pass指令指向你正确的PHP-FPM socket文件
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
通过这种方式,Nginx会根据不同的域名,将请求转发给PHP-FPM,并告诉PHP-FPM去执行对应网站根目录下的PHP脚本。想了解更多关于PHP-FPM的配置与优化,可以关注我们后续关于<a href=”/blog/php-fpm-optimization/”>PHP-FPM配置</a>的专题文章。
常见问题解答 (FAQ)
问:我可以在一个<code>server块里用
server_name`指令放多个域名吗? 答:完全可以!用空格隔开即可,例如<code>server_name site-a.com www.site-a.com example.com;</code>。第一个域名通常被视为主域名。你甚至可以使用通配符,比如<code>server_name *https://www.google.com/search?q=.site-a.com;</code>来匹配所有子域名。
**问:如果没有请求的域名匹配任何<code>server_name,Nginx会怎么处理?** 答:Nginx会把请求交给那个在<code>listen
指令中标记了<code>default_server</code>的<code>server块来处理。如果没有显式指定<code>default_server
,那么通常是配置文件中第一个被读取到的<code>server`块成为默认。因此,配置一个专门的“接盘侠”<code>default_server</code>来处理所有未匹配的域名请求,并返回一个错误或特定页面,是一个很好的安全实践。
问:我应该把所有网站的配置都写在<code>nginx.conf`里吗? 答:绝对不应该!正如我们前面所实践的,使用<code>sites-available</code>和<code>sites-enabled</code>这种模块化的方式,是管理多个网站配置的最佳实践,它能让你的配置结构清晰、维护方便。
问:这种方式托管多个网站,会互相影响性能吗? 答:会的。因为它们共享的是同一台服务器的CPU、内存、I/O和网络带宽资源。如果其中一个网站突然流量暴增或者运行了非常消耗资源的代码,就可能会影响到同一台服务器上的其他网站。因此,在决定要托管多少个网站时,务必要<a href=”/blog/vps-selection-guide/”>选择一台配置合适的云服务器</a>,并持续监控其资源使用情况。
毫无疑问,学会云服务器如何搭建多站点架构?Nginx + 多域名部署方案详解这项技能,是你从服务器新手向“老司机”迈进的关键一步。它能让你最大化地利用服务器资源,以极低的成本承载你的多个创意和项目。如果你在配置过程中遇到任何问题,或者希望寻找一个性能稳定、能轻松支撑多站点架构的托管环境,欢迎随时<a href=”/contact-us/”>联系我们</a>。让你的每一个域名,都能在云端找到属于自己的、那个独一无二的“家”。