CentOS 7香港服务器部署Laravel+Docker全流程指南

1. 项目概述

在香港地区的服务器上部署Laravel应用是一个常见的开发需求,特别是对于需要面向亚太地区用户的服务。CentOS 7作为稳定可靠的Linux发行版,配合Docker容器化技术,能够为Laravel应用提供高效的运行环境。本教程将详细讲解从零开始搭建Laravel+MySQL服务的完整流程。

注意:本教程假设您已经拥有一台运行CentOS 7的香港服务器,并具备基本的Linux命令行操作能力。

2. 环境准备与基础配置

2.1 系统更新与基础工具安装

首先登录您的CentOS 7服务器,执行以下命令更新系统并安装必要工具:

sudo yum update -y sudo yum install -y yum-utils device-mapper-persistent-data lvm2

这些工具是后续安装Docker所必需的依赖项。更新系统可以确保所有软件包都是最新版本,减少潜在的兼容性问题。

2.2 Docker安装与配置

在CentOS 7上安装Docker的推荐方式是使用官方仓库:

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io

安装完成后,启动Docker服务并设置为开机自启:

sudo systemctl start docker sudo systemctl enable docker

验证Docker是否安装成功:

sudo docker --version

2.3 Docker Compose安装

Docker Compose是管理多容器应用的重要工具,安装方法如下:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose

验证安装:

docker-compose --version

3. Laravel项目准备

3.1 创建Laravel项目

在服务器上创建项目目录并初始化Laravel项目:

mkdir ~/laravel-project && cd ~/laravel-project curl -s https://laravel.build/example-app | bash

这个命令会创建一个名为example-app的新Laravel项目。如果您已有现有项目,可以直接将项目文件上传到这个目录。

3.2 配置项目环境

编辑项目根目录下的.env文件,配置数据库连接等关键参数:

APP_NAME=Laravel APP_ENV=production APP_KEY=base64:... APP_DEBUG=false APP_URL=http://your-domain.com DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=your_secure_password

重要提示:生产环境中务必设置APP_DEBUG=false,并确保APP_KEY已生成。

4. Docker Compose配置

4.1 编写docker-compose.yml

在项目根目录创建docker-compose.yml文件,内容如下:

version: '3.8' services: app: build: context: . dockerfile: Dockerfile image: laravel-app container_name: laravel-app restart: unless-stopped working_dir: /var/www/html volumes: - .:/var/www/html environment: - "DB_HOST=mysql" - "DB_PORT=3306" depends_on: - mysql networks: - laravel-network mysql: image: mysql:5.7 container_name: mysql restart: unless-stopped environment: MYSQL_DATABASE: laravel MYSQL_ROOT_PASSWORD: your_secure_password volumes: - mysql-data:/var/lib/mysql networks: - laravel-network nginx: image: nginx:alpine container_name: nginx restart: unless-stopped ports: - "80:80" - "443:443" volumes: - .:/var/www/html - ./nginx/conf.d:/etc/nginx/conf.d depends_on: - app networks: - laravel-network volumes: mysql-data: driver: local networks: laravel-network: driver: bridge

4.2 创建Dockerfile

在项目根目录创建Dockerfile,内容如下:

FROM php:8.0-fpm-alpine WORKDIR /var/www/html RUN apk add --no-cache \ freetype \ libpng \ libjpeg-turbo \ freetype-dev \ libpng-dev \ libjpeg-turbo-dev \ libzip-dev \ zip \ unzip \ git \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) gd pdo pdo_mysql zip \ && apk del --no-cache freetype-dev libpng-dev libjpeg-turbo-dev RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer COPY . . RUN composer install --no-interaction --optimize-autoloader --no-dev RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache

4.3 配置Nginx

创建nginx配置文件目录和文件:

mkdir -p nginx/conf.d

创建nginx/conf.d/app.conf文件,内容如下:

server { listen 80; index index.php index.html; server_name your-domain.com; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root /var/www/html/public; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }

5. 部署与启动

5.1 构建并启动容器

在项目根目录执行以下命令:

docker-compose up -d --build

这个命令会:

  1. 构建自定义的PHP-FPM镜像
  2. 拉取MySQL和Nginx官方镜像
  3. 创建网络和卷
  4. 启动所有服务

5.2 初始化数据库

执行数据库迁移和种子:

docker-compose exec app php artisan migrate --seed

5.3 优化应用性能

执行以下优化命令:

docker-compose exec app php artisan config:cache docker-compose exec app php artisan route:cache docker-compose exec app php artisan view:cache

6. 常见问题与解决方案

6.1 权限问题

如果遇到文件权限问题,可以执行:

docker-compose exec app chown -R www-data:www-data storage bootstrap/cache

6.2 数据库连接失败

检查MySQL容器是否正常运行:

docker-compose logs mysql

确保.env文件中的数据库配置与docker-compose.yml中的一致。

6.3 Nginx 502 Bad Gateway

检查PHP-FPM服务是否正常运行:

docker-compose exec app php-fpm -t

查看Nginx错误日志:

docker-compose logs nginx

7. 安全加固建议

7.1 防火墙配置

配置服务器防火墙,仅开放必要端口:

sudo firewall-cmd --permanent --add-port=80/tcp sudo firewall-cmd --permanent --add-port=443/tcp sudo firewall-cmd --reload

7.2 数据库安全

建议修改MySQL root密码,并创建专用应用用户:

docker-compose exec mysql mysql -uroot -p

在MySQL命令行中:

ALTER USER 'root'@'%' IDENTIFIED BY 'new_secure_password'; CREATE USER 'appuser'@'%' IDENTIFIED BY 'app_password'; GRANT ALL PRIVILEGES ON laravel.* TO 'appuser'@'%'; FLUSH PRIVILEGES;

然后更新.env文件中的数据库凭据。

7.3 HTTPS配置

为生产环境配置SSL证书,可以使用Let's Encrypt免费证书:

docker-compose stop nginx sudo certbot certonly --standalone -d your-domain.com

然后更新nginx配置使用SSL证书。

8. 维护与监控

8.1 日志查看

查看容器日志:

docker-compose logs -f

查看特定服务日志:

docker-compose logs -f app docker-compose logs -f mysql docker-compose logs -f nginx

8.2 备份策略

定期备份数据库:

docker-compose exec mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > backup.sql

备份应用代码和上传文件:

tar -czvf laravel-backup.tar.gz ~/laravel-project

8.3 性能监控

安装监控工具:

docker run -d --name=portainer -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

然后通过浏览器访问服务器IP:9000来管理Docker容器。

9. 更新与升级

9.1 应用更新

当Laravel应用代码更新时:

git pull origin master docker-compose exec app composer install docker-compose exec app php artisan migrate docker-compose exec app php artisan cache:clear

9.2 容器重建

当Dockerfile或docker-compose.yml有修改时:

docker-compose up -d --build

9.3 服务重启

重启所有服务:

docker-compose restart

重启特定服务:

docker-compose restart app

10. 实际部署经验分享

在香港服务器部署Laravel应用时,网络延迟通常比内地服务器更低,但也要注意以下几点:

  1. 选择靠近主要用户群体的服务器机房位置
  2. 监控服务器到数据库的网络延迟
  3. 配置适当的缓存策略减少数据库查询
  4. 使用CDN加速静态资源加载
  5. 定期检查服务器与容器的资源使用情况

对于高流量应用,可以考虑:

  • 增加Nginx和PHP-FPM容器实例数量
  • 配置MySQL主从复制
  • 使用Redis缓存会话和数据
  • 实现负载均衡

提示:香港服务器通常提供国际带宽优势,适合服务亚太地区用户,但也要注意合规性和数据安全要求。