如何在 Ubuntu 上的 Nginx 中配置虚拟主机
在 Nginx 中配置虚拟主机是在单个服务器上托管多个网站的最强大技术之一,每个网站都有自己的域名、根目录和独立配置。Nginx 通过 server blocks 处理这一问题 — 灵活、轻量级的配置单元,定义 web 服务器如何响应每个域的请求。
无论您是在管理个人作品集、运行客户网站,还是扩展多租户应用程序,本指南都提供了在 Ubuntu 上设置 Nginx 虚拟主机的完整、生产就绪的演练。我们将涵盖目录结构、server block 配置、启用站点、SSL/HTTPS 设置和故障排除 — 您需要的一切,从零开始到完全功能的多站点 Nginx 服务器。
> 寻找可靠的 Ubuntu 服务器来跟随本指南? AlexHost 的 VPS Hosting 计划为您提供完整的 root 访问权限、SSD 存储和即时部署 — 非常适合这个用例。
先决条件
开始之前,请确保满足以下条件:
在您的服务器上安装 Nginx
如果尚未安装 Nginx,请在 Ubuntu 服务器上运行以下命令:
sudo apt update
sudo apt install nginx验证安装并检查服务是否正在运行:
sudo systemctl status nginx您应该在输出中看到 active (running)。如果没有,请手动启动它:
sudo systemctl start nginx
sudo systemctl enable nginx指向您服务器的域名
每个虚拟主机都需要一个解析到您服务器公共 IP 地址的域名。您需要在 DNS 设置中创建指向服务器 IP 的 A 记录。
> 需要域名?通过 AlexHost 域名注册注册您的域名,并直接从您的控制面板管理 DNS 记录。
对于本地测试目的,您可以通过编辑 /etc/hosts 文件来绕过 DNS(在第 7 步中介绍)。
所需权限
您需要在 Ubuntu 服务器上拥有 sudo 权限才能创建目录、编辑配置文件和管理 Nginx 服务。
第 1 步:为每个网站设置目录
服务器上托管的每个网站都应该有自己的隔离目录来存储网络文件。这种分离可以保持您的项目井井有条,并防止配置冲突。
在本指南中,我们将配置两个示例域:example1.com 和 example2.com。在整个过程中,请将这些替换为您的实际域名。
创建网络根目录
sudo mkdir -p /var/www/example1.com/html
sudo mkdir -p /var/www/example2.com/html-p 标志根据需要创建所有中间目录。
分配正确的所有权
将这些目录的所有权授予 www-data,即运行 Nginx 的系统用户:
sudo chown -R www-data:www-data /var/www/example1.com/html
sudo chown -R www-data:www-data /var/www/example2.com/html这确保 Nginx 具有必要的读取权限来从这些目录提供文件。
设置目录权限
sudo chmod -R 755 /var/www755 权限意味着所有者具有完全的读/写/执行访问权限,而组和其他用户具有读和执行访问权限——这对于公开提供的网络内容是合适的。
第 2 步:创建示例 HTML 内容
要验证每个虚拟主机是否正常工作,请为每个站点创建一个简单的 index.html 文件。
对于 example1.com
echo "<h1>Welcome to Example1.com!</h1>" | sudo tee /var/www/example1.com/html/index.html对于 example2.com
echo "<h1>Welcome to Example2.com!</h1>" | sudo tee /var/www/example2.com/html/index.html这些占位符页面将确认 Nginx 将请求路由到每个域的正确文档根目录。
第3步:创建虚拟主机配置文件
Nginx 将站点配置文件存储在 /etc/nginx/sites-available/。每个文件定义一个 server block — Nginx 相当于 Apache 虚拟主机的概念。启用的站点随后被符号链接到 /etc/nginx/sites-enabled/。
example1.com 的配置
创建一个新的配置文件:
sudo nano /etc/nginx/sites-available/example1.com添加以下 server block:
server {
listen 80;
listen [::]:80;
server_name example1.com www.example1.com;
root /var/www/example1.com/html;
index index.html index.htm;
access_log /var/log/nginx/example1.com.access.log;
error_log /var/log/nginx/example1.com.error.log;
location / {
try_files $uri $uri/ =404;
}
}保存并关闭文件(Ctrl+X,然后 Y,然后 Enter)。
example2.com 的配置
创建第二个配置文件:
sudo nano /etc/nginx/sites-available/example2.com添加以下 server block:
server {
listen 80;
listen [::]:80;
server_name example2.com www.example2.com;
root /var/www/example2.com/html;
index index.html index.htm;
access_log /var/log/nginx/example2.com.access.log;
error_log /var/log/nginx/example2.com.error.log;
location / {
try_files $uri $uri/ =404;
}
}关键指令说明
| 指令 | 用途 |
|---|---|
listen 80 | 在端口 80 上监听传入的 HTTP 连接 |
listen [::]:80 | 在端口 80 上启用 IPv6 支持 |
server_name | 定义此块处理的域名 |
root | 设置文档根目录 — 网站文件的存储位置 |
index | 指定请求目录时要提供的默认文件 |
try_files | 尝试提供请求的文件;如果未找到则返回 404 |
access_log / error_log | 每个站点的单独日志文件,便于调试 |
第 4 步:启用虚拟主机
Nginx 通过创建从 sites-available 到 sites-enabled 的符号链接来激活站点。此设计允许您准备配置而无需立即激活它们。
sudo ln -s /etc/nginx/sites-available/example1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example2.com /etc/nginx/sites-enabled/删除默认站点(可选但推荐)
如果要防止 Nginx 的默认占位符页面造成干扰,请禁用它:
sudo rm /etc/nginx/sites-enabled/default您可以稍后通过重新创建符号链接来重新启用它。
第 5 步:测试 Nginx 配置
在重启 Nginx 之前,始终验证配置文件是否存在语法错误。配置错误的文件可能会导致服务器上的所有网站瘫痪。
sudo nginx -t成功的测试返回:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful如果看到错误,Nginx 将指示发生问题的文件和行号。查看相关配置文件并更正任何拼写错误或缺少的分号,然后继续。
第 6 步:重启 Nginx 以应用更改
配置测试通过后,重新加载或重启 Nginx 以应用您的更改:
sudo systemctl restart nginx或者,使用 reload 进行优雅重启,不会中断活动连接:
sudo systemctl reload nginx第 7 步:访问您的网站
如果 DNS 已配置
如果您的域名已通过 DNS A 记录指向您的服务器 IP 地址,只需打开浏览器并导航到:
http://example1.comhttp://example2.com
您应该看到您在第 2 步中创建的相应”欢迎”消息。
用于本地测试(无 DNS)
如果您在本地测试或 DNS 尚未传播,您可以通过编辑本地计算机的 /etc/hosts 文件(在 Linux/macOS 上)或 C:WindowsSystem32driversetchosts(在 Windows 上)来模拟域名解析。
使用提升的权限打开文件:
sudo nano /etc/hosts添加以下行,将 YOUR_SERVER_IP 替换为您实际的服务器 IP:
YOUR_SERVER_IP example1.com www.example1.com
YOUR_SERVER_IP example2.com www.example2.com保存文件并在浏览器中测试。请记住在您的真实 DNS 记录生效后删除这些条目。
第8步:使用Let’s Encrypt启用HTTPS(推荐)
在生产环境中,使用纯HTTP运行网站已不再可接受。HTTPS加密您的服务器和访问者之间的流量,改进SEO排名,并且是现代浏览器功能所必需的。Let’s Encrypt提供免费的、自动可续期的SSL/TLS证书。
> 更倾向于高级SSL解决方案? AlexHost为需要扩展验证或通配符覆盖的企业提供受信任的SSL证书。
安装Certbot
sudo apt install certbot python3-certbot-nginx获取并安装SSL证书
为每个域运行Certbot。--nginx插件会自动修改您的Nginx配置以启用HTTPS:
sudo certbot --nginx -d example1.com -d www.example1.comsudo certbot --nginx -d example2.com -d www.example2.com按照交互式提示进行操作。Certbot将:
- 通过HTTP质询验证域所有权
- 从Let’s Encrypt获取签名证书
- 自动更新您的Nginx服务器块以侦听端口443
- 配置HTTP到HTTPS重定向
验证自动续期
Let’s Encrypt证书每90天过期一次。Certbot安装一个systemd计时器来自动处理续期。使用以下命令测试:
sudo certbot renew --dry-run如果干运行完成无错误,您的证书将自动续期,无需任何手动干预。
您更新后的服务器块将如下所示
Certbot运行后,您的配置将自动更新为类似以下内容:
server {
listen 443 ssl;
server_name example1.com www.example1.com;
root /var/www/example1.com/html;
index index.html;
ssl_certificate /etc/letsencrypt/live/example1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 80;
server_name example1.com www.example1.com;
return 301 https://$host$request_uri;
}故障排除常见问题
即使配置仔细,问题仍可能出现。以下是最常见的问题及其解决方法:
502 Bad Gateway
这通常意味着 Nginx 无法与后端服务(例如 PHP-FPM 或 Node.js 应用)通信。验证上游服务是否正在运行,以及配置中的套接字/端口是否正确。
403 Forbidden
通常是权限问题。检查 www-data 是否拥有网站根目录,以及文件权限是否设置正确:
sudo chown -R www-data:www-data /var/www/example1.com
sudo chmod -R 755 /var/www/example1.com404 Not Found
验证服务器块中的 root 指令指向正确的目录,以及 index.html 是否存在于该路径中。
加载错误的网站
如果访问 example1.com 加载了 example2.com 的内容,请检查:
- 每个
server_name指令是否唯一且正确 sites-enabled中的符号链接是否有效:ls -la /etc/nginx/sites-enabled/- 如果默认网站冲突,是否已禁用它
配置更改后 Nginx 无法启动
重启前始终运行 sudo nginx -t。仔细查看错误输出 — 它将指向导致问题的确切文件和行号。
检查日志
每个网站的日志(在步骤 3 中配置)是您最好的调试资源:
sudo tail -f /var/log/nginx/example1.com.error.log
sudo tail -f /var/log/nginx/example1.com.access.log高级注意事项
托管 PHP 应用程序
如果您的网站运行 PHP(例如 WordPress、Laravel),您需要安装 PHP-FPM 并在服务器块中添加 fastcgi_pass 指令:
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}使用控制面板
通过命令行手动管理 Nginx 虚拟主机功能强大但耗时。如果您更喜欢图形界面,请考虑 AlexHost 的 VPS with cPanel 或探索完整的 VPS 控制面板以找到适合您工作流程的解决方案。
超越单个 VPS 的扩展
随着流量增长,单个 VPS 可能不足以满足需求。对于高流量、资源密集型工作负载,请考虑升级到 专用服务器以获得有保证的资源、完整的硬件隔离和最大性能。
结论
您现在已成功在 Ubuntu 上配置了 Nginx 虚拟主机,使您的服务器能够同时托管多个独立网站。以下是所完成工作的总结:
- 为每个域创建了隔离的网站根目录,具有正确的所有权和权限
- 编写了干净的、生产就绪的服务器块配置,具有单独的访问和错误日志
- 使用 Nginx 的符号链接模式启用了虚拟主机
sites-available/sites-enabled - 安全地验证和重新加载了 Nginx 配置
- 使用免费的 Let's Encrypt 证书通过 Certbot 为每个站点保护了 HTTPS
此设置高效、可扩展,并遵循 Nginx 最佳实践。无论您托管两个站点还是二十个站点,相同的模式都适用——只需为每个额外的域重复该过程。
为获得最佳效果,请将此配置与快速、可靠的托管环境配对。AlexHost 的 VPS Hosting 计划针对 Linux 工作负载进行了优化,提供完全的 root 访问权限,并由 24/7 技术支持支持——为您在生产环境中运行 Nginx 提供了理想的基础。
