Чим відрізняються звичаї для сайтів, доступних проти каталогу conf.d для nginx


98

Я маю певний досвід використання Linux, але жоден не використовує nginx. Мені доручено вивчити варіанти збалансування навантаження для сервера додатків.

Я використовував apt-get для встановлення nginx і все здається нормальним.

У мене є пара питань.

Яка різниця між доступною для сайтів папкою та папкою conf.d. Обидві ці папки були включені в налаштування конфігурації за замовчуванням для nginx. Підручники використовують і те, і інше. Для чого вони потрібні та яка найкраща практика?

Для чого використовується папка з підтримкою сайтів? Як я ним користуюся?

Конфігурація за замовчуванням посилається на користувача даних www? Чи потрібно створити цього користувача? Як надати цьому користувачеві оптимальні дозволи для запуску nginx?


Намагайтеся уникати повзучості сфери, задаючи питання; www-data- окрема тема. Більшість операційних систем визначають окремого користувача з меншими дозволами, який процес може запускати як після прив'язки до порту 80 як root. Це визначено у конфігураційному файлі. Застосовувати основні практики безпеки; не дозволяйте користувачеві писати те, що веб-серверу не потрібно писати, не дозволяйте іншим користувачам писати у файли, якщо це не навмисно.
Андрій Б

Відповіді:


93

Папками сайтів * керують nginx_ensiteі nginx_dissite. Для користувачів Apache httpd, які виявляють це за допомогою пошуку, еквіваленти є a2ensite/ a2dissite.

sites-availableПапка для зберігання всіх ваших конфігурацій ВХост, йде вони чи ні в даний час включено.

sites-enabledПапка містить символічні посилання на файли в папці сайтів-доступних. Це дозволяє вибірково відключити vhosts, видаливши симпосилання.

conf.dвиконує завдання, але вам потрібно щось перемістити з папки, видалити його або внести зміни до нього, коли вам потрібно щось відключити. Абстракція папок сайтів * робить речі трохи організованішими та дозволяє керувати ними за допомогою окремих скриптів підтримки.

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


12
Я щось не так зрозумів? Не розуміючи протидії.
Ендрю Б

1
мені цікаво, це вбудовано в nginx? я встановив вручну github.com/perusio/nginx_ensite
lfender6445

18
Важливо зазначити, що sites-available|sites-enabledце Debian-ism і не є чимось, що роблять nginx або Apache. Це, мабуть, було досить корисно в минулому, але його корисність дещо обмежена в епоху управління конфігурацією та контейнерами.
Майкл Хемптон

Чи можете ви прокоментувати, як управління конфігурацією та контейнерами обмежує корисність доступних сайтів | включених сайтів?
karthik vee

1
@karthikvee справа в тому, що нині сервери часто виступають як ефемерні контейнери, які обслуговують лише один веб-сайт / послугу, тому це можна включити nginx.confбез втрати читабельності. Це протилежно підходу декількох років тому, коли сервери зазвичай зберігали десятки веб-сайтів.
adamczi

38

Я хотів би додати до попередніх відповідей, що найважливішим є не те, як ви називаєте каталоги (хоча це дуже корисна умова), а те, що ви насправді вкладаєте nginx.conf. Приклад конфігурації:

http {
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*.conf;
    include /etc/nginx/sites-enabled/my_own_conf;
...
}

Тільки директива використовується тут , включає , таким чином , немає ніякої внутрішньої різниці між , наприклад , conf.d/і sites-enabled/.

З вищенаведеної документації:

Syntax:     include file | mask;
Default:    —
Context:    any

Includes another file, or files matching the specified mask, 
into configuration. Included files should consist of 
syntactically correct directives and blocks.

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


1
Правильно, sites-enabledдещо було винайдено деяким розподілом, що метушиться навколо, як дратівливий проміжний. Перейдіть на nginx з офіційного джерела : ви отримаєте сучасний продукт, а також позбудетесь цієї конфігурації лайно / пекло.
Бернард Россет

2
Це пояснює, чому на офіційній документації Nginx немає жодної посилання на цю назву. Це сторонній проект! github.com/perusio/nginx_ensite
AxeEffect

30

Зазвичай sites-enabledпапка використовується для визначення віртуального хоста, тоді conf.dяк використовується для глобальної конфігурації сервера. Якщо ви підтримуєте кілька веб-сайтів, тобто віртуальних хостів, то кожен з них отримує власний файл, тож ви можете їх легко вмикати та вимикати, переміщуючи файли в і з нього sites-enabled(або створюючи та видаляючи посилання, що, ймовірно, краща ідея).

Використовуйте conf.dдля таких речей, як завантаження модулів, файли журналів та інші речі, не характерні для одного віртуального хоста.

Конфігурація за замовчуванням посилається на користувача даних www? Чи потрібно створити цього користувача?

Ви повинні мати nginx, що працює як некористувач. Це в деяких випадках названо www-data, але ви можете назвати його все, що завгодно.

Як надати цьому користувачеві оптимальні дозволи для запуску nginx?

Я менш впевнений у відповіді на це питання (на даний момент я не запускаю nginx), але якщо це щось на кшталт Apache, відповідь полягає в тому, що www-dataкористувачеві потрібні лише дозволи на читання будь-яких статичних файлів (і читати + виконувати в каталогах ), що ви обслуговуєте чи читаєте / виконуєте дозволи на такі речі, як сценарії CGI, і жодних інших дозволів немає.


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

> 'У вас повинен бути nginx, який працює як некорінний користувач' - ви могли б детальніше розповісти про це?
lfender6445

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

14

Що відбувається?

Ви повинні використовувати Debian або Ubuntu, оскільки зло sites-available / sites-enabledлогіка не використовується упаковкою nginx вгору від http://nginx.org/packages/ .

В обох випадках обидва реалізуються як конфігурація конфігурації за допомогою стандартної includeдирективи в /etc/nginx/nginx.conf.

Ось фрагмент /etc/nginx/nginx.confофіційного пакету nginx від nginx.org:

http {
    …
    include /etc/nginx/conf.d/*.conf;
}

Ось фрагмент /etc/nginx/nginx.confвід Debian / Ubuntu :

http {
    …
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Отже, з точки зору NGINX, єдиною різницею було б те, що файли від conf.dотримують швидше оброблятися, і, як така, якщо у вас є конфігурації, які мовчки конфліктують між собою, то ті з них conf.dможуть мати перевагу над тими, хто в sites-enabled.


Найкраща практика conf.d.

Ви повинні використовувати /etc/nginx/conf.d, як це стандартна умова, і вона повинна працювати в будь-якому місці.

Якщо вам потрібно вимкнути сайт, просто перейменуйте ім’я файлу, щоб він більше не мав .confсуфікса, дуже просто, прямо та зрозуміло:

sudo mv -i /etc/nginx/conf.d/default.conf{,.off}

Або навпаки, щоб увімкнути сайт:

sudo mv -i /etc/nginx/conf.d/example.com.conf{.disabled,}


Уникайте sites-availableта будь-якими sites-enabledвитратами.

Я не бачу абсолютно жодної причини використовувати sites-available/ sites-enabled:

  • Деякі люди згадували nginx_ensiteі nginx_dissiteсценарії - назви цих скриптів ще гірші, ніж у решті цього дебале, - але цих скриптів також ніде не знайти - вони відсутні в nginxпакеті навіть у Debian (і, мабуть, і в Ubuntu) , а також немає у власному пакеті, плюс, чи справді вам потрібен цілий нестандартний сторонній сценарій, щоб просто перемістити та / або зв’язати файли між двома каталогами ?!

  • І якщо ви не використовуєте сценарії (що насправді є розумним вибором, як зазначено вище), то виникає питання про те, як керувати сайтами:

    • Чи створюєте ви символічні посилання від sites-availableдо sites-enabled?
    • Скопіювати файли?
    • Перемістити файли?
    • Редагувати файли на місці в sites-enabled?

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

Що приводить нас до:

  • Чи безпечно видалити файл із sites-enabled? Це м'яке посилання? Тверде посилання? Або єдина копія конфігурації? Прекрасний приклад пекла конфігурації.

  • Які сайти було відключено? (З цим conf.dпросто проведіть пошук інверсії для файлів, які не закінчуються .conf- find /etc/nginx/conf.d -not -name "*.conf"або використовують grep -v.)

Не тільки все вищезазначене, але також відзначаємо специфічну includeдирективу, яку використовує Debian / Ubuntu - /etc/nginx/sites-enabled/*- не вказаний суфікс імені файлу для sites-enabled, на відміну від conf.d.

  • Це означає, що якщо одного дня ви вирішите швидко відредагувати файл або два в межах /etc/nginx/sites-enabled, і ви emacsстворюєте файл резервної копії на кшталт default~, то, раптом, у вас є обидва defaultта default~включені як активна конфігурація, яка, залежно від використовуваних директив, може навіть не дати ви маєте будь-які попередження та спричиняєте тривалий сеанс налагодження. (Так, це сталося зі мною; це було під час хакатону, і я був зовсім здивований, чому мій конфіденцій не працює.)

Таким чином, я переконаний, що sites-enabledце чисте зло!


Окрім усього вищезазначеного, мабуть, також дуже часто створювати неправильні символьні посилання! stackoverflow.com/a/14107803/1122270 Про всяк випадок, якщо ви не вважали, що sites-enabledце досить зло!
cnst

Або іноді може статися так, що хтось вирішить відредагувати файли sites-enabled, але тоді інша людина вирішує відключити його, видаливши, можливо, думаючи, що це просто симпосилання, для подальшого скидання пам'яті nginx heap потрібен наступний дамп пам'яті для відновлення файлу conf: stackoverflow.com/q/45852224/1122270
CNST

Я повинен не погодитися з твердженнями про sites-availableі sites-enabled; важливо мати можливість готувати конфігураційні файли за межами каталогу "live", таким чином, якщо nginx буде перезавантажено або перезапущено, він не отримає часткові файли конфігурації. Також може бути корисно зберегти конфігураційні файли, які вже не активно використовуються. Створення посилань не є особливо складним завданням, якщо у вас є достатній досвід управління nginx, в першу чергу, IMO.
BE77Y

@ BE77Y ви використовуєте більш складний підхід. У програмуванні найкращою практикою вважається повністю видалити невикористаний код, а не просто вимкнути або прокоментувати його; Я не бачу причин, чому DevOps повинен бути інакшим - якщо конфігурація більше не потрібна, видаліть її (вона все одно повинна існувати у вашому VCS). Те саме з частковими конф-файлами - чому б ви редагували їх увімкнено та перезавантажували nginx за вашою спиною? ( USR1, який повторно відкриває журнали, не перезавантажує конф.) Я вважаю, що ваші коментарі щодо "досвіду" символічного зв’язку неправильно спрямовані - проблема полягає в послідовності, яка мало стосується досвіду.
cnst

2
Зрозуміло, що а) це не підходяще середовище для цієї дискусії, і, можливо, ще важливіше, б) це, ймовірно, буде безрезультатним у будь-якому випадку. Давайте погодимось не погодитися.
BE77Y
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.