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 --version2.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 --version3. 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: bridge4.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/cache4.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这个命令会:
- 构建自定义的PHP-FPM镜像
- 拉取MySQL和Nginx官方镜像
- 创建网络和卷
- 启动所有服务
5.2 初始化数据库
执行数据库迁移和种子:
docker-compose exec app php artisan migrate --seed5.3 优化应用性能
执行以下优化命令:
docker-compose exec app php artisan config:cache docker-compose exec app php artisan route:cache docker-compose exec app php artisan view:cache6. 常见问题与解决方案
6.1 权限问题
如果遇到文件权限问题,可以执行:
docker-compose exec app chown -R www-data:www-data storage bootstrap/cache6.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 nginx7. 安全加固建议
7.1 防火墙配置
配置服务器防火墙,仅开放必要端口:
sudo firewall-cmd --permanent --add-port=80/tcp sudo firewall-cmd --permanent --add-port=443/tcp sudo firewall-cmd --reload7.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 nginx8.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-project8.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:clear9.2 容器重建
当Dockerfile或docker-compose.yml有修改时:
docker-compose up -d --build9.3 服务重启
重启所有服务:
docker-compose restart重启特定服务:
docker-compose restart app10. 实际部署经验分享
在香港服务器部署Laravel应用时,网络延迟通常比内地服务器更低,但也要注意以下几点:
- 选择靠近主要用户群体的服务器机房位置
- 监控服务器到数据库的网络延迟
- 配置适当的缓存策略减少数据库查询
- 使用CDN加速静态资源加载
- 定期检查服务器与容器的资源使用情况
对于高流量应用,可以考虑:
- 增加Nginx和PHP-FPM容器实例数量
- 配置MySQL主从复制
- 使用Redis缓存会话和数据
- 实现负载均衡
提示:香港服务器通常提供国际带宽优势,适合服务亚太地区用户,但也要注意合规性和数据安全要求。
