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.