• Как в NGINX пропустить запрос OPTIONS в php-fpm?

    karabanov
    @karabanov
    Системный администратор
    Для включения указанных методов намеренно делать ничего не надо, так как они доступны по умолчанию. Вот что бы отключить некоторые методы, да надо приложить усилия.

    В подтверждение своих слов приведу пример:

    docker-compose.yml

    version: '3'
    
    services:
      alpine-nginx:
        image: nginx:stable-alpine
        container_name: alpine-nginx
        restart: "no"
        links:
          - composer-php
        volumes:
          - ./default.conf:/etc/nginx/conf.d/default.conf
          - ./code:/code
        ports:
          - "80:80"
    
      composer-php:
        image: php:7-fpm
        container_name: composer-php
        restart: "no"
        volumes:
          - ./code:/code
        ports:
          - "9000:9000"



    default.conf

    server {
      listen 80;
      listen [::]:80;
    
      client_max_body_size 2M;
    
      server_name domain.com admin.domain.com www.domain.com api.domain.com;
    
      charset utf-8;
      index index.php;
    
      root /code;
    
      gzip on;
      location / {
        try_files $uri $uri/ @phpindex;
      }
    
      location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass composer-php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    
        fastcgi_param   QUERY_STRING            $query_string;
        fastcgi_param   REQUEST_METHOD          $request_method;
        fastcgi_param   CONTENT_TYPE            $content_type;
        fastcgi_param   CONTENT_LENGTH          $content_length;
        fastcgi_param   SCRIPT_FILENAME         $realpath_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME             $fastcgi_script_name;
        fastcgi_param   PATH_INFO               $fastcgi_path_info;
        fastcgi_param   PATH_TRANSLATED         $document_root$fastcgi_path_info;
        fastcgi_param   REQUEST_URI             $request_uri;
        fastcgi_param   DOCUMENT_URI            $document_uri;
        fastcgi_param   DOCUMENT_ROOT           $realpath_root;
        fastcgi_param   SERVER_PROTOCOL         $server_protocol;
        fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
        fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;
        fastcgi_param   REMOTE_ADDR             $remote_addr;
        fastcgi_param   REMOTE_PORT             $remote_port;
        fastcgi_param   SERVER_ADDR             $server_addr;
        fastcgi_param   SERVER_PORT             $server_port;
        fastcgi_param   SERVER_NAME             $server_name;
      }
    
      location @phpindex {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass composer-php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    
        set $index_name /index.php;
    
        fastcgi_param   QUERY_STRING            $query_string;
        fastcgi_param   REQUEST_METHOD          $request_method;
        fastcgi_param   CONTENT_TYPE            $content_type;
        fastcgi_param   CONTENT_LENGTH          $content_length;
        fastcgi_param   SCRIPT_FILENAME         $realpath_root$index_name;
        fastcgi_param   SCRIPT_NAME             $index_name;
        fastcgi_param   PATH_INFO               $fastcgi_path_info;
        fastcgi_param   PATH_TRANSLATED         $document_root$fastcgi_path_info;
        fastcgi_param   REQUEST_URI             $request_uri;
        fastcgi_param   DOCUMENT_URI            $document_uri;
        fastcgi_param   DOCUMENT_ROOT           $realpath_root;
        fastcgi_param   SERVER_PROTOCOL         $server_protocol;
        fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
        fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;
        fastcgi_param   REMOTE_ADDR             $remote_addr;
        fastcgi_param   REMOTE_PORT             $remote_port;
        fastcgi_param   SERVER_ADDR             $server_addr;
        fastcgi_param   SERVER_PORT             $server_port;
        fastcgi_param   SERVER_NAME             $server_name;
      }
      location ~ /\.ht {
        deny  all;
      }
    }



    code/index.php

    <?php
    
    header('X-PHP-REQUEST_METHOD: ' . $_SERVER['REQUEST_METHOD']);
    
    echo $_SERVER['REQUEST_METHOD'];
    
    echo "\n\n"
    ?>



    Результат

    zend@zbook:~$ curl -X GET http://api.domain.com/ -d ''
    GET
    
    zend@zbook:~$ curl -X POST http://api.domain.com/ -d ''
    POST
    
    zend@zbook:~$ curl -X DELETE http://api.domain.com/user/1000
    DELETE
    
    zend@zbook:~$ curl -X OPTIONS http://api.domain.com/user/1000
    OPTIONS
    
    zend@zbook:~$ curl -X PATCH http://api.domain.com/user/1000
    PATCH
    
    zend@zbook:~$ curl -I http://api.domain.com/user/1000
    HTTP/1.1 200 OK
    Server: nginx/1.20.1
    Date: Sun, 18 Jul 2021 18:05:05 GMT
    Content-Type: text/html; charset=UTF-8
    Connection: keep-alive
    X-Powered-By: PHP/7.4.21
    X-PHP-REQUEST_METHOD: HEAD
    
    zend@zbook:~$ curl -X PUT http://api.domain.com/user/1000
    PUT

    Ответ написан
    4 комментария
  • Как идентифицировать юзера инкогнито?

    @nirvimel
    Собрание секты верующих в приватный режим браузера в этом треде. Волшебная кнопка "инкогнито" (слово то какое красивое) надевает на юзера шапку невидимку, защищает его от слежки и вообще от всего.

    Так что же такое приватный режим на самом деле?

    Privacy mode or "private browsing" or "incognito mode"[1] is a privacy feature in some web browsers to disable browsing history and the web cache. This allows a person to browse the Web without storing local data that could be retrieved at a later date. Privacy mode will also disable the storage of data in cookies and Flash cookies. This privacy protection is only on the local computing device as it is still possible to identify frequented websites by associating the IP address at the web server.

    https://en.wikipedia.org/wiki/Privacy_mode

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

    Чтобы окончательно развеять сомнения в своей уникальности, включаем приватный режим, проходим этот тест и наслаждаемся результатом (Show full results for fingerprinting -> Ctrl+F эту строку):
    Your browser fingerprint appears to be unique among the xxx,xxx,xxx tested so far.
    Ответ написан
    1 комментарий
  • Возможно ли установить контейнер как сервер?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Так слой докера почти ничего к нагрузке не добавляет, если вы не используете оркестраотр, то это вообще просто окружение. Проще уж само приложение тогда вынести. Но вся суть контейнеров в том, что если приложение написано правильно, с возможностью горизонтального масштабирования, докер контейнер очень быстро запускается на разных хостах.
    Ответ написан
    1 комментарий
  • Возможно ли установить контейнер как сервер?

    romesses
    @romesses
    Backend инженер
    Если у вас вычислительные задачи на том контейнере, то есть немалая вероятность, что вам не удастся выиграть отказом от Docker.
    Пожалуй, разве только если вы запускаете контейнер слишком часто. Тогда это будет иметь смысл. Но тогда вы неправильно пользуетесь Docker.

    Попробуйте переселить тот контейнер на машину помощнее. А лучше даже распараллелить, увеличив количество экземпляров. В итоге, это, может быть, даже архитектурная задача.
    Ответ написан
    5 комментариев
  • Как Не ждать input от пользователя в python?

    KirasiH
    @KirasiH
    Раньше было лучше
    Внучок, используй библиотеку threading
    Ответ написан
    Комментировать
  • Как спроектировать архитектуру большого проекта с начальным знанием программирования?

    Микросервисы + отсутствие опыта = головная боль и нерабочий код.
    Ответ написан
    Комментировать
  • Как спроектировать архитектуру большого проекта с начальным знанием программирования?

    tema_sun
    @tema_sun
    В вашем случае методолгия "хренак-хренак и в продакшн" подойдет как нельзя лучше. Я не шучу. Наговнокодьте что-то работающее, ничего страшного в этом нет.
    Ответ написан
    Комментировать
  • Как спроектировать архитектуру большого проекта с начальным знанием программирования?

    saboteur_kiev
    @saboteur_kiev Куратор тега Python
    software engineer
    К сожалению с начальным знанием программирования - никак.
    Вы не можете привлекать сторонних разработчиков, но уже привлекаете их через Тостер.

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

    Как говорят - оптимизация до оптимизации не нужна.

    У меня был опыт запуска интернет-магазина во времена, когда их было десяток на всю страну. Первый интернет-магазин мы писали почти полгода, внедрив в него тысячи фич, которые оказались невостребованными. Через год проект себя отбил, и мы заказали не редизайн а весь магазин с нуля. Разработка шла 2 месяца, обошлась в 4 раза дешевле. Функционал стал гораздо удобнее. И мы поняли, что в первый раз надо было тоже пойти по более простому пути, тогда мы мы запустились на 4 месяца раньше и отбились бы за полгода.
    Ответ написан
    1 комментарий
  • Как парсить поисковые подсказки?

    @Fadey001
    В хроме открываешь инструменты разработчика – F12
    Пишешь запрос в поисковик и смотришь куда и что отправляется.
    Гугл например шлет запросы на
    https://www.google.ru/complete/search?sclient=psy-ab&newwindow=1&safe=off&biw=840&bih=589&q=hello&oq=&gs_l=&pbx=1&bav=on.2,or.r_cp.&bvm=bv.150120842,d.bGs&fp=340975d5227619b6&pf=p&gs_rn=64&gs_ri=psy-ab&gs_mss=%D0%BF%D0%B0h&tok=0mPi7H_lGIpBh7dz7hlFyQ&cp=5&gs_id=24&xhr=t&tch=1&ech=15&psi=uGDSWO_2CMb-6ASvx7PoDg.1490182331198.1

    Сам запрос в параметре q передается.
    Но при запросе без параметров ругается на неправильный запрос. Осталось узнать откуда берутся все параметры (чаще всего это все есть прямо на странице). Далее формируешь запрос с ключевым словом, подставляешь все параметры и ловишь ответ с подсказками.
    Алгоритм такой
    Ответ написан
    4 комментария
  • Могут ли быть в документе больше одного тега header, main, footer?

    nikolayshabalin
    @nikolayshabalin
    Автор профессиональных курсов в HTML Academy
    Насколько я осведомлён, main как раз-таки, можно использовать один раз. Если нет, ткните пальцем, пожалуйста.
    Ответ написан
    1 комментарий
  • ДДос атака на nginx пакетами 1 байт?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    500 строк в секунду - это не мощно и, вероятно, даже не DDoS. Если адрес один, то просто закройте ему доступ брандмауэром, а если адреса разные, то настройте лимит запросов в Nginx.

    nginx.conf
    http {
        ...
        limit_req_zone $binary_remote_addr zone=reqlimit:10m rate=30r/s;
        ...
    }

    some_site.conf
    server {
        ...
        location / {
            ...
            limit_req zone=reqlimit burst=10 nodelay;
        }
    }

    После этого запросы с одного ip-адреса начиная с 31-го в секунду будут отбрасываться.

    Как вишенку на торт, можно добавить ещё фильтр для fail2ban:

    nginx-req-limit.conf
    [Definition]
    
    failregex = limiting requests, excess: .* by zone .*, client: <HOST>
    ignoreregex =

    и правило в jail.local
    [nginx-req-limit]
    enabled = true
    port = http,https
    filter = nginx-req-limit
    logpath = /var/www/*/*/logs/error.log # Здесь укажите свой путь к логам виртуального хоста
    findtime = 600
    maxretry = 10
    bantime = 7200

    После этого адреса DoS'еров будут автоматически блокироваться брандмауэром на два часа. Что разгрузит Nginx от обработки паразитного трафика.
    Ответ написан
    11 комментариев
  • DDoS атака заставляет php-fpm грузить сервак на 100%, как пофиксить?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Ответ написан
    Комментировать
  • Как поменять цвет текста?

    mmmaaak
    @mmmaaak
    Погугли в чем разница между =, == и ===
    Ответ написан
    1 комментарий
  • DDoS атака заставляет php-fpm грузить сервак на 100%, как пофиксить?

    Нужно смотреть каждый ддос отличается друг от друга, что-то легко решается что-то тяжело.
    Покажите часть аксес лога по этому поводу
    Например так
    tail -f  /путь _до_ccess.log  | grep vasha_forma.php  > /tmp/111.txt

    tail -f выводит в режиме реального времени изменения в логе. ( не cat а именно изменения последней строки)
    |передать вывод на ввод другой команде
    grep - оставляет только строки удовлетворяющие условию в вашем случае это имя пхп файла. или гет параметра в общем то что по чему нужно отсортировать лог

    и через как накопится пара сотен строк давайте сюда.
    ВАШ ДОМЕН НЕ ЯВЛЯЕТСЯ секретным! вы платите яндексу за то что его узнаем, так что в логах ничего криминального нет.
    Ответ написан
  • DDoS атака заставляет php-fpm грузить сервак на 100%, как пофиксить?

    @zkrvndm
    Боты, парсеры, расширения
    Усложните вашу форму, добавьте скрытые поля, которые заполняются хешем по мере набора текста в других полях или при движении мыши. Затем на стороне сервера проверяйте, правильно ли заполнены скрытые поля, если нет, то баните этот IP-адрес.

    Есть еще такой вариант, как подключить Google Recaptcha с максимально агрессивными настройками и банить все адреса, которые не прошли проверку.
    Ответ написан
    4 комментария
  • Как брать оплату в телеграм?

    MinTnt
    @MinTnt
    Kotlin-Android / Python-Scraping
    1) Проработать ЛС бота, в котором будет Бот скидать чек для оплаты, а так же проверять оплату, хороший варянт красиво организовать при помощи inlinekeyboard с параметром url=''
    2) Сделать в боте или парсинг, или через api, проверка оплаты чека, когда человек к примеру нажимает на кнопку "Проверить оплату" сделанную к примеру так же через inlinekeyboard для удобности, с добавлением задержки на нажатие
    3) В случаи оплаты, бот добавляет в группу человека, и добавляет его в базу, записывая и просчитывая туда дату, которая будет спустя 30 дней.
    4) Добавить в бота, ежедневную, или же проверку через кмд. При вводе которой ищет в базе значения ID людей которых нужно кикнуть, в графе где "дата кика" совпадает с текущей
    Ответ написан
    1 комментарий
  • Как подключить animate.css и wow.min.js?

    iamd503
    @iamd503 Куратор тега CSS
    Верстальщик
    <link href="animate.css">
    <script src="wow.min.js"></script>
    Ответ написан
    2 комментария
  • Как и чем можно реализовать GUI приложения в качестве графической оболочки Linux?

    CityCat4
    @CityCat4
    Если я чешу в затылке - не беда!
    Не слишком понятно - хотите написать свое приложение с гуем или же хотите запускать существующее приложение при старте?
    Если первое - существует вагон и еще тележечка тулкитов - правда большинство из них старые и страшные.
    - Стандартный X Toolkit
    - Tk
    - Motif
    ...и что-то там еще было. Ну, qt разумеется, но qt - это не про экономию ресурсов :)
    Если второе - запускать программу вместоWM Там возможно с ключами запуска придется пошаманить, чтобы сразу растянуть на полный экран - ведь кнопок управления не будет!
    Как запускать? Через .xinitrc, если Х стартует с DM или через startx - если вручную.
    Ответ написан
    Комментировать
  • Как организовать безопасное общение между микросервисами?

    firedragon
    @firedragon
    Senior .NET developer
    Организуйте сеть, откройте наружу дырочку. Гайдов целый вагон. И кстати просто идиотизм защищать приложения если к вам уже вломились в сеть. ИМХО
    Ответ написан
  • По каким причинам может не устанавливаться Cookie?

    SilenceOfWinter
    @SilenceOfWinter
    та еще зажигалка...
    Если перед вызовом функции клиенту уже передавался какой-либо вывод (тэги, пустые строки, пробелы, текст и т.п.), setcookie() вызовет отказ и вернет FALSE. Если setcookie() успешно отработает, то вернет TRUE. Это, однако, не означает, что клиентское приложение (броузер) правильно приняло и обработало cookie.
    php.net/setcookie
    Ответ написан
    1 комментарий