本文为在 Mac 上实现 多站点托管 的实用参考,覆盖 Nginx 与 Apache 两种常见服务器、虚拟主机配置、hosts 文件、SSL 本地证书以及常见问题排查。建议先安装 Homebrew、PHP(如需多版本)、以及基本命令行工具。
在本地通过配置 HTTP 服务器的多个虚拟主机,再配合系统 /etc/hosts 映射不同域名到 127.0.0.1,即可实现多站点共存。若同时运行 Nginx 与 Apache,可用端口或反向代理实现互不冲突。
使用 Homebrew 安装:
brew install nginx
brew install httpd # Apache
brew install php # 可指定版本,如 php@7.4
在 Nginx 中,每个站点使用 server block。示例将两个站点绑定到不同域名:
server {
listen 80;
server_name site1.local;
root /Users/you/Sites/site1;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000; # php-fpm
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
server {
listen 80;
server_name site2.local;
root /Users/you/Sites/site2;
index index.php index.html;
...
}
将以上配置放入 /usr/local/etc/nginx/servers/ 或 /etc/nginx/sites-enabled(取决于安装)。重启 Nginx:nginx -s reload 或 brew services restart nginx。
Apache 使用 VirtualHost。示例:
<VirtualHost *:80>
ServerName site1.local
DocumentRoot "/Users/you/Sites/site1"
AllowOverride All
Require all granted
<VirtualHost *:80>
ServerName site2.local
DocumentRoot "/Users/you/Sites/site2"
...
配置文件通常放在 /usr/local/etc/httpd/extra/httpd-vhosts.conf,启用并重启 Apache:brew services restart httpd。
本地解析靠 /etc/hosts,添加:
127.0.0.1 site1.local
127.0.0.1 site2.local
保存后通过浏览器访问域名即可。如果 DNS 缓存导致旧解析,执行:sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder。
开发环境建议使用 mkcert 生成受信任的本地证书:
brew install mkcert
mkcert -install
mkcert site1.local site2.local
生成的证书放到相应站点配置中。Nginx 示例:
server {
listen 443 ssl;
server_name site1.local;
ssl_certificate /path/to/site1.local.pem;
ssl_certificate_key /path/to/site1.local-key.pem;
...
}
当 Nginx 与 Apache 同机运行,避免端口冲突。常见做法是让 Nginx 作为 反向代理 (listen 80/443),并把部分请求转给 Apache 的后台端口,例如 8080。
location /legacy {
proxy_pass http://127.0.0.1:8080;
}
或将 Apache 改为监听非标准端口,同时在 Nginx 中代理对应 server_name。
调试多个项目可能需要不同 PHP 版本。可以通过 Homebrew 并启用对应的 php-fpm 端口或套接字:
php@7.4-fpm -> 127.0.0.1:9074
php@8.1-fpm -> 127.0.0.1:9081
在站点配置中设置 fastcgi_pass 到对应端口以实现版本隔离。
1) 若页面返回 403,检查目录权限与 DocumentRoot。2) 无法访问域名,确认 /etc/hosts 是否生效并清缓存。3) SSL 错误,确保证书被系统信任(mkcert 安装)。4) 端口占用,使用 lsof -i :80 或 lsof -i :443 查找占用进程。
为每个项目使用独立的根目录与配置文件,保持配置版本化(例如放在 Git 中)。使用 反向代理 可以将静态资源与动态应用分离。定期清理 unused 服务并记录端口映射,避免冲突。
问:本地多个站点都指向同一个项目,如何排查?
答:先确认 /etc/hosts 中是否有重复或通配配置,检查服务器配置的 server_name / ServerName 是否正确匹配。若使用反向代理,核对 proxy_pass 目标是否配置错误。
问:如何在本地为不同站点使用不同 PHP 版本?
答:安装所需的 PHP 版本并启动对应的 php-fpm,为每个版本设置不同的监听端口或套接字,在 Nginx 的 location ~ \.php$ 或 Apache 的 Proxy 指向相应的 php-fpm 地址。