我正在尝试设置我的第一个 nginx 服务器,但在设置 ipv4 和 ipv6 时遇到了问题。
我的配置文件顶部有这个(它是配置文件中唯一的服务器块):
server {
# Listen for requests on these ports
listen 80 default;
listen [::]:80 default_server;
}
这是我尝试启动 ngnix 时收到的错误:
* Restarting 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()
任何帮助都将受到赞赏。
答案1
您尝试绑定到 IPv4 两次。
listen 80 default;
listen [::]:80 default_server;
默认情况下(在 Linux 上)第二listen
条指令绑定到 IPv4 和 IPv6,除非您明确要求它仅使用该ipv6only
选项绑定到 IPv6。
有两种方法可以解决此问题。请选择其中一种(但不能同时选择两种):
删除第一个
listen
指令,因为这是多余的。第二个指令将通过 IPv4 映射的 IPv6 覆盖 IPv4 和 IPv6 连接。这样做的唯一缺点是您的日志将以映射形式显示 IPv4 地址,例如::ffff:203.0.113.25
。添加
ipv6only=on
到第二listen
条指令。
请注意,从 nginx 1.3.4 开始,它ipv6only=on
现在是默认设置,因此在后续版本中必须使用原始配置。在此之前,默认设置取决于操作系统。
答案2
你运行的是 Linux 吗?
那么可能必须做这样的事情:
listen [::]:80 ipv6only=on;
listen 80;