GitLab无法将Laravel应用部署至AWS EC2实例求助
排查与解决Laravel部署至AWS EC2后目录为空的问题
我来帮你一步步排查这个问题——流水线显示正常但EC2上的/var/www/html目录为空,大概率是部署流程里的某个环节有隐性错误,咱们逐个击破:
1. 先确认EC2实例上的Git仓库是否已初始化
你的部署脚本直接执行git pull origin,但如果EC2的/var/www/html目录还没关联到GitLab仓库,这个命令会静默失败。请手动登录EC2实例,执行以下命令初始化仓库:
cd /var/www/html git init git remote add origin <你的GitLab仓库HTTPS/SSH地址> git fetch origin git checkout main # 替换成你的仓库默认分支,比如master
这一步是确保EC2上的目录已经和GitLab仓库建立关联,并且拉取到了初始代码。
2. 验证GitLab CI的SSH连接权限
虽然你在CI里配置了SSH密钥,但要确认该密钥对应的公钥已经添加到EC2实例的ubuntu用户的~/.ssh/authorized_keys文件中。可以登录EC2后执行以下命令检查:
cat ~/.ssh/authorized_keys
如果没找到对应公钥,把CI里SSH_PRIVATE_KEY的公钥内容添加进去即可。
另外,你可以在.gitlab-deploy.sh里加个SSH连通性测试,提前发现连接问题:
# 在for循环里的ssh命令前添加 ssh ubuntu@${array[i]} "echo 'SSH连接EC2成功'"
3. 让部署脚本暴露错误细节
流水线显示“执行正常”但没效果,很可能是git pull命令在EC2上执行失败了,但脚本没捕获错误。修改.gitlab-deploy.sh:
#!/bin/bash set -e # 替换原来的set -f,命令出错时立即停止脚本并返回错误 set -x # 开启命令输出,方便在CI日志里看细节 #Get servers list string=$DEPLOY_SERVER array=(${string//,/ }) #Iterate servers for deploy and pull last commit for i in "${!array[@]}"; do echo "Deploying to server ${array[i]}" ssh -v ubuntu@${array[i]} "cd /var/www/html && git pull origin main" # 明确指定分支名 done
这样CI日志会显示SSH和Git命令的详细输出,比如是否有权限拉取仓库、分支名是否匹配等。
4. 检查CI变量配置是否正确
登录GitLab项目的「Settings → CI/CD → Variables」,确认:
SSH_PRIVATE_KEY是能访问EC2的私钥(无换行缺失,格式正确)DEPLOY_SERVER是EC2的公网IP(多个IP用逗号分隔,无多余空格)- 如果你用SSH地址拉取GitLab仓库,还要确保EC2的公钥已经添加到GitLab项目的「Deploy Keys」中(否则EC2无法拉取代码)
5. Laravel部署的后续配置(必做)
即使代码拉取成功,Laravel还需要配置才能运行,登录EC2执行以下步骤:
cd /var/www/html # 复制并配置环境变量 cp .env.example .env # 生成APP_KEY php artisan key:generate # 安装PHP依赖(需要先在EC2上安装Composer) composer install # 设置目录权限 sudo chown -R www-data:www-data /var/www/html sudo chmod -R 755 /var/www/html/storage sudo chmod -R 755 /var/www/html/bootstrap/cache # 配置Apache根目录为public文件夹 sudo nano /etc/apache2/sites-available/000-default.conf # 将DocumentRoot改为/var/www/html/public,然后重启Apache sudo systemctl restart apache2
内容的提问来源于stack exchange,提问作者CIZO
相关产品推荐
相关产品推荐

