Подтвердить что ты не робот

Ошибка 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;

        }
4b9b3361

Ответ 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 *;