• +4

    В значительной степени это относится ко всему HTTP/2.

    HTTP/2 Server Push не так прост, как я думал
  • +1

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

    Пулы потоков: ускоряем NGINX в 9 и более раз
  • +1

    Всё так. Смысла особого нет.

    Пулы потоков: ускоряем NGINX в 9 и более раз
  • 0

    Прочитывать и понимать значение слов — мне кажется всё же не то же самое, что понимать вложенный в эти слова смысл. Вот скажем есть некая математическая теорема, достаточно короткая, всего 4-5 предложения. Но на понимание можно запросто убить час. Неужели навык скорочтения тут поможет?

    Как прокрастинировать эффективно: 6 полезных онлайн-сервисов
  • +8

    ИМХО автор сам загнал себя в карьерный тупик. Любимым делом должно быть то, что ты делаешь на работе.
    Средний возраст разработчиков у нас в отделе — 37 лет. Все счастливы, полны сил и очень любят свою работу.

    Каково это — быть разработчиком в России, когда тебе сорок
  • +1

    Конечно, при желании, у пользователя есть способы отстрелить себе обе ноги (как тот же gzip 9), но не надо этого делать.


    Что касается записи, то есть директива aio_write.

    Разница между nginx и apache с примерами
  • +1

    Это классическая практика добавлять слэш в конце и традиционно это делается через 301-ый редирект, который кэшируется браузером. Если у вас путь в форме или скриптах приписан неверно (а откуда ещё возьмется POST-запрос?), то нужно править код, а не затыкать проблему редиректом. Редирект на запросы с телом — это вообще плохо, вне зависимости от кода.

    Разница между nginx и apache с примерами
  • 0
    Другой классический пример — использование mod_jk с ajp для интеграции с Apache Tomcat (прокидывание TLS-сессий в appserver).

    Знаю не мало случаев перехода с ajp на nginx проксирующий по http, а вот такой хотелки как-то не припоминаю. Если чего-то очень не хватает, об этом имеет смысл пойти и написать feature request в trac.

    Разница между nginx и apache с примерами
  • +1

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

    Разница между nginx и apache с примерами
  • +1

    Event MPM работает только для keep-alive соединений. От этого Apache не стал nginx-ом. Обработка запроса в Apache, как происходила многопоточно, так и происходит, и это не масштабируется.

    Разница между nginx и apache с примерами
  • +1

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


    В пользу Apache можно привести ряд аргументов:


    1. Можно отдать ему предпочтение при прочих равных, если вы умеете его настраивать и знаете гораздо лучше чем nginx.
    2. Ваш сервис опирается на некоторую функциональность Apache, которой либо нет в nginx, либо она реализована иначе. Распространенный пример в данном случае — это виртуальный хостинг с использованием .htaccess файлов вашими клиентами.
    3. Вы используете Apache в качестве сервера приложений, как менеджер процессов для php, python, java, etc..., чем nginx самостоятельно не занимается, а работает в паре с другими, например php-fpm, gunicorn, wildfly, тем же Apache.

    В рунете более чем 76% веб-сайтов обслуживает nginx по крайней мере в качестве фронтенда. В мировом масштабе успехи nginx скромнее, но тенденция такова, что доля Apache стабильно снижается, а доля nginx стабильно растет.

    Разница между nginx и apache с примерами
  • 0

    Как раз наоборот. Статика + мало памяти — было единственным слабым местом nginx, которое и устранили с помощью пула потоков. =)

    Разница между nginx и apache с примерами
  • 0
    Я задал вполне конкретный вопрос (см. мой первый пост): в каких случаях архитектура apache будет иметь преимущества перед nginx.

    Я более-менее разбирал этот вопрос в статье.

    Разница между nginx и apache с примерами
  • +1

    sigmask — это вообще про обработчики сигналов. И единственное отличие pselect() от select() в наличии дополнительного аргумента, который позволяет переопределить обработку сигналов на время вызова select().


    Опять же, обратимся к man:


    sigmask is a pointer to a signal mask (see sigprocmask(2)); if it is not NULL, then pselect() first replaces the current signal mask by the one pointed to by sigmask, then does the "select" function, and then restores the original signal mask.


    Ну и man signal процитирую:


    Signal mask and pending signals


    A signal may be blocked, which means that it will not be delivered until it is later unblocked. Between the time when it is generated and when it is delivered a signal is said to be pending.


    Each thread in a process has an independent signal mask, which indicates the set of signals that the thread is currently blocking.

    Разница между nginx и apache с примерами
  • +2

    Ок. Вы изменили комментарий. =)


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

    Разница между nginx и apache с примерами
  • 0

    А, пардон, код в примере маску всё же проверяет. Но комментарий опять же вводит в заблуждение:


    //Читаем данные из каждого сокета, так как не знаем какие события заставил ОС дать нам CPU

    Разница между nginx и apache с примерами
  • +1

    По маске пробегать относительно дешево, а написано другое, я же процитировал: нам приходится обрабатывать все наши коннекты и проверять их на получение данных, делая с них read


    И код в примере именно так и делает зачем-то.

    Разница между nginx и apache с примерами
  • +3
    У select есть большой недостаток — мы не можем знать, какое именно событие произошло и с каким именно сокетом. Каждый раз, когда мы получаем процессорное время, нам приходится обрабатывать все наши коннекты и проверять их на получение данных, делая с них read. Если у нас будет 1000 соединений, а данные придут только по одному из них, то мы обработаем все 1000 соединений, чтобы найти нужный.

    Тут написана неправда. Процитирую man: On exit, the sets are modified in place to indicate which file descriptors actually changed status.

    Разница между nginx и apache с примерами
  • +4

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


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

    Разница между nginx и apache с примерами
  • +3

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

    Разница между nginx и apache с примерами
  • +2
    текущее время в nginx может начать отставать при недостатке нагрузки

    Это что-то новенькое. Можно подробнее?

    Разница между nginx и apache с примерами
  • 0

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

    Установка и базовая настройка nginx и php-fpm для разработки проектов локально в Ubuntu 16.04
  • 0

    Совсем недавно — это почти два года назад, начиная с nginx 1.9.0. =)


    Исключить можно, для этого есть опция down у директивы server в блоке upstream. Не считая ряд сторонних модулей, есть статистика для бесплатной версии nginx в виде сервиса.

    Семь отличных ускорителей сайтов для Linux и Unix
  • +1

    Вот nginx умеет UDP. Какой-нибудь DNS прекрасно балансируется.

    Семь отличных ускорителей сайтов для Linux и Unix
  • +1

    Он уже научился балансировать HTTP/2 и UDP? =)

    Семь отличных ускорителей сайтов для Linux и Unix
  • +8

    Если nginx работает слишком быстро, то его можно конечно притормозить с помощью Varnish, но я бы не советовал. =)
    image

    Семь отличных ускорителей сайтов для Linux и Unix
  • 0
    зачем лишние движения и лишние строки в конфигах?

    Обращаю внимание на две бессмысленные директивы fastcgi_split_path_info и fastcgi_index в location ~* \.php$. Это либо ошибка, либо копипаста.

    Установка и базовая настройка nginx и php-fpm для разработки проектов локально в Ubuntu 16.04
  • +4

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

    Сборка nginx: CentOS 6.8, документы и грабли
  • +4
    Ловкость sed и никакой коммерции. Команда nginx вряд ли скажет спасибо

    Заголовок ответа Server: nginx — это минимальная благодарность, которую пользователь может выразить разработчикам. Эти заголовки влияют на статистику серверов на рынке, которую таким образом агрегируют некоторые профильные ресурсы. Данная статистика, среди прочего, вносит вклад в отношение инвесторов к нам, дадут ли нам ещё денег и сколько, чтобы дальше разрабатывать и поддерживать nginx, либо придется идти искать другую работу.


    Хотите скрыть заголовок Server и поддержать разработку — купите NGINX Plus, там есть такая опция. А писать скрипты, подменяющие название продукта, и рассказывать об этом на весь мир — я лично считаю, что тем самым вы наиболее красноречиво выражаете свое отношение к его создателям.


    Что же касается безопасности, то данная практика называется "Security through obscurity" и в профессиональной среде считается порочной. При необходимости тип сервера легко узнается по косвенным признакам.

    Сборка nginx: CentOS 6.8, документы и грабли
  • +1

    Самый ужасный браузер с точки зрения поддержки стандартов. Критические баги в реализации HTTP/2 годами не исправляют, зато "быстрее и комфортнее".

    «Браузерная война» Google Chrome продолжается — вести с полей
  • 0

    SSL или не SSL, а также детали соединения — не являются частью URI.


    Типичный HTTP/1.1-запрос выглядит так:


    GET /blog HTTP/1.1
    Host: example.com
    User-Agent: Mozilla...
    Accept: text/html

    и он так выглядит вне зависимости от того, по SSL/TLS он сделан или поверх голого TCP.


    URI в данном случае /blog. POST-запросы с этой точки зрения выглядят точно также, только еще содержат тело. Так что ваша фраза:


    На стороне nginx не реально воссоздать GET запрос и реальный IP-адрес клиента (какие данные точно не передаются сейчас не скажу). С телом POST и т. п. запросов проблем как раз не заметил

    вообще лишена смысла.

    Если вам обязательно знать, используется ли SSL/TLS или нет на соединении с клиентом с haproxy, так разнесите также эти соединения по разным портам. Пусть haproxy проксирует либо на один порт, либо на другой. В чем проблема?

    Либо можно выкинуть haproxy, поставить nginx на его место — и тогда будет счастье. Всю информацию можно будет передавать в заголовках.
    Как я пытался включить http2 у себя на проекте с nginx
  • 0

    URI никогда не передается по proxy protocol, это уже часть HTTP запроса, которых может быть много в одном соединении. Спецификация тут: http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt

    Как я пытался включить http2 у себя на проекте с nginx
  • +1

    Всё должно работать без проблем, если правильно настроить. Реальный IP передается через proxy protocol.

    Как я пытался включить http2 у себя на проекте с nginx
  • +1

    Нет, они такие же. Правки там сделаны только для того, чтобы оно собиралось правильно с новыми версиями.

    Как я пытался включить http2 у себя на проекте с nginx
  • 0

    Правильно использовать собственный DNS-сервер. Например, установленный на той же машине:

    resolver 127.0.0.1;
    

    Как я пытался включить http2 у себя на проекте с nginx
  • +13

    Не стоит эти патчи от CloudFlare использовать. Почему не стоит я давал подробное разъяснение у нас в багтрекере: http://trac.nginx.org/nginx/ticket/1029#comment:2


    Появление этих патчей было актом самопиара CloudFlare, а не попыткой сделать что-то полезное для общества.

    Как я пытался включить http2 у себя на проекте с nginx
  • +6

    Процитирую документацию:

    Для предотвращения DNS-спуфинга рекомендуется использовать DNS-серверы в защищённой доверенной локальной сети.
    Встроенный резолвер заточен на производительность, для чего пришлось несколько пожертвовать безопасностью. Он не рассчитан на применение в незащищенных сетях. Не говоря уж о том, что задержка при обращении к гугловому серверу может сказаться на скорости обработки запроса, а его недоступность или неправильная работа и вовсе привести к недоступности вашего сервиса.

    Как я пытался включить http2 у себя на проекте с nginx
  • +6

    Забавно наблюдать старательно сконфигурированный A+ в ssllabs и дырку в безопасности в виде:


    resolver 8.8.4.4 8.8.8.8;
    Как я пытался включить http2 у себя на проекте с nginx
  • +2

    Планами делились на nginx.conf. Можно посмотреть на нашем youtube-канале.


    Также на прошлом HL++ был доклад и в этом году будет.

    Масштабируемая конфигурация nginx