Pull to refresh
254
Karma
0
Rating

Старый безработный админ

  • Followers 109
  • Following 4

Файрвол IPFW в ОС FreeBSD

Конфигурация тоже демонстрационная. Основная цель - показать, как вообще сторится конфигурация, что именно нужно в какой последовательности писать.

Читатели хабра не умеют читать маны? Статей по ipfw нет на опеннет и лиссяре? Что нового здесь? Какие bestpractice описаны?

Ну дали б просто ссылку на статью Кеды 15-и летней давности и сразу под ней свою рекламу...

Файрвол IPFW в ОС FreeBSD

ipfw мощная штука, на фряхе многие до сих пор строят програмные маршрутизаторы, включая интернет провайдеров.

Ну это только динозавры, которых не смущают десятки копирований пакета. Для остальных Луиджи (собственно автор ipfw) десять лет назад сделал netmap.

Получаем данные результатов выборов с сайта Центризбиркома РФ

Читать Хабр через tor или просто европейские прокси уже почти нереально. Постоянные "Connection refused" - вероятно защита от DDoS совсем испортилась.

Пока спасают RU-прокси, но их "осталось на 3 дня" ...

Осваиваем новую базу кода: анализируем программу nginx

Зачем вообще переводить этот бред? Инструкция о том как не надо делать.

Если есть желание перевести что-то полезное по nginx, то лучше то как надо делать, например:
www.evanmiller.org/nginx-modules-guide.html
www.evanmiller.org/nginx-modules-guide-advanced.html

Ботнет Mēris: расследуем крупнейшую DDoS-атаку в истории интернета

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

владельцы атакующих устройств далеко не пользователи ya.ru

Трояны и бэкдоры в кнопочных мобильных телефонах российской розницы

У меня нокиа 5110 на пожарной сигнализации трижды на различные рассылки "подписывалась". Окончательно "отписаться" помогло только письменное заявление в МТС.

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

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

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

Конечно, вся логика формирования конфига и должна осуществляться генератором, но отвергать полностью наследование я бы не стал. В моем текущем проекте сейчас 30k+ vhosts, все с одинаковой логикой и на одном движке и отличаются они только одной строкой root|alias|proxy_pass. Не вижу криминала в том, что большинство директив будут описаны на максимально допустимом верхнем уровне и унаследованы.

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

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

Где-то я эту мысль уже слышал :) Игорь Сысоев на highload++:

не слушайте людей, которые говорят, что DRY — это всеобщая парадигма. Это хорошо, когда вам нравится продукт, или вы программируете продукт. Если же вам просто нужно облегчить свою администраторскую жизнь, то copy-paste — это для вас. Ваш друг — это редактор с хорошим find-replace;

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

Ну и try_files здесь не нужен, так как работаем в REWRITE_PHASE, то и if отработает нормально.

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

Этот пример я уже приводил выше.
Так и должно работать, так как директивы модуля работают в фазе REWRITE:

$ grep -rnF PHASE ../form-input-nginx-module-master/
../form-input-nginx-module-master/src/ngx_http_form_input_module.c:372:    h = ngx_array_push(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers);

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

Использование echo_read_request_body - абсолютно бесполезно, точнее просто вредно. Если пакет поднялся до фазы CONTENT, то для того чтобы выполнить if (значит попасть в фазу REWRITE) у него есть только один выход - выполнить проксирование. Но при использовании директивы proxy_pass переменная $request_body получит значение автоматически, то есть echo_read_request_body просто лишено смысла.

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

Хороший пример насколько модуль быстрее njs.

Скорее пример того насколько быстрее будет завершить обработку в REWRITE-фазе, чем в CONTENT

Маршруты пакета для обоих случаев:

$ cat /tmp/tree.txt | grep phase | awk '{print $3}' | uniq
ngx_http_core_generic_phase
ngx_http_core_rewrite_phase
ngx_http_core_find_config_phase
ngx_http_core_rewrite_phase

$ cat /tmp/tree_njs.txt | grep phase | awk '{print $3}' | uniq
ngx_http_core_generic_phase
ngx_http_core_rewrite_phase
ngx_http_core_find_config_phase
ngx_http_core_rewrite_phase
ngx_http_core_post_rewrite_phase
ngx_http_core_generic_phase
ngx_http_core_access_phase
ngx_http_core_post_access_phase
ngx_http_core_generic_phase
ngx_http_core_content_phase

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

server {
    root /www/example_com;
    listen *:80;
    server_name  .example.com;
        
    location /index.php {
        fastcgi_pass   unix:/var/run/php-fpm.sock;
        fastcgi_param  SCRIPT_FILENAME         $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}
<?php
if(!count($_REQUEST)) http_response_code(418);
die();

19691

js_import /scripts/nginx/js/check_body.js;
server {
    root /www/example_com;
    listen *:80;
    server_name  .example.com;
        
    location /index.php {
        fastcgi_pass   unix:/var/run/php-fpm.sock;
        fastcgi_param  SCRIPT_FILENAME         $document_root$fastcgi_script_name;
        include        fastcgi_params;
        
        js_content check_body.body_empty;
        #if ( $request_body = '' ) {
        #  return 418;
        #}
    }
}

12263

server {
    root /www/example_com;
    listen *:80;
    server_name  .example.com;
        
    location /index.php {
        fastcgi_pass   unix:/var/run/php-fpm.sock;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include fastcgi_params;
        
        set_form_input_multi $data;
        
        if ( $data = '' ) {
          return 418;
        }
    }
}

6009

Время в наносекундах от ngx_http_handler:entry до ngx_http_finalize_request:return

Усредненное для 100000 "пустых" POST-запросов.

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

echo-nginx-module работает в CONTENT-фазе, там мы можем получить $request_body и без сторонних модулей.

Как всё это поможет проверить переменную $request_body в REWRITE-фазе?

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

Как это поможет установить значение в переменной $request_body?

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

Скажем так - я не думаю, что njs станет узким местом.
Но и делать так я точно не стал бы - сопровождать такое никакого желания. Решение только на случай если "можно использовать только nginx".
Как вариант можно использовать https://github.com/calio/form-input-nginx-module:

    location /index.php {
        fastcgi_pass   unix:/var/run/php-fpm.sock;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include fastcgi_params;
        
        set_form_input_multi $data;
        
        if ( $data = '' ) {
          return 418;
        }
    }

Но, опять же, спорное решение и в плане поддержки и в плане производительности.

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

Прототип решения по ссылке на форум вполне хорош.
Нам нужно переместить обработку условия в CONTENT-фазу, njs вполне для этого подходит, применительно к примеру из статьи как-то так:

js_import check_body.js;
server {
    root /www/example_com;
    listen *:80;
    server_name  .example.com;
        
    location /index.php {
        fastcgi_pass   unix:/var/run/php-fpm.sock;
        fastcgi_param  SCRIPT_FILENAME         $document_root$fastcgi_script_name;
        include        fastcgi_params;
        
        js_content check_body.body_empty;
    }
}
function body_empty(r) {
  if (r.method == "POST" && (typeof(r.requestBody) == "undefined" || r.requestBody === null)) {
    r.return(418, "Empty\n");
  } else {
    r.return(200, "ret:[" + r.requestBody + "]\n");
  }
}

export default {body_empty};
$ curl -w "HTTP CODE: %{http_code}\n" -d "key1=value1" -X POST "example.com/index.php" \
ret:[key1=value1]
HTTP CODE: 200
$ curl -w "HTTP CODE: %{http_code}\n" -X POST "example.com/index.php"
Empty
HTTP CODE: 418

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

По map есть отличная статья, но а данном случае он также не поможет.

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

К сожалению, я не смог воспроизвести проблему (да и просто уже не помню деталей), с которой столкнулся в 2017-м, но общую идею изложил здесь.

Information

Rating
Does not participate
Registered
Activity