Не удается перезапустить nginx, ошибка bind () (98: адрес уже используется)

9

Я знаю, что эта тема существует в разных формах, но у меня проблемы с решением моей проблемы. Если я запускаю service nginx restart, nginx терпит неудачу со следующим журналом:

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

У меня только один конфиг загружается в sites-enabled. Когда я бегу:

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

Это показывает, что в defaultконфигурации есть 80 прослушиваний, но это не должно иметь значения, так как его нет 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)

Вот netstatпример того, какие порты используются:

$ 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

И вот мой полный конфиг в sites-enabled(единственный там):

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

Мне интересно, если эта ошибка bind () происходит из-за моей конфигурации. Есть идеи, что я могу делать не так? Я использую nginx / 1.4.6 (Ubuntu). Любая помощь будет принята с благодарностью.

dallen
источник
В настоящее время я сталкиваюсь с той же проблемой. Некогда работавший конфиг nginx без изменений теперь не будет успешно перезагружен, поскольку он говорит, что порт используется, однако nginx - единственное приложение, работающее на этом порту. Вы решили свою проблему?
Митч Кент

Ответы:

13

Попробуйте остановить nginx:

service nginx stop

Проверьте, работает ли nginx:

ps ax | grep nginx

И если все еще работает, убить процесс:

kill -p PID

Проверьте статус nginx, не запустится:

ps ax | grep nginx

А затем сделайте чистый старт:

service nginx start

Это сработало для меня после того же вопроса.

szg28
источник
Для меня, после того, как убили PID, процесс начнется сам по себе
Джейсон Лю
4

Согласно вашему netstatвыводу, сам nginx все еще работает на порту 80.

Прежде чем пытаться перезапустить его, проверьте свою конфигурацию nginx -tи исправьте ошибки.

Майкл Хэмптон
источник
4
Я запустил nginx -t и ошибок нет. Вот почему я смущен тем, что не могу перезапустить.
выпал
Попробуйте сначала остановить nginx, а затем запустить его снова.
Майкл Хэмптон
1
Я вхожу в ту же проблему. Я бы посчитал это ошибкой nginx.
ClojureMostly
2

Я, наверное, единственный, кто достаточно глуп, чтобы совершить эту ошибку, но я случайно загрузил не тот пакет ( phpвместо php-fpm), который установил Apache 2 в качестве зависимости. Поскольку он работал на 80-м порту, Nginx не смог.

Вероятно, не очень распространенная ошибка, но я думаю, что вы должны проверить, есть ли у вас случайно что-нибудь еще на порту 80.

Redwolf Программы
источник
Вы не первый, кто это делает. Название пакета было выбрано плохо; это действительно должно было быть названо mod_phpвместо этого. Но теперь, когда так было в течение многих лет, его нельзя изменить, не нарушив систему каждого.
Майкл Хэмптон
@MichaelHampton По крайней мере, это довольно простое исправление ( apt-get remove apache2 && apt-get autoremove)
Программы
1

У меня была похожая проблема.

Вот что у меня сработало:
sudo fuser -k 80/tcp
then:
service nginx restart

Я не знаю причину, но мой ответ был найден здесь: https://easyengine.io/tutorials/nginx/trou устранение неисправностей/emerg-bind-failed-98-address-already-in- use/

Кроме того, вот предыстория того, как / когда появилось это сообщение об ошибке: https://serverfault.com/a/939888/399723

SherylHohman
источник