nginx - nginx: [emerg] прив’язати () до [::]: 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 / за замовчуванням
Tampa

Я запускав Nginx + Varnish, і сталася ця помилка. Рішення було зверху стоп обома, потім спочатку запустити nginx, а потім лакувати.
Бен

ви можете спробувати зупинити названу послугу.
amal

ви видалили дефолт із сайтів, що підтримуються
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
Ви також можете виправити це, просто видаливши прослуховування 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 запускатися на потрібний порт.

У запуску ubuntu 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 install.
жирарій

Дякую. Але будь-яка ідея, чому це раптом почалося? Я не торкався сервера протягом тижня, але це почалося минулої ночі.
Аджай Сінгх

1
Дякуємо за ваше рішення. Це працює для мене, я використовую Cloud Cloud Platform
конгрес

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;в тому самому шаблоні, вже вирішується проблема і правильно. Ваш трюк працює, але це не те, що я хотів би зробити майбутніми читачами вашого запитання. Ось чому я пропоную вибрати правильну відповідь @ Натана.
Олівер

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] прив’язати () до [::]: 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
Ви маєте рацію, що видалення посилання / etc / nginx / sites-enable / default sym не заважає прослуховувати його на двох портах. Мені здається, що насправді трохи дратує те, що кожен підручник на 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/isissue/5486

ця помилка ще не має рішення

таким чином, змінений крон для оновлення (встановлення перезавантаження після оновлення) (використовуючи пропозицію від 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--

Я думаю, це, ймовірно, і моє питання. але мені потрібно почекати, щоб подивитися
Оскар Чжоу1989

2

Перша зміна apache liste port 80 на 8080 apache в /etc/apache2/ports.conf включають

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, а весь динамічний запит на апаш, а статичний контент обслуговується сервером 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

Я використовую супервізор, щоб запускати Nginx і Gunicorn пліч-о-пліч на контейнері Docker.

Це була конфігурація, що використовується для керівника:

[supervisord]
nodaemon=true

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


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

Проблема полягала в тому, як я запустив Ngnix: за замовчуванням він працює на передньому плані. Це змушує контролювати повторний запуск для запуску іншого примірника Nginx.

Додавши -g 'daemon off;'до командного рядка, Nginx залишився на передньому плані, супервізор перестав намагатися запустити інший екземпляр.


1

У моєму випадку одна із служб Apache, Apache2 або Nginx вже працювала, і через це я не зміг запустити іншу службу.


0

У мене було декілька * .save файлів (аварійні звалища від нано) з різних файлів конфігурацій NGINX на моїх сайтах, доступних для доступу. Після того як я видалив ці .save файли, NGINX перезапустив все. Я припускав, що вони нешкідливі, оскільки не було відповідних символьних посилань, але, мабуть, я помилявся.


0

Щоб продовжити відповіді на @ lfender6445 та @SAURABH -

Моєю проблемою було також те, що після оновлення до Vagrant 2.2.2 Apache2 працював як веб-сервер, коли гість завантажився. Раніше у мене був тільки nginx як веб-сервер.

бродячий 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(або певні інші параметри) директиви про прослуховування, змушує 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.