Перейти до змісту

Як налаштувати Nginx для кількох веб-сайтів у Rocky Linux

Вступ

Ось мій обіцяний посібник із багатосайтових налаштувань Nginx у Rocky Linux. Почну з примітки для початківців; решта ви знаєте, для чого ви тут, тому прокрутіть вниз.

Привіт новачки! Одна з речей, яку Nginx робить дуже добре, це спрямування трафіку з однієї центральної точки на кілька веб-сайтів і програм на одному сервері або на кількох інших серверах. Ця функція називається «зворотний проксі», і відносна легкість, з якою Nginx це робить, є однією з причин, чому я почав її використовувати.

Тут я покажу вам, як керувати декількома веб-сайтами в одній інсталяції Nginx і як це робити простим і організованим способом, який дозволить швидко й легко вносити зміни.

Для тих, хто шукає подібне налаштування для Apache, перегляньте цей посібник.

Я поясню багато деталей... але зрештою, весь процес по суті включає налаштування кількох папок та створення невеликих текстових файлів. У цьому посібнику ми не будемо використовувати надто складні конфігурації веб-сайтів. Коли ви дізнаєтесь, як це зробити, це займе лише кілька хвилин, щоб виконувати кожен раз. Це легко.*

* Для заданих значень "легко".

Передумови та припущення

Це все, що вам знадобиться:

  • Сервер Rocky Linux, підключений до Інтернету, на якому вже працює Nginx. Якщо ви ще не зайшли так далеко, можете спочатку скористатися нашим посібником зі встановлення Nginx.

  • Деякий комфорт із виконанням завдань у командному рядку та встановленням термінального текстового редактора, наприклад nano.

    !!! tip "У крайньому випадку"

    ```
      ... ви можете використати щось на кшталт Filezilla або WinSCP — і звичайний текстовий редактор на основі графічного інтерфейсу користувача — щоб відтворити більшість цих кроків, але в цьому підручнику ми будемо робити все простим шляхом.
    ```
    
  • Принаймні один домен вказує на ваш сервер для одного з тестових веб-сайтів. Ви можете використовувати або другий домен, або субдомен для іншого.

!!! tip

        Налаштуйте свій хост-файл для створення імітованих доменних імен, якщо ви робите це на локальному сервері. Інструкції нижче.
  • Ми припускаємо, що ви використовуєте Nginx на голому сервері або звичайному VPS і SELinux працює. Усі інструкції будуть сумісні з SELinux за замовчуванням.

  • Усі команди потрібно запускати від імені користувача root, увійшовши в систему як користувач root або використовуючи sudo.

Налаштування ваших папок і тестових сайтів

Папки сайту

По-перше, вам знадобиться кілька папок для файлів вашого сайту. Під час першої інсталяції Nginx усі файли "демо-версії" веб-сайту будуть знаходитися в /usr/share/nginx/html. Це добре, якщо ви розміщуєте лише один сайт, але ми станемо цікавішими. Ігноруйте каталог html поки що та просто перейдіть до його батьківської папки:

cd /usr/share/nginx

Тестовими доменами для цього посібника будуть site1.server.test та site2.server.test, і ми назвемо ці папки вебсайтів відповідно. Ви, звичайно, повинні змінити ці домени на ті, які використовуєте. Однак (і ось трюк, який я взяв від Smarter PeopleTM), ми будемо писати доменні імена «задом наперед».

напр. «yourwebsite.com» поміститься в папку під назвою com.yourwebsite. Зверніть увагу, що ви можете буквально називати ці папки як завгодно, але для цього методу є вагома причина, яку я виклав нижче.

Наразі просто створіть свої папки:

mkdir -p test.server.site1/html
mkdir -p test.server.site2/html

Отже, ця команда створить, наприклад, папку test.server.site1 і помістить у неї іншу папку з назвою html. Саме там ви розмістите файли, які хочете обслуговувати через веб-сервер. (Ви також можете назвати це "webroot" або щось подібне.)

Це робиться для того, щоб ви могли розміщувати пов’язані з веб-сайтами файли, які ви не хочете оприлюднювати, у батьківському каталозі, зберігаючи все в одному місці.

Примітка

Прапорець `-p` повідомляє команді `mkdir` про створення будь-яких відсутніх папок у щойно визначеному шляху, тому вам не потрібно створювати кожну папку по одній.

Для цього тесту ми робимо самі «веб-сайти» дуже простими. Просто створіть файл HTML у першій папці за допомогою вашого улюбленого текстового редактора:

nano test.server.site1/html/index.html

Потім вставте наступний фрагмент HTML:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Site 1</title>
</head>
<body>
    <h1>This is Site 1</h1>
</body>
</html>

Збережіть та закрийте файл, потім повторіть кроки з папкою test.server.site2, змінивши "Site 1" на "Site 2" у наведеному вище HTML-коді. Це робиться для того, щоб пізніше ми могли бути впевнені, що все працює належним чином.

Ваші тестові веб-сайти готові; їдемо далі.

Папки конфігурації

Тепер перейдемо до папки налаштувань і конфігурації Nginx, де ми будемо працювати до кінця цього посібника:

cd /etc/nginx/

Якщо ви виконаєте команду ls, щоб побачити, які файли та папки тут знаходяться, ви побачите купу різних речей, більшість з яких сьогодні неактуальні. Слід звернути увагу на такі:

  • nginx.conf — це файл, який містить, як ви вже здогадалися, конфігурацію Nginx за замовчуванням. Ми відредагуємо це пізніше.
  • conf.d — це каталог, де ви можете розмістити власні файли конфігурації. Ви могли б використовувати це для вебсайтів, але краще використовувати це для налаштувань окремих функцій, які ви хочете використовувати на всіх своїх вебсайтах.
  • default.d — це каталог, куди може потрапити конфігурація вашого вебсайту, якщо на сервері працює лише один сайт або якщо на вашому сервері є «основний» вебсайт. Залиште це поки що.

Ми хочемо створити дві нові папки під назвою sites-available та sites-enabled:

mkdir sites-available
mkdir sites-enabled

Що ми зробимо, так це помістимо всі файли конфігурації нашого вебсайту в папку sites-available. Там ви можете працювати з файлами конфігурації скільки завгодно, доки не будете готові активувати файли за допомогою символічного посилання на папку sites-enabled.

Нижче я покажу вам, як це працює. Наразі ми закінчили із папками.

Чому ви (можете) захотіти записати свої домени в зворотному порядку:

Простіше кажучи, це організаційна річ, яка особливо корисна під час використання командного рядка із завершенням табуляції, але вона все ще є досить цінною для програм на основі графічного інтерфейсу користувача. Він розроблений для людей, які запускають *багато* веб-сайтів або програм на сервері.

Усі папки вашого веб-сайту (і файли конфігурації) будуть упорядковані в алфавітному порядку спочатку за доменом верхнього рівня (наприклад, .com, .org тощо), потім за основним доменом, а потім за будь-якими субдоменами. Під час пошуку в довгому списку доменів може бути легше звузити те, що ви шукаєте.

Це також полегшує сортування ваших папок і конфігураційних файлів за допомогою інструментів командного рядка. Щоб отримати список усіх папок, пов’язаних із певним доменом, ви можете виконати:

```bash
ls /usr/share/nginx/ | grep com.yoursite*
```


Що виведе щось на зразок:

```
com.yoursite.site1
com.yoursite.site2
com.yoursite.site3
```

Налаштування файлів конфігурації

Редагування nginx.conf

За замовчуванням реалізація Nginx у Rocky Linux відкрита для всього HTTP-трафіку та спрямовує його на демонстраційну сторінку, яку ви могли бачити в нашому посібнику зі встановлення Nginx. Ми цього не хочемо. Ми хочемо, щоб трафік із доменів спрямовувався на вказані нами веб-сайти.

Тож із каталогу /etc/nginx/ відкрийте nginx.conf у вашому улюбленому текстовому редакторі:

nano nginx.conf

Спочатку знайдіть рядок, який виглядає так:

include /etc/nginx/conf.d/*.conf;

І додайте цей біт трохи нижче:

include /etc/nginx/sites-enabled/*.conf;

Це буде завантажено у файли конфігурації нашого веб-сайту, коли вони будуть готові до запуску.

Тепер перейдіть до розділу, який виглядає так, і або закоментуйте його за допомогою символу решітки ++#++, або видаліть його, якщо вам так хочеться:

server {
    listen       80;
    listen       [::]:80;
    server_name  _;
    root         /usr/share/nginx/www/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    error_page 404 /404.html;
    location = /404.html {
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
}

Як це виглядало б як «закоментовано»:

#server {
#    listen       80;
#    listen       [::]:80;
#    server_name  _;
#    root         /usr/share/nginx/www/html;
#
#    # Load configuration files for the default server block.
#    include /etc/nginx/default.d/*.conf;
#
#    error_page 404 /404.html;
#    location = /404.html {
#    }
#
#    error_page 500 502 503 504 /50x.html;
#    location = /50x.html {
#    }
#}

Якщо ви новачок, ви можете зберегти код із коментарями для довідки, що стосується прикладу коду HTTPS, який уже прокоментовано нижче у файлі.

Збережіть і закрийте файл, а потім перезапустіть сервер за допомогою:

systemctl restart nginx

Тепер принаймні демонстраційну сторінку ніхто не побачить.

Додавання файлів конфігурації сайту

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

Примітка

Для абсолютних новачків символічні посилання — це спосіб дозволити файлам удавати, що вони знаходяться у двох папках одночасно. Змініть вихідний файл (або «ціль»), і він зміниться всюди, де ви на нього посилаєтеся. Оригінал буде змінено, якщо ви використовуєте програму для редагування файлу за посиланням.

Однак нічого не станеться з оригінальним файлом, якщо ви видалите посилання на ціль. Цей трюк дозволяє нам помістити файли конфігурації веб-сайту в робочий каталог (`sites-available`), а потім «активувати» їх, посилаючись на ці файли з `sites-enabled`.

Я покажу вам, що я маю на увазі. Створіть файл конфігурації для першого веб-сайту так:

nano sites-available/test.server.site1.conf

Тепер вставте цей код. Це найпростіша робоча конфігурація Nginx, яку ви можете мати, і вона повинна добре працювати на більшості веб-сайтів зі статичним HTML:

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

    # virtual server name i.e. domain name #
    server_name site1.server.test;

    # document root #
    root        /usr/share/nginx/test.server.site1/html;

    # log files
    access_log  /var/log/nginx/www_access.log;
    error_log   /var/log/nginx/www_error.log;

    # Directives to send expires headers and turn off 404 error logging. #
    location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        access_log off; log_not_found off; expires max;
    }
}

Все, починаючи з кореня документа і нижче, є технічно необов’язковим. Корисно та рекомендовано, але не обов’язково для функціонування веб-сайту.

У будь-якому разі збережіть і закрийте файл, а потім перейдіть до каталогу sites-enabled:

cd sites-enabled

Створіть символічне посилання на щойно створений файл конфігурації в папці sites-available:

ln -s ../sites-available/test.server.site1.conf

Перевірте свою конфігурацію за допомогою команди nginx -t, і якщо ви отримаєте повідомлення про те, що все гаразд, перезавантажте сервер:

systemctl restart nginx

Потім наведіть свій браузер на домен, який ви використовуєте для цього першого сайту (у моєму випадку: site1.server.test), і знайдіть повідомлення «Це сайт 1», яке ми розмістили у файлі HTML. Якщо у вашій системі встановлено curl, ви можете запустити curl site1.server.test і перевірити, чи завантажиться HTML-код у вашому терміналі.

Примітка

Деякі браузери (з найкращими намірами) змушують вас використовувати HTTPS, коли ви вводите домен свого сервера в адресний рядок. Якщо у вас не налаштовано HTTPS, це викличе помилки.

Не забудьте вручну вказати "http://" в адресному рядку браузера, щоб уникнути цієї проблеми. Якщо це не спрацює, очистіть кеш або використовуйте менш вимогливий браузер для цієї частини тестування. Я рекомендую [Min](https://minbrowser.org).

Якщо все пройде правильно, повторіть вищезазначені кроки, змінюючи назви файлів та вміст файлів конфігурації по ходу роботи. "site1" до "site2" і все це. Коли у вас є файли конфігурації та символічні посилання для сайту 1 і сайту 2, і ви перезапустили Nginx, це має виглядати так:

Скріншот двох тестових веб-сайтів поруч

Примітка

Ви також можете створювати посилання за межами каталогу з підтримкою сайтів за допомогою довгої форми команди `ln -s`. Це виглядатиме як `ln -s [source-file] [link]`.

У цьому контексті це:

```bash
ln -s /etc/nginx/sites-available/test.server.site1.conf /etc/nginx/sites-enabled/test.server.site1.conf
```

Відключення веб-сайту

Якщо вам потрібно зупинити роботу одного зі своїх веб-сайтів, перш ніж знову запустити його, просто видаліть символічне посилання в розділі «Увімкнено сайти»:

rm /etc/nginx/sites-enabled/test.server.site1.conf

Потім перезапустіть Nginx. Щоб відновити роботу сайту, вам потрібно буде повторно створити символічне посилання та перезапустити Nginx.

Опціонально: редагування файлу хостів

Ця частина однозначно для новачків. Усі інші, ймовірно, можуть пропустити.

Тож цей розділ застосовується лише, якщо ви випробовуєте цей посібник у локальному середовищі розробки. Це якщо ви запускаєте свій тестовий сервер на своїй робочій станції або іншому комп’ютері у вашій локальній домашній чи корпоративній мережі.

Оскільки вказати зовнішні домени на ваші локальні комп’ютери – це складно (і потенційно небезпечно, якщо ви не знаєте, що робите), ви можете налаштувати кілька «підроблених» доменів, які добре працюватимуть у вашій локальній мережі й ніде більше.

Найпростіший спосіб зробити це за допомогою хост-файлу на вашому комп’ютері. Файл хосту – це лише текстовий файл, який може замінити налаштування DNS. Ви можете вручну вказати доменне ім’я для будь-якої IP-адреси. Однак це працюватиме лише на цьому одному комп'ютері.

Отже, на Mac та Linux файл hosts знаходиться в каталозі /etc/ і його можна дуже легко редагувати через командний рядок (вам знадобиться root-доступ). Якщо ви працюєте на робочій станції Rocky Linux, просто запустіть:

nano /etc/hosts

У Windows файл hosts знаходиться за адресою C:\Windows\system32\drivers\etc\hosts, і ви можете використовувати будь-який графічний текстовий редактор, якщо у вас є права адміністратора.

Отже, якщо ви працюєте на комп’ютері Rocky Linux і використовуєте сервер Nginx на тому самому комп’ютері, ви повинні відкрити файл і визначити потрібні домени/IP-адреси. Якщо ваша робоча станція та тестовий сервер використовуються на одній машині, це буде:

127.0.0.1           site1.server.test
127.0.0.1           site2.server.test

Якщо ви використовуєте сервер Nginx на іншій машині в мережі, просто використовуйте адресу цієї машини, наприклад.:

192.168.0.45           site1.server.test
192.168.0.45           site2.server.test

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

Налаштування SSL-сертифікатів для ваших сайтів

Перегляньте наш посібник з отримання SSL-сертифікатів за допомогою Let's Encrypt та certbot. Інструкції там працюватимуть чудово.

Висновок

Пам’ятайте, що більшість угод про організацію папок/файлів і іменування є технічно необов’язковими. Файли конфігурації вашого вебсайту здебільшого потрібно розмістити будь-де всередині /etc/nginx/, а nginx.conf має знати, де знаходяться ці файли.

Фактичні файли веб-сайту повинні знаходитися десь у /usr/share/nginx/, а решта — це вже питання.

Спробуйте, потренуйтеся в ScienceTM і не забудьте виконати nginx -t перед перезапуском Nginx, щоб переконатися, що ви не пропустили крапку з комою чи щось подібне. Це заощадить вам багато часу.

Author: Ezequiel Bruni

Contributors: Steven Spencer, Ganna Zhyrnova