在 LAMP(Linux + Apache + MySQL/MariaDB + PHP)或 LNMP(Linux + Nginx + MySQL/MariaDB + PHP)环境中搭建多个独立网站,核心思路是:为每个网站分配独立的目录、配置文件和域名(或子域名),通过 Web 服务器虚拟主机(VirtualHost/Server Block)进行隔离。以下是通用步骤和两种架构的具体实现方式。
🌐 前提准备
- 系统环境:已安装好 LAMP 或 LNMP 基础镜像(如 Docker 镜像或物理机/虚拟机)。
- 域名解析:确保各站点域名已指向服务器 IP(A 记录或 CNAME)。
- 目录规划:建议按如下结构组织:
/var/www/site1 # 网站1根目录 /var/www/site2 /etc/nginx/conf.d/ # 或 /etc/apache2/sites-available/ - 数据库隔离:每个站点可共用同一 MySQL 实例,但创建独立数据库和用户(推荐权限最小化)。
🔧 方案一:LNMP(Nginx + MySQL + PHP-FPM)
1. 创建网站目录与权限
sudo mkdir -p /var/www/site1/html
sudo mkdir -p /var/www/site2/html
sudo chown -R www-data:www-data /var/www/site1/html
sudo chown -R www-data:www-data /var/www/site2/html
sudo chmod -R 755 /var/www/site1/html
2. 配置 Nginx 虚拟主机(Server Block)
编辑 /etc/nginx/conf.d/site1.conf:
server {
listen 80;
server_name site1.example.com www.site1.example.com;
root /var/www/site1/html;
index index.php index.html;
location ~ .php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 根据实际 PHP 版本调整
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location / {
try_files $uri $uri/ =404;
}
}
同理创建 site2.conf,修改 server_name 和 root 路径。
3. 测试并重载配置
sudo nginx -t
sudo systemctl reload nginx
4. 创建独立数据库(MySQL)
CREATE DATABASE site1_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'site1_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON site1_db.* TO 'site1_user'@'localhost';
FLUSH PRIVILEGES;
✅ 建议:每个站点使用独立数据库用户,避免跨站数据泄露。
🔧 方案二:LAMP(Apache + MySQL + PHP)
1. 创建网站目录(同上)
2. 配置 Apache 虚拟主机(.conf 文件)
启用 mod_rewrite 和 mpm_prefork(如需):
sudo a2enmod rewrite
sudo a2dissite 000-default.conf # 可选:禁用默认站点
创建 /etc/apache2/sites-available/site1.conf:
<VirtualHost *:80>
ServerName site1.example.com
ServerAlias www.site1.example.com
DocumentRoot /var/www/site1/html
<Directory /var/www/site1/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/site1_error.log
CustomLog ${APACHE_LOG_DIR}/site1_access.log combined
</VirtualHost>
启用站点:
sudo a2ensite site1.conf
sudo systemctl restart apache2
3. 数据库配置(同 LNMP)
🐳 Docker 场景(基于官方镜像)
若使用 Docker 部署 LAMP/LNMP 镜像(如 lemp 或 lamp 多容器组合),可通过以下方式扩展:
示例:Docker Compose 多站点
# docker-compose.yml
version: '3.8'
services:
web1:
image: nginx:alpine
volumes:
- ./site1/html:/usr/share/nginx/html
- ./site1/nginx.conf:/etc/nginx/conf.d/default.conf
ports:
- "8081:80"
depends_on: [db]
web2:
image: nginx:alpine
volumes:
- ./site2/html:/usr/share/nginx/html
- ./site2/nginx.conf:/etc/nginx/conf.d/default.conf
ports:
- "8082:80"
depends_on: [db]
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: shared_db
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
💡 提示:生产环境建议用反向X_X(如 Traefik/Nginx)统一端口转发,避免暴露多个端口。
✅ 最佳实践建议
| 项目 | 建议 |
|---|---|
| PHP-FPM 管理 | 每个站点可配独立 pool(LNMP),提高资源隔离性 |
| SSL/TLS | 使用 Let’s Encrypt 自动签发证书(certbot) |
| 日志分离 | 每个站点独立 error/access log,便于排查 |
| 安全加固 | 关闭目录浏览、限制文件上传类型、定期更新组件 |
| 备份策略 | 定期备份数据库 + 网站代码 + 配置文件 |
需要我提供:
- 完整的 Docker Compose 多站点模板?
- 自动化脚本(一键部署多站点)?
- WordPress/ThinkPHP 等框架的预配置示例?
欢迎告诉我你的具体技术栈(如 Ubuntu + Nginx 1.24 + PHP 8.2)和使用场景(个人博客/企业多租户/SaaS),我可进一步定制方案。
PHPWP博客