Nginx не может остановиться и отсутствует nginx.pid

33

Я хочу остановить Nginx, но он так не работает.

$ sudo service nginx stop
Stopping nginx:                                            [FAILED]

И nginx.confэто определяет место nginx.pid есть строка.

# /etc/nginx/nginx.conf
pid        /var/run/nginx.pid;

Но нет nginx.pidв каталоге /var/run/.

locate nginx.pid показывает этот вывод.

/var/run/nginx.pid 
/var/run/nginx.pid.oldbin

Но после не updatedbнайдется совпадений для поиска. Я использую nginx / 1.4.4 в CentOS release 6.5 (Final).

Что я должен сделать, чтобы остановить демон nginx?

Редактировать 2014/01/07

Это вывод ps -ef | grep nginx, кажется, демон nginx все еще работает.

ironsand 17065 16933  0 15:55 pts/0    00:00:00 grep --color nginx
root     19506     1  0  2013 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
ironsand 19507 19506  0  2013 ?        00:00:25 nginx: worker process  

И sudo service nginx restartдает эту ошибку. Я думаю, что nginxне запускается, потому что старый еще жив. И /var/log/nginx/error.log-2014017содержит также эту ошибку.

Stopping nginx:                                            [FAILED]
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
                                                           [FAILED]
Ironsand
источник
3
Система не может остановить nginx, если он не запущен и, поскольку PID-файл отсутствует, я подозреваю, что он уже остановлен. Вы можете проверить с помощью ps -ef | grep nginxили sudo netstat -tlnp | grep nginx.
Ладададада
1
Спасибо за совет. Я добавил результат psкоманды.
Айронсанд

Ответы:

37

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

ps -ef | grep nginx

Это покажет вам PID основного процесса nginx. Как вы упомянули выше:

корень 19506 1 0 2013? 00:00:00 nginx: основной процесс / usr / sbin / nginx -c /etc/nginx/nginx.conf

Убей его, используя

убить -9 19506

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

ps -ef | grep nginx

netstat -tulpn | grep 80

убедитесь, что с файловой системой все в порядке, и вы можете читать / записывать в / var файловую систему. Затем запустите nginx

сервис nginx start

sandeep.s85
источник
Благодарность! После уничтожения главного процесса мне пришлось также уничтожить рабочий процесс nginx. Тогда я наконец смогу запустить демон nginx.
Айронсанд
Ты спас душу только сейчас, Сандип! Большое спасибо за документирование ..
Thale
Спасибо @ sandeep.s85. Мне тоже полезно. Интересно, что может привести к отсутствию файла nginx.pid во время работы nginx?
Codemonkey
Это только что повторилось для меня, я хотел бы знать, что вызывает это.
Codemonkey
Мой основной процесс nginx возвращается к жизни после того, как я его убью.
WTIFS
11

проблема

Для меня имя файла pid было разным в этих двух файлах:

  • /usr/lib/systemd/system/nginx.service
    • pid /var/run/nginx.pid;
  • /etc/nginx/nginx.conf
    • PIDFile=/run/nginx.pid

Эти два должны соответствовать.

Fix:

Поэтому я настроил его в /usr/lib/systemd/system/nginx.service, а затем сделал:

systemctl daemon-reload
systemctl start nginx

Тогда это подошло правильно.

Патрик Боос
источник
3
Как придешь? В Ubuntu /var/run/есть символическая ссылка/run/
Z. Zlatev
Да, так что это не решение вообще. Но в моем случае все это /run/nginx.pid.
danger89
В моем nginx.conf были pid logs / nginx.pid - он был изменен на /run/nginx.pid и исправлен, спасибо, Патрик!
phpguru
9

У меня была эта проблема, и бег ps -ef | grep nginxпоказывал мне рабочих, которые продолжали набирать обороты, несмотря на то, что убивали мастер-процесс, как было предложено в принятом ответе:

[~]# ps -ef | grep nginx
nginx    10730     1  0 Sep14 ?        00:00:16 nginx: cache manager process            
nginx    18469     1  0 Oct09 ?        00:11:02 nginx: worker process                   
nginx    25779     1  0 Oct13 ?        00:01:31 nginx: worker process                   
nginx    26458     1  0 15:45 ?        00:00:00 nginx: worker process    

Поэтому мое решение исправить это было просто так:pkill nginx && service nginx restart

amurrell
источник
1

Моя проблема заключалась в том, что я pidуказал в двух разных файлах conf. После того, как я удалил одну ссылку, затем удалил .pidфайл и снова запустил nginx, он начал работать нормально.

matthewdaniel
источник
Да, этот PID определен в /usr/lib/systemd/system/nginx-debug.service и /etc/nginx/nginx.conf
edmondscommerce
0

Похоже, это указывает на то, что nginx сразу падает, если он был запущен ранее. Вы проверили содержимое, /var/log/nginx*чтобы увидеть, что делает процесс?

РЕДАКТИРОВАТЬ: Кроме того, если вы сообщите нам свою ОС и версию nginx, мы можем дать более подробные ответы.

zymhan
источник
0

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

Попробуйте netstat -tulpn- Вы ищете запись под локальным адресом, которая заканчивается на: 80 - это также даст вам имя программы и PID, чтобы вы могли ее идентифицировать. Вот мой - я использую lighttpd, и он показан на 3-й строке.

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:5000          0.0.0.0:*               LISTEN      4684/rtorrent
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      923/php-fpm.conf)
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      972/lighttpd
tcp        0      0 0.0.0.0:6901            0.0.0.0:*               LISTEN      4684/rtorrent
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      720/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      720/sshd
udp        0      0 0.0.0.0:6881            0.0.0.0:*                           4684/rtorrent

Правильно завершите работу другого веб-сервера (поскольку, если он запускается с помощью upstart, обычное 'kill' может не сработать) и попробуйте запустить ngnix Если это так, вы можете / должны затем отредактировать свои сценарии инициализации, чтобы остановить запуск другого веб-сервера, или настроить его конфигурацию на другом уровне.

Подмастерье
источник
Спасибо за вашу помощь. netstat -tulpnпоказывает tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 19507/nginx. Так что каким-то образом nginx занял этот порт. Но как сказал sandeep, я убил процесс nginx, тогда он работает. Я ценю вашу помощь!
утюг и
0

У меня была похожая проблема с Ubuntu 10.10 и скомпилированной версией nginx, работающей в / opt / nginx / sbin.

проверьте оба файла /opt/nginx/conf/nginx.conf и /etc/nginx/nginx.conf и убедитесь, что они совпадают.

Настройте /etc/init.d/nginx файл запуска, чтобы он соответствовал тесту местоположения nginx.pid, используя:

sudo /etc/init.d/nginx configtest # should show no failures
sudo /etc/init.d/nginx start      # should show starting
sudo /etc/init.d/nginx status     # should show running
sudo /etc/init.d/nginx stop       # should show stopping -- (wait for a few)
sudo /etc/init.d/nginx status     # should show can not access PID file for nginx
sudo netstat -tap  # should not show nginx program running with open local address
Пит Уильямс
источник
0

Чтобы остановить nginx, проверьте руководство, как это сделать man nginx.

По умолчанию следует использовать сигнал остановки с nginx -s stop.

Должно быть так просто на самом деле. Ваши варианты:

stop, quit, reopen, reload.
прости
источник