Назад | Перейти на главную страницу

«Sudo service nginx start» не работает, но «sudo nginx» работает - не могу понять, почему

У меня есть сервер, который близок к новому, и у меня проблема с запуском nginx, как ожидалось. Я настроил другой сервер примерно таким же образом, и он там работает. Я полагаю, между ними должна быть какая-то разница в окружающей среде, но я не смог ее найти.

Краткая версия:

Starts - sudo nginx
Fails - sudo service nginx start
Fails - sudo service nginx restart
works - sudo service nginx stop

Когда команды не работают, они на самом деле ничего не говорят, кроме:

 * Restarting nginx nginx                                                [fail]

Ничего другого в файлах журнала (nginx [доступ или ошибка], системный журнал) или записано на экран

Подробнее:

Оба говорят, что файл конфигурации в порядке

sudo service nginx configtest
sudo nginx -t

==== Тот, который работает

clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fd6076a09d0) = 24394
close(4)                                = 0
*** read(3, "/run/nginx.pid\n", 128)        = 15

(… snip till the bottom…)

*** rt_sigreturn(0x11)                      = 24396
dup2(11, 2)                             = 2
close(11)                               = 0
read(10, "", 8192)                      = 0
exit_group(0)                           = ?

=============== Тот, который терпит неудачу

clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f067e79d9d0) = 21761
close(4)                                = 0
*** read(3, "/run/nginx.pid\nserver_name\n", 128) = 27

(… snip till the bottom…)

*** rt_sigreturn(0x11)                      = 21763
dup2(11, 2)                             = 2
close(11)                               = 0
read(10, "", 8192)                      = 0
exit_group(0)                           = ?

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

Как я это узнал?

Попробуйте бежать

sudo nginx

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

Это будет не очень удовлетворительный или популярный ответ, но я нашел его.

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

Поскольку у меня была временная мера запуска nginx вне выскочки, я продолжил обновлять свой сервер. Когда дело дошло до перезапуска nginx, чтобы убедиться, что он использует текущую среду, я использовал «sudo service nginx restart», чтобы остановить текущую, а затем вручную ввел команду запуска, которая не удалась в сценарии выскочки (остановка сработала, это был запуск это не удается). После того, как вы сделаете это некоторое время и резко обновите поддомены и файлы, которые будут обслуживаться вместе с другими мелочами. "sudo service nginx restart" сработал. Ни разу при ручном запуске nginx или командах «sudo service nginx restart» не выводились какие-либо ошибки / предупреждения, которые я мог найти.

Все, о чем я могу думать, это то, что должно было быть какое-то условие, которое было ниже порога для вывода любого типа ошибки или предупреждения, которое беспокоило выскочку, но не nginx. Хотя этого было достаточно, чтобы он потерпел неудачу, он не беспокоил его настолько, чтобы выдать какое-либо фактическое сообщение о том, почему он не работает. А-а!

Файлы журналов и родительские каталоги принадлежат или доступны для чтения www-data? Файлы, каталоги и родительские каталоги, которые вы хотите обслуживать, принадлежат или доступны для чтения www-data?

Вы можете попробовать strace. Если да, запустите:

sudo strace service nginx start

что даст много результатов. Где-то ближе к концу вы, вероятно, увидите ошибку разрешения. Возможно, будет проще сохранить вывод strace в файл и выполнить через него grep.

Другой вариант - переключиться на www-data user и посмотрите, возникают ли у вас какие-либо ошибки при ручном чтении / записи файлов журнала или чтении других файлов, которые вы хотите обслуживать. Даже если www-data у вас плохая оболочка, вы можете:

sudo su -s /bin/bash www-data

Если ты бежишь whoami в этой оболочке он должен сказать www-data.

Вы можете попробовать использовать следующее задание Upstart и посмотреть, имеет ли это значение:

description "nginx - small, powerful, scalable web/proxy server"

start on filesystem and static-network-up
stop on runlevel [016] or unmounting-filesystem or deconfiguring-networking

expect fork
respawn

pre-start script
    [ -x /usr/sbin/nginx ] || { stop; exit 0; }
    exec /usr/sbin/nginx -q -t -g 'daemon on; master_process on;'
end script

exec /usr/sbin/nginx -g 'daemon on; master_process on;'

pre-stop exec /usr/sbin/nginx -s quit

https://bitbucket.org/CameronNemo/upstart-jobs/src/5248c9e3e0f5343bc856ccde380e78c539fbfbe9/nginx.conf?at=master