Save 15% on All Hosting Services

测试技能,享折扣

使用代码: Skills 开始使用
China
Linux 管理

如何在 Ubuntu 上的 Nginx 中配置虚拟主机

在单个服务器上配置 Nginx 虚拟主机是托管多个网站的最强大技术之一,每个网站都有自己的域名、根目录和独立配置。Nginx 通过服务器块处理此问题——灵活、轻量级的配置单元,定义 Web 服务器如何响应每个域的请求。

无论您是在管理个人作品集、运行客户网站还是扩展多租户应用程序,本指南都提供了在 Ubuntu 上设置 Nginx 虚拟主机的完整、生产就绪的演练。我们将涵盖目录结构、服务器块配置、启用站点、SSL/HTTPS 设置和故障排除——从零开始到完全功能的多站点 Nginx 服务器所需的一切。

> 寻找可靠的 Ubuntu 服务器来跟随本指南?AlexHost 的VPS 托管计划为您提供完全的 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 步:为每个网站设置目录

您服务器上托管的每个网站都应该有自己的隔离目录来存储 Web 文件。这种分离使您的项目保持井然有序,并防止配置冲突。

在本指南中,我们将配置两个示例域:example1.comexample2.com。在整个过程中用您的实际域名替换这些。

创建 Web 根目录

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/www

755 权限意味着所有者具有完全的读/写/执行访问权限,而组和其他用户具有读和执行访问权限——适合公开提供的 Web 内容。

第 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/ 中。每个文件定义一个服务器块——Nginx 相当于 Apache 虚拟主机。启用的站点随后被符号链接到 /etc/nginx/sites-enabled/

example1.com 的配置

创建一个新的配置文件:

sudo nano /etc/nginx/sites-available/example1.com

添加以下服务器块:

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 {
    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.com
  • http://example2.com

您应该看到在第 2 步中创建的相应”欢迎”消息。

用于本地测试(无 DNS)

如果您在本地测试或 DNS 尚未传播,您可以通过编辑本地计算机的 /etc/hosts 文件(在 Linux/macOS 上)或 C:WindowsSystem32driversetchosts(在 Windows 上)来模拟域名解析。

使用提升的权限打开文件:

sudo nano /etc/hosts

添加以下行,用您的实际服务器 IP 替换 YOUR_SERVER_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.com
sudo certbot --nginx -d example2.com -d www.example2.com

按照交互式提示进行操作。Certbot 将:

  1. 通过 HTTP 质询验证域名所有权
  2. 从 Let’s Encrypt 获取签名证书
  3. 自动更新您的 Nginx 服务器块以在端口 443 上监听
  4. 配置 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 是否拥有 Web 根目录,以及文件权限是否设置正确:

sudo chown -R www-data:www-data /var/www/example1.com
sudo chmod -R 755 /var/www/example1.com

404 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 虚拟主机很强

Linux
管理
LiteSpeed 主机 安全 管理

Save 15% on All Hosting Services

测试技能,享折扣

使用代码: Skills 开始使用
快速获取信息
快速获取信息

节省您的时间,快速解答您的问题

自己解决问题
自己解决问题

知识库包含详细的教程,让您可以自己处理技术任务。

提高技能
提高技能

通过使用知识库,您可以扩展有关虚拟主机和相关主题的知识

插图和图表
插图和图表

许多文章都配有插图和图表,使复杂的过程和设置更容易理解。

实用技巧
实用技巧

你会找到有用的技巧和窍门,以提升你的网站或网络应用的性能。

给定主题的相关性
给定主题的相关性

知识库中的信息会定期更新,以反映 IT 基础设施和 AlexHost 服务领域的最新变化和趋势。

没有找到您要找的主题?有一个完美的解决方案

杰出的客人和客户!您的便利是我们的首要任务!如果您在安装任何特定软件或部署服务器时遇到困难,请随时联系我们。我们重视您的意见,并随时准备帮助您解决问题。

此外,我们还为您提供了积极参与创建知识库的机会。如果您有希望纳入我们数据库的主题或问题,请告诉我们!我们随时准备根据您的需求撰写详细的文章和指南。

我们努力使您在 AlexHost 的体验尽可能方便和高效,您对知识库的贡献有助于我们实现这一目标。联系我们 ->
info@alexhost.com 并让我们知道如何让您的住宿体验更加完美。

Solution Image