Вопрос про настройку nginx

С наступающим праздником, уважаемые коллеги!

Суть такая: есть папка /etc/nginx/conf.d куда кладутся файлы конфигурации виртуальных хостов. В основном файле конфигурации указано:

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

Вопрос такого плана. Можно ли в этом параметре указывать доступ к файлу по http? Или если быть точным, можно ли вместо текстовых файлов возвращать результат выполнения скрипта?

типа

include "http://localhost/vhosts.php"

Идея в том, чтобы создавать виртуальные хосты динамически.

Второй вопрос. Помимо nginx в OpenBSD встроен демон httpd - проблема в том, что при запуске он слушает все интерфейсы. Можно ли ему ограничить доступ к интерфейсам? Чтобы httpd и nginx работали на разных интерфейсах и не мешали друг другу?

Лига Сисадминов

1.6K постов17.8K подписчиков

Добавить пост

Правила сообщества

Мы здесь рады любым постам связанным с рабочими буднями специалистов нашей сферы деятельности.

1
Автор поста оценил этот комментарий
Да это я просто дома балуюсь, какие тут серьёзные конторы?

тогда забить на :

Уменьшение количества операций чтения-записи на диск.
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

А опыт? Разве не интересно хотя бы теоретическое решение?

показать ответы
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Уменьшение количества операций чтения-записи на диск.

В принципе я рассматривал вариант со скриптом как резервный - просто смонтировать эту папку как RAM-диск.

показать ответы
1
Автор поста оценил этот комментарий
Второй вопрос. Помимо nginx в OpenBSD встроен демон httpd - проблема в том, что при запуске он слушает все интерфейсы. Можно ли ему ограничить доступ к интерфейсам? Чтобы httpd и nginx работали на разных интерфейсах и не мешали друг другу?

server "www.example.com" { 

listen on * port 80 root "/htdocs/www.example.com"
}

В этой директиве указывается

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Там и указал - вместо * имя хоста. Всё равно слушает на всех.

UPD. А нет, спасибо, второй вопрос решён.

Сам оказался невнимателен. 😁

показать ответы
Автор поста оценил этот комментарий
Я знаю возможности sudo)) зачем вам sudo в данной ситуации? Или вы хотите что бы посторонние управляли вашим ВЭБ сервером?
раскрыть ветку (1)
Автор поста оценил этот комментарий

Как минимум - хочу работать от рута, но не хочу разрешать вход под рутом по ssh.  И пароль рута каждый раз набирать тоже не хочу.

показать ответы
Автор поста оценил этот комментарий
А зачем sudo вообще?
раскрыть ветку (1)
Автор поста оценил этот комментарий

Чтобы не писать каждый раз su root

Более тонкая настройка прав доступа.

Можно разрешить пользователю получать права рута и работать под ними. Можно ограничить пользователя или группу определённым набором разрешённых команд. Ну и логирование: сразу ясно кто запускал ту или иную команду.


Если свой сервер доверяешь кому-то - лучше порезать права.

Да и вход под рутом по ssh - плохая идея.


Да, www - тоже пользователь... и группа.

показать ответы
Автор поста оценил этот комментарий
Ну так в нем есть sh разница конечно есть, но сути дела не меняет )
раскрыть ветку (1)
Автор поста оценил этот комментарий

И doas - встроенный аналог sudo 😁

можно писать не sudo su а doas su

с тем же результатом.

показать ответы
Автор поста оценил этот комментарий
А что вы имеете в виду под "опёнок"?
раскрыть ветку (1)
Автор поста оценил этот комментарий
Ну хорошо, накосячить можно и в записях в бд, и опять же ВЭБ сервер не поднимется. В общем дело ваше, но я бы не стал управлять ВЭБ сервером через тот же ВЭБ сервер )
раскрыть ветку (1)
Автор поста оценил этот комментарий

Если записи в БД вносятся собственноручно написанным скриптом - в записях при всём желании не накосячишь. Скрипт либо работает, либо нет.

И да...

https://wordpresslib.ru/htaccess/nginx-htaccess-kak-konverti...

я бы не стал управлять ВЭБ сервером через тот же ВЭБ сервер

А это как? Я уже опробовал - у меня на хосте работает ДВА вебсервера на разных интерфейсах.

Автор поста оценил этот комментарий
Я о том, что например накосячив в htaccess и перезапустив ВЭБ сервер, он может не подняться и тогда ваш php скрипт перестает работать.
раскрыть ветку (1)
Автор поста оценил этот комментарий

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

Из одной БД, к которой у скрипта есть права доступа "только чтение".

показать ответы
Автор поста оценил этот комментарий
Прям нельзя... Хреново написанный скрипт ничем не безопаснее bash. А вот скрипт на bash/python можно написать со всеми проверками и ограничениями, что бы он не смог сделать то что не надо. И это будет проще. Более того написав на php вы рискуете выстрелить себе в ногу и например положить вэбсервер и тогда php уже не сможет работать.
раскрыть ветку (1)
Автор поста оценил этот комментарий

Не пугайте. Писал, брал данные из базы - ничего не падало. Любой скрипт можно написать "со всеми проверками и ограничениями". И да, это опёнок.

На котором, кстати, bash просто отсутствует.

Не установлен, ибо не нужен.

P.S и sudo тоже.

показать ответы
Автор поста оценил этот комментарий
Причем тут ansible. Все что нужно - https://vestacp.com/
раскрыть ветку (1)
Автор поста оценил этот комментарий

Возможно. Не пробовал, но спасибо.

Автор поста оценил этот комментарий
И чем это "безопаснее" bash/python/perl скрипта?
раскрыть ветку (1)
Автор поста оценил этот комментарий

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


Да и как я понял, скрипт в примере выполняется на принимающей стороне, а не на передающей.

показать ответы
Автор поста оценил этот комментарий
А то что вы пытаетесь сделать прям можно?
раскрыть ветку (1)
Автор поста оценил этот комментарий

Я пытаюсь открыть веб-страницу. Скрипт PHP при этом не принимает никаких параметров, просто генерирует текст конфига, на основании данных из БД. Так почему нельзя?


Можно ещё встроить в него проверку IP, чтобы он открывался с одного-единственного IP-адреса, возвращая всем, кто идёт с прочих адресов 404

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

Или Вы его не видите. А мне интересно "создать сайт одной командой", "удалить сайт одной командой", включить-выключить...

Возможно, запланировать включение-выключение сайтов по расписанию.


Да и использование ansible не спасёт от написания плейбуков. А тот же вебмин - только вручную, только хардкор.

показать ответы
Автор поста оценил этот комментарий

Почему через тот же пхп нельзя просто обновлять содержимое файла, и потом делать релоад?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Можно, но я думал он при релоаде будет дёргать конфиг.

Хотя не принципиально. Скрипт добавления/удаления хоста всё равно будет писать в БД, затем на его основе будет генерить конфиги для nginx и dns (хотя PowerDNS всё равно берёт данные из БД), затем релоадить днс и нжинкс...

1
Автор поста оценил этот комментарий

Касаемо первого вопроса, nginx это больше про статические текстовые конфиги (конечно там можно всяких мап замутить и использовать переменные - но это не то что тебе нужно)


Тебе нужно что-то в виде service-discovery самое простое это traefik который например из http бэкнда будет забирать динамический конфиг. Или может envoy - но про него я мало чего знаю. А еще можно покопать чет про caddy и haproxy(как у него там нынче с динамическими конфигами?)

раскрыть ветку (1)
Автор поста оценил этот комментарий

Благодарю, посмотрю.

1
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
Автор поста оценил этот комментарий

Понял, спасибо!

Просто смутило имя конфига

А теперь напишем конфиг для nginx (/etc/nginx/sites-enabled/bash):

И то, что идёт запуск баш-скрипта. Нельзя так делать!

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

Мей би.

Ещё и ansible прикрутить.

4
Автор поста оценил этот комментарий

"Это не наружу, а в локальной сети" -- в локальной сети тоже враги могут быть. Не делай так.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Разве что сын. Это моя домашняя локальная сеть.

Автор поста оценил этот комментарий

В "большом файле" всё равно куча маленьких - таблицы.

раскрыть ветку (1)
Автор поста оценил этот комментарий

У них разные режимы чтения-записи. Поэтому читать один большой файл лучше чем кучу маленьких.

Да и лень мне ручками делать типовые операции, если честно.

Всё равно уже имена хостов лежат в БД DNS, чо бы их же не использовать и для nginx?

1
Автор поста оценил этот комментарий

Так а БД это не операции по диску? ( ‾ʖ̫‾)

раскрыть ветку (1)
Автор поста оценил этот комментарий

Там БД - один большой файл, а не куча маленьких.

Идея в том, чтобы держать записи к хостам в базе.

Как для dns, так и для веб-сервера.


В идеале можно и веб-интерфейс запилить.

Виртуальный хост создал-удалил, включил-выключил.

Можно даже несколько версий PHP установить и для каждого хоста указывать нужную.

показать ответы
Автор поста оценил этот комментарий

Гугол в помощь. Мне дохуя всё лениво сейчас, сам думать и писать не хочу, потому вот первое что более менее похоже. https://debian.pro/2114

Алгоритм есть, меняй под себя. Костыльно, но сработает

раскрыть ветку (1)
Автор поста оценил этот комментарий

А, так это не в конфиге, а в скрипте. Но в принципе я что-то подобное и задумываю. Спасибо!

Только мне проще данные не башем, а похапе брать.

показать ответы
Автор поста оценил этот комментарий

Можно вызвать curl в конфиге с нужного адреса и тогда получим в конфиг ответ от скрипта

раскрыть ветку (1)
Автор поста оценил этот комментарий

В конфиге nginx.conf ?
Идея хорошая, но я пока не совсем понимаю как.

показать ответы
1
Автор поста оценил этот комментарий

Выглядит как "Серьезная контора возьмет в аренду дырокол"


Лучше опиши более подробно какую проблему хочешь решить а не то как сделать лакированный костыль :)

раскрыть ветку (1)
Автор поста оценил этот комментарий

Уже описал проблему - хочу виртуальные хосты в БД.

Выглядит как "Серьезная контора возьмет в аренду дырокол"

Да это я просто дома балуюсь, какие тут серьёзные конторы? 😁

показать ответы
Автор поста оценил этот комментарий

Так а PHP файл где будет лежать, не на диске каком-то?

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

раскрыть ветку (1)
Автор поста оценил этот комментарий

PHP-файл сам по себе перезаписываться не будет - возьмёт инфу из БД и всё.


Операции может и мизер, но так проще, а я ленив.

показать ответы
1
Автор поста оценил этот комментарий

Еще бы понять что ты в первом вопросе хочешь...

раскрыть ветку (1)
Автор поста оценил этот комментарий

PHP в браузере не возвращает свой код. Вместо этого он возвращает текст как результат выполнения скрипта. Соответственно если держать виртуальные хосты в базе SQL, то можно написать скрипт, который будет выдавать конфигурации виртуальных хостов в текстовом виде. И тогда будет достаточно сделать nginx reload чтобы добавить или убрать виртуальный хост.


Не обязательно php - perl или python тоже подойдут.

показать ответы
8
Автор поста оценил этот комментарий
можно ли вместо текстовых файлов возвращать результат выполнения скрипта?

Не делай этого. Это уязвимость, причем серьезная.


Чтобы httpd и nginx работали на разных интерфейсах и не мешали друг другу?

https://httpd.apache.org/docs/2.4/bind.html

раскрыть ветку (1)
Автор поста оценил этот комментарий
Не делай этого. Это уязвимость, причем серьезная.

Это не наружу, а в локальной сети.

https://httpd.apache.org/docs/2.4/bind.html

httpd в OpenBSD - не совсем Apache и этот метод там не работает.

Даже если указать конкретный IP и порт 8080 - он всё равно слушает все интерфейсы.

Или Вы имеете в виду - заменить httpd на другой веб-сервер? На Apache?

показать ответы
Автор поста оценил этот комментарий
Заходить по ssh по паролю - это моветон и не безопасно. Значительно безопаснее заходить по ключу и пароль набирать не придется. И заходить по паролю под юзером, на машину на которой есть sudo вообще не безопаснее чем заходить сразу под root
раскрыть ветку (1)
Автор поста оценил этот комментарий

1. Лень возиться с ключами, когда не знаешь, надолго ли у тебя эта виртуалка. Может на полгода-год, а может завтра снесёшь.

2. Руту можно поставить простой пароль, а юзеру ... не очень простой.

3. Имя рута известно всем и брутфорс вполне возможен. Имя юзера в интернете не пишешь, так что подбирать придётся долго и упорно.

4. Я не все виртуалки выставляю в интернет. И экспериментирую не только с OpenBSD, но и с Debian например.