使用场景
实际工作中有一些本地的域名需要修改 hosts 才可以访问,例如: test.laravel
, develop.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 项目的地方, todo
和 sanctum
是两个已有的项目。
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.laravel
和 http://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 - 博客园