Nginx не стартует, но проверка конфига не показывает ошибок?
Nginx 1.12.0, Linux RH 7.2
Установил, сделал конфиг - проверка конфига выдает что все ок:
nginx: the configuration file /etc/nginx/conf.d/ev1.conf syntax is ok
nginx: configuration file /etc/nginx/conf.d/ev1.conf test is successful
Запускаю, выдает ошибку:
systemctl start nginx.service
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
смотрю логи:
Starting nginx - high performance web server...
nginx: [emerg] "events" directive is not allowed here in /etc/nginx/conf.d/ev1.conf:1
nginx: configuration file /etc/nginx/nginx.conf test failed
nginx.service: control process exited, code=exited status=1
Запускаю со стандартным конфигом - запускается без ошибок. Возвращаю конфиг - снова ошибки. Как понять что не так с конфигом (тест конфига проходит нормально).
А вы проверяйте не один отдельно взятый, а делайте nginx -t и проверяйте все конфиги. Судя по всему у вас этот конфиг инклюдится из другого и тогда приходит нарушение расположения директивы.
events может быть только в main, а вы засунули куда-нибудь внутрь конфигов хостов.
переносите в nginx.conf или инклюдьте из верного места в nginx.conf.
nginx стартует от рута и потом понижает свои права, так как мэйнтейнеры всех дистрибутивов ленивы и не используют setcap, что бы разрешить nginx'у биндиться на порты 1-1024. Ваш совет не имеет смысла.
Erelecano Oioraen: ой да ладно, не говорите за всех. дефолтный конфиг от убунты 16.04.2 годичной давности.
За старт несистемных демонов от рута руки еще в детском садике должны отбивать.
вопрос2: а вы чем пользуетесь ??
***@srv3:~$ systemctl cat nginx.service
# /lib/systemd/system/nginx.service
# Stop dance for nginx
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the nginx process.
# If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[Unit]
Description=A high performance web server (www-data)
After=network.target
[Service]
User=www-data
Group=www-data
Type=forking
PIDFile=/run/nginx.pid
PermissionsStartOnly=true
#ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStartPre=/bin/touch /run/nginx.pid
ExecStartPre=/bin/chown www-data:www-data /run/nginx.pid
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
pfg21: а теперь посмотрите что делает nginx -g. А именно стартует родительский процесс от рута, что бы открыть порты и понижает детям права, делая их www-data. Ну сделайте вы ps aufxw|grep nginx и обнаружьте, что папа запускается от рута.
Для того, что бы запускаться не от рута нужно сделать cap_net_bind_service=+ep /usr/bin/nginx и пускать его сразу от пользователя, без -g.
pfg21: еще раз, для тех кто на бронепоезде. Посмотрите от кого у вас запущен родительский процесс. Без рута или cap_net_bind_service=+ep вы не сможете занять 80 и 443 порты.
Как я уже писал это обходится при помощи setcap, все думаю, что надо бы собрать nginx под Debian/Ubuntu с ним, что бы и родитель не под рутом пускался, но руки не доходят. Самого раздражает, что всем кто работает с портами 1-1024 нужен рутовый родитель и что мэйнтейнеры не используют setcap.
pfg21: дело не в том, что не хотят, дело в том, что им лень. Обычная костность мышления. А под пересобрать собственно примерно это и имелось в виду. Собрать свой пакет так, что бы оно шло с setcap из коробки, ну и подправить дефолтный конфиг и прочее.
Erelecano Oioraen: поковырял тут systemd, в нем оказывается есть поддержка capablies
как понимаю надо просто дописать строчку в сервис
------------ man systemd.exec
CapabilityBoundingSet=
Controls which capabilities to include in the capability bounding set for the executed process. See capabilities(7) for details. Takes a whitespace-separated list of capability names as read by cap_from_name(3), e.g. CAP_SYS_ADMIN, CAP_DAC_OVERRIDE, CAP_SYS_PTRACE. Capabilities listed will be included in the bounding set, all others are removed. If the list of capabilities is prefixed with "~", all but the listed capabilities will be included, the effect of the assignment inverted. Note that this option also affects the respective capabilities in the effective, permitted and inheritable capability sets, on top of what Capabilities= does. If this option is not used, the capability bounding set is not modified on process execution, hence no limits on the capabilities of the process are enforced. This option may appear more than once, in which case the bounding sets are merged. If the empty string is assigned to this option, the bounding set is reset to the empty capability set, and all prior settings have no effect. If set to "~" (without any further argument), the bounding set is reset to the full set of available capabilities, also undoing any previous settings.
pfg21: надо будет посмотреть, спасибо за наводку. Если systemd умеет работать с capabilities, так еще проще все делается. Как будет время и силы гляну, если сделаю, то напишу.
Всем спасибо, проблема оказалась в том что в главном конфиге который в /etc/nginx/nginx.conf были секции которые дублировались в конфиге /etc/nginx/conf.d/ev1.conf