Несколько сайтов на nginx, один IP


14

Поэтому я использую цифровой океан и nginx. Я хочу разместить несколько сайтов (мои проекты), но не хочу покупать домен для каждого.

Есть ли способ разместить несколько сайтов на nginx и digital ocean при доступе к ним через этот ip?


Размещать их в разных папках ( X.Y.Z.W/foo, X.Y.Z.W/bar)? Почему вы не можете получить домены для них? (Вы можете назначить один и тот же IP нескольким доменам)?
Муру

Для этого вам понадобится несколько доменов. Существует бесплатная служба доменов: freenom.com предоставляет вам бесплатные домены .tk, .ml, .ga, .cf и .gq.
TheWanderer

@muru Я думаю, они не хотят тратить деньги на несколько доменов. Они хотят, чтобы несколько сайтов имели один URL.
Странник

@ Zacharee1 им нужен только один домен, и они могут делать субдомены. Если они откажутся сделать это, им придется использовать злой IP-метод, который в зависимости от типа приложения / проекта, который они используют, может не поддерживать методы определения местоположения «подпапки».
Томас Уорд

@ThomasW. Я думал, что поддоменов не будет вариант
TheWanderer

Ответы:


17

Есть два способа добиться этого. Либо вы делаете все по IP-адресу, с указанием местоположения подпапок, либо вам нужно будет купить один домен, а затем иметь несколько поддоменов в этом домене (поддоменам ничего не стоит, если вы покупаете домен, но уточните это у своего регистратора).

Я не советую использовать метод IP-адреса хотя бы потому, что очень важно запоминать IP-адреса, и если вы пытаетесь делиться информацией с другими, у вас также возникает проблема с запоминанием IP-адреса.


Подход с одним IP, многими подпапками, без имени домена

ВНИМАНИЕ! У нас нет никакой информации о ваших проектах, над которыми вы работаете. Нам нужно знать больше, чтобы определить, можете ли вы использовать этот подход, так как многие веб-фреймворки не будут работать без привязки к настоящему доменному имени.


ПРЕДУПРЕЖДЕНИЕ . В ходе продолжающегося тестирования этих примеров было обнаружено, что подход «Один домен, много подкаталогов» не требует любезного обратного проксирования данных к серверной части, поскольку запрошенный URI будет включать подкаталоги в URI; это может привести к тому, что на внутренних серверах возникнут проблемы с правильным поведением

С nginxдругой стороны, мы должны использовать «злой» подход к этому - один IP-адрес, множество документированных корней и подпапок. Это очень злой подход и может вызвать много проблем с некоторыми веб-фреймворками.

Предполагая nginxустановку по умолчанию в качестве базы из репозиториев, мы должны создать конфигурацию сайта для обработки каждого запроса подкаталога проекта. Тогда мы должны символически связать его в нужном месте.

Создайте /etc/nginx/sites-available/my-projectsсо следующим (используйте это как шаблон / руководство - предполагается три проекта со статическим HTML и без динамических веб-приложений на PHP или Python или аналогичных, и вы можете копировать отдельные блоки местоположений и создавать новые местоположения соответственно; это также предполагает ваше 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 {}блока в конфигурации вам нужно будет определить имя сервера и, вероятно, установить четвертый блок сервера как «перехватить все» для других запросов.

Пример: У меня есть три проекта, 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

(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;
}

Далее мы настраиваем конфигурацию для ваших сайтов / проектов. Я собираюсь предположить, что они все статические файлы, хотя. Каждый из них подразумевает, что у вас есть разные веб-каталоги для каждого проекта на сервере (разные «корни документов»).

/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 Похоже, это новый вопрос.
Томас Уорд
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.