Ошибка nginx: (99: Невозможно назначить запрошенный адрес)
Я запускаю Ubuntu Hardy 8.04 и nginx 0.7.65, и когда я пытаюсь запустить свой сервер nginx:
$ sudo /etc/init.d/nginx start
Я получаю следующую ошибку:
Starting nginx: [emerg]: bind() to IP failed (99: Cannot assign requested address)
где "IP" является заполнителем для моего IP-адреса. Кто-нибудь знает, почему эта ошибка может произойти? Это работает на EC2.
Мой файл nginx.conf выглядит так:
user www-data www-data;
worker_processes 4;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
access_log /usr/local/nginx/logs/access.log;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 3;
gzip on;
gzip_comp_level 2;
gzip_proxied any;
gzip_types text/plain text/css application/x-javascript text/xml application/xml
application/xml+rss text/javascript;
include /usr/local/nginx/sites-enabled/*;
}
и мой /usr/local/nginx/sites -enabled/example.com выглядит так:
server {
listen IP:80;
server_name example.com;
rewrite ^/(.*) https://example.com/$1 permanent;
}
server {
listen IP:443 default ssl;
ssl on;
ssl_certificate /etc/ssl/certs/myssl.crt;
ssl_certificate_key /etc/ssl/private/myssl.key;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:-LOW:-SSLv2:-EXP;
server_name example.com;
access_log /home/example/example.com/log/access.log;
error_log /home/example/example.com/log/error.log;
}
Ответы
Ответ 1
С Amazon EC2 и эластичными IP-адресами сервер фактически не знает своего IP-адреса, как и для большинства других серверов.
Итак, вы должны сказать своему Linux, чтобы позволить процессам связываться с нелокальным адресом. Просто добавьте следующую строку в файл /etc/sysctl.conf
:
# allow processes to bind to the non-local address
# (necessary for apache/nginx in Amazon EC2)
net.ipv4.ip_nonlocal_bind = 1
а затем перезагрузите файл sysctl.conf:
$ sysctl -p /etc/sysctl.conf
что будет нормально при перезагрузке.
Ответ 2
Чтобы избежать жесткого кодирования IP-адреса в конфигурации, сделайте следующее:
listen *:80;
listen [::]:80;
Ответ 3
Как упомянуто выше в kirpit, вы хотите, чтобы linux-процессы связывались с локальным IP-адресом:
nano /etc/sysctl.conf
# allow processes to bind to the non-local address
net.ipv4.ip_nonlocal_bind = 1
sysctl -p /etc/sysctl.conf
Затем вы хотите добавить частный IP-адрес, который связан с вашим эластичным ip, и добавить его в конфигурацию ваших сайтов:
nano /etc/nginx/sites-available/example.com
Перезагрузка nginx:
service nginx reload
Все сделано!
Ответ 4
Может существовать оставшийся процесс/программа, которая использует/прослушивает порт 80.
Вы можете проверить, что с помощью netstat -lp.
Убейте этот процесс и запустите nginx.
Ответ 5
С Amazon EC2 и эластичными IP-адресами сервер фактически не знает своего IP-адреса, как и для большинства других серверов. Таким образом, в файлах виртуального хоста apache по крайней мере вы ставите *: 80, а не на свой эластичный ip: 80
Затем он работает правильно. Итак, теоретически, делать *: 80 для nginx должно работать одинаково, но когда вы это делаете, вы получаете [появление]: bind() до 0.0.0.0:80 не удалось (98: адрес уже используется). Пока не найдено ни одного решения.
.
Ответ 6
Для людей, которые могут иметь дело с этим в будущем, я просто искал свой частный IP-адрес в экземпляре AWS и привязался к этому. Я подтвердил, что nginx смог публично выслушать и выполнить мою переписывание после этого. Я не мог сделать *: PORT, поскольку у меня был внутренний сервер, на который я проксировал.
Ответ 7
Если вы используете Network Manager, вам нужно подождать, чтобы поднять сетевой интерфейс перед запуском службы:
systemctl включить NetworkManager-wait-online.service
Ответ 8
Для Amazon EC2 и эластичных IP-адресов sysctl.conf
не будет работать, поскольку nginx еще не прослушивает eth0
.
Итак, вам нужно listen *;