本地虚拟主机(dnsmasq、Apache)无法访问问题求助
本地.dev域名Web环境无法访问排查求助
几个月前我搭建了本地Web开发环境,之前一切正常,但昨天突然出现异常:我可以ping通所有*.dev地址,比如:
➜ ping -c 1 home.dev PING home.dev (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.049 ms --- home.dev ping statistics --- 1 packets transmitted, 1 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.049/0.049/0.049/0.000 ms
但在浏览器中输入地址时,仅显示错误提示:This site can’t be reached home.dev refused to connect。我已多次重启电脑、dnsmasq和Apache,重复了搭建指南的所有步骤,还尝试了其他配置方案,但均无效果,恳请大家提供排查思路。
我的配置信息
1. http-vhosts.conf 文件内容
<Directory "/www"> Options Indexes MultiViews FollowSymLinks AllowOverride All Require all granted </Directory> <Virtualhost *:80> VirtualDocumentRoot "/www/home/wwwroot" ServerName home.dev UseCanonicalName Off </Virtualhost> <Virtualhost *:80> VirtualDocumentRoot "/www/sites/%1/wwwroot" ServerName sites.dev ServerAlias *.dev UseCanonicalName Off </Virtualhost> <Virtualhost *:80> VirtualDocumentRoot "/www/sites/%-7+/wwwroot" ServerName xip ServerAlias *.xip.io UseCanonicalName Off </Virtualhost>
2. 本地目录结构
/www home wwwroot index.html (...) sites sites test wwwroot index.html (...)
3. httpd -S 命令输出
➜ httpd -S [Mon Jan 15 16:53:36.655895 2018] [so:warn] [pid 31755] AH01574: module php7_module is already loaded, skipping AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using olivetum.local. Set the 'ServerName' directive globally to suppress this message VirtualHost configuration: *:80 is a NameVirtualHost default server home.dev (/private/etc/apache2/extra/httpd-vhosts.conf:7) port 80 namevhost home.dev (/private/etc/apache2/extra/httpd-vhosts.conf:7) port 80 namevhost sites.dev (/private/etc/apache2/extra/httpd-vhosts.conf:13) wild alias *.dev port 80 namevhost xip (/private/etc/apache2/extra/httpd-vhosts.conf:20) wild alias *.xip.io ServerRoot: "/usr" Main DocumentRoot: "/Library/WebServer/Documents" Main ErrorLog: "/private/var/log/apache2/error_log" Mutex default: dir="/private/var/run/" mechanism=default Mutex mpm-accept: using_defaults PidFile: "/private/var/run/httpd.pid" Define: DUMP_VHOSTS Define: DUMP_RUN_CFG User: name="_www" id=70 not_used Group: name="_www" id=70 not_used
4. dig home.dev @127.0.0.1 命令输出
➜ dig home.dev @127.0.0.1 ;; QUESTION SECTION: ;home.dev. IN A ;; ANSWER SECTION: home.dev. 0 IN A 127.0.0.1
排查思路建议
结合你的情况,我整理了几个优先级较高的排查方向,你可以逐一尝试:
- 先确认Apache是否真的在监听80端口:执行
lsof -i :80或者netstat -an | grep LISTEN | grep :80,看看有没有httpd进程在监听。如果没有,说明Apache启动失败,直接去查看错误日志/private/var/log/apache2/error_log,里面会有具体的失败原因(比如端口被其他服务占用、配置语法错误)。 - 检查虚拟主机配置语法:执行
apachectl configtest,这个命令会帮你检测Apache配置文件的语法问题,哪怕是小错误比如括号不匹配、路径写错都会被揪出来。另外你之前httpd -S里有个php7模块重复加载的警告,建议去httpd.conf里检查下是不是重复写了LoadModule php7_module,把警告修复掉避免潜在问题。 - 验证网站目录权限:从
httpd -S输出看到Apache运行用户是_www,你需要确保/www及其子目录、文件的权限允许_www读取。可以执行chown -R _www:_www /www或者chmod -R 755 /www,权限不足经常会导致Apache无法正常解析文件。 - 直接访问IP测试基础服务:在浏览器输入
http://127.0.0.1,如果能看到Apache默认页面或者你的home.dev内容,说明Apache本身没问题,问题出在域名匹配或浏览器层面;如果不能访问,那重点排查Apache的基础运行问题。 - 排查浏览器的HTTPS强制跳转:这里有个很容易忽略的点——
.dev现在是正式的顶级域名,主流浏览器会自动把.dev域名强制跳转到HTTPS,但你只配置了80端口的HTTP虚拟主机,没有配置443端口的SSL服务,所以浏览器会提示连接被拒绝。你可以试试在浏览器里明确输入http://home.dev(加上http://前缀),或者临时把域名后缀改成.test来测试,看看能不能正常访问。 - 清空DNS缓存:虽然ping和dig都正常,但浏览器或系统的DNS缓存可能有残留,试试清空浏览器DNS缓存(比如Chrome里输入
chrome://net-internals/#dns点击清空),或者执行系统级缓存清空命令:sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder。
内容的提问来源于stack exchange,提问作者olivetum
相关产品推荐
相关产品推荐

