nginx 错误:(99:无法分配请求的地址)

Posted

技术标签:

【中文标题】nginx 错误:(99:无法分配请求的地址)【英文标题】:nginx error: (99: Cannot assign requested address) 【发布时间】:2011-03-12 14:45:04 【问题描述】:

我正在运行 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】:

可能还有剩余的进程/程序正在使用/侦听端口 80。

您可以使用 netstat -lp 进行检查。 杀死该进程并启动 nginx。

【讨论】:

hmm 不幸的是没有监听端口 80。 啊,问题是我使用的 IP 是 EC2 弹性 IP,而不是私有 IP。当我更改为私有 IP 时,一切正常。【参考方案2】:

为避免在配置中硬编码 IP 地址,请执行以下操作:

listen *:80;
listen [::]:80;

【讨论】:

谢谢!这是通过vestaCP在数字海洋上使用浮动IP的解决方案,同时将您的浮动IP添加到vestaCP控制面板IP选项卡中的“NAT IP关联”,然后在Web选项卡中更改域以使用浮动IP。 【参考方案3】:

使用 Amazon EC2 和弹性 IP,服务器实际上并不像大多数其他服务器那样知道其 IP。所以在 apache 虚拟主机文件中至少你放 *:80 而不是你的弹性 ip :80

然后它可以正常工作。所以理论上,为 nginx 做 *:80 应该是一样的,但是当你这样做时,你会得到 [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)。还没有找到解决办法。 .

【讨论】:

【参考方案4】:

使用 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

重启后就好了。

【讨论】:

AWS 服务是不透明的,只会减慢整个开发过程。 Rackspace 和 Digital Ocean 让您的系统在由它们托管时管理自己的盒子,而无需重写一堆晦涩的配置文件。 谢谢@kirpit。我管理的 AWS 服务器已将相同的 IP 保留了 2 年,尽管我一直被告知 AWS 服务器不断更改 IP。这是一个登台服务器,所以我可以测试 2 个不同版本的实时服务器,但我认为 AWS 不适合这种事情,并希望你启动一个全新的盒子。 我特别需要在 Rackspace 的新 CentOS 7 虚拟机上执行此操作。我正在从 CentOS 6 升级并检查该服务器以发现此配置文件有大量更改,因此感谢您的回答,因为它也帮助我避免了其他问题! 非常感谢,这也帮助了我在 PLESK 管理的系统中 Plesk 本身由 nginx 交付!【参考方案5】:

正如上面提到的 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

全部完成!

【讨论】:

【参考方案6】:

对于 Amazon EC2 和弹性 IP,sysctl.conf 将不起作用,因为 nginx 仍然无法侦听 eth0

所以,你需要listen *;

【讨论】:

【参考方案7】:

对于将来可能会处理这个问题的人,我只是在 AWS 实例中查找我的私有 IP 并绑定到它。我验证了 nginx 能够公开收听并在那之后执行我的重写。我不能做 *:PORT,因为我有一个要代理的内部服务器。

【讨论】:

【参考方案8】:

如果您使用的是网络管理器,则必须等待提升网络接口才能启动服务:

systemctl enable NetworkManager-wait-online.service

【讨论】:

以上是关于nginx 错误:(99:无法分配请求的地址)的主要内容,如果未能解决你的问题,请参考以下文章

已安装 Spark,针对正确的 hadoop 版本构建,无法分配请求的地址错误

bind:无法在本地网络中的UDPclient上分配请求的地址

在 EC2 上使用 nginx 设置 django

Docker 无法分配请求的地址

Uwsgi:“无法分配请求的地址”

无法在 localhost:8000 上侦听(原因:无法分配请求的地址)