我是 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:8080
并http://mytestproject.local
应显示来自mytestproject的网站。
但事实却并非如此:
http://localhost:8080
并http://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