Как стать автором
Обновить
256
0
Alexander @simpleadmin

Пользователь

Отправить сообщение

Nginx. О чем не хотелось писать

Время на прочтение5 мин
Количество просмотров12K

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

Наследование директив в nginx - это классная штука. Именно наследование позволяет писать простые и понятные конфиги. При слиянии конфигураций значение директивы и её функциональность переходит из вышестоящего контекста в текущий. Логично, что наследование не происходит от параллельных контекстов, например от соседнего location или if.

Вроде бы всё хорошо. Пока не возникают исключения.

N.B.: Здесь и далее описывается работа с nginx версии 1.21.1 (если не указано иное). Всё сказанное основывается лишь на опыте и ошибках автора. Вместе с тем автор не является разработчиком nginx и даже его маститым сварщиком, поэтому не стоит принимать слова автора как догму, а, наоборот, подвергать сомнению и самостоятельному тестированию.

Размышления простого админа
Всего голосов 20: ↑20 и ↓0+20
Комментарии9

Nginx. Фазы обработки запроса. If is Evil?

Время на прочтение2 мин
Количество просмотров14K

Самое страшное зло в Nginx - это if в location. Об этом написано много, в том числе на nginx.com. Процитируем кусочек:

The only 100% safe things which may be done inside if in a location context are:
- return ...;
- rewrite ... last;

Казалось бы, если использовать конструкцию вида

location / {
if ( $condition ) {
return 418;
}
...
}

то ничего страшного не произойдет, однако, при определенном "умении", можно сломать даже то, что должно работать на 100%. Но будет ли виноват в нашей поломке if?

Читать далее
Всего голосов 12: ↑12 и ↓0+12
Комментарии25

Nginx. Трассировка. Взгляд землекопа

Время на прочтение10 мин
Количество просмотров4.4K

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

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

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

Читать далее
Всего голосов 13: ↑13 и ↓0+13
Комментарии2

Nginx. Фазы обработки запроса. Практика

Время на прочтение5 мин
Количество просмотров13K

Хабру катастрофически не хватает такого формата постов как "продолжение" или "дополнение". После написания статьи зачастую появляется материал, который хотелось бы добавить к сказанному, но update'ить статью, с её сроком жизни в 1-2 дня, бессмысленно, а писать в комментариях невозможно из-за объёма материала. В то же время этого материала может быть недостаточно для новой статьи, да и, в силу того, что он сильно перекликается с предыдущей статьёй, придется либо постоянно её цитировать, либо оставлять пробелы, подразумевая, что читатель понимает о чем идет речь.

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

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

Читать далее
Всего голосов 40: ↑40 и ↓0+40
Комментарии10

Nginx. О чем не пишут в книгах

Время на прочтение9 мин
Количество просмотров45K

Эта статья родилась случайно. Слоняясь по книжному фестивалю и наблюдая, как дочка пытает консультантов, заставляя их искать Иэна Стюарта, мой глаз зацепился за знакомые буквы на обложке: "Nginx".

Надо же, на полках нашлось целых три книги - не полистать их было бы преступлением. Первая, вторая, третья... Ощущение, будто что-то не так. Ну вроде страниц много, текст связный, но каково содержание? Установка nginx, список переменных и модулей, а дальше docker, ansible. Открываем вторую: wget, лимиты запросов и памяти, балансировка, kubernetes, AWS. Третья: GeoIP, авторизация, потоковое вещание, puppet, Azure. Ребята, а где про то, как вообще работает nginx? На кого рассчитаны ваши книги? На состоявшегося админа, который и так знает архитектуру этого веб-сервера? Да он вроде с базовыми настройками и сам справится. На новичка, который не знает как пользоваться wget? Вы уверены, что ему знание о существовании ngx_http_degradation_module и тем паче "облака" важнее порядка прохождения запроса?

Итак. О чем не пишут в книгах.
(здесь и дальше мы говорим только о NGX_HTTP_)

Фазы обработки запроса
Всего голосов 86: ↑86 и ↓0+86
Комментарии11

Об использовании regexp в map nginx

Время на прочтение3 мин
Количество просмотров16K

Давно ничего не писал, поэтому разбавим конец пятницы простыми, но не всегда очевидными изысканиями в Nginx.

В этом веб-сервере есть замечательная директива map, которая позволяет существенно упростить и сократить конфиги. Суть директивы в том, что она позволяет создать новую переменную, значение которой зависит от значений одной или нескольких исходных переменных. Ещё большую силу директива приобретает при использовании регулярных выражений, но при этом многие забывают, об одном важном моменте. Выдержка из мануала:

Читать далее
Всего голосов 22: ↑22 и ↓0+22
Комментарии2

В поисках LD_PRELOAD

Время на прочтение12 мин
Количество просмотров23K
Эта заметка была написана в 2014-м году, но я как раз попал под репрессии на хабре и она не увидела свет. За время бана я про неё забыл, а сейчас нашёл в черновиках. Думал было удалить, но авось кому пригодится.



В общем, небольшое пятничное админское чтиво на тему поиска «включенного» LD_PRELOAD.
Читать дальше →
Всего голосов 67: ↑67 и ↓0+67
Комментарии9

Когда 'a' не равно 'а'. По следам одного взлома

Время на прочтение6 мин
Количество просмотров112K
Пренеприятнейшая история случилась с одним моим знакомым. Но насколько она оказалась неприятной для Михаила, настолько же занимательной для меня.

Надо сказать, что приятель мой вполне себе UNIX-пользователь: может сам поставить систему, установить mysql, php и сделать простейшие настройки nginx.
И есть у него десяток-полтора сайтов посвященных строительным инструментам.

Один из таких сайтов, посвященный бензопилам, плотненько сидит в ТОПe поисковиков. Сайт этот — некоммерческий обзорник, но кому-то поперек горла и повадились его атаковать. То DDoS, то брутфорс, то комменты напишут непотребные и шлют абузы на хостинг и в РКН.
Неожиданно всё стихло и это затишье оказалось не к добру, а сайт начал постепенно покидать верхние строчки выдачи.

image

То была присказка, дальше сама админская байка.

Время близилось ко сну когда раздался звонок телефона: «Сань, ты не глянешь мой сервер? Мне кажется меня хакнули, доказать не могу, но ощущение не покидает уже третью неделю. Может мне просто пора лечиться от паранойи?»
Читать дальше →
Всего голосов 399: ↑393 и ↓6+387
Комментарии73

Чем проще задача, тем чаще я ошибаюсь

Время на прочтение7 мин
Количество просмотров46K
image

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

Коллега попросил поправить скрипт у него на сервере. Сделал, сдал ему и обронил ненароком: «Время спешит на 5 минут». Сервер его, пусть сам и разбирается с синхронизацией. Полчаса, час прошел, а он всё пыхтит и тихо матерится.

«Бестолочь! — подумал я, переключаясь в консоль сервера — ну ладно оторвусь ещё на пару минут.»

Смотрим, ntp, rdate, sdwdate не установлены, timesyncd отключен и не запущен.

# timedatectl
      Local time: Sun 2019-08-25 20:44:39 +03
  Universal time: Sun 2019-08-25 17:44:39 UTC
        RTC time: Sun 2019-08-25 17:39:52
       Time zone: Europe/Minsk (+03, +0300)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

Здесь сразу отмечу, что аппаратное время верное: по нему будет легче ориентироваться дальше.

Отсюда и началась череда ошибок.
Читать дальше →
Всего голосов 93: ↑92 и ↓1+91
Комментарии37

Почему (сегодня) return 444 не всегда полезен

Время на прочтение7 мин
Количество просмотров35K
В web-сервере Nginx есть замечательный код ответа 444, который «закрывает» соединение без отправки данных. Данный функционал весьма полезен при фильтрации паразитного трафика — если мы уверены, что клиент по каким-то критериям не является валидным, то нет необходимости его уведомлять, например, 403-м ответом. Эффективнее просто прекратить передачу данных, что, зачастую, позволяет существенно снизить нагрузку на сервер.

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

И, в общем-то, на протяжении многих лет эти советы можно было использовать почти не глядя, но… современные браузеры не стоят на месте и периодически преподносят нам новые сюрпризы.
Читать дальше →
Всего голосов 71: ↑70 и ↓1+69
Комментарии75

Сопроцессы: -что, -как, -зачем?

Время на прочтение5 мин
Количество просмотров20K
Многие пользователи Bash знают о существании со-процессов, появившихся в 4-й версии Bash'a. Несколько меньшее количество знает о том, что сопроцессы в Bash не какая-то новая фича, а древний функционал KornShell'a появившийся ещё в реализации ksh88 в 1988 году. Ещё меньшее количество пользователей shell'ов умеющих сопроцессить знают синтаксис и помнят как это делать. Вероятно, я отношусь к четвёртой группе — знающих о сопроцессах, периодически умеющих ими пользоваться но так и не понимающих «зачем?». Я говорю «периодически», так как иногда я освежаю в голове их синтаксис, но к тому моменту, когда мне кажется что «вот тот случай когда можно применить co-proc» я уже напрочь забываю о том как это делать.

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

В заголовке статьи у нас 3 вопроса. Пойдём по порядку.

Что?


Что же такое co-process? Со-процессинг — это одновременное выполнение двух процедур, одна из которых считывает вывод другой. Для его реализации необходимо предварительно запустить фоновый процесс выполняющий функционал канала. При запуске фонового процесса его stdin и stdout присваиваются каналам связанными с пользовательскими процессами. Соответственно, один канал для записи, второй для чтения. Пояснять это проще на примерах, поэтому сразу перейдём ко второму вопросу.
Читать дальше →
Всего голосов 58: ↑57 и ↓1+56
Комментарии36

Дёргаем цепочку сертификатов

Время на прочтение4 мин
Количество просмотров30K
Вчера, видимо, был шабаш https и клиенты стали массово слать сертификаты. Разумеется ни корневых ни промежуточных не прилагалось и просьба их выслать вызывала такое же недоумение как встречный поток у блондинки на дороге с односторонним движением.

На 4-м сертификате дёргать их вручную стало лень (а я ленив по натуре), поэтому набросал «самокат» выцепляющий издателя и формирующий chain-файл для скармливания nginx'у.
Наверняка он не идеален и проверен лишь на полуторадесятках сертификатов, но чем богаты.

Об устройстве x.509 много сказано (в том числе на хабре), поэтому повторяться не буду.

Ниже просто пошаговая инструкция получения цепочки вперемешку с небольшой выжимкой из теории и не более того.
Читать дальше →
Всего голосов 16: ↑15 и ↓1+14
Комментарии3

Bash Co-Processes

Время на прочтение3 мин
Количество просмотров10K
Одной из новых функций в Bash 4.0 является coproc. Оператор coproc позволяет создавать со-процесс, который связан с командной оболочкой с помощью двух каналов: один для отправки данных в со-процесс, второй для получения из со-процесса.

Впервые я нашёл применение этому пытаясь писать лог используя перенаправление exec. Цель состояла в том, чтобы опционально разрешить запись вывода скрипта в лог-файл после запуска сценария (например, вследствие опции --log командной строки).

Основная проблема с логированием вывода после того как скрипт стартовал связана с тем, что его вывод уже мог быть перенаправлен (в файл или канал). Если мы перенаправим уже перенаправленный вывод, то не сможем выполнить команду так, как это было задумано пользователем.
Читать дальше →
Всего голосов 17: ↑16 и ↓1+15
Комментарии3

Немного о сокетах, redis и битых яйцах

Время на прочтение5 мин
Количество просмотров42K
Работать в пятницу после обеда первого апреля не хочется — вдруг ещё техника выкинет какую-нибудь шутку. Потому решил о чем-либо написать.
Не так давно на просторах хабра в одной статье огульно охаяли сразу Unix-сокеты, mysql, php и redis. Говорить обо всём в одной статье не будем, остановимся на сокетах и немного на redis.
Итак вопрос: что быстрее Unix- или TCP-сокеты?
Вопрос, который не стоит и выеденного яйца, однако, постоянно муссируемый и писать не стал бы если б не опрос в той самой статье, согласно которому едва-ли не половина респондентов считает, что лучше/надёжнее/стабильнее использовать TCP-сокеты.
Тем, кто и так выбирает AF_UNIX, можно дальше не читать.
Читать дальше →
Всего голосов 29: ↑29 и ↓0+29
Комментарии35

Амнезия FreeBSD

Время на прочтение4 мин
Количество просмотров26K
Я никогда не понимал как работает распределение памяти во FreeBSD. Из всего многообразия документации полезное помнилось, лишь

An urban myth has circulated for years that Linux did a better job avoiding swapouts than FreeBSD, but this in fact is not true. What was actually occurring was that FreeBSD was proactively paging out unused pages in order to make room for more disk cache while Linux was keeping unused pages in core and leaving less memory available for cache and process pages.


Ну лучше чем Linux, да и пусть. Я не против. Но хуже самого непонимая процесса выделения памяти меня убивала Inactive память. Что это такое и можно ли «это» безболезненно использовать? Считать ли эту память доступной для использования приложением?

Под cut'ом больше вопросов чем ответов.
Читать дальше →
Всего голосов 31: ↑23 и ↓8+15
Комментарии19

А был ли who на сервере?

Время на прочтение22 мин
Количество просмотров25K
Тяпница… тринадцатое… всё важное решили оставить на понедельник, а потому сделаю какую-нибудь гадость…
В связи с появивишимся на хабре пересказом статьи решил немного отбалансировать данное руководство. Скрыть своё посещение, конечно, не совсем тривиально, но особых сложностей это не составляет.
Итак, задача:
Войти на сервер, выполнить некие действия и «подмести» за собой.

Здесь и далее считаем, что никаких дополнительных инструментов слежения( за исключением «по умолчанию») в системе не используется и мы знаем пароль root'a.

С чем работаем:

# uname -ori
FreeBSD 10.0-RELEASE GENERIC

# `echo $SHELL` --version
tcsh 6.18.01 (Astron)

Описываемое ниже несколько диссонирует с упоминаемой выше статьей, т.к. оная в первую очередь ориентирована на Linux-пользователей, но общие принципы теже и после перехода во FreeBSD(c 9.0) на хранение данных в utmpx родство стало ближе.

Поехали…
Читать дальше →
Всего голосов 19: ↑18 и ↓1+17
Комментарии15

single-mode во FreeBSD с поддержкой сети

Время на прочтение2 мин
Количество просмотров12K
Это совсем маленькая заметка о том, что как нет ничего более постоянного чем временное, так и самая тривиальная(на первый взгляд) задача занимает больше всего времени.
В пятницу утром знакомый обратился с вопросом «Как пересобрать мир в single-mode на удалённом сервере без KVM?»
«Прописать в /etc/rc скрипт выполняющий /etc/netstart && service sshd start в части исполняемой в single-mode, а дальше всё как обычно», — ничтоже сумняшеся ответил я.
Но спустя часа два вопрос повторился и оказалось, что всё не так тривиально.
Уж не знаю было ли это просто моим заблуждением или всё-таки в ранних версиях FreeBSD /etc/rc частично выполнялся в single-mode(справедливости ради никогда не приходилось это проверять), но в 10-ке он действительно не работает.
Итак, задача:
# uname -opr
FreeBSD 10.1-STABLE amd64
Необходимо перейти из multi-mode в single-mode и получить доступ по ssh.
Читать дальше →
Всего голосов 14: ↑10 и ↓4+6
Комментарии25

SYN-флудим со спуффингом на 14 mpps или нагрузочная вилка V 2.0

Время на прочтение6 мин
Количество просмотров19K
Что-то меня пробило на написание заметок последнее время, поэтому пока энтузиазм не спал раздаю долги.
Год назад я пришёл на хабр со статьёй "TCP(syn-flood)-netmap-generator производительностью 1,5 mpps", после которой многие писали и даже звонили с просьбой описать создание такой же «вилки» со спуффингом на максимуме возможностей 10GB сети. Я всем обещал, а руки всё не доходили.
Кто-то скажет, что это руководство для хакеров, но ведь свинья грязи найдёт, а те кому нужен этот инструмент в благонадёжных целях могу остаться ни с чем.

image
Читать дальше →
Всего голосов 39: ↑35 и ↓4+31
Комментарии44

Что такое grep и с чем его едят

Время на прочтение6 мин
Количество просмотров657K
Эта заметка навеяна мелькавшими последнее время на хабре постами двух тематик — «интересные команды unix» и «как я подбирал программиста». И описываемые там команды, конечно, местами интересные, но редко практически полезные, а выясняется, что реально полезным инструментарием мы пользоваться и не умеем.
Небольшое лирическое отступление:
Года три назад меня попросили провести собеседование с претендентами на должность unix-сисадмина. На двух крупнейших на тот момент фриланс-биржах на вакансию откликнулись восемь претендентов, двое из которых входили в ТОП-5 рейтинга этих бирж. Я никогда не требую от админов знания наизусть конфигов и считаю, что нужный софт всегда освоится, если есть желание читать, логика в действиях и умение правильно пользоваться инструментарием системы. Посему для начала претендентам были даны две задачки, примерно такого плана:
— поместить задание в крон, которое будет выполняться в каждый чётный час и в 3 часа;
— распечатать из файла /var/run/dmesg.boot информацию о процессоре.

К моему удивлению никто из претендентов с обоими вопросами не справился. Двое, в принципе, не знали о существовании grep.

image

Поэтому… Лето… Пятница… Перед шашлыками немного поговорим о grep.
Читать дальше →
Всего голосов 188: ↑174 и ↓14+160
Комментарии144

Защищаем роутер от пользователя с помощью dd-wrt

Время на прочтение32 мин
Количество просмотров43K
Провайдер у которого я отбываю рабочую повинность выдаёт абонентам маршрутизаторы в безвозмездное пользование на период заключения договора. При выдаче роутера механики прошивают его, внося логин, пароль, ip и настраивая wifi. И всё бы ничего, но попадаются особо умные пользователи, которые любят понастраивать девайс, да и на маршрутизаторах есть кнопка сброса к заводским настройкам, после манипуляций с которой либо абонент ехал в офис, либо механик выезжал к абоненту заново настраивать устройство. Чаша терпения полнилась и последней каплей стал TL-WR841N, которых провайдер закупил крупную партию.
Мало того что педалька сброса не утоплена (а наоборот расположена так, что может быть нажата перекрученным кабелем да и просто хламом в котором иногда оказываются абонентские устройства) так ещё производитель совместил WPS и RESET на одной кнопке, что мягко говоря чуднОе решение.
image
Был ещё один болезненный момент — с родной прошивкой TP-Link'a роутер не всегда восстанавливал соединение после обрыва связи.
Конечно, и наше решение имеет свои минусы, как-то невозможность смены паролей, но с этим мы готовы мириться.
Ну чтож… Начинаем «лечение».
Читать дальше →
Всего голосов 55: ↑41 и ↓14+27
Комментарии34
1

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность