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
Tampa
источник
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

lfender6445
источник
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
datdinhquoc
источник
1
Я принимал 404 Not Found, и я воспользовался твоим предложением, теперь я решил свою проблему. Спасибо.
бухта
3
Это сработало для меня. Больше ничего не делал. Не уверен, какой процесс запускается, когда система перезагружается, но я просто добавлю это в свою процедуру перезапуска nginx. Спасибо!
Хом Назид
38

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

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

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

Tampa
источник
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 на другой порт?
Менаше
10

попробуйте сделать эту команду

sudo fuser -k 443/tcp
service nginx restart
разъем
источник
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из других файлов блоков.

Оскар Чжоу1989
источник
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она не была использована где-либо еще в моей конфигурации.

Matthijs
источник
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;

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

zombi_man
источник