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

Nginx не останавливается, а nginx.pid отсутствует

Я хочу остановить 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]

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

пс -ef | grep nginx

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

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

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

kill -9 19506

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

пс -ef | grep nginx

netstat -tulpn | grep 80

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

запуск службы nginx

Проблема

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

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

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

Исправить:

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

systemctl daemon-reload
systemctl start nginx

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

У меня была эта проблема, и я бегу 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

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

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

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

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

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

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

Выключите другой веб-сервер должным образом (поскольку, если его порождение происходит от выскочки, обычное «уничтожение» может не сработать) и попробуйте запустить ngnix. Если это так, вы можете / должны отредактировать свои сценарии инициализации, чтобы остановить запуск другого веб-сервера, или настроить его конфигурацию на другом источнике питания.

У меня была аналогичная проблема с 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

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

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

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

stop, quit, reopen, reload.

Попробуй это:

sudo fuser -k 443/tcp
sudo fuser -k 80/tcp

Нашел здесь: https://www.digitalocean.com/community/questions/nginx-is-unable-to-bind-to-443