树莓派上为不同.local域名配置独立Nginx服务器的问题咨询
树莓派上为不同.local域名配置独立Nginx服务器的问题咨询
我来帮你梳理下问题原因和解决办法:
为什么访问foo.local会跳转到默认Nginx页面?
这是因为Nginx的default_server规则在起作用——当Nginx收到请求时,如果找不到和请求域名匹配的server_name配置块,就会自动用标记了default_server的那个server来处理请求。你用Avahi把foo.local指向了树莓派的IP,请求自然会落到Nginx上,而你又没给foo.local单独配置server块,所以就走了默认的raspberrypi.local对应的页面。
解决办法分两种场景:
场景1:让未配置的.local域名直接显示“无法访问”
你可以新增一个专门的server块,把它设为新的default_server,用来拦截所有未匹配的域名请求,直接断开连接或者返回404:
- 修改Nginx配置,先把原来的默认server块去掉
default_server标记:
server { listen 80; listen [::]:80; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name raspberrypi.local; }
- 新增一个专门处理未匹配域名的server块:
server { listen 80 default_server; listen [::]:80 default_server; server_name _; # 下划线表示匹配所有未明确配置的域名 return 444; # 直接关闭连接,浏览器会显示“无法访问” }
- 重启Nginx生效:
sudo systemctl restart nginx
之后再访问foo.local,浏览器就会提示无法连接了。
场景2:配置多个独立的.local域名(不是别名)
如果想给不同的.local域名配置不同的服务,按下面步骤来:
用Avahi发布多个.local域名的A记录(如果要长期生效,建议写成Avahi服务文件,避免每次重启手动执行):
临时生效的命令:avahi-publish -a -R foo.local 192.168.68.120 avahi-publish -a -R bar.local 192.168.68.120长期生效的话,比如给foo.local创建Avahi服务文件
/etc/avahi/services/foo.local.service:<?xml version="1.0" standalone='no'?> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <service-group> <name replace-wildcards="yes">foo</name> <service> <type>_http._tcp</type> <port>80</port> <host-name>raspberrypi</host-name> <address ipv4="192.168.68.120"></address> </service> </service-group>然后重启Avahi:
sudo systemctl restart avahi-daemon在Nginx里为每个域名配置独立的server块:
# raspberrypi.local 原服务 server { listen 80; listen [::]:80; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name raspberrypi.local; } # foo.local 专属服务 server { listen 80; listen [::]:80; root /var/www/foo; # 存放foo域名的网站文件目录 index index.html; server_name foo.local; } # bar.local 专属服务 server { listen 80; listen [::]:80; root /var/www/bar; # 存放bar域名的网站文件目录 index index.html; server_name bar.local; } # 可选:拦截未配置的域名 server { listen 80 default_server; listen [::]:80 default_server; server_name _; return 444; }
- 创建对应的网站目录并放入内容:
sudo mkdir -p /var/www/foo /var/www/bar sudo echo "<h1>Hello from foo.local</h1>" > /var/www/foo/index.html sudo echo "<h1>Hello from bar.local</h1>" > /var/www/bar/index.html
- 重启Nginx生效:
sudo systemctl restart nginx
这样每个.local域名就会指向各自独立的内容了。
备注:内容来源于stack exchange,提问作者Hello-World
相关产品推荐
相关产品推荐

