Как настроить виртуальный сервер Nginx в Ubuntu 16.04 AWS EC2, Digitalocean

Published June 2, 2020 • 3 mins read

Как настроить серверные блоки Nginx (виртуальные хосты) в Ubuntu 16.04

Введение

При использовании веб-сервера Nginx серверные блоки (аналогично виртуальным хостам в Apache) можно использовать для инкапсуляции деталей конфигурации и размещения нескольких доменов на одном сервере.

В этом руководстве мы обсудим, как настроить серверные блоки в Nginx на сервере Ubuntu 16.04.

Предпосылки

В sudoэтом уроке мы будем использовать пользователя без полномочий root с привилегиями. Если у вас нет настроенного пользователя, вы можете создать его, следуя нашему руководству по первоначальной настройке сервера Ubuntu 16.04 .

Вам также нужно будет установить Nginx на вашем сервере. Следующие руководства охватывают эту процедуру:

Выполнив эти требования, вы можете продолжить работу с этим руководством.

Пример конфигурации

В демонстрационных целях мы собираемся настроить два домена с нашим сервером Nginx. Доменными именами, которые мы будем использовать в этом руководстве, являются example.com и test.com .

Вы можете найти руководство по настройке доменных имен с DigitalOcean здесь . Если у вас нет двух свободных доменных имен для игры, используйте пока фиктивные имена, и мы позже покажем вам, как настроить локальный компьютер для проверки вашей конфигурации.

Шаг первый: настройка новых корневых каталогов документов

По умолчанию в Nginx в Ubuntu 16.04 один серверный блок включен по умолчанию. Он настроен на обслуживание документов вне каталога в /var/www/html.

Хотя это хорошо работает для одного сайта, нам нужны дополнительные каталоги, если мы собираемся обслуживать несколько сайтов. Мы можем считать /var/www/htmlкаталог каталогом по умолчанию, который будет обслуживаться, если запрос клиента не соответствует ни одному из наших других сайтов.

Мы создадим структуру каталогов /var/wwwдля каждого из наших сайтов. Фактический веб-контент будет помещен в htmlкаталог внутри этих специфичных для сайта каталогов. Это дает нам некоторую дополнительную гибкость для создания других каталогов, связанных с нашими сайтами, как братьев и сестер в htmlкаталог, если это необходимо.

Нам нужно создать эти каталоги для каждого из наших сайтов. -pФлаг сообщает , mkdirчтобы создать все необходимые родительские каталоги по пути:

sudo mkdir -p /var/www/example.com/html
sudo mkdir -p /var/www/test.com/html

Теперь, когда у нас есть наши каталоги, мы передадим право владения веб-каталогами нашей обычной учетной записи пользователя. Это позволит нам писать им без sudo.

Запись

В зависимости от ваших потребностей, вам может понадобиться снова настроить права доступа или владение папками, чтобы предоставить определенный доступ www-dataпользователю. Например, динамические сайты часто будут нуждаться в этом. Конкретные разрешения и требования к владельцам полностью зависят от конфигурации. Следуйте рекомендациям для конкретной технологии, которую вы используете.

Мы можем использовать $USERпеременную среды, чтобы назначить право собственности на учетную запись, в которой мы в настоящее время вошли (убедитесь, что вы не вошли как root). Это позволит нам легко создавать или редактировать контент в этом каталоге:

sudo chown -R $USER:$USER /var/www/example.com/html
sudo chown -R $USER:$USER /var/www/test.com/html

Права доступа к нашим веб-корням уже должны быть правильными, если вы не изменили свое umaskзначение, но мы можем убедиться, набрав:

sudo chmod -R 755 /var/www

Наша структура каталогов теперь настроена, и мы можем двигаться дальше.

Шаг второй: создание образцов страниц для каждого сайта

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

Создайте index.htmlфайл в своем первом домене:

nano /var/www/example.com/html/index.html

Внутри файла мы создадим действительно простой файл, который указывает, к какому сайту мы сейчас обращаемся. Это будет выглядеть так:

/var/www/example.com/html/index.html

<html>
    <head>
        <title>Welcome to Example.com!</title>
    </head>
    <body>
        <h1>Success!  The example.com server block is working!</h1>
    </body>
</html>

Сохраните и закройте файл, когда вы закончите.

Поскольку файл для нашего второго сайта в основном будет таким же, мы можем скопировать его в наш второй корень документа следующим образом:

cp /var/www/example.com/html/index.html /var/www/test.com/html/

Теперь мы можем открыть новый файл в нашем редакторе:

nano /var/www/test.com/html/index.html

Измените его так, чтобы он ссылался на наш второй домен:

/var/www/test.com/html/index.html

<html>
    <head>
        <title>Welcome to Test.com!</title>
    </head>
    <body>
        <h1>Success!  The test.com server block is working!</h1>
    </body>
</html>

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

Шаг третий: создание файлов блоков сервера для каждого домена

Теперь, когда у нас есть контент, который мы хотим обслуживать, нам нужно создать серверные блоки, которые сообщат Nginx, как это сделать.

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

Создайте первый файл блока сервера

Как упоминалось выше, мы создадим наш первый файл конфигурации блока сервера, скопировав файл по умолчанию:

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

Теперь откройте новый файл, который вы создали в вашем текстовом редакторе с sudoправами:

sudo nano /etc/nginx/sites-available/example.com

Игнорируя закомментированные строки, файл будет выглядеть примерно так:

/etc/nginx/sites-available/example.com

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

        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                try_files $uri $uri/ =404;
        }
}

Во-первых, нам нужно взглянуть на директивы listen. Только у одного из наших серверных блоков на сервере может быть default_serverвключена опция. Здесь указывается, какой блок должен обслуживать запрос, если server_nameзапрошенный не соответствует ни одному из доступных блоков сервера. Это не должно происходить очень часто в реальных сценариях, так как посетители будут получать доступ к вашему сайту через ваше доменное имя.

Вы можете выбрать один из ваших сайтов в качестве «по умолчанию», включив этот default_serverпараметр в listenдирективу, или вы можете оставить включенный блок сервера по умолчанию, который будет обслуживать содержимое /var/www/htmlкаталога, если запрошенный хост не может быть найден.

В этом руководстве мы оставим серверный блок по умолчанию для обслуживания несоответствующих запросов, поэтому мы удалим default_serverэтот и следующий серверные блоки. Вы можете добавить опцию к тому, какой из ваших блоков сервера имеет для вас смысл.

/etc/nginx/sites-available/example.com

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

        . . .
}

Запись

Вы можете проверить, что default_serverопция включена только в одном активном файле, набрав:

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

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

Следующее, что нам нужно настроить, это корень документа, указанный в rootдирективе. Укажите его на корневой каталог документа сайта, который вы создали:

/etc/nginx/sites-available/example.com

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

        root /var/www/example.com/html;

}

Далее нам нужно изменить, server_nameчтобы соответствовать запросам для нашего первого домена. Мы можем дополнительно добавить любые псевдонимы, которые мы хотим сопоставить. Мы добавим www.example.comпсевдоним для демонстрации.

Когда вы закончите, ваш файл будет выглядеть примерно так:

/etc/nginx/sites-available/example.com

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

        root /var/www/example.com/html;
        index index.html index.htm index.nginx-debian.html;

        server_name example.com www.example.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

Это все, что нам нужно для базовой конфигурации. Сохраните и закройте файл для выхода.

Создайте второй файл блока сервера

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

sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/test.com

Откройте новый файл с sudoпривилегиями в вашем редакторе:

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

Опять же, убедитесь, что вы не используете default_serverопцию для listenдирективы в этом файле, если вы уже использовали ее в другом месте. Настройте rootдирективу так, чтобы она указывала на корневой каталог вашего второго домена, и настройте ее так, server_nameчтобы она соответствовала доменному имени вашего второго сайта (обязательно включайте любые псевдонимы).

Когда вы закончите, ваш файл будет выглядеть примерно так:

/etc/nginx/sites-available/test.com

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

        root /var/www/test.com/html;
        index index.html index.htm index.nginx-debian.html;

        server_name test.com www.test.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

Когда вы закончите, сохраните и закройте файл.

Шаг четвертый: Включите блоки вашего сервера и перезапустите Nginx

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

Мы можем создать эти ссылки, набрав:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/test.com /etc/nginx/sites-enabled/

Эти файлы теперь находятся во включенном каталоге. Теперь у нас включено три серверных блока, которые настроены на ответ в зависимости от их listenдирективы и server_name(вы можете узнать больше о том, как Nginx обрабатывает эти директивы здесь ):

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

sudo nano /etc/nginx/nginx.conf

В файле найдите server_names_hash_bucket_sizeдирективу. Удалите #символ, чтобы раскомментировать строку:

/etc/nginx/nginx.conf

http {
    . . .

    server_names_hash_bucket_size 64;

    . . .
}

Сохраните и закройте файл, когда вы закончите.

Затем проверьте, чтобы убедиться, что в ваших файлах Nginx нет синтаксических ошибок:

sudo nginx -t

Если проблем не обнаружено, перезапустите Nginx, чтобы изменения вступили в силу:

sudo systemctl restart nginx

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

Шаг пятый: измените файл локальных хостов для тестирования (необязательно)

Если вы не использовали свои доменные имена и вместо этого использовали фиктивные значения, вы можете изменить конфигурацию вашего локального компьютера, чтобы позволить вам временно протестировать конфигурацию блока вашего сервера Nginx.

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

Запись

Убедитесь, что вы выполняете эти действия на локальном компьютере, а не на своем VPS-сервере. Для этого вам нужно иметь root-доступ, быть членом административной группы или иным образом иметь возможность редактировать системные файлы.

Если вы находитесь на компьютере Mac или Linux дома, вы можете отредактировать нужный файл, набрав:

sudo nano /etc/hosts

Если вы работаете в Windows, вы можете найти инструкции по изменению файла hosts здесь.

Вам нужно знать публичный IP-адрес вашего сервера и домены, которые вы хотите направить на сервер. Предполагая, что публичный IP-адрес моего сервера 203.0.113.5, строки, которые я бы добавил в мой файл, выглядели бы примерно так:

/ и т.д. / хосты

127.0.0.1   localhost
. . .

203.0.113.5 example.com www.example.com
203.0.113.5 test.com www.test.com

Это позволит перехватывать любые просьбы example.comи test.comи отправить их на сервер, который является то , что мы хотим , если мы не на самом деле собственные домены , которые мы используем.

Сохраните и закройте файл, когда вы закончите.

Шаг шестой: проверь свои результаты

Теперь, когда вы все настроены, вы должны проверить, что блоки вашего сервера работают правильно. Вы можете сделать это, посетив домены в вашем веб-браузере:

http://example.com

Вы должны увидеть страницу, которая выглядит следующим образом:

Nginx первый блок сервера

Если вы посещаете ваше второе доменное имя, вы должны увидеть немного другой сайт:

http://test.com

Nginx второй серверный блок

Если оба этих сайта работают, вы успешно настроили два независимых серверных блока с Nginx.

На этом этапе, если вы настроили свой hostsфайл на локальном компьютере для проверки, вы, вероятно, захотите удалить добавленные строки.

Если вам нужен доступ по доменному имени к вашему серверу для общедоступного сайта, вы, вероятно, захотите приобрести доменное имя для каждого из ваших сайтов. Вы можете узнать, как настроить их так, чтобы они указывали на ваш сервер, здесь.

Вывод

Теперь у вас должна быть возможность создавать серверные блоки для каждого домена, который вы хотите разместить на одном сервере. Не существует никаких реальных ограничений на количество серверных блоков, которые вы можете создать, если ваше оборудование может обрабатывать трафик.

Подпишись на рассылку