如何使nginx监听server_name:port?

63
我在nginx的配置文件中有以下内容:

In my nginx conf file, I have :

  listen       80;
    server_name  $hostname;

然而,如果我运行netstat命令,我会看到它正在监听0.0.0.0:80。

我想要的是nginx监听$hostname:80,有没有一种方法可以配置它来实现这个目标?

我尝试了不同的设置,但迄今为止都没有成功。感谢您的帮助。


我认为你不能在主机名上侦听,只能在IP上侦听。 - Jaime Hablutzel
2个回答

84
server_namedocs指令用于标识虚拟主机,而不是用于设置绑定。 netstat 命令告诉你 nginx 监听的地址为 0.0.0.0:80,这意味着它将接受来自任何 IP 的连接。
如果你想要更改 nginx 绑定的 IP,你需要更改 listendocs 规则。因此,如果你想要将 nginx 绑定到 localhost,你需要将其更改为:
listen 127.0.0.1:80;

以此方式,非本地主机发出的请求会被丢弃(它们甚至不会到达nginx)。

1
我想请教一下,将localhost作为监听IP的原因是什么?也就是说,我们不希望请求来自于外部世界吗? - ransh
是的,这就是原因。在本地开发中通常是这种情况。在远程服务器上,您可以做一些类似的事情来防止“外部”访问站点,限制访问只限于那些具有SSH访问权限的人,例如。 - Alessandro Vendruscolo
@sjas,请提供一个正确的、不误导的答案。:) 或者至少是一个有信息量的评论!现在这个评论是没有用的。 - JakeRobb
1
你必须结合提到的 listen IP:PORT; 语句,并设置两个虚拟主机 - 为 IP 本身阻止基于 IP 的访问(否则您将可能有一个基于 IP 的访问,这可能不是您想要的),以及设置另一个包含 server_name SUB.DOMAIN.TLD; 的虚拟主机,该虚拟主机允许指向所需的内容。这个回答够资深吗,@JakeRobb? - sjas
另一个原因是当你在Linux上以非root用户身份运行时。也就是说,你在高于1000的端口上运行进程,并在操作系统中添加一个从高端口到低端口的端口映射。 - Hector
非常好的答案,谢谢。在我们的情况下,我们希望我们自己的身份验证/授权软件运行在本地主机上,只有经过授权后才能将请求转发到nginx。因此,仅侦听来自本地主机的连接正是我们所需要的。 - BobDoolittle

0
如果有人不想为本地主机或任何其他内部IP(这是通过更改listen指令的地址所能做的唯一事情)执行此操作,可以使用allow/deny规则。
allow some.public.ip.here;
deny all;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接