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 版本构建,无法分配请求的地址错误