nginx - nginx: [emerg] bind () to [::]: 80 не удалось (98: адрес уже используется)


249

Внезапно я получаю сообщение об ошибке ниже nginx

 * Restarting nginx
 * Stopping nginx nginx
   ...done.
 * Starting nginx nginx
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
   ...done.
   ...done.

Если я бегу

lsof -i :80 or sudo fuser -k 80/tcp 

Я ничего не получаю. Ничего на порту 80

Затем я запускаю ниже:

sudo netstat -pan | grep ":80"
tcp        0      0 127.0.0.1:8070          0.0.0.0:*               LISTEN      15056/uwsgi     
tcp        0      0 10.170.35.97:39567      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39564      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39584      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39566      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39571      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39580      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39562      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39582      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39586      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39575      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39579      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39560      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39587      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39591      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39589      10.158.58.13:8080       TIME_WAIT   - 

Я в тупике. Как мне отладить это?

Я использую UWSGI с прокси-портом на порт 8070. UWSGI работает. Nginx нет. Я использую Ubuntu 12.4

Ниже приведены соответствующие части моего файла конфигурации nginx.

upstream uwsgi_frontend {
          server 127.0.0.1:8070;
        }
server {
listen 80;
        server_name 127.0.0.1;
        location = /favicon.ico {
                  log_not_found off;
                }



                location / {
                       include uwsgi_params;
                       uwsgi_buffering off;

                       uwsgi_pass 127.0.0.1:8070;
                 }
        }

Вот как я устанавливаю nginx на Ubuntu 12.04

nginx=stable;add-apt-repository ppa:nginx/$nginx;
apt-get update
apt get install nginx-full

19
Я нашел проблему, которой у меня никогда не было. Мне пришлось удалить / etc / nginx / sites-available / default. Тогда это сработало. Мой конфиг был в / etc / nginx / default
— Тампа

Я использовал Nginx + Varnish и у меня была эта ошибка. Решением было и то, и другое, затем сначала запустите nginx, а затем лак.
— Бен

Вы можете попробовать остановить именованный сервис.
— амал

Вы удалили настройки по умолчанию с включенных сайтов?
— Wolfpack'08

Я попробовал все решения здесь. Проверил все используемые порты (он использовался самим NGINX), поэтому я убил порт и перезапустил его. Работал как шарм.
— Гэвин

Ответы:


202

[::]:80 это адрес ipv6.

Эта ошибка может быть вызвана, если у вас есть конфигурация nginx, которая прослушивает порт 80, а также порт [::]:80.

В моем файле по умолчанию для сайтов было следующее:

listen 80;
listen [::]:80 default_server;

Вы можете исправить это, добавив ipv6only=onк [::]:80этому:

listen 80;
listen [::]:80 ipv6only=on default_server;

Для получения дополнительной информации см .:

http://forum.linode.com/viewtopic.php?t=8580

http://wiki.nginx.org/HttpCoreModule#listen


11
Вы также можете исправить это, просто удалив listen 80; потому что слушает [::]: 80 слушает как IPv4, так и IPv6. Будьте осторожны, потому что некоторые системы (например, FreeBSD) разделяют сокеты IPv4 и IPv6, и тогда это не будет работать, но для Linux это должно быть хорошо. wiki.nginx.org/HttpCoreModule#listen
— gitaarik

4
Спасибо, что углубились в это и объяснили, почему удаление /etc/nginx/sites-available/defaultпомогает с вышеуказанной ошибкой.
— Оливер

1
Даже когда я закомментирую строку ipv6, я все равно получаю ту же ошибку при попытке sudo service nginx restart. Когда я это делаю netstat -tulpn |grep 80, я получаю только один раз процесс nginx (0.0.0.0:80). Есть идеи, почему он не перезапустится?
— Роман

Я второй, что сказал @rednaw, но вместо того, чтобы удалить прослушивание, вы можете просто закомментировать это
— d4nyll

Установка ipv6only=onисправила проблему, но nginx должен действительно обнаружить, что он пытается привязаться к одному и тому же интерфейсу: порт дважды.
— Дан Даскалеску

246

я исправил это, запустив sudo apachectl stop- оказалось, что apache работал в фоновом режиме и предотвратил запуск nginx на желаемом порту.

На убунту беги sudo /etc/init.d/apache2 stop


8
Используйте sudo /etc/init.d/apache2 stopдля остановки apache в Ubuntu 14.04
— Footniko

3
Причина в том, что у вас не может быть двух веб-серверов, слушающих один и тот же порт. Выберите один и, если требуется, прокси. Например, используйте nginx, но для определенных запросов (например, для phpфайлов) используйте прокси для порта Apache.
— d4nyll

То же самое здесь, на свежей установке Debian 9.
— Jirarium

Спасибо. Но есть идеи, почему это внезапно началось? Я не трогал сервер неделю, но он начался прошлой ночью.
— Аджай Сингх

1
Спасибо за ваше решение. Это работает для меня, я использую Google Cloud Platform
— congle

93

Мой случай другой, мне пришлось убить запуск Nginx, чтобы перезапустить его.

Вместо того

sudo systemctl restart nginx

Я должен был использовать:

sudo pkill -f nginx & wait $!
sudo systemctl start nginx

1
Я принимал 404 Not Found, и я воспользовался твоим предложением, теперь я решил свою проблему. Спасибо.
— бухта

3
Это сработало для меня. Больше ничего не делал. Не уверен, какой процесс запускается, когда система перезагружается, но я просто добавлю это в свою процедуру перезапуска nginx. Спасибо!
— Хом Назид

38

Я нашел проблему, которой у меня никогда не было.

Я просто должен был удалить /etc/nginx/sites-available/default. Тогда это сработало.

Мой конф был в /etc/nginx/default.


2
+1 Это решение сработало для меня, но потом я подумал, что по умолчанию должно быть что-то, что действительно вызывает проблему, поэтому я выкопал немного глубже и дал ответ с дополнительной информацией.
— Натан

11
Я бы сказал, что удаление шаблона конфигурации сайта по умолчанию - не лучшее решение - комментирование строки, содержащейся listen 80;в этом же шаблоне, уже решает проблему и правильно делает это. Ваш трюк работает, но это не то, что я хотел бы сделать для будущих читателей вашего вопроса. Вот почему я предлагаю вам выбрать правильный ответ @ Nathan.
— Оливер

4
У меня была та же проблема после запуска apt-get dist-upgrade, который обновил пакет nginx, который создал ссылку /etc/nginx/sites-enabledна /etc/nginx/sites-available/default. nginx пытался загрузить эту конфигурацию по умолчанию, которая прослушивает порт 80 через IPv6, затем он также загружал мои прочитанные мои настоящие конфиги. Удаление этой символической ссылки решило проблему.
— Дан Даскалеску

15
ВАМ НЕ НУЖНО УДАЛИТЬ /etc/nginx/sites-available/default , просто удалите символическую ссылку на него -sudo rm /etc/nginx/sites-enabled/default
— d4nyll

Я столкнулся с этой проблемой при попытке запустить nginxпорт 8080 и varnishпорт 80 и аналогично этому ответу. Я обнаружил проблему в nginxконфигурации по умолчанию, все еще прослушивающей порт 80, хотя все мои sites-availableконфиги прослушивали порт 8080. Он был расположен по адресу/etc/nginx/conf.d/default
— zigojacko

24

Я также получал ту же ошибку.

nginx: [emerg] bind () to [::]: 80 не удалось (98: адрес уже используется)

и когда я набрал localhost в браузере, то я получал

Оно работает!

Это веб-страница по умолчанию для этого сервера.

Программное обеспечение веб-сервера работает, но контент еще не добавлен. вместо страницы приветствия nginx apache2 работает на том же порту,

  1. найти файл apache2 ports.conf

    sudo /etc/apache2/ports.conf
    
  2. измените порт другой тогда 80, я делаю это как70

  3. сохранить файл

  4. перезагрузите вашу систему

это будет работать и для вас, если вы введете localhost в браузере, вы получите страницу приветствия nginx


1
Вы можете просто не захотеть запускать Apache2 и nginx одновременно. Я обнаружил, что установка Apache запускает службу. Итак, я выдал «sudo /etc/init.d/apache2 stop», а затем смог нормально запустить nginx. Это также спасает вас от перезагрузки вашей системы.
— Крис Вестин

1
Вы правы, что удаление ссылки sym / etc / nginx / sites-enabled / default означает, что она не может прослушивать два порта. На самом деле меня немного раздражает, что каждый урок по nginx начинается с предложения всем удалить ссылку «по умолчанию», но это другая тема, я полагаю.
— Eschipul

@IgorGanapolsky переключить Apache на другой порт?
— Менаше


8

Моя проблема заключалась в том, что у меня были перекрывающиеся директивы прослушивания. Мне удалось выяснить перекрывающиеся директивы, запустив

grep -r listen /etc/nginx/*

Два файла слушали на одном и том же порту:

/etc/nginx/conf.d/default.conf:           listen 80;  
/etc/nginx/sites-enabled/default.conf:    listen 80;

3
Это очень хороший способ проверить вещи: grep -r listen /etc/nginx/*спасибо, что поделились!
— Newskooler

6

У меня была такая же проблема в letsencrypt (certbot) и nginx,

ссылка: https://github.com/certbot/certbot/issues/5486

эта ошибка пока не имеет решения

Итак, изменен cron для возобновления (добавление перезагрузки после возобновления) (используя предложение от certbot)

-- in /etc/cron.d/certbot
from
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew 
to
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --pre-hook "service nginx stop" --post-hook "service nginx start"

журналы (короткие):

-- in /var/log/syslog
Jun 10 00:14:25 localhost systemd[1]: Starting Certbot...
Jun 10 00:14:38 localhost certbot[22222]: nginx: [error] open() "/run/nginx.pid$
Jun 10 00:14:41 localhost certbot[22222]: Hook command "nginx" returned error c$
Jun 10 00:14:41 localhost certbot[22222]: Error output from nginx:
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] still could not bind()
Jun 10 00:14:41 localhost systemd[1]: Started Certbot.


-- in /var/log/nginx/error.log
2018/06/10 00:14:27 [notice] 22233#22233: signal process started
2018/06/10 00:14:31 [notice] 22237#22237: signal process started
2018/06/10 00:14:33 [notice] 22240#22240: signal process started
2018/06/10 00:14:34 [notice] 22245#22245: signal process started
2018/06/10 00:14:38 [notice] 22255#22255: signal process started
2018/06/10 00:14:38 [error] 22255#22255: open() "/run/nginx.pid" failed (2: No $
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: still could not bind()

1
супер случайный, но это было то, что моя проблема была я верю. спасибо за публикацию этого. моя ошибка, казалось, проявлялась из-за устаревшей записи домена, которую он пытался обновить, но не мог, потому что я больше не контролировал домен.
— w--

Наверное, это тоже моя проблема. но мне нужно подождать, чтобы взглянуть
— Оскар Zhou1989

2

Сначала измените apache listen port 80 на 8080 apache в /etc/apache2/ports.conf include

Listen 1.2.3.4:80 to 1.2.3.4:8080
sudo service apache2 restart 

или

sudo service httpd restart    // in case of centos

затем добавьте nginx в качестве обратного прокси-сервера, который будет прослушивать порт apache

server {
 listen   1.2.3.4:80;
 server_name  some.com;

 access_log  /var/log/nginx/something-access.log;

 location / {
  proxy_pass http://localhost:8080;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }


location ~* ^.+\.(jpg|js|jpeg|png)$ {
   root /usr/share/nginx/html/;
}

location /404.html {
  root /usr/share/nginx/html/40x.html;
}

error_page 404 /404.html;
    location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
    location = /50x.html {
}

# put code for static content like js/css/images/fonts
}

После изменений перезапустите сервер nginx

sudo service nginx restart

Теперь весь трафик будет обрабатываться сервером nginx и отправлять весь динамический запрос в apache, а статический контент обслуживается сервером nginx.

Для предварительной настройки, такой как кеш:

https://www.linode.com/docs/web-servers/nginx/slightly-more-advanced-configurations-for-nginx/#basic-nginx-caching


1

Я встретил подобную проблему. журнал как ниже

2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: still could not bind()
2018/10/31 12:54:23 [alert] 127997#127997: unlink() "/run/nginx.pid" failed (2: No such file or directory)
2018/10/31 22:40:48 [info] 36948#36948: Using 32768KiB of shared memory for push module in /etc/nginx/nginx.conf:68
2018/10/31 22:50:40 [emerg] 37638#37638: duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/default:18
2018/10/31 22:51:33 [info] 37787#37787: Using 32768KiB of shared memory for push module in /etc/nginx/nginx.conf:68

Последнее [emerg]показывает, что duplicate listen options for [::]:80это означает, что существует более одного блочного файла nginx, содержащего[::]:80 .

Мое решение состоит в том, чтобы удалить один из [::]:80 параметров

PS у вас наверное есть файл блока по умолчанию. Мой совет - сохранить этот файл в качестве сервера по умолчанию для порта 80 и удалить его [::]:80из других файлов блоков.


1

Я использую supervisor для одновременного запуска Nginx и Gunicorn в контейнере Docker.

Эта конфигурация использовалась для супервизора:

[supervisord]
nodaemon=true

[program:gunicorn]
command = /project/start.sh
user = www-data


[program:nginx]
command=/usr/sbin/nginx

Проблема заключалась в том, как я запустил Ngnix: по умолчанию он работает на переднем плане. Это заставляет supervise повторить попытку запуска другого экземпляра Nginx.

Добавив -g 'daemon off;'в командную строку, Nginx остался на переднем плане, супервизор прекратил попытки запуска другого экземпляра.


1

В моем случае одна из служб Apache, Apache2 или Nginx уже работала, и из-за этого я не смог запустить другую службу.


0

У меня было несколько * .save файлов (аварийных дампов из nano) из разных конфигурационных файлов NGINX в моем каталоге сайтов. Как только я удалил эти .save файлы, NGINX перезапустился нормально. Я предположил, что они безвредны, так как не было соответствующих символических ссылок, но я ошибся.


0

Чтобы ответить на ответы @ lfender6445 и @SAURABH -

Моей проблемой был также тот факт, что после обновления до Vagrant 2.2.2 Apache2 работал в качестве веб-сервера при загрузке гостя. В прошлом у меня был только nginx в качестве веб-сервера.

vagrant ssh в коробку и выполните следующую команду, чтобы отключить запуск Apache2 при каждой загрузке гостевого ящика:

sudo update-rc.d -f apache2 remove

Выход из SSH, бродячая остановка, бродяга вверх. Задача решена.


0

Если проблема не устраняется после попытки любого из вышеперечисленных решений, перезапустите сервер один раз. У меня это сработало :)


Да, это так. Но работа с nginx и последующий перезапуск nginx также работают. Это ответ @datdinhquoc.
— Хом Назид

0

В моем случае виновником оказался серверный блок, содержащий:

        listen  127.0.0.1:80;
        listen  [::1]:80 ipv6only=on;
        server_name  localhost;

В Linux сокет, прослушивающий определенный IP (например [::1]:80), конфликтует с сокетом, прослушивающим тот же порт, но с любым IP (т.е. [::]:80). Обычно nginx прозрачно решает эту проблему, используя один сокет за кулисами. Однако явное указание ipv6only(или некоторые другие параметры) в директиве listen заставляет nginx (пытаться) создать отдельный сокет для него, что приведет к Address already in useошибке.

Так ipv6only=onкак в любом случае это значение по умолчанию (начиная с 1.3.4), исправление состояло в том, чтобы просто удалить эту опцию из этой директивы и убедиться, что ipv6onlyона не была использована где-либо еще в моей конфигурации.


0

У меня та же проблема, но я вижу, что порт 80 прослушивается Nginx:

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      9730/nginx 

Но когда я пытаюсь перезапустить его, у меня появляется ошибка:

    service nginx restart
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:443 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:443 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:443 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:443 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:443 failed (98: Address already in use)
nginx: [emerg] still could not bind()

Моя проблема была в файле конфигурации, я установил файл PID, и кажется, что система не может поймать его правильно:

user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

Когда я его убрал, все заработало.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.