Không thể khởi động lại nginx, bind () không thành công (98: Địa chỉ đã được sử dụng)


9

Tôi biết chủ đề này tồn tại dưới nhiều hình thức khác nhau, nhưng tôi gặp khó khăn khi giải quyết vấn đề của mình. Nếu tôi chạy service nginx restart, nginx không thành công với nhật ký sau:

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()

Tôi chỉ có một cấu hình tải trong sites-enabled. Khi tôi chạy:

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

Nó cho thấy rằng defaultcấu hình đã nghe 80, nhưng điều đó không quan trọng vì nó không có trong đó 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)

Dưới đây là phần netstathiển thị cổng nào đang được sử dụng:

$ 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

Và đây là cấu hình hoàn chỉnh của tôi trong sites-enabled(cái duy nhất trong đó):

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;
}

Tôi tự hỏi nếu lỗi bind () này xảy ra do cấu hình của tôi. Bất cứ ý tưởng những gì tôi có thể làm sai? Tôi đang sử dụng nginx / 1.4.6 (Ubuntu). Mọi sự trợ giúp sẽ rất được trân trọng.


Tôi hiện đang đối mặt với cùng một vấn đề. Một cấu hình nginx đã từng hoạt động mà không có thay đổi nào bây giờ sẽ không tải lại thành công vì nó đang nói cổng đang sử dụng, tuy nhiên nginx là ứng dụng duy nhất chạy trên cổng đó. Bạn đã giải quyết vấn đề của bạn?
Mitch Kent

Câu trả lời:


13

Hãy thử dừng nginx:

service nginx stop

Kiểm tra nginx vẫn đang chạy:

ps ax | grep nginx

Và nếu vẫn chạy, giết tiến trình:

kill -p PID

Kiểm tra trạng thái nginx, sẽ không chạy:

ps ax | grep nginx

Và sau đó làm một khởi đầu sạch:

service nginx start

Điều này làm việc cho tôi sau khi vấn đề tương tự.


Đối với tôi, sau khi giết chết PID, quá trình sẽ tự bắt đầu lại
Jason Liu

4

Theo netstatđầu ra của bạn , nginx vẫn đang chạy trên cổng 80.

Trước khi bạn cố gắng khởi động lại nó, hãy xác thực cấu hình của bạn nginx -tvà sửa lỗi.


4
Tôi đã chạy nginx -t và không có lỗi. Đó là lý do tại sao tôi bối rối vì không thể khởi động lại.
dallen 14/03/2015

Hãy thử dừng nginx trước, và sau đó bắt đầu lại.
Michael Hampton

1
Tôi rand vào cùng một vấn đề. Tôi coi đây là một lỗi của nginx.
ClojureMostly

2

Tôi có lẽ là người duy nhất đủ ngu ngốc để mắc lỗi này, nhưng tôi đã vô tình tải xuống gói sai ( phpthay vì php-fpm), cài đặt Apache 2 làm phụ thuộc. Vì nó đang chạy trên cổng 80, Nginx không thể.

Có lẽ không phải là một lỗi rất phổ biến, nhưng tôi đoán việc mang đi là để kiểm tra xem bạn có vô tình có bất cứ điều gì khác trên cổng 80 không.


Bạn không phải là người đầu tiên làm điều đó. Tên gói được chọn kém; nó thực sự nên được đặt tên mod_phpthay thế. Nhưng bây giờ, theo cách đó trong nhiều năm, nó không thể thay đổi mà không phá vỡ hệ thống của mọi người.
Michael Hampton

@MichaelHampton Ít nhất đó là một sửa chữa khá đơn giản ( apt-get remove apache2 && apt-get autoremove)
Các chương trình Redwolf

1

Tôi đã có một vấn đề tương tự.

Đây là những gì làm việc cho tôi:
sudo fuser -k 80/tcp
sau đó:
service nginx restart

Tôi không biết nguyên nhân, nhưng câu trả lời của tôi đã được tìm thấy ở đây: https://easyengine.io/tutorials/nginx/troubledhoot/emerg-bind-fails-98-address-al yet-in-use /

Ngoài ra, đây là cơ sở của cách thức / khi thông báo lỗi này xuất hiện: https://serverfault.com/a/939888/399723

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.