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]

3
Система не може зупинити nginx, якщо він не працює, і оскільки PID-файлу немає, я підозрюю, що він вже зупинений. Ви можете перевірити за допомогою ps -ef | grep nginxабо sudo netstat -tlnp | grep nginx.
Ladadadada

1
Дякую за вашу пораду. Я додав результат psкоманди.
ironsand

Відповіді:


37

Я порекомендую зупинити nginx, попередньо вбивши його головний процес. Nginx не працює належним чином, тому це не може бути припинено за допомогою скрипта init.

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


Спасибі! Після вбивства головного процесу мені довелося вбити також процес nginx. Тоді я можу нарешті запустити демона nginx.
ironsand

Ти врятував душу саме зараз Сандіп! Велике спасибі за документування ..
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

Ці двоє потрібно відповідати.

Виправити:

Тому я скоригував це в /usr/lib/systemd/system/nginx.service, а потім зробив:

systemctl daemon-reload
systemctl start nginx

Тоді воно підійшло правильно.


3
Як це? У Ubuntu /var/run/є симпосилання/run/
Z. Zlatev

Так, це зовсім не рішення. Але в моєму випадку все є /run/nginx.pid.
небезпека89

Мій nginx.conf мав підпис pid / 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


1

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


Так, PID визначено в /usr/lib/systemd/system/nginx-debug.service та /etc/nginx/nginx.conf
edmondscommerce

0

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

РЕДАКТУВАННЯ. Крім того, якщо ви скажете нам вашу ОС та версію nginx, ми можемо дати більш детальні відповіді.


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

Вимкніть інший веб-сервер належним чином (оскільки, якщо його нерестовина буде запущена, звичайне "вбивство" може не спрацювати) і спробуйте запустити ngnix. У такому випадку ви можете / слід відредагувати свої скрипти init, щоб зупинити запуск іншого веб-сервера або налаштувати його конфігурацію на інший режим живлення.


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

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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.