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 daemon

แก้ไข 2014/01/07

นี่เป็นเอาต์พุตของps -ef | grep nginxดูเหมือนว่า nginx daemon ยังคงทำงานอยู่

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คำสั่ง
เตารีดและ

คำตอบ:


37

ฉันจะแนะนำให้หยุด nginx โดยฆ่ามันเป็นกระบวนการหลักก่อน nginx ไม่ได้ปิดอย่างถูกต้องอาจเป็นเพราะมันไม่สามารถหยุดใช้สคริปต์เริ่มต้น

ps -ef | grep nginx

นี่จะแสดง PID ของกระบวนการต้นแบบ nginx เหมือนที่คุณกล่าวไว้ข้างต้น:

root 19506 1 0 2013? 00:00:00 nginx: กระบวนการหลัก / usr / sbin / nginx -c /etc/nginx/nginx.conf

ฆ่ามันโดยใช้

kill -9 19506

ตรวจสอบอีกครั้งว่ามีกระบวนการ nginx ใด ๆ ที่กำลังทำงานอยู่หรือพอร์ต 80 ถูกครอบครอง หากคุณเห็นกระบวนการใด ๆ ที่เชื่อมกับพอร์ต 80 ให้ระบุ PID และตรวจสอบว่าสามารถถูกฆ่าได้หรือไม่

ps -ef | grep nginx

netstat -tulpn | grep 80

ตรวจสอบให้แน่ใจว่าระบบไฟล์นั้นใช้ได้และคุณสามารถอ่าน / เขียนไปยัง / var ระบบไฟล์ได้ จากนั้นเริ่ม nginx

เริ่มบริการ nginx


ขอบคุณ! หลังจากที่ฆ่ากระบวนการต้นแบบฉันต้องฆ่าและกระบวนการของคนงาน nginx ด้วย จากนั้นฉันก็สามารถเริ่ม nginx daemon
เตารีดและ

คุณได้ช่วยชีวิต Sandeep ตอนนี้! ขอบคุณมากสำหรับการบันทึก ..
ทะเล

ขอบคุณ @ 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/เป็น symlink ของ/run/
Z. Zlatev

ใช่แล้วนั่นไม่ใช่ทางออกเลย แต่ในกรณีของฉันทุกอย่างคือ /run/nginx.pid
อันตราย 89

nginx.conf ของฉันมีบันทึก pid / nginx.pid อยู่ - เปลี่ยนเป็น /run/nginx.pid และได้รับการแก้ไขขอบคุณ Patrick!
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ระบุไว้ในสองไฟล์ conf ที่แตกต่างกัน หลังจากที่ฉันลบหนึ่งการอ้างอิงแล้วลบ.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

ปิดเว็บเซิร์ฟเวอร์อื่นอย่างถูกต้อง (เนื่องจากหากวางไข่ออกจากการพุ่งพรวดขึ้นมาการ 'kill' ปกติอาจไม่ทำงาน) และลองเริ่ม ngnix หากเป็นเช่นนั้นคุณสามารถ / ควรแก้ไขสคริปต์เริ่มต้นเพื่อหยุดเว็บเซิร์ฟเวอร์อื่นไม่ให้เริ่มต้นหรือปรับการกำหนดค่าด้วยพลังงานอื่น


ขอบคุณสำหรับความช่วยเหลือของคุณ. แสดงให้เห็นว่าnetstat -tulpn tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 19507/nginxดังนั้น nginx ก็ครอบครองพอร์ตนั้น แต่ดังที่แซนดีพกล่าวว่าฉันฆ่ากระบวนการ 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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.