GitLab Runner 1.29跑Behat测试报api.local 80端口连接被拒
问题排查结论
连接80端口被拒绝的核心原因不是虚拟主机规则未识别,是Apache服务未正常启动,所有到api.local的请求根本没有被Web服务接收。
具体根因
- 你使用的
php:5.6-apache官方镜像默认通过apache2-foreground脚本以前台模式托管Apache进程,直接在CI脚本中执行apache2ctl start会出现守护进程异常:进程启动后会因为容器内无init进程托管、PID文件权限不足、环境变量未完整加载等问题立刻退出,80端口无进程监听。 - 你的流水线脚本在执行
apache2ctl start后没有做启动状态校验,虽然写了apache2ctl status但日志中无对应输出,说明启动步骤已经静默失败,后续数据库初始化、测试步骤执行时Apache早已退出。 - 配置存在两处隐患:一是Dockerfile中APT执行顺序错误,先执行
apt-get upgrade再执行apt-get update,会导致包索引过期、安装依赖失败;二是虚拟主机配置未明确开启软链访问权限,就算Apache启动成功,软链形式的项目目录也可能返回403错误。
修复方案
- 替换
.gitlab-ci.yml中before_script段的Apache启动逻辑,增加配置校验、启动后端口检测步骤:
before_script: - eval $(ssh-agent -s) - ssh-add <(echo "$SSH_PRIVATE_KEY") - echo "export APPLICATION_ENV='test'" >> /etc/apache2/envvars - export APPLICATION_ENV='test' - rm /var/www/globkurier.pl/globkurier.pl -Rf - ln -s /builds/znatury/globkurier.pl/ /var/www/globkurier.pl/globkurier.pl - mkdir -p /var/log/apache2/ - chmod -R 755 /var/log/apache2/ - echo '127.0.0.1 api.local' >> /etc/hosts - echo '127.0.0.1 api.mock' >> /etc/hosts # 先校验Apache配置合法性 - apache2ctl configtest # 加载Apache环境变量,后台启动服务 - source /etc/apache2/envvars && apache2 -DFOREGROUND & # 等待服务启动 - sleep 3 # 校验80端口监听状态 - ss -tulpn | grep :80 - curl -I http://127.0.0.1
- 调整虚拟主机配置,给软链目录开启访问权限,在
api.local.conf、api.mock.conf中添加对应目录规则:
<Directory /var/www/globkurier.pl/globkurier.pl> Options FollowSymLinks Indexes AllowOverride All Require all granted </Directory>
- 修正Dockerfile中的APT执行顺序,将
apt-get update移到所有apt操作的最前面,避免包索引过期问题:
# 修正后顺序 RUN apt-get update --fix-missing RUN apt-get upgrade -y RUN apt-get install -y \ # 原有依赖列表保持不变
- 重新构建镜像后再跑流水线,如果还是启动失败,直接查看
/var/log/apache2/error.log的输出定位具体配置错误。
内容的提问来源于stack exchange,提问作者Emer
相关产品推荐
相关产品推荐

