Quantcast
Channel: Nginx Forum
Viewing all 53287 articles
Browse latest View live

Re: systemd: PID file /var/run/nginx.pid not readable (yet?) after start.

$
0
0
On 23.11.2017 19:30, S.A.N wrote:

> для Systemd лучше вообще не указывать pid файл

Не лучше. Если Type=forking то pid файл необходимо указывать всегда:
https://lists.freedesktop.org/archives/systemd-devel/2017-November/039831.html

> вместо Type=fork использовать Type=notify, это более гибкий вариант
> сообщить Systemd что процесс готов к работе.

Тогда не будет работать обновление исполняемого файла на лету:
http://nginx.org/ru/docs/control.html#upgrade

# service nginx upgrade
Starting new master nginx: [ OK ]
Graceful shutdown of old nginx: [ OK ]

--
Best regards,
Gena

_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: systemd: PID file /var/run/nginx.pid not readable (yet?) after start.

$
0
0
Hello!

On Thu, Nov 23, 2017 at 12:30:45PM -0500, S.A.N wrote:

> > С точки зрения практики - паттерн "daemon(); write_pidfile();"
> > используется чуть менее, чем везде, вплоть до соответствующих
> > библиотечных функций. Так что инициатива выглядит, скажем так,
> > сомнительной.
> >
> > Проще всего, IMHO, это было бы заткнуть на уровне systemd,
> > дожидаясь появления pid-файла при необходимости.
>
> Возможно я чего-то не понимаю, но для Systemd лучше вообще не указывать pid
> файл, вместо Type=fork использовать Type=notify, это более гибкий вариант
> сообщить Systemd что процесс готов к работе.
>
> Вот подробней, кстати PostgreSQL и PHP-FPM уже перешли на него.
> https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=

Нет, спасибо, собираться с systemd'шными библиотеками - это не к
нам.

--
Maxim Dounin
http://mdounin.ru/
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: systemd: PID file /var/run/nginx.pid not readable (yet?) after start.

$
0
0
23 ноября 2017 г., 22:55 пользователь Maxim Dounin <mdounin@mdounin.ru>
написал:

> Hello!
>
> On Thu, Nov 23, 2017 at 12:30:45PM -0500, S.A.N wrote:
>
> > > С точки зрения практики - паттерн "daemon(); write_pidfile();"
> > > используется чуть менее, чем везде, вплоть до соответствующих
> > > библиотечных функций. Так что инициатива выглядит, скажем так,
> > > сомнительной.
> > >
> > > Проще всего, IMHO, это было бы заткнуть на уровне systemd,
> > > дожидаясь появления pid-файла при необходимости.
> >
> > Возможно я чего-то не понимаю, но для Systemd лучше вообще не указывать
> pid
> > файл, вместо Type=fork использовать Type=notify, это более гибкий вариант
> > сообщить Systemd что процесс готов к работе.
> >
> > Вот подробней, кстати PostgreSQL и PHP-FPM уже перешли на него.
> > https://www.freedesktop.org/software/systemd/man/systemd.
> service.html#Type=
>
> Нет, спасибо, собираться с systemd'шными библиотеками - это не к
> нам.
>
>
не совсем про systemd, скорее про пакеты

не пробовали вот такие хуки
https://fedoraproject.org/wiki/Packaging:Scriptlets#Systemd ?
(для pre, post скриптов)


> --
> Maxim Dounin
> http://mdounin.ru/
> _______________________________________________
> nginx-ru mailing list
> nginx-ru@nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru
>
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: systemd: PID file /var/run/nginx.pid not readable (yet?) after start.

$
0
0
On 23.11.2017 19:13, Maxim Dounin wrote:

>>>> В systemd's daemon(7) manpage очень подробно расписано
>>>> как должны вести себя SysV Daemons при работе с systemd.
>>>> И очевидно, что nginx этим требованиям не соответствует.

>>>> Original process должен вызывать exit() только после того,
>>>> как будет полностью завершена инициализация daemon process,
>>>> в частности, после того как daemon process создаст свой pid файл.

>>> Это, что называется, всё очень интересно, но вызывает сомнение
>>> успех подобных рекомендаций. Особенно с учётом отсутствия
>>> каких-либо внятных примеров того, что же использовать вместо
>>> daemon(3). О чём я, собственно, и писал выше.

>> Что использовать вместо daemon(3) документировано в daemon(7):
>> https://www.freedesktop.org/software/systemd/man/daemon.html

>> Lennart Poettering очень подробно ответил на этот вопрос в рассылке:
>> https://lists.freedesktop.org/archives/systemd-devel/2017-November/039830.html

>> Впрочем, если очень хочется использовать все-таки daemon(3) то можно:
>> https://lists.freedesktop.org/archives/systemd-devel/2017-November/039834.html

>> Кстати, Lennart Poettering нашел еще одну ошибку в исходниках nginx:
>> https://lists.freedesktop.org/archives/systemd-devel/2017-November/039832.html

> Это всё замечательно (за вычетом того, предлагаемое использование
> daemon(3) почему-то не учитывает, что после вызова daemon(3)
> parent-процесса уже нет, а "ошибка" - не ошибка), но не отменяет
> того, что чуть менее, чем все существующие демоны делают именно
> "daemon(); write_pidfile();", и при таком подходе - ситуацию не
> изменить.

А при каком подходе ситуацию c nginx изменить можно?
Если говорить конструктивно.

Посмотрел у себя в системе, CentOS 7.4 - там достаточно мало осталось
сервисов Type=forking. Postfix например, запускает много процессов,
как и nginx - проверил его исходники, он действует точно так,
как рекомендуется в документе systemd's daemon(7) manpage.

О каких именно "чуть менее, чем все существующие демоны"
сервисах Вы говорите? Есть еще кроме nginx примеры некорректного
поведения systemd-сервисов с Type=forking которые запускают много
дочерних процессов как это делает nginx или postfix?

Проблемы в работе под управлением systemd сейчас есть только у nginx:
systemd: PID file /var/run/nginx.pid not readable (yet?) after start.
Все остальные сервисы у меня на серверах под systemd работают нормально.

Когда я спросил у Lennart Poettering насчет того,
что все существующие демоны так делают он мне ответил
"the better written ones synchronize properly".

Хочется чтобы и nginx тоже попадал в эту категорию "better written".

Когда я спрашивал разработчиков systemd чтобы они исправили
systemd, вот что Lennart Poettering из Red Hat мне ответил:

https://lists.freedesktop.org/archives/systemd-devel/2017-November/039834.html

[...]

>>> But "daemon(); write_pidfile();" is common pattern
>>> used by many services and even in library functions.

>> It may be common, but not necessarily correct. The parent process should
>> only exit *after* finishing all the preparations (i.e. something like
>> "fork(); write_pidfile(); exit()"), since systemd uses the exit as a
signal
>> that the daemon is now "ready".

> You are joking? Why you think that this pattern is not correct?

It doesn't work on SysV init either: "/etc/init.d/nginx start ;
/etc/init.d/nginx stop" is racy as it will leave ngnx running if it the
PID file isn't written by the time the stop command is used.

[...]

> Or may be it will be simpler to fix root cause of problem in systemd?

Well, I wish you good luck fixing SysV init scripts too. Before we
talk about "fixing systemd", let's talk how do you intend to make
"/etc/init.d/nginx start ; /etc/init.d/nginx stop" work correctly,
without races, without sometimes leaving nginx running, if you don't
wait for the PID file to be written safely before exiting.

Lennart

--
Lennart Poettering, Red Hat

=================================================================

Что ему ответить? Как сделать так, чтобы команда
"/etc/init.d/nginx start ; /etc/init.d/nginx stop"
работала без глюков на CentOS 6 ? Она ведь глючит.

Может быть действительно имеет смысл сделать
"wait for the PID file to be written safely before exiting"
и не брать для nginx пример с кривых и глючных демонов
у которых есть race conditions при старте/остановке?

>> Максим, можно ли сделать так, чтобы nginx соответствовал
>> тем требованиям которые предъявляет systemd к SysV Daemons?

>> https://www.freedesktop.org/software/systemd/man/daemon.html

> Можно, я ж разве против?

А как это лучше всего сделать?

--
Best regards,
Gena

_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: systemd: PID file /var/run/nginx.pid not readable (yet?) after start.

$
0
0
On Wed, Nov 22, 2017 at 08:43:14PM +0300, Maxim Dounin wrote:
> С точки зрения практики - паттерн "daemon(); write_pidfile();"
> используется чуть менее, чем везде, вплоть до соответствующих
> библиотечных функций. Так что инициатива выглядит, скажем так,
> сомнительной.

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

1. Папа выполняет pipe(2) и форкает дочку.

2. Дочка читает конфиги, открывает сокеты и делает все нужные
предварительные проверки, если всё ок -- пишет в пайп
свой pid и закрывает пайп, если нет -- делает exit().

3. Прочитав пайп, папа видит смотрит, вернулся ли pid или
eof/ошибка. Если прочитан правильный pid, то он записывается
в файл, и папа делает exit(0), если нет, то дочка подбирается
waitpid()ом и её статус выбрасывается через exit() наверх.

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

> Проще всего, IMHO, это было бы заткнуть на уровне systemd,
> дожидаясь появления pid-файла при необходимости.

Лучше делать не "как проще", а правильно.
--
Eugene Berdnikov
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: systemd: PID file /var/run/nginx.pid not readable (yet?) after start.

$
0
0
Здравствуйте, Илья,

On 23/11/2017 21:30, Илья Шипицин wrote:
> не совсем про systemd, скорее про пакеты
>
> не пробовали вот такие хуки https://fedoraproject.org/wiki/Packaging:Scriptlets#Systemd ?
> (для pre, post скриптов)

Мы собираем пакеты не только под systemd-enabled дистрибутивы из одних и тех же исходных пакетов, поэтому использовали уже раскрытые версии в соответствущих местах (см. http://hg.nginx.org/pkg-oss/file/tip/rpm/SPECS/nginx.spec.in#l238).

--
Konstantin Pavlov
www.nginx.com
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Migrating from Varnish

$
0
0
Hello,

On Thu, Nov 23, 2017 at 11:52 AM, Maxim Dounin <mdounin@mdounin.ru> wrote:

> Hello!
>
> On Thu, Nov 23, 2017 at 10:24:19AM -0600, Andrei wrote:
>
> > > > - Does anyone have any recent working documentation on supported
> > > > modules/Lua scripts which can achieve wildcard purges as well as
> specific
> > > > URL purges?
> > >
> > > Cache purging is available in nginx-plus, see
> > > http://nginx.org/r/proxy_cache_purge.
> >
> > I'm aware of the paid version, but I don't have a budget for it yet, and
> > quite frankly this should be a core feature for any caching service. Are
> > there no viable options for the community release? It's a rather
> pertinent
> > feature to have in my transition
>
> I'm aware of at least one 3rd party module from Piotr Sikora,
> https://github.com/FRiCKLE/ngx_cache_purge. I've never tried to
> use it, and AFAIK it doesn't support wildcard purges. It is
> mostly known to developers as a hack that starts segfaulting on
> unrelated changes in proxy module, so obviously enough I can't
> recommend using it.
>
>
Thanks for mentioning the segfaulting issues, definitely not something I
want to run into. I saw that one, and some more details with Lua in these:

https://scene-si.org/2017/01/08/improving-nginx-lua-cache-purges/
https://scene-si.org/2016/11/02/purging-cached-items-from-nginx-with-lua/
http://syshero.org/post/68479556365/nginx-passive-cache-invalidation

From what I'm seeing available, it looks as though my best bet is Lua, or
pushing all the purge requests to a custom backend service that's going to
queue/handle the file removals. Redis tracking also comes to mind since I'm
going to be doing live stats for the traffic so that's another hop I have
to factor in. With these options I'm thinking of doing a cache zone per
domain, or perhaps group of domains. Are there any performance impacts from
having for example tens or hundreds of cache zones defined?

Note though that I personally think that cache purging is
> something that should _not_ be present in any caching service, and
> I wouldn't recommend using nginx-plus functionality either.
> Proper controlling of cache validity times is something that
> should be used instead. This is what happens in browsers anyway,
> and trying to "purge" things there won't work.
>

I'm sorry but I strongly disagree here. Every respectable CDN service which
offers caching, also offers purging. People want their content updated on
edge service when changes are made to their application, and they want
their applications to be able to talk to edge services. Take a busy news
site for example. When a tag/post/page is updated, they expect viewers to
be able to see it right then and there, not when cache expires. If they
wait for cache to expire, they lose viewers and $$ due to delays.


> > > Note well that by default nginx respects what is returned by the
> > > backend in various response headers, and proxy_cache_valid time
> > > only applies if there are no explicit cache validity time set, see
> > > http://nginx.org/r/proxy_ignore_headers.
> >
> > So to override the ttls set by the backend, I would have to use
> > proxy_ignore_headers for all headers which can directly affect the
> intended
> > TTL?
>
> Yes, if you want to ignore what the backend set. In many cases
> this might not be a good idea though.
>

I understand why it's not always a good idea. I have numerous checks and
balances accumulated over the years at the moment which I'm working on
porting over. Overriding backend cache headers on a granular level is
something I enjoy :)


> --
> Maxim Dounin
> http://mdounin.ru/
> _______________________________________________
> nginx mailing list
> nginx@nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx
>
_______________________________________________
nginx mailing list
nginx@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx

Re: Migrating from Varnish

$
0
0
Thanks for the tip. Have you ran into any issues as Maxim mentioned?

On Thu, Nov 23, 2017 at 11:53 AM, itpp2012 <nginx-forum@forum.nginx.org>
wrote:

> Andrei Wrote:
> -------------------------------------------------------
> > I'm aware of the paid version, but I don't have a budget for it yet,
> > and
> > quite frankly this should be a core feature for any caching service.
> > Are
> > there no viable options for the community release? It's a rather
>
> https://github.com/FRiCKLE/ngx_cache_purge/
>
> Easy to implement (add).
>
> Posted at Nginx Forum: https://forum.nginx.org/read.
> php?2,277462,277476#msg-277476
>
> _______________________________________________
> nginx mailing list
> nginx@nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx
>
_______________________________________________
nginx mailing list
nginx@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx

Re: systemd: PID file /var/run/nginx.pid not readable (yet?) after start.

$
0
0
Hello!

On Thu, Nov 23, 2017 at 09:00:07PM +0200, Gena Makhomed wrote:

> On 23.11.2017 19:13, Maxim Dounin wrote:
>
> >>>> В systemd's daemon(7) manpage очень подробно расписано
> >>>> как должны вести себя SysV Daemons при работе с systemd.
> >>>> И очевидно, что nginx этим требованиям не соответствует.
>
> >>>> Original process должен вызывать exit() только после того,
> >>>> как будет полностью завершена инициализация daemon process,
> >>>> в частности, после того как daemon process создаст свой pid файл.
>
> >>> Это, что называется, всё очень интересно, но вызывает сомнение
> >>> успех подобных рекомендаций. Особенно с учётом отсутствия
> >>> каких-либо внятных примеров того, что же использовать вместо
> >>> daemon(3). О чём я, собственно, и писал выше.
>
> >> Что использовать вместо daemon(3) документировано в daemon(7):
> >> https://www.freedesktop.org/software/systemd/man/daemon.html
>
> >> Lennart Poettering очень подробно ответил на этот вопрос в рассылке:
> >> https://lists.freedesktop.org/archives/systemd-devel/2017-November/039830.html
>
> >> Впрочем, если очень хочется использовать все-таки daemon(3) то можно:
> >> https://lists.freedesktop.org/archives/systemd-devel/2017-November/039834.html
>
> >> Кстати, Lennart Poettering нашел еще одну ошибку в исходниках nginx:
> >> https://lists.freedesktop.org/archives/systemd-devel/2017-November/039832.html
>
> > Это всё замечательно (за вычетом того, предлагаемое использование
> > daemon(3) почему-то не учитывает, что после вызова daemon(3)
> > parent-процесса уже нет, а "ошибка" - не ошибка), но не отменяет
> > того, что чуть менее, чем все существующие демоны делают именно
> > "daemon(); write_pidfile();", и при таком подходе - ситуацию не
> > изменить.
>
> А при каком подходе ситуацию c nginx изменить можно?
> Если говорить конструктивно.

Чтобы изменить ситуацию конкретно с nginx - нужно сесть и сделать
хороший патч. Очевидно, это сделать можно, и даже не очень
сложно. Я, как уже неоднократно сказал, не возражаю.

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

> Посмотрел у себя в системе, CentOS 7.4 - там достаточно мало осталось
> сервисов Type=forking. Postfix например, запускает много процессов,
> как и nginx - проверил его исходники, он действует точно так,
> как рекомендуется в документе systemd's daemon(7) manpage.
>
> О каких именно "чуть менее, чем все существующие демоны"
> сервисах Вы говорите? Есть еще кроме nginx примеры некорректного
> поведения systemd-сервисов с Type=forking которые запускают много
> дочерних процессов как это делает nginx или postfix?

Не вижу причин, почему демоны с "много дочерних процессов" должны
отличаться от сервисов с "мало дочерних процессов".

In no particular order,

- memcached, делает deamonize() (который суть daemon(3) и
завершает исходный процесс), после чего пишет pid-файл.

https://github.com/memcached/memcached/blob/master/memcached.c#L6788
https://github.com/memcached/memcached/blob/master/memcached.c#L6924

- httpd, делает apr_proc_detach() (который суть daemon(3) и тоже
завершает исходный процесс) в worker_pre_config(), и сильно
после пишет pid-файл (в worker_run()).

https://github.com/apache/httpd/blob/trunk/server/mpm/worker/worker.c#L2002
https://github.com/apache/httpd/blob/trunk/server/mpm/worker/worker.c#L1663

- Reference-реализация PEP 3143 - Standard daemon process library,
https://www.python.org/dev/peps/pep-3143/, зовётся функция
detach_process_context() (которая в свою очередь зовёт функцию с
говорящим названием fork_then_exit_parent()), потом пишется
pid-файл.

https://pagure.io/python-daemon/blob/master/f/daemon/daemon.py#_376
https://pagure.io/python-daemon/blob/master/f/daemon/daemon.py#_389

- nptd, в отсутствии опции --wait-sync (которая суть замена
ntpdate) выходит сразу после fork(), pid-файл пишется позже в
рамках getconfig().

https://github.com/ntp-project/ntp/blob/stable/ntpd/ntpd.c#L730
https://github.com/ntp-project/ntp/blob/stable/ntpd/ntpd.c#L892

Тысячи их.

[...]

--
Maxim Dounin
http://mdounin.ru/
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Migrating from Varnish

$
0
0
Andrei Wrote:
-------------------------------------------------------
> Thanks for the tip. Have you ran into any issues as Maxim mentioned?
>

Not yet.

Re: systemd: PID file /var/run/nginx.pid not readable (yet?) after start.

$
0
0
On 23.11.2017 23:00, Maxim Dounin wrote:

>>> Это всё замечательно (за вычетом того, предлагаемое использование
>>> daemon(3) почему-то не учитывает, что после вызова daemon(3)
>>> parent-процесса уже нет, а "ошибка" - не ошибка), но не отменяет
>>> того, что чуть менее, чем все существующие демоны делают именно
>>> "daemon(); write_pidfile();", и при таком подходе - ситуацию не
>>> изменить.

>> А при каком подходе ситуацию c nginx изменить можно?
>> Если говорить конструктивно.

> Чтобы изменить ситуацию конкретно с nginx - нужно сесть и сделать
> хороший патч. Очевидно, это сделать можно, и даже не очень
> сложно. Я, как уже неоднократно сказал, не возражаю.

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

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

Эта идея уже взлетела. Если демон состоит из одного процесса
- systemd может однозначно узнать его pid, проблемы могут возникать
только с теми демонами, которые состоят из нескольких процессов.
Из известных мне сервисов состоящих из более чем одного процесса:

* postfix - сделали синхронизацию и проблем с systemd больше нет.
* httpd - перевели на Type=notify и проблем с systemd больше нет.
* php-fpm - перевели на Type=notify и проблем с systemd больше нет.
* nginx - только с этим сервисом наблюдаются проблемы под systemd.

>> О каких именно "чуть менее, чем все существующие демоны"
>> сервисах Вы говорите? Есть еще кроме nginx примеры некорректного
>> поведения systemd-сервисов с Type=forking которые запускают много
>> дочерних процессов как это делает nginx или postfix?

> Не вижу причин, почему демоны с "много дочерних процессов" должны
> отличаться от сервисов с "мало дочерних процессов".

systemd однозначно определяет pid демонов состоящих из одного процесса
и поэтому для них в юнит-файле можно вообще не указывать опцию PIDFile=
- все будет работать как надо даже если они стартуют без синхронизации.

Вот что говорит Lennart Poettering из Red Hat:

If you use Type=forking, then you'll get away with not specifiying a
PID file in most cases, but it's racy as soon as you have more than
one daemon process, and nginx appears to be one of this kind, hence
please specify PIDFile=.

https://lists.freedesktop.org/archives/systemd-devel/2017-November/039833.html

--
Best regards,
Gena

_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Please take me off the mailing list

$
0
0
_______________________________________________
nginx mailing list
nginx@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx

Re: Please take me off the mailing list

$
0
0
On November 23, 2017 9:25:14 PM EST, Daniel Francis-Lyon via nginx <nginx@nginx.org> wrote:
>_______________________________________________
>nginx mailing list
>nginx@nginx.org
>http://mailman.nginx.org/mailman/listinfo/nginx

All messages have a link at the bottom. Follow it and unsubscribe yourself.
--

Thanks,

Fabian S.

OpenPGP: 3C3FA072ACCB7AC5DB0F723455502B0EEB9070FC
_______________________________________________
nginx mailing list
nginx@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx

Re: systemd: PID file /var/run/nginx.pid not readable (yet?) after start.

$
0
0
Hello!

On Fri, Nov 24, 2017 at 01:12:46AM +0200, Gena Makhomed wrote:

> On 23.11.2017 23:00, Maxim Dounin wrote:
>
> >>> Это всё замечательно (за вычетом того, предлагаемое использование
> >>> daemon(3) почему-то не учитывает, что после вызова daemon(3)
> >>> parent-процесса уже нет, а "ошибка" - не ошибка), но не отменяет
> >>> того, что чуть менее, чем все существующие демоны делают именно
> >>> "daemon(); write_pidfile();", и при таком подходе - ситуацию не
> >>> изменить.
>
> >> А при каком подходе ситуацию c nginx изменить можно?
> >> Если говорить конструктивно.
>
> > Чтобы изменить ситуацию конкретно с nginx - нужно сесть и сделать
> > хороший патч. Очевидно, это сделать можно, и даже не очень
> > сложно. Я, как уже неоднократно сказал, не возражаю.
>
> Для меня это будет слишком сложный патч, в разумные сроки не напишу.
>
> > Но сама идея, что все должны сесть и заняться выпиливанием
> > стандартного паттерна, который работал десятки лет, и делать
> > вместо это что-то своё с синхронизацией - не взлетит.
>
> Эта идея уже взлетела. Если демон состоит из одного процесса
> - systemd может однозначно узнать его pid, проблемы могут возникать
> только с теми демонами, которые состоят из нескольких процессов.
> Из известных мне сервисов состоящих из более чем одного процесса:
>
> * postfix - сделали синхронизацию и проблем с systemd больше нет.
> * httpd - перевели на Type=notify и проблем с systemd больше нет.
> * php-fpm - перевели на Type=notify и проблем с systemd больше нет.
> * nginx - только с этим сервисом наблюдаются проблемы под systemd.

Давайте, всё-таки, опеределимся: мы за всё хорошее против всего
плохого (== чтобы демоны писали pid-файлы до выхода запущенного
процесса, потому что по другому - плохо), или вопрос исключительно
в том, чтобы systemd не ругался в логи?

Если за всё хорошее - то проблема, очевидно, не ограничевается
сервисами из более чем одного процесса, и не решается переводом на
Type=notify. Она вообще ортогональна существованию systemd. И
идея её решения, очевидно, не взлетела, и уже наверное не взлетит.

Если чтобы systemd не ругался - то проблема, очевидно, не в том,
чтобы сделать хорошо, а в том, убрать конкретную ругань (которая
не несёт практического смысла, см. ниже). И предолженный ранее
workaround про sleep 0.1 - вполне себе в этом ключе же решение?

> >> О каких именно "чуть менее, чем все существующие демоны"
> >> сервисах Вы говорите? Есть еще кроме nginx примеры некорректного
> >> поведения systemd-сервисов с Type=forking которые запускают много
> >> дочерних процессов как это делает nginx или postfix?
>
> > Не вижу причин, почему демоны с "много дочерних процессов" должны
> > отличаться от сервисов с "мало дочерних процессов".
>
> systemd однозначно определяет pid демонов состоящих из одного процесса
> и поэтому для них в юнит-файле можно вообще не указывать опцию PIDFile=
> - все будет работать как надо даже если они стартуют без синхронизации.
>
> Вот что говорит Lennart Poettering из Red Hat:
>
> If you use Type=forking, then you'll get away with not specifiying a
> PID file in most cases, but it's racy as soon as you have more than
> one daemon process, and nginx appears to be one of this kind, hence
> please specify PIDFile=.
>
> https://lists.freedesktop.org/archives/systemd-devel/2017-November/039833.html

Ну вот я посмотрел на это место чуть подробнее, и имею сказать,
что это не совсем соответствует действительности. Единственное,
для чего нужен PIDFile в случае nginx'а - это чтобы systemd
нормально реагировал на binary upgrade.

Для правильного детектирования основного процесса при запуске
PIDFile не нужен, так как master-процесс - единственный, у кого
parent'ом systemd, у остальных процессов parent'ом будет master.
И соответственно все остальные процессы успешно отфильтрует вот
этот код,
https://github.com/systemd/systemd/blob/master/src/core/cgroup.c#L1727:

/* Ignore processes that aren't our kids */
if (get_process_ppid(npid, &ppid) >= 0 && ppid != mypid)
continue;

Однако если PIDFile не указывать, то "service nginx upgrade"
приведёт к тому, что после выхода старого мастера systemd будет
считать, что nginx умер, и убьёт все новые процессы. Поэтому
PIDFile указывать таки надо.

Соответственно имеем то что имеем: PIDFile указывать надо, от
этого на старте могут появляться сообщения про "PID file not ... yet?".
Сообщения эти безвредные, и ни на что не влияют, кроме собственно
появления самих сообщений.

Если идти по пути синхронизации через pipe, то патч получается
как-то такой. Не могу сказать, что он мне нравится, особенно в
контексте решения задачи "чтобы у systemd в логе стало на одну
строчку меньше".

diff -r 325b3042edd6 src/core/nginx.c
--- a/src/core/nginx.c Thu Nov 23 16:33:40 2017 +0300
+++ b/src/core/nginx.c Fri Nov 24 07:07:44 2017 +0300
@@ -361,6 +361,10 @@
return 1;
}

+ if (ngx_daemon_sync(cycle->log) != NGX_OK) {
+ return 1;
+ }
+
if (ngx_log_redirect_stderr(cycle) != NGX_OK) {
return 1;
}
diff -r 325b3042edd6 src/os/unix/ngx_daemon.c
--- a/src/os/unix/ngx_daemon.c Thu Nov 23 16:33:40 2017 +0300
+++ b/src/os/unix/ngx_daemon.c Fri Nov 24 07:07:44 2017 +0300
@@ -9,10 +9,19 @@
#include <ngx_core.h>


+static ngx_fd_t ngx_daemon_fd = NGX_INVALID_FILE;
+
+
ngx_int_t
ngx_daemon(ngx_log_t *log)
{
- int fd;
+ u_char buf[1];
+ ngx_fd_t fd, pp[2];
+
+ if (pipe(pp) == -1) {
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "pipe() failed");
+ return NGX_ERROR;
+ }

switch (fork()) {
case -1:
@@ -20,9 +29,30 @@
return NGX_ERROR;

case 0:
+ if (close(pp[0]) == -1) {
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() pipe failed");
+ return NGX_ERROR;
+ }
+
+ ngx_daemon_fd = pp[1];
break;

default:
+ if (close(pp[1]) == -1) {
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() pipe failed");
+ return NGX_ERROR;
+ }
+
+ if (read(pp[0], buf, 1) != 1) {
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "read() pipe failed");
+ return NGX_ERROR;
+ }
+
+ if (close(pp[0]) == -1) {
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed");
+ return NGX_ERROR;
+ }
+
exit(0);
}

@@ -68,3 +98,26 @@

return NGX_OK;
}
+
+
+ngx_int_t
+ngx_daemon_sync(ngx_log_t *log)
+{
+ if (ngx_daemon_fd == NGX_INVALID_FILE) {
+ return NGX_OK;
+ }
+
+ if (write(ngx_daemon_fd, "", 1) != 1) {
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "write() failed");
+ return NGX_ERROR;
+ }
+
+ if (close(ngx_daemon_fd) == -1) {
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed");
+ return NGX_ERROR;
+ }
+
+ ngx_daemon_fd = NGX_INVALID_FILE;
+
+ return NGX_OK;
+}
diff -r 325b3042edd6 src/os/unix/ngx_os.h
--- a/src/os/unix/ngx_os.h Thu Nov 23 16:33:40 2017 +0300
+++ b/src/os/unix/ngx_os.h Fri Nov 24 07:07:44 2017 +0300
@@ -40,6 +40,7 @@
ngx_int_t ngx_os_specific_init(ngx_log_t *log);
void ngx_os_specific_status(ngx_log_t *log);
ngx_int_t ngx_daemon(ngx_log_t *log);
+ngx_int_t ngx_daemon_sync(ngx_log_t *log);
ngx_int_t ngx_os_signal_process(ngx_cycle_t *cycle, char *sig, ngx_pid_t pid);



--
Maxim Dounin
http://mdounin.ru/
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Cannot build 1.12.x on MSYS2/MinGW64

$
0
0
Hi,

The build fails without this patch. Is there a chance for this to be merged to the 1.12 branch?
https://hg.nginx.org/nginx/rev/4a343228c55e

Re: systemd: PID file /var/run/nginx.pid not readable (yet?) after start.

$
0
0
On Fri, Nov 24, 2017 at 07:12:31AM +0300, Maxim Dounin wrote:
> + if (read(pp[0], buf, 1) != 1) {
> + ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "read() pipe failed");
> + return NGX_ERROR;
> + }
> +
> + if (close(pp[0]) == -1) {
> + ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed");

"close() pipe failed"

> + return NGX_ERROR;
> + }
> +
> exit(0);
> }
>
> @@ -68,3 +98,26 @@
>
> return NGX_OK;
> }
> +
> +
> +ngx_int_t
> +ngx_daemon_sync(ngx_log_t *log)
> +{
> + if (ngx_daemon_fd == NGX_INVALID_FILE) {
> + return NGX_OK;
> + }
> +
> + if (write(ngx_daemon_fd, "", 1) != 1) {
> + ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "write() failed");

"write() pipe failed"

> + return NGX_ERROR;
> + }
> +
> + if (close(ngx_daemon_fd) == -1) {
> + ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed");

"close() pipe failed"

> + return NGX_ERROR;

Можно ещё заменить "pp" на "sync_fd" / "sync_pipe".
--
Eugene Berdnikov
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

ngx_http_upstream_test_next u->peer.tries > 1

$
0
0
assume all servers always fail in upstream

nginx would call ngx_http_upstream_next when u->peer.tries > 1, and call ngx_http_upstream_finalize_request directly when u->peer.tries == 1

it would not pass NGX_PEER_FAILED to u->peer.free

so how peer->fails increase when last retry fail?

Re: systemd: PID file /var/run/nginx.pid not readable (yet?) after start.

$
0
0
Прошу прощения за то, что вставляю свои пять копеек, но у меня, почему-то, на
Gentoo NgX вполне замечательно стартует на SystemD без ругани, на которую
жалуется ОП:

```
ноя 24 12:12:24 note systemd[1]: Starting The nginx HTTP and reverse proxy
server...
ноя 24 12:12:25 note nginx[17684]: nginx: the configuration file /etc/nginx/
nginx.conf syntax is ok
ноя 24 12:12:25 note nginx[17684]: nginx: configuration file /etc/nginx/
nginx.conf test is successful
ноя 24 12:12:25 note systemd[1]: Started The nginx HTTP and reverse proxy
server.
```

Код nginx.service при этом такой:
```
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -QUIT $MAINPID

[Install]
WantedBy=multi-user.target
```

В связи с этим у меня возникает вопрос: а что я, собственно, делаю не так?
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

RE: Nginx + SSL problem for old browsers

$
0
0
> Could this be because of the lack of SNI support on old browsers?

It's possible.
But you should be able to tell on the client itself - if there is ssl cert domain mismatch or the client can't connect at all.

Imo the easiest way to check https://www.ssllabs.com/ssltest/

p.s. newer Openssl (1.1.x) versions by default disable weak ciphers. So depending on how your nginx/openssl is compiled the actual cipher list might be different to the configuration line.

rr

_______________________________________________
nginx mailing list
nginx@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx

Re: systemd: PID file /var/run/nginx.pid not readable (yet?) after start.

$
0
0
On 24.11.2017 6:12, Maxim Dounin wrote:

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

>> Эта идея уже взлетела. Если демон состоит из одного процесса
>> - systemd может однозначно узнать его pid, проблемы могут возникать
>> только с теми демонами, которые состоят из нескольких процессов.
>> Из известных мне сервисов состоящих из более чем одного процесса:

>> * postfix - сделали синхронизацию и проблем с systemd больше нет.
>> * httpd - перевели на Type=notify и проблем с systemd больше нет.
>> * php-fpm - перевели на Type=notify и проблем с systemd больше нет.
>> * nginx - только с этим сервисом наблюдаются проблемы под systemd.

> Давайте, всё-таки, опеределимся: мы за всё хорошее против всего
> плохого (== чтобы демоны писали pid-файлы до выхода запущенного
> процесса, потому что по другому - плохо), или вопрос исключительно
> в том, чтобы systemd не ругался в логи?

Так ведь systemd и ругается в логи потому что по другому - плохо.
Например, команда "/etc/init.d/nginx start ; /etc/init.d/nginx stop"
будет глючить на системах, где nginx запускается в виде SysV сервиса.

> Если за всё хорошее - то проблема, очевидно, не ограничевается
> сервисами из более чем одного процесса, и не решается переводом на
> Type=notify. Она вообще ортогональна существованию systemd. И
> идея её решения, очевидно, не взлетела, и уже наверное не взлетит.

В MacOS X есть launchd - там сервисам вообще запрещено делать fork()
и вызывать функцию daemon() - и ничего, никто еще умер, все работает.
https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html

systemd - это такой же launchd, но для системы Linux. Только для своих
конфигурационных файлов он использует ini синтаксис вместо формата xml
и небезуспешно пытается быть обратно совместимым со старыми SysV Daemons

Но свои специфичные требования к сервисам есть и у systemd:
https://www.freedesktop.org/software/systemd/man/daemon.html

15. Call exit() in the original process. The process that invoked
the daemon must be able to rely on that this exit() happens
after initialization is complete and all external communication
channels are established and accessible.

Одним из таких communication channels как раз и является pid-файл.

> Если чтобы systemd не ругался - то проблема, очевидно, не в том,
> чтобы сделать хорошо, а в том, убрать конкретную ругань (которая
> не несёт практического смысла, см. ниже). И предолженный ранее
> workaround про sleep 0.1 - вполне себе в этом ключе же решение?

sleep 0.1 - это race condition на ровном месте, плохой workaround.
Лучше будет если такого workaround`а в unit-файлах nginx не делать.

Когда команда "/etc/init.d/nginx start ; /etc/init.d/nginx stop"
глючит - это ведь отрицательно сказывается на репутации nginx.
И эта проблема вообще ортогональна существованию systemd.

>> systemd однозначно определяет pid демонов состоящих из одного процесса
>> и поэтому для них в юнит-файле можно вообще не указывать опцию PIDFile=
>> - все будет работать как надо даже если они стартуют без синхронизации.
>>
>> Вот что говорит Lennart Poettering из Red Hat:
>>
>> If you use Type=forking, then you'll get away with not specifiying a
>> PID file in most cases, but it's racy as soon as you have more than
>> one daemon process, and nginx appears to be one of this kind, hence
>> please specify PIDFile=.
>>
>> https://lists.freedesktop.org/archives/systemd-devel/2017-November/039833.html
>
> Ну вот я посмотрел на это место чуть подробнее, и имею сказать,
> что это не совсем соответствует действительности. Единственное,
> для чего нужен PIDFile в случае nginx'а - это чтобы systemd
> нормально реагировал на binary upgrade.
>
> Для правильного детектирования основного процесса при запуске
> PIDFile не нужен, так как master-процесс - единственный, у кого
> parent'ом systemd, у остальных процессов parent'ом будет master.
> И соответственно все остальные процессы успешно отфильтрует вот
> этот код,
> https://github.com/systemd/systemd/blob/master/src/core/cgroup.c#L1727:
>
> /* Ignore processes that aren't our kids */
> if (get_process_ppid(npid, &ppid) >= 0 && ppid != mypid)
> continue;
>
> Однако если PIDFile не указывать, то "service nginx upgrade"
> приведёт к тому, что после выхода старого мастера systemd будет
> считать, что nginx умер, и убьёт все новые процессы. Поэтому
> PIDFile указывать таки надо.
>
> Соответственно имеем то что имеем: PIDFile указывать надо, от
> этого на старте могут появляться сообщения про "PID file not ... yet?".
> Сообщения эти безвредные, и ни на что не влияют, кроме собственно
> появления самих сообщений.
>
> Если идти по пути синхронизации через pipe, то патч получается
> как-то такой. Не могу сказать, что он мне нравится, особенно в
> контексте решения задачи "чтобы у systemd в логе стало на одну
> строчку меньше".

Есть проблема "/etc/init.d/nginx start ; /etc/init.d/nginx stop"
на старых системах, использующих SysV систему инициализации.

И есть еще проблема не полной совместимости nginx с требованиями,
которые systemd предъявляет к SysV Daemons - это имиджевая проблема.

Сообщение "PID file not ... yet?" - это только следствие этих проблем.

--
Best regards,
Gena

_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru
Viewing all 53287 articles
Browse latest View live