Nginx gagal berhenti dan nginx.pid hilang

33

Saya ingin menghentikan Nginx tetapi gagal seperti ini.

$ sudo service nginx stop
Stopping nginx:                                            [FAILED]

Dan nginx.confitu mendefinisikan tempat nginx.pid memiliki garis.

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

Tetapi tidak ada nginx.piddalam direktori /var/run/.

locate nginx.pid menunjukkan output ini.

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

Tetapi setelah updatedbitu tidak ada kecocokan untuk pencarian. Saya menggunakan nginx / 1.4.4 in CentOS release 6.5 (Final).

Apa yang harus saya lakukan untuk menghentikan daemon nginx?

Edit 2014/01/07

Ini adalah output ps -ef | grep nginx, sepertinya daemon nginx masih berjalan.

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  

Dan sudo service nginx restartmemberikan kesalahan ini. Saya pikir nginxgagal memulai karena yang lama masih hidup. Dan /var/log/nginx/error.log-2014017juga mengandung kesalahan ini.

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]
pasir besi
sumber
3
Sistem tidak dapat menghentikan nginx jika tidak berjalan dan karena tidak ada file PID, saya curiga sudah berhenti. Anda dapat memeriksa dengan ps -ef | grep nginxatau sudo netstat -tlnp | grep nginx.
Ladadadada
1
Terima kasih atas saranmu. Saya menambahkan hasil psperintah.
ironsand

Jawaban:

37

Saya akan merekomendasikan menghentikan nginx dengan membunuh proses masternya terlebih dahulu. Nginx tidak dimatikan dengan benar mungkin karena itu tidak dapat dihentikan menggunakan skrip init.

ps -ef | grep nginx

Ini akan menunjukkan kepada Anda PID proses master nginx. Seperti yang Anda sebutkan di atas:

root 19506 1 0 2013? 00:00:00 nginx: proses master / usr / sbin / nginx -c /etc/nginx/nginx.conf

Bunuh itu menggunakan

kill -9 19506

Verifikasi sekali lagi apakah ada proses nginx yang berjalan atau port 80 ditempati. Jika Anda melihat ada proses yang mengikat ke port 80, Identifikasi PID dan periksa apakah itu bisa dimatikan.

ps -ef | grep nginx

netstat -tulpn | grep 80

pastikan sistem file baik-baik saja dan Anda dapat membaca / menulis ke / sistem file var. Kemudian Mulai nginx

layanan mulai nginx

sandeep.s85
sumber
Terima kasih! Setelah membunuh proses master, saya harus membunuh juga proses pekerja nginx. Kemudian saya akhirnya dapat memulai dagin nginx.
ironsand
Anda menyelamatkan jiwa sekarang Sandeep! Terima kasih banyak untuk mendokumentasikan ..
Thale
Terima kasih @ sandeep.s85. Berguna bagi saya juga. Tidak tertarik apa yang akan menyebabkan file nginx.pid hilang saat nginx berjalan?
Codemonkey
Ini baru saja terjadi lagi untuk saya, saya berharap saya tahu apa yang menyebabkannya.
Codemonkey
Proses master nginx saya kembali hidup setelah saya membunuhnya.
WTIFS
11

Masalah

Bagi saya nama file pid berbeda dalam dua file:

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

Keduanya harus cocok.

Memperbaiki:

Jadi saya menyesuaikannya di /usr/lib/systemd/system/nginx.service dan kemudian melakukannya:

systemctl daemon-reload
systemctl start nginx

Kemudian itu muncul dengan benar.

Patrick Boos
sumber
3
Bagaimana bisa? Di Ubuntu /var/run/adalah symlink dari/run/
Z. Zlatev
Ya jadi itu bukan solusi sama sekali. Tetapi dalam kasus saya semuanya adalah / run/nginx.pid.
hazard89
Nginx.conf saya memiliki pid logs / nginx.pid di dalamnya - berubah menjadi /run/nginx.pid dan sudah diperbaiki, terima kasih Patrick!
phpguru
9

Saya memiliki masalah ini, dan berlari ps -ef | grep nginxakan menunjukkan kepada saya para pekerja yang akan terus berputar, meskipun membunuh proses master seperti yang disarankan oleh jawaban yang diterima:

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

Jadi solusi saya untuk memperbaikinya hanyalah ini:pkill nginx && service nginx restart

amurrell
sumber
1

Masalah saya adalah bahwa saya telah pidmenentukan dalam dua file conf yang berbeda. Setelah saya menghapus satu referensi kemudian menghapus .pidfile dan mulai nginx lagi itu mulai berlaku normal.

matthewdaniel
sumber
Yap satu ini, PID didefinisikan dalam /usr/lib/systemd/system/nginx-debug.service dan /etc/nginx/nginx.conf
edmondscommerce
0

Ini tampaknya menunjukkan bahwa nginx langsung crash, jika sudah dimulai sebelumnya. Sudahkah Anda memeriksa konten /var/log/nginx*untuk melihat apa yang sedang dilakukan?

EDIT: Juga, jika Anda memberi tahu kami OS dan versi nginx Anda, kami dapat memberikan jawaban yang lebih terperinci.

zymhan
sumber
0

Saya membutuhkan lebih banyak informasi untuk memastikan tetapi, saya kira Anda sudah memiliki server web lain yang berjalan daripada contoh ngnix yang Anda inginkan sendiri sehingga Anda perlu menemukannya - kesalahan mengatakan port 80 sedang digunakan, tetapi tidak dengan apa

Coba netstat -tulpn- Anda sedang mencari entri di bawah alamat lokal yang berakhir dengan: 80 - ini juga akan memberi Anda nama program dan PID sehingga Anda dapat mengidentifikasinya. Ini milik saya - Saya menjalankan lighttpd dan ditunjukkan pada baris ke-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

Matikan server web lain dengan benar (karena jika itu memunculkan pemula, 'bunuh' yang normal mungkin tidak berfungsi) dan coba mulai ngnix. Jika demikian, Anda dapat / harus mengedit skrip init Anda untuk menghentikan server web lain memulai, atau menyesuaikan konfigurasinya pada kekuatan lain.

Journeyman Geek
sumber
Terima kasih atas bantuan Anda. netstat -tulpnmenunjukkan tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 19507/nginx. Jadi entah bagaimana nginx menduduki port itu. Tapi seperti kata sandeep, saya membunuh proses nginx lalu berhasil. Saya menghargai bantuan Anda!
ironsand
0

Saya punya masalah serupa dengan Ubuntu 10.10 dan versi kompilasi dari nginx berjalan di / opt / nginx / sbin.

periksa kedua file /opt/nginx/conf/nginx.conf dan /etc/nginx/nginx.conf dan pastikan keduanya cocok.

Sesuaikan file /etc/init.d/nginx untuk mencocokkan dengan tes lokasi nginx.pid menggunakan:

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
Pete Williams
sumber
0

Untuk menghentikan nginx, periksa manual bagaimana melakukannya man nginx.

Cara standarnya adalah menggunakan sinyal stop dengan nginx -s stop.

Seharusnya sesederhana itu. Pilihan Anda adalah:

stop, quit, reopen, reload.
prosti
sumber