nginx上的多个网站,一个IP


14

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

有没有一种方法可以在一个IP上访问同时在nginx和数字海洋上托管多个网站?


将它们托管在其他文件夹(X.Y.Z.W/fooX.Y.Z.W/bar)?您为什么不能为其获取域名?(您可以将同一IP分配给多个域)?
muru

您将需要多个域来执行此操作。但是,有免费的域名服务:freenom.com为您提供免费的.tk,.ml,.ga,.cf和.gq域名。
TheWanderer '16

@muru我认为他们不想在多个域上花钱。他们希望以某种方式在一个URL上拥有多个网站。
TheWanderer '16

@ Zacharee1他们只需要一个域,并且可以做子域。如果他们拒绝这样做,则必须采取基于IP的邪恶方法,根据他们使用的应用程序/项目的类型,这些方法可能无法支持“子文件夹”定位方法。
托马斯·沃德

@ThomasW。我当时想不要使用子域
TheWanderer '16

Answers:


17

有两种方法可以实现此目的。您可以通过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传播后,这些站点将按应有的方式工作。


在这种配置中,您将在哪里放置proxy_cache的块?假设proj1,proj2,proj3具有相同的终结点,并且具有不同的根,并且希望将响应缓存在不同的文件夹中。
user305883

@ user305883听起来这是一个新问题。
托马斯·沃德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.