nginx 虚拟主机未监听正确的主机名

nginx 虚拟主机未监听正确的主机名

我是 nginx 的新手,但我遇到了一个对我来说完全不明显的基本问题。

我在 Mac 上使用 brew 安装了 nginx。使用以下基本且未更改的默认配置,安装过程非常顺利:

server {
   listen 80;
   server_name localhost;

    location / {
        root   html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

现在,我是一名从事多个项目的开发人员。之前,我在 apache 中为每个项目配置了一个虚拟主机,并结合了自定义主机条目,例如myproject1.local

因此,为了使用 nginx 测试这一点,我编辑了 /etc/hosts 文件并添加:

# /etc/hosts
127.0.0.1   mytestproject.local

然后,在 nginx 配置中,我添加了以下内容:

server {
    listen 8080;
    listen mytestproject.local:80;
    server_name mytestproject.local;

    location / {
        root /Users/MyUserName/Projects/mytestproject/Web;
        index index.html;
    }
}

有了这个,我预期的

  • http://localhost应显示默认网站
  • http://localhost:8080http://mytestproject.local应显示来自mytestproject的网站。

但事实却并非如此:

  • http://localhost:8080http://mytestproject.local正确显示来自mytestproject的网站。
  • http://localhost 提供来自测试项目的文件,而不是我预期的来自默认网站的文件

所以,这是我的问题:

我哪里错了?我需要配置什么才能让 localhost 显示默认网站,而其他端口和其他自定义域(通过 /etc/hosts)上的其他内容则显示其相应的内容,并且不会混淆?

提前致谢。

答案1

了解 nginx 如何选择服务器块http://nginx.org/en/docs/http/request_processing.html#mixed_name_ip_based_servers

在这种情况下,第一个服务器监听*:80,第二个服务器监听127.0.0.1:80,当您转到时,http://localhost/您的浏览器连接到127.0.0.1:80,并且 nginx 选择第二个服务器块,因为它更匹配请求,Host之后测试标头。

因此简单的解决方案就是listen mytestproject.local:80;用简单的替换listen 80;

答案2

我有一种奇怪的感觉,Bonjour 服务与此有关。Bonjour 服务为 .local 域提供多播 DNS https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/NetServices/Articles/domainnames.html#//apple_ref/doc/uid/20001072-202537

相关内容