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

Вступление

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

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

Предпосылки

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

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

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

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

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

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

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

По умолчанию в 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.

Note

[.note] # В зависимости от ваших потребностей вам может потребоваться снова настроить права доступа или владельца папок, чтобы разрешить определенный доступ пользователю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


    
        Welcome to Example.com!
    
    
        

Success! The example.com server block is working!

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

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

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


    
        Welcome to Test.com!
    
    
        

Success! The test.com server block is working!

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

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

Теперь, когда у нас есть контент, который мы хотим обслуживать, нам нужно создать серверные блоки, которые сообщат 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. Only one of our server blocks on the server can have the default_server option enabled. Указывает, какой блок должен обслуживать запрос, если запрошенныйserver_name не соответствует ни одному из доступных блоков сервера. Это не должно происходить очень часто в реальных сценариях, так как посетители будут получать доступ к вашему сайту через ваше доменное имя.

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

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

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

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

        . . .
}

Note

[.Примечание]##

Вы можете проверить, что опция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 обрабатывает эти директивыhere):

  • example.com: ответит на запросыexample.com иwww.example.com

  • test.com: ответит на запросыtest.com иwww.test.com

  • default: ответит на любые запросы порта 80, которые не соответствуют двум другим блокам.

Чтобы избежать возможной проблемы с памятью хеш-ведра, которая может возникнуть при добавлении дополнительных имен серверов, мы продолжим и скорректируем одно значение в нашем файле/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-адреса, по которым наш локальный компьютер будет подключаться при запросе доменных имен.

Note

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

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

sudo nano /etc/hosts

Если вы работаете в Windows, вы можетеfind instructions for altering your hosts file здесь.

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

/etc/hosts

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 first server block

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

http://test.com

Nginx second server block

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

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

Если вам нужен доступ по доменному имени к вашему серверу для общедоступного сайта, вы, вероятно, захотите приобрести доменное имя для каждого из ваших сайтов. Вы можете узнать, какset them up to point to your server здесь.

Заключение

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

Related