基于LAMP或LNMP镜像如何搭建多个独立网站?

在 LAMP(Linux + Apache + MySQL/MariaDB + PHP)或 LNMP(Linux + Nginx + MySQL/MariaDB + PHP)环境中搭建多个独立网站,核心思路是:为每个网站分配独立的目录、配置文件和域名(或子域名),通过 Web 服务器虚拟主机(VirtualHost/Server Block)进行隔离。以下是通用步骤和两种架构的具体实现方式。


🌐 前提准备

  1. 系统环境:已安装好 LAMP 或 LNMP 基础镜像(如 Docker 镜像或物理机/虚拟机)。
  2. 域名解析:确保各站点域名已指向服务器 IP(A 记录或 CNAME)。
  3. 目录规划:建议按如下结构组织:
    /var/www/site1          # 网站1根目录
    /var/www/site2
    /etc/nginx/conf.d/      # 或 /etc/apache2/sites-available/
  4. 数据库隔离:每个站点可共用同一 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_nameroot 路径。

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_rewritempm_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 镜像(如 lemplamp 多容器组合),可通过以下方式扩展:

示例: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),我可进一步定制方案。