Tidak dapat memulai ulang nginx, bind () gagal (98: Alamat sudah digunakan)

9

Saya tahu topik ini ada dalam berbagai bentuk, tetapi saya mengalami kesulitan menyelesaikan masalah saya. Jika saya menjalankan service nginx restart, nginx gagal dengan log berikut:

2015/03/14 08:36:42 [emerg] 9400#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2015/03/14 08:36:42 [emerg] 9400#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2015/03/14 08:36:42 [emerg] 9400#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2015/03/14 08:36:42 [emerg] 9400#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2015/03/14 08:36:42 [emerg] 9400#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2015/03/14 08:36:42 [emerg] 9400#0: still could not bind()

Saya hanya punya satu konfigurasi pemuatan sites-enabled. Ketika saya menjalankan:

$ grep -slir "listen 80"
$ sites-available/default

Ini menunjukkan bahwa defaultkonfigurasi telah mendengarkan 80, tetapi itu tidak masalah karena tidak ada sites-enabled.

$ ps ax -o pid,ppid,%cpu,vsz,wchan,command|egrep '(nginx|PID)'
  PID  PPID %CPU    VSZ WCHAN  COMMAND
 9468     1  0.0  97188 sigsus nginx: master process /usr/sbin/nginx
 9471  9468  0.0  97328 ep_pol nginx: worker process
 9472  9468  0.0  97368 ep_pol nginx: worker process
 9693  9641  0.0   9448 pipe_w egrep --color=auto (nginx|PID)

Berikut ini netstatmenunjukkan port apa yang sedang digunakan:

$ netstat -tulpn

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      1300/master
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      9468/nginx
tcp        0      0 0.0.0.0:2812            0.0.0.0:*               LISTEN      5980/monit
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1174/mysqld
tcp        0      0 127.0.0.1:11211         0.0.0.0:*               LISTEN      1155/memcached
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      9468/nginx
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1113/sshd
tcp6       0      0 :::25                   :::*                    LISTEN      1300/master
tcp6       0      0 :::9000                 :::*                    LISTEN      9106/hhvm
tcp6       0      0 :::22                   :::*                    LISTEN      1113/sshd
udp        0      0 127.0.0.1:11211         0.0.0.0:*                           1155/memcached

Dan inilah konfigurasi lengkap saya sites-enabled(satu-satunya di sana):

server {
    listen                  443 ssl default_server;

    limit_conn              gulag 15;
    server_name             www.my-website.com;

    access_log              /home/my-website/logs/access.log;
    error_log               /home/my-website/logs/error.log info;

    root                    /home/my-website/web;
    index                   index.php index.html;

    ssl_certificate /etc/nginx/ssl/my-website.com.chained.crt;
    ssl_certificate_key /etc/nginx/ssl/my-website.com.key;
    ssl_prefer_server_ciphers On;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;

    include                 /etc/nginx/includes/my-website_redirects_https.inc;
    include                 /etc/nginx/includes/file_cache.inc;
    include                 /etc/nginx/includes/wordpress.inc;
}

server {
    listen                  80;
    server_name             my-website.com www.my-website.com;
    return                  301 https://$server_name$request_uri;
}

server {
    listen                  443;
    server_name             my-website.com;
    return                  301 https://www.$server_name$request_uri;
}

server {
    server_name
        some-other-website1.com         www.some-other-website1.com
        some-other-website2.com         www.some-other-website2.com
        some-other-website3.com         www.some-other-website3.com
        some-other-website4.com         www.some-other-website4.com
        some-other-website5.com         www.some-other-website5.com

    rewrite ^(.*)$ https://www.my-website.com/some/page/ permanent;
}

server {
    server_name
        some-other-website6.com         www.some-other-website6.com
        some-other-website7.com         www.some-other-website7.com
        some-other-website8.com         www.some-other-website8.com

    rewrite ^(.*)$ https://www.my-website.com/some/other/page/ permanent;
}

server {
    server_name     subdomain.my-website.com;

    rewrite ^(.*)$ https://some.otherwebsite.com/ permanent;
}

server {
    server_name
        some-other-website9.com         www.some-other-website9.com
        some-other-website10.com         www.some-other-website10.com
        some-other-website11.com         www.some-other-website11.com

    rewrite ^(.*)$  https://www.my-website.com/ permanent;
}

Saya bertanya-tanya apakah kesalahan bind () ini terjadi karena konfigurasi saya. Adakah ide yang mungkin saya lakukan salah? Saya menggunakan nginx / 1.4.6 (Ubuntu). Bantuan apa pun akan sangat dihargai.

dallen
sumber
Saya saat ini menghadapi masalah yang sama. Konfigurasi nginx yang dulu berfungsi tanpa perubahan sekarang tidak akan berhasil memuat ulang karena dikatakan port yang digunakan, namun nginx adalah satu-satunya aplikasi yang berjalan di port tersebut. Sudahkah Anda memecahkan masalah Anda?
Mitch Kent

Jawaban:

13

Coba hentikan nginx:

service nginx stop

Periksa nginx yang masih berjalan:

ps ax | grep nginx

Dan jika masih berjalan, matikan prosesnya:

kill -p PID

Periksa status nginx, tidak akan berjalan:

ps ax | grep nginx

Dan kemudian lakukan start bersih:

service nginx start

Ini bekerja untuk saya setelah masalah yang sama.

szg28
sumber
Bagi saya, setelah membunuh PID, proses akan memulai sendiri lagi
Jason Liu
4

Menurut netstathasil keluaran Anda , nginx sendiri masih berjalan di port 80.

Sebelum Anda mencoba untuk me-restart itu, validasi konfigurasi Anda dengan nginx -tdan perbaiki kesalahan.

Michael Hampton
sumber
4
Saya telah menjalankan nginx -t dan tidak ada kesalahan. Itu sebabnya saya bingung karena tidak bisa memulai kembali.
dallen
Coba hentikan nginx dulu, dan kemudian mulai lagi.
Michael Hampton
1
Saya menemukan masalah yang sama. Saya akan menganggap ini bug dari nginx.
ClojureMostly
2

Saya mungkin satu-satunya yang cukup bodoh untuk melakukan kesalahan ini, tetapi saya tidak sengaja mengunduh paket yang salah ( phpbukan php-fpm), yang menginstal Apache 2 sebagai ketergantungan. Karena itu berjalan pada port 80, Nginx tidak bisa.

Mungkin bukan kesalahan yang sangat umum, tapi saya kira takeaway adalah untuk memeriksa apakah Anda secara tidak sengaja memiliki hal lain di port 80.

Program Redwolf
sumber
Anda bukan yang pertama melakukan itu. Nama paket itu dipilih dengan buruk; itu seharusnya dinamai mod_phpsebaliknya. Tapi sekarang sudah seperti itu selama bertahun-tahun, itu tidak dapat diubah tanpa merusak sistem semua orang.
Michael Hampton
@MichaelHampton Setidaknya ini adalah perbaikan yang cukup sederhana ( apt-get remove apache2 && apt-get autoremove)
Program Redwolf