У меня есть сервер, который близок к новому, и у меня проблема с запуском 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
Я проверил разрешения для nginx.conf, и они в порядке (такие же, как рабочий сервер). Дважды проверил, что www-data имеет доступ к файлам журнала и тому подобное, и это действительно так.
Файл /etc/init.d/nginx одинаков на обоих серверах, как и используемая команда (см. Выше)
Файлы журнала существуют
www-данные пользователя / группы существуют
Ubuntu 12.04 LTS
nginx 1.6
Запуск запрошенной службы sudo strace nginx запускается на каждом сервере. За исключением первого фрагмента ниже, единственными различиями, которые я видел между запуском на двух разных серверах, были такие, как указатели и PID. Я добавил две строки в наборе, которые отличаются ***
==== Тот, который работает
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