Рубрики
Servers: How To

NGINX: несколько доменов + default_server


NGINX — надежный веб-сервер, особо удачный для отдачи статических, хэшированных страниц и высокой с множественными подключениями нагрузки

В конфигах nginx блоки server используются для обслуживания нескольких индивидуальных доменов на одном сервере.

Давайте посмотрим, как настроить виртуальные хосты Nginx на сервере Ubuntu 19.04 и более ранних версиях (14.04+)

Требования

  • Вы должны знать пароль sudo или работать на сервере из под root
  • Веб-сервер Nginx уже должен быть установлен. Инструкции по установке Nginx можно найти здесь.

На локальном компьютере домены можно тут же и выдумать, ниже в тексте я покажу, как это реализовать (похоже и в Windows). На реальном для проверки нужно иметь 2 домена.

В данном руководтстве будут использоваться два тестовых локальных домена — test.loc и python.loc (в переспективе — второй сайт на питоне)

1. Создаем каталоги для сайтов

Файлы сайтов по умолчанию хранятся в /var/www/html

Сразу после установки nginx включается один стандартный виртуальный хост, который и обслуживает документы из стандартного каталога /var/www/html. По идее этот сайт открывается, если набрать localhost (или 127.0.0.1)

Для обслуживания нескольких сайтов нужно создать дополнительные каталоги, желательно там же — внутри /var/www

Как размещать данные — ваш личный выбор. Например, /var/www/site.loc/html или /var/www/site.loc

Почему некоторые настойчиво создают внутри папки сайта папку html? Ответ прост — вдруг будет ещё какая-то папка, например со скриптами для обслуживания сайта. Вот мы её и помещаем внутрь каталога сайта, чтобы не путалась. А индексацию и посетителей пускаем только в html. Я проигнорирую эту папку.

sudo mkdir -p /var/www/test.loc
sudo mkdir -p /var/www/python.loc

Создав все необходимые каталоги, передайте права на них текущему пользователю с доступом к sudo.

Используйте переменную окружения $USER, чтобы задать текущего пользователя. Это позволит создавать файлы в этих каталогах.

sudo chown -R $USER:$USER /var/www/test.loc
sudo chown -R $USER:$USER /var/www/python.loc

Чтобы задать «правильный» доступ к каталогам, пройдёмся по ним командой chmod, задав стандартные 755 (Владельцу — всё, остальным — почитать), рекурсивно по всем каталогам (-R).

sudo chmod -R 755 /var/www

На реальном сервере (да и локалке) смену прав доступа к файлам и папкам удобнее делать командой find

На будущее и в реальных проектах права доступа придётся менять в зависимости от того файл это или директория. Для файлов нужен более ограниченный доступ, в то же время с разрешением для пользователя www-data (стандартный системный пользователь сервера nginx).

Рекурсивно (от выбранной папки и вниз по вложенным каталогам) меняем владельца на www-data
chown -R www-data:www-data /var/www

Установка прав для всех файлов (но не каталогов) в каталоге /www/html:
find /var/www -type f -exec chmod 640 {} \;

Установка прав для всех поддиректорий в каталоге /www/html:
find /var/www -type d -exec chmod 750 {} \;

2. Создание тестовых страниц для доменов

Просто скопируем index.php или index.html из стандартного каталога /var/www/html в другие два каталога, и допишем там пару слов про конкретный домен.

Примечание: Стандартная страница должна открываться, если на запущенном сервере в браузере набрать localhost или 127.0.0.1 Если у вас ещё нет «стандартной» страницы в /var/www/html, то либо вы её удалили, либо что-то было не так при установке. Про установку серверного программного обеспечения на линукс читайте здесь.

cp /var/www/html/index.php /var/www/test.loc
cp /var/www/html/index.php /var/www/python.loc

Каждый из файлов можно слегка отредактировать, чтобы идентифицировать конкретный каталог. Следующий код кроме данных php покажет в заголовке браузера ту фразу, что зажата между тегов title.Paragraph

Кстати, в оконной среде это можно сделать через sublime text 3, если, например, он у вас установлен (или через gedit)

subl /var/www/html/python.loc/index.php

Записывая в титл идентификацию, вы в последствии в рамке браузера увидите различия.

Сохраните и закройте файл. Сделайте так для всех сайтов, в том числе с дефолтным. Очень удобно — видно, что и nginx работает, и php-fpm и все остальные прибамбасы — phpinfo выводит инфу и про memcached и про подключенную связку с базой данных и прочее.

3: Создание виртуальных хостов

Блок server

Итак, скопируйте стандартный файл, чтобы создать первый блок server.

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/test.loc

Откройте новый файл в текстовом редакторе:

sudo nano /etc/nginx/sites-available/test.loc

Всё, что прикрыто спереди # системой не учитывается, считается комментарием. Не учитывая закомментированных строк, в итоге этот файл должен выглядеть так:

В server_name указаваем доменное имя и несколько алиасов (синонимов, в частности традиционный www…) Относительно директивы listen нужно помнить, что она на всем сервере может быть только один раз. Иначе возникнет ошибка.

Чтобы убедиться, что опция default_server включена только в одном файле виртуального хоста, введите:

grep -R default_server /etc/nginx/sites-enabled/Paragraph

Если такие записи в раскомментированном виде находятся в нескольких файлах (указывается в последнем столбце), веб-сервер пожалуется на ошибку. Необходимо исправить эти строчки так, как в примере выше. А для дефолтного сайта (localhost) оставить с этой директивой.

server {
listen 80 default_server;
listen [::]:80 default_server;

Логика такая: если в адресную строку ввести localhost или 127.0.0.1, то откроется дефолтный сайт. Если ввести неизвестный системе адрес — опять он же. А если прописанные в настройках домены — то именно они. Впрочем, на реальном сервере дефолтным сайтом должен быть основной домен.

Подключение php-fpm: unix сокет или 127.0.0.1:9000?

Paragraph

В конце блока прописывается настройка для php, если вы его вообще подключаете. Обратите внимание, что в данном случае PHP-FPM подключается через юникс сокет и для тестовых проектов это нормально. Однако, в реальности не смотря на все гайды, которыми переполнен интернет, помните, что unix-socket весьма нестабильная телега, которая может падать на высокой нагрузке. В чём секрет того, что везде прописан именно такой вариант ? Для минимальной и средней нагрузки — сойдёт. Но сайт на WordPress с миллионом страниц на сервере с 8 гб оперативной памяти и ubuntu 16.04 очень быстро склеивал ласты, пока я не нашел заметку одного умного человека, что «эти ваши сокеты»… Ну вы поняли.

Для высоконагруженных хайлоад проектов не бойтесь работать через стабильный http сокет (и конечно никакого apache, все robots.txt, sitemap.xml и любимые .htaccess легко заменяются грамотными настройками nginx). Однако забудьте про всякие буферы и большие размеры в настройках. NGINX работает быстро и по маленькому. Буферизация ему может навредить.

Для второго сайта скопируйте первый конфиг и отредактируйте

sudo cp /etc/nginx/sites-available/python.loc /etc/nginx/sites-available/test.loc

sudo nano /etc/nginx/sites-available/test.loc

Измените в нем все адреса сайта и папки сайта в соответствии со вторым доменом.

4: Включение виртуальных хостов

Теперь виртуальные хосты готовы, но их нужно активировать.

Для этого нужно создать символьные ссылки из этих файлов в каталог sites-enabled, который читается веб-сервером Nginx во время запуска.

sudo ln -s /etc/nginx/sites-available/python.loc /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/test.loc /etc/nginx/sites-enabled/

Теперь эти файлы в каталоге sites-enabled. На данный момент у вас есть три виртуальных блока, которые смогут отвечать на запросы согласно директивам listen и server_name.

Чтобы избежать потенциальных проблем с памятью, которые могут возникнуть из-за дополнительных имён сервера, отредактируйте файл /etc/nginx/nginx.conf:

sudo nano /etc/nginx/nginx.conf

Найдите директиву server_names_hash_bucket_size и раскомментируйте её:

http {
. . .
server_names_hash_bucket_size 64;
. . .
}

Сохраните и закройте файл.

Проверьте синтаксис на наличие ошибок:

sudo nginx -t

Если ошибок нет, перезапустите Nginx, чтобы обновить настройки:

sudo systemctl restart nginx

Теперь Nginx обслуживает два новых домена и стандартный localhost.

5: Настройка локальных хостов на домашней машине

Для запуска нескольких сайтов для тестов и разработки на одном компьютере нужно создать дополнительные локальные хосты.

Это не позволит другим посетителям просматривать сайт, но даст вам возможность проверить работу и настройки каждого. Этот метод работает путем перехвата запросов, которые, как правило, поступают в DNS для разрешения доменных имен. Вместо этого можно указать IP-адреса, которые будут использоваться локальным компьютером, при поступлении запросов к доменным именам.

В Mac или Linux откройте файл /etc/hosts

sudo nano /etc/hostsParagraph

В Windows откройте блокнот от имени администратора и пропишите все тоже самое. Файл спрятан в папке Windows (C:/Windows/system32/drivers/etc/hosts

127.0.0.1 localhost
127.0.0.1 python.loc
127.0.0.1 test.loc

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *