目录

dnsmasq + laradock 本地开发自动解析域名,无需添加 hosts

使用场景

实际工作中有一些本地的域名需要修改 hosts 才可以访问,例如: test.laraveldevelop.test

实现的目的: 在指定目录下新建 laravel 项目(比如 test)后,可以直接在浏览器中访问 http://test.laravel ,无需再修改 hosts 文件

基本原理:

  • 使用 dnsmasq 将 .laravel 域名代理到本地解析
  • 使用 nginx 实现目录下的 泛域名解析

学习本文,你需要具备以下基本技能:

  • 程序员必备的基本技能(比如 vi/vim,终端命令)
  • nginx
  • dnsmasq (跟着本文即可知道大致用法)
  • laradock (需要很熟练,需要会配置 nginx)

本文将以 .laravel 为例来说明。 在开始前,可以先 ping test.laravel,看一下结果(结果肯定是 ping 不通啦)

dnsmasq

1
2
3
brew install dnsmasq

echo "address=/laravel/127.0.0.1" >> /usr/local/etc/dnsmasq.conf

address=/laravel/127.0.0.1 , 意思是访问 .laravel 直接引导到 127.0.0.1

1
2
sudo mkdir -p /etc/resolver
sudo tee /etc/resolver/laravel <<< "nameserver 127.0.0.1"

这里新建的文件叫 laravel , 因为我配置的域名结尾是 .laravel,假如大家配置的是 .test ,这里新文件应该叫:test。同理,如果配置多个域名后续,就必须写入多个文档哦!

1
sudo brew services start dnsmasq

此时 ping test.laravel 会发现 响应 ip 为 127.0.0.1, 浏览器访问 http://test.laravel ,就会看到输出内容啦。

命令合并写:

1
2
3
domain="laravel" && echo "address=/$domain/127.0.0.1" >> /usr/local/etc/dnsmasq.conf && sudo tee /etc/resolver/$domain <<< "nameserver 127.0.0.1" && unset domain && sudo brew services restart dnsmasq

domain="test" && echo "address=/$domain/127.0.0.1" >> /usr/local/etc/dnsmasq.conf && sudo tee /etc/resolver/$domain <<< "nameserver 127.0.0.1" && unset domain && sudo brew services restart dnsmasq
1
2
//刷新 DNS 缓存
sudo killall -HUP mDNSResponder

提示: dnsmasq 可以加载本地 /etc/hosts ,可配置 resolv-file ,具体内容可以参考其配置说明。

laradock 项目配置(重点,nginx 泛域名解析代理)

本小节实现的目的是,给目录里的每个项目自动配置泛域名代理 目录结构为:

1
2
3
~/code
├── todo
└── sanctum

如上例, code 文件夹是我存放所有 laravel 项目的地方, todosanctum 是两个已有的项目。

dns 配置

前文已配置好

项目环境配置

配置 laradock 的 .env

1
APP_CODE_PATH_HOST=~/code
1
vi nginx/sites/laravel.conf

写入以下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
server {

    listen 80;
    listen [::]:80;

    server_name ~^(?<subdomain>.+)\.laravel$;
    root /var/www/$subdomain/public;
    index index.php index.html index.htm;

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php-upstream;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    location /.well-known/acme-challenge/ {
        root /var/www/letsencrypt/;
        log_not_found off;
    }

    error_log /var/log/nginx/laravel_error.log;
    access_log /var/log/nginx/laravel_access.log;
}

注意,核心内容是:

1
2
3
server_name ~^(?<subdomain>.+)\.laravel$;
root /var/www/$subdomain/public;
index index.php index.html index.htm;

启动 laradock docker-compose up -d nginx 。 在浏览器中访问 http://todo.laravelhttp://sanctum.laravel

当然,你可以在 /code 目录中, laravel new test ,然后就能直接访问 http://test.laravel 啦。

错误排查

  • 如果 ping todo.laravel 没有返回 127.0.0.1 ,应该是 dnsmasq 配置不正确,或者没有重启服务
  • 如果浏览器访问 http://todo.laravel 不成功,应该是 laradock 没有配置好
  • 本人只有 mac 环境,其他平台请根据原理自行测试

参考资料

> Mac 下安装 dnsmasq 来配置开发环境

> 用 brew 安装 nginx 并配置 - Mysticbinary - 博客园

> 部分参考 mac os 搭建私有 DNS 之 dnsmasq - jasondayee - 博客园