![在“listen”指令的“$server_listen_port”中未找到主机](https://linux22.com/image/788359/%E5%9C%A8%E2%80%9Clisten%E2%80%9D%E6%8C%87%E4%BB%A4%E7%9A%84%E2%80%9C%24server_listen_port%E2%80%9D%E4%B8%AD%E6%9C%AA%E6%89%BE%E5%88%B0%E4%B8%BB%E6%9C%BA.png)
使用以下 nginx 配置摘录:
map $server_name $server_listen_port {
default 443;
localhost. 80;
localhost 80;
}
server {
server_name "${ENVIRONMENT_SERVER_NAME}.";
listen $server_listen_port http2 reuseport;
# ...
}
使用以下方法验证配置时出现以下错误环境服务器名称在环境中设置为“本地主机”:
nginx: [emerg] host not found in "$server_listen_port" of the "listen" directive in /etc/nginx/conf.d/99_main.conf:38
nginx: configuration file /etc/nginx/nginx.conf test failed
我正在尝试解释此错误消息的确切含义。这是否意味着 listen 语句由于缺少主机名而无效?
或者它是不是想告诉我地图中没有主机的值?在这种情况下,我希望调用“默认”。
我尝试过各种各样的变化,但都没有什么进展。
是什么原因导致了此错误?我该如何修复它?
答案1
这应该是一个评论(但空间有限)。
您正在尝试运行不使用 TLS 的 HTTP/2。虽然理论上可行,大多数客户端不支持它。我不知道 nginx 是否支持它。如果 nginx 至少会解析配置并使用静态配置启动,那么测试起来会很容易。
我很难想象您的多路复用站点方法所带来的价值。使用 TLS,Web 服务器将根据连接的端口和 HTTP 标头选择后端。对于 HTTPS,它是基于端口和 SNI 进行选择的。您似乎试图通过推迟解析监听端口直到有请求要处理来避免有多个服务器定义 - 但在您打开并监听端口之前,您不会收到任何请求。