nginx上多个网站,一个IP

Bro*_*ode 15 nginx

所以我正在使用数字海洋和 nginx。我想托管多个网站(我的项目),但不想为每个网站购买一个域。

有没有办法在使用一个 ip 访问它们的同时在 nginx 和数字海洋上托管多个网站?

Tho*_*ard 20

有两种方法可以实现这一点。要么您通过 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/my-projects /etc/nginx/sites-enabled
Run Code Online (Sandbox Code Playgroud)

然后重启nginx服务:

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

# If on 15.10 or newer, use this:
sudo systemctl restart nginx
Run Code Online (Sandbox Code Playgroud)

单域多子域方法。

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

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

示例:我有三个项目,proj1, proj2, proj3。我有一个名为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
Run Code Online (Sandbox Code Playgroud)

(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;
}
Run Code Online (Sandbox Code Playgroud)

接下来,我们为您的站点/项目设置配置。不过,我将假设它们都是静态文件。每一个都意味着服务器上的每个项目都有不同的 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

/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;
    }
}
Run Code Online (Sandbox Code Playgroud)

/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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我们必须从 中删除“默认”配置/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/
Run Code Online (Sandbox Code Playgroud)

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

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

# If on 15.04 or newer, use this:
sudo systemctl restart nginx
Run Code Online (Sandbox Code Playgroud)

一旦 DNS 传播,这些站点就会正常工作。