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

7

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

Есть ли способ разместить несколько веб-сайтов в nginx и в цифровом океане при доступе к ним с помощью одного ip?

    
задан Bros Code 02.05.2016 в 12:37
источник

1 ответ

10

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

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

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

  

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

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

Предполагая, что по умолчанию 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/ {
        root /var/www/proj1;
        try_files $uri $uri/ =404;

        # any additional configuration for non-static content
    }

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

        # any additional configuration for non-static content
    }

    location /proj3/ {
        root /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 {} блоком в конфигурации вам нужно будет определить имя сервера и, вероятно, установить четвертый серверный блок как «catch all» для других запросов.

  

Пример: У меня есть три проекта: 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 - это будет «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 будет распространяться, сайты будут работать так, как должны.

    
ответ дан Thomas Ward 02.05.2016 в 13:20
источник