nginx 上有多个网站,一个 IP

nginx 上有多个网站,一个 IP

所以我使用 digital ocean 和 nginx。我想托管多个网站(我的项目),但不想为每个网站购买一个域名。

有没有办法在 nginx 和 digital ocean 上托管多个网站,同时使用一个 IP 访问它们?

答案1

有两种方法可以实现这一点。要么你通过 IP 地址、子文件夹位置来做所有事情,要么你需要购买域名,然后在该域名上拥有多个子域名(如果您购买域名,则子域名不需要花费任何费用,但请咨询您的注册商)。

我不建议使用 IP 地址方法,因为必须记住 IP 地址非常麻烦,而且如果您尝试与他人分享信息,您也会遇到其他人必须记住 IP 地址的相同问题。


一 IP 多子文件夹方法,无需域名

注意! 我们没有关于你正在从事的项目的任何信息。我​​们需要了解更多信息来确定你是否可以这样做,因为许多如果没有绑定真正的域名,Web 框架将无法运行。


警告:在对这些示例进行持续测试的过程中,我们发现“一个域,多个子目录”方法并不适合将数据反向代理到后端,因为请求的 URI 将包含 URI 内的子目录;这可能会使后端服务器无法正常运行。

另一方面nginx,我们需要对此采取一种“邪恶”的方法 - 一个 IP 地址,多个文档根目录和子文件夹位置。这是一种非常邪恶的方法,可能会给某些 Web 框架带来很多问题。

假设默认nginx安装作为存储库的基础,那么我们必须创建一个站点配置来处理每个项目子目录请求。然后我们必须在正确的位置对其进行符号链接。

使用以下内容创建/etc/nginx/sites-available/my-projects(使用它作为模板/指南 - 它假设三个项目具有静态 HTML 并且没有 PHP 或 python 或类似的动态 Web 应用程序,并且您可以复制各个位置块并相应地创建新的位置;它还假设您的服务器 IP 是1.2.3.4)。

server {
    listen 80 default_server;

    server_name 1.2.3.4;

    location / {
        return 410;  # Default root of site won't exist.
    }

    location /proj1/ {
        alias /var/www/proj1;
        try_files $uri $uri/ =404;

        # any additional configuration for non-static content
    }

    location /proj2/ {
        alias /var/www/proj2;
        try_files $uri $uri/ =404;

        # any additional configuration for non-static content
    }

    location /proj3/ {
        alias /var/www/proj3;
        try_files $uri $uri/ =404;

        # any additional configuration for non-static content
    }
}

现在我们替换默认配置(删除它)并添加我们的配置:

sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/my-projects /etc/nginx/sites-enabled

然后重新启动nginx服务:

# If on 14.04, use this:
sudo service nginx restart

# If on 15.10 or newer, use this:
sudo systemctl restart nginx

一个域名、多个子域名的方法。

本回答部分假设您有一个域名和多个子域名。如果您没有,请在您的问题中澄清这一点

对于nginx server {}配置中的每个块,您都需要定义服务器名称,并可能将第四个服务器块设置为其他请求的“全部捕获”。

例子:我有三个项目,,,proj1proj2proj3有一个名为evil-projects.net(注意:实际上并不存在)的域名。我想要三个不同的子域名,每个nginx配置一个,每个子域名指向一个项目。我的服务器位于 1.2.3.4,它将为所有网站提供服务。

对于上述场景,我们有两部分:域和子域,以及服务器配置。

(1):DNS配置

在您的主机上设置 DNS,以使 DNS 记录满足以下要求:

evil-projects.net  IN A  1.2.3.4
proj1.evil-projects.net  IN A  1.2.3.4
proj2.evil-projects.net  IN A  1.2.3.4
proj3.evil-projects.net  IN A  1.2.3.4

(2):服务器上的 NGINX 配置(1.2.3.4)

现在开始nginx配置。我假设您将使用默认的 nginx 设置和来自存储库的包(我将使用 14.04 作为基本示例)。/etc/nginx/sites-available首先,我们将四个配置文件放入。 您可能需要sudo在创建这些文件时使用,因为所讨论的文件夹归所有root

/etc/nginx/sites-available/catch-all- 这将是对任何无效域的“全部捕获”。我喜欢返回 http 错误代码 410 (GONE)。

server {
    listen 80 default_server;

    server_name _;

    return 410;
}

接下来,我们为您的网站/项目设置配置。不过,我假设它们都是静态文件。每个文件都意味着您在服务器上为每个项目设置不同的 Web 目录(不同的“文档根目录”)。

/etc/nginx/sites-available/proj1.evil-projects.net

server {
    listen 80;

    server_name proj1.evil-projects.net;

    root /var/www/proj1;
    index index.htm index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

/etc/nginx/sites-available/proj2.evil-projects.net

server {
    listen 80;

    server_name proj2.evil-projects.net;

    root /var/www/proj2;
    index index.htm index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

/etc/nginx/sites-available/proj3.evil-projects.net

server {
    listen 80;

    server_name proj3.evil-projects.net;

    root /var/www/proj3;
    index index.htm index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

然后我们必须从中删除“默认”配置/etc/nginx/sites-enabled,并添加我们自己的配置。同样,sudo这里需要。

sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/proj1.evil-projects.net /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/proj2.evil-projects.net /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/proj3.evil-projects.net /etc/nginx/sites-enabled/

然后我们重新启动该nginx过程:

# If on 14.04, use this:
sudo service nginx restart

# If on 15.04 or newer, use this:
sudo systemctl restart nginx

一旦 DNS 传播,网站就会正常运行。

相关内容