多站点共存需Nginx按域名路由、PHP-FPM独立端口池隔离、数据库与缓存多租户配置;须改www.conf监听为TCP端口,为各站建独立FPM池及Nginx虚拟主机,代码部署时.env的APP_KEY必须唯一,数据库与文件权限须按站点分离。

准备多站点共存的服务器基础环境
要在同一台服务器上运行多个Laravel站点,必须确保Nginx能区分不同域名请求、PHP-FPM能隔离各站运行上下文、数据库与缓存服务支持多租户连接。缺少任一环节,站点间将出现配置污染或500错误。
执行系统更新并安装核心组件:sudo apt update → sudo apt install nginx php8.1-fpm php8.1-mysql php8.1-redis php8.1-opcache mysql-server redis-server
验证PHP-FPM监听方式:cat /etc/php/8.1/fpm/pool.d/www.conf | grep -E "listen|user|group"。若listen = /run/php/php8.1-fpm.sock,则所有站点共享同一socket;【必须改为listen = 9001】才能为每个站点分配独立端口,避免进程混用。
为每个站点创建独立PHP-FPM池
进入PHP-FPM池配置目录:cd /etc/php/8.1/fpm/pool.d/
复制默认池并重命名:sudo cp www.conf site-a.conf → sudo cp www.conf site-b.conf
编辑site-a.conf:sudo nano site-a.conf,修改以下关键项:
[site-a]
user = www-data-site-a
group = www-data-site-a
listen = 127.0.0.1:9001
listen.owner = www-data
listen.group = www-data
pm.max_children = 10
chdir = /var/www/site-a
同理编辑site-b.conf,把端口改为9002、用户组改为www-data-site-b、chdir指向/var/www/site-b。每改完一个文件,执行sudo systemctl restart php8.1-fpm生效。
配置Nginx虚拟主机并绑定域名
在/etc/nginx/sites-available/下为每个站点创建独立配置文件:sudo nano /etc/nginx/sites-available/site-a
填入标准Laravel站点配置,重点修改三处:
server_name site-a.com www.site-a.com;
root /var/www/site-a/public;
fastcgi_pass 127.0.0.1:9001;
对site-b重复操作,server_name设为site-b.com,root指向/var/www/site-b/public,fastcgi_pass改为127.0.0.1:9002。
启用站点:sudo ln -sf /etc/nginx/sites-available/site-a /etc/nginx/sites-enabled/ → sudo ln -sf /etc/nginx/sites-available/site-b /etc/nginx/sites-enabled/
测试Nginx语法并重载:sudo nginx -t → sudo systemctl reload nginx
部署各站点代码并设置专属环境
方法一:手动部署
① 创建站点根目录:sudo mkdir -p /var/www/site-a /var/www/site-b
② 分别克隆代码:git clone https://your-repo-a.git /var/www/site-a → git clone https://your-repo-b.git /var/www/site-b
③ 进入site-a目录,执行:cp .env.example .env → composer install --no-dev --optimize-autoloader
④ 编辑.env:APP_URL=https://site-a.com → DB_DATABASE=site_a_db → DB_USERNAME=site_a_user
方法二:自动化脚本部署(推荐)
编写deploy-site.sh,内容包含mkdir、git clone、composer install、key:generate、migrate --force等指令,并传入$1为站点名参数。运行时./deploy-site.sh site-a即可完成全链路初始化。
注意:两个站点的.env中【APP_KEY必须各自独立生成】,不可复用同一密钥,否则加密会话和密码重置链接将跨站失效。
设置数据库与文件权限隔离
为site-a创建专用MySQL用户与数据库:
mysql -u root -p -e "CREATE DATABASE site_a_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -u root -p -e "CREATE USER 'site_a_user'@'localhost' IDENTIFIED BY 'strong-password-a';"
mysql -u root -p -e "GRANT ALL PRIVILEGES ON site_a_db.* TO 'site_a_user'@'localhost'; FLUSH PRIVILEGES;"
同理为site-b创建site_b_db与site_b_user,密码必须不同。
设置storage与bootstrap/cache可写权限:sudo chown -R www-data-site-a:www-data-site-a /var/www/site-a/storage /var/www/site-a/bootstrap/cache → sudo chown -R www-data-site-b:www-data-site-b /var/www/site-b/storage /var/www/site-b/bootstrap/cache
最后执行缓存命令:php artisan config:cache → php artisan route:cache → php artisan view:cache,每个站点需分别进入其目录下运行。


















