Nginx không dừng lại và nginx.pid bị mất


33

Tôi muốn ngăn Nginx nhưng thất bại như thế này.

$ sudo service nginx stop
Stopping nginx:                                            [FAILED]

nginx.confnơi đó xác định vị trí của nginx.pid có một dòng.

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

Nhưng không có nginx.pidtrong thư mục /var/run/.

locate nginx.pid cho thấy đầu ra này.

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

Nhưng sau khi updatedbkhông có kết quả tìm kiếm. Tôi đang sử dụng nginx / 1.4.4 in CentOS release 6.5 (Final).

Tôi nên làm gì để ngăn chặn nginx daemon?

Chỉnh sửa 2014/01/07

Đây là đầu ra của ps -ef | grep nginx, có vẻ như nginx daemon vẫn đang chạy.

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đưa ra lỗi này. Tôi nghĩ nginxkhông bắt đầu vì người cũ vẫn còn sống. Và /var/log/nginx/error.log-2014017cũng chứa lỗi này.

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
Hệ thống không thể dừng nginx nếu nó không chạy và vì không có tệp PID, tôi nghi ngờ nó đã bị dừng. Bạn có thể kiểm tra với ps -ef | grep nginxhoặc sudo netstat -tlnp | grep nginx.
Ladadadada

1
Cảm ơn lời khuyên của bạn. Tôi đã thêm kết quả của pslệnh.
ironsand

Câu trả lời:


37

Tôi sẽ khuyên bạn nên dừng nginx bằng cách giết quá trình chính trước. Nginx không được tắt đúng cách có thể là do không thể dừng sử dụng init script.

ps -ef | grep nginx

Điều này sẽ cho bạn thấy quy trình tổng thể của nginx. Giống như bạn đã đề cập ở trên:

gốc 19506 1 0 2013? 00:00:00 nginx: quy trình tổng thể / usr / sbin / nginx -c /etc/nginx/nginx.conf

Giết nó bằng cách sử dụng

giết -9 19506

Xác minh một lần nữa xem có quá trình nginx nào đang chạy hay cổng 80 bị chiếm dụng hay không. Nếu bạn thấy bất kỳ quá trình nào được liên kết với cổng 80, hãy xác định PID và kiểm tra xem nó có thể bị giết không.

ps -ef | grep nginx

netstat -tulpn | grep 80

đảm bảo hệ thống tập tin tốt và bạn có thể đọc / ghi vào hệ thống tập tin / var. Sau đó bắt đầu nginx

dịch vụ bắt đầu


Cảm ơn! Sau khi giết quy trình chủ, tôi phải giết cả quy trình công nhân nginx. Sau đó tôi cuối cùng có thể bắt đầu nginx daemon.
ironsand

Bạn đã cứu một linh hồn ngay bây giờ Sandeep! Cảm ơn rất nhiều vì đã làm tài liệu ..
Thale

Cảm ơn @ sandeep.s85. Hữu ích cho tôi quá. Không quan tâm điều gì sẽ khiến tập tin nginx.pid bị thiếu trong khi nginx đang chạy?
Codemonkey

Điều này vừa xảy ra một lần nữa đối với tôi, tôi ước tôi biết nguyên nhân gây ra nó.
Codemonkey

Quá trình chủ nginx của tôi trở lại để sống sau khi tôi giết nó.
WTIFS

11

Vấn đề

Đối với tôi, tên tệp pid khác nhau trong hai tệp đó:

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

Hai người cần phải hợp nhau.

Sửa chữa:

Vì vậy, tôi đã điều chỉnh nó trong /usr/lib/systemd/system/nginx.service và sau đó đã làm:

systemctl daemon-reload
systemctl start nginx

Sau đó, nó đi lên chính xác.


3
Làm thế nào mà? Trong Ubuntu /var/run/là một liên kết tượng trưng của/run/
Z. Zlatev

Vâng, đó không phải là một giải pháp. Nhưng trong trường hợp của tôi, tất cả mọi thứ là /run/nginx.pid.
nguy hiểm89

Nginx.conf của tôi có nhật ký pid / nginx.pid trong đó - đã đổi thành /run/nginx.pid và nó đã được sửa, cảm ơn Patrick!
phpguru

9

Tôi gặp vấn đề này và việc chạy ps -ef | grep nginxsẽ cho tôi thấy các công nhân sẽ tiếp tục quay cuồng, mặc dù giết chết quy trình tổng thể theo đề xuất của câu trả lời được chấp nhận:

[~]# 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    

Vì vậy, giải pháp của tôi để khắc phục nó chỉ đơn giản là thế này:pkill nginx && service nginx restart


1

Vấn đề của tôi là tôi đã pidchỉ định trong hai tập tin conf khác nhau. Sau khi tôi xóa một tham chiếu, sau đó xóa .pidtệp và bắt đầu lại nginx, nó bắt đầu hoạt động bình thường.


Đúng cái này, PID được định nghĩa trong /usr/lib/systemd/system/nginx-debug.service và
/etc/nginx/nginx.conf

0

Điều này dường như cho thấy nginx đang bị sập ngay lập tức, nếu nó đã được bắt đầu sớm hơn. Bạn đã kiểm tra nội dung của /var/log/nginx*để xem những gì quá trình đang làm?

EDIT: Ngoài ra, nếu bạn cho chúng tôi biết hệ điều hành và phiên bản nginx của bạn, chúng tôi có thể đưa ra câu trả lời chi tiết hơn.


0

Tôi cần thêm thông tin để chắc chắn, nhưng tôi đoán bạn đã có một máy chủ web khác đang chạy chứ không phải là ví dụ của ngnix bạn muốn nên bạn cần tìm nó - lỗi cho biết cổng 80 đang được sử dụng, nhưng không phải bởi gì

Hãy thử netstat -tulpn- Bạn đang tìm kiếm một mục dưới địa chỉ cục bộ kết thúc bằng: 80 - điều này cũng sẽ cung cấp cho bạn tên chương trình và PID để bạn có thể xác định mục đó. Đây là của tôi - Tôi đang chạy lighttpd và nó được hiển thị trên dòng thứ 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

Tắt máy chủ web khác đúng cách (vì nếu nó xuất hiện mới bắt đầu, một 'kill' bình thường có thể không hoạt động) và thử bắt đầu ngnix. Nếu đó là trường hợp, bạn có thể / nên chỉnh sửa tập lệnh init của mình để ngăn máy chủ web khác khởi động hoặc điều chỉnh cấu hình của nó trên nguồn điện khác.


Cảm ơn bạn đã giúp đỡ. netstat -tulpncho thấy tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 19507/nginx. Vì vậy, bằng cách nào đó nginx chiếm cảng đó. Nhưng như Sandeep đã nói, tôi đã giết quá trình nginx sau đó nó hoạt động. Tôi đánh giá cao sự giúp đỡ của bạn!
ironsand

0

Tôi gặp vấn đề tương tự với Ubuntu 10.10 và một phiên bản được biên dịch của nginx đang chạy trong / opt / nginx / sbin.

kiểm tra cả hai tập tin /opt/nginx/conf/nginx.conf và /etc/nginx/nginx.conf và xác minh chúng khớp với nhau.

Điều chỉnh tập tin khởi động /etc/init.d/nginx để khớp với kiểm tra vị trí nginx.pid bằng cách sử dụng:

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

Để dừng nginx kiểm tra hướng dẫn làm thế nào để làm điều đó man nginx.

Cách mặc định sẽ là sử dụng tín hiệu dừng với nginx -s stop.

Nên đơn giản mà thực sự. Lựa chọn của bạn là:

stop, quit, reopen, reload.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.