Nginx - nginx: [emerg] bind() в [::]: 80 не удалось (98: адрес уже используется)
Внезапно я получаю следующую ошибку 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
Ответы
Ответ 1
[::]: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
Ответ 2
i исправил это, запустив sudo apachectl stop
- оказалось, что apache работал в фоновом режиме и предотвратил запуск nginx на нужном порту.
В режиме ubuntu sudo /etc/init.d/apache2 stop
Ответ 3
Я нашел проблему, которой у меня никогда не было.
Мне просто пришлось удалить /etc/nginx/sites-available/default
. Тогда это сработало.
Мой conf был в /etc/nginx/default
.
Ответ 4
Мое дело другое, мне пришлось убить Nginx, чтобы перезапустить его.
Вместо
sudo systemctl restart nginx
Мне пришлось использовать:
sudo pkill -f nginx
sudo systemctl start nginx
Ответ 5
Я также получал ту же ошибку.
nginx: [emerg] bind() to [::]: 80 не удалось (98: адрес уже используется)
и когда я набрал localhost в браузере, то я получал
Оно работает!
Это веб-страница по умолчанию для этого сервера.
Программное обеспечение веб-сервера работает, но контент еще не добавлен. вместо страницы приветствия nginx apache2 работает на том же порту,
-
найти файл apache2 ports.conf
sudo /etc/apache2/ports.conf
-
измените порт, кроме 80
, я делаю это как 70
-
сохранить файл
-
перезагрузите вашу систему
это будет работать и для вас, если вы введете localhost в браузере, вы получите страницу приветствия nginx
Ответ 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()
Ответ 7
попробуйте выполнить эту команду
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;
Ответ 9
Первое изменение apache прослушивает порт от 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 и отправить весь динамический запрос на apache, а статический conten обслуживается сервером nginx.
Для предварительной конфигурации, такой как кеш:
https://www.linode.com/docs/web-servers/nginx/slightly-more-advanced-configurations-for-nginx/#basic-nginx-caching
Ответ 10
Я встретил подобную проблему. журнал выглядит следующим образом:
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
из других файлов блоков
Ответ 11
В моем случае одна из служб Apache, Apache2 или Nginx уже работала, и из-за этого я не смог запустить другую службу.
Ответ 12
У меня было несколько файлов *.save(аварийных дампов из nano) из разных конфигурационных файлов NGINX в моем каталоге - avilable. Как только я удалил эти .save файлы, NGINX перезагрузился. Я предположил, что они были безвредны, поскольку не было соответствующих символических ссылок, но я думаю, что я ошибся.
Ответ 13
Чтобы следить за ответами @lfender6445 и @SAURABH -
Моя проблема заключалась также в том, что после обновления до Vagrant 2.2.2 Apache2 запускался как веб-сервер, когда гость загружался. Раньше у меня был только nginx как веб-сервер.
vagrant ssh в поле и запустить следующую команду, чтобы отключить Apache2 от запуска при каждом загрузке гостевого окна:
sudo update-rc.d -f apache2 remove
Выходите из ssh, бродячая остановка, бродячая. Задача решена.
Ответ 14
Если проблема не устранена после попытки любого из вышеперечисленных решений, перезапустите сервер один раз. Это сработало для меня :)
Ответ 15
В моем случае виновником оказался серверный блок, содержащий:
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
не использовался где-либо еще в моей конфигурации.
Ответ 16
Я использую 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 остался на переднем плане, супервизор прекратил попытки запуска другого экземпляра.