Oracle云Docker部署Laravel登录异常 显示中间页重启后仅临时恢复
Laravel Docker部署后登录间歇性跳转异常问题
Laravel登录功能无法正常使用,会显示如下中间跳转页:
该问题仅在搭载Docker的Oracle云实例生产服务器上出现,重启服务器后可临时恢复正常,但运行数小时后问题会再次复现。
相关配置信息
docker-compose配置
version: '3' networks: laravel: services: nginx: build: context: . dockerfile: nginx.dockerfile ports: - "80:80" volumes: - .:/var/www/html:delegated depends_on: - PHP networks: - laravel restart: always MySQL: image: mysql:5.7 tty: true ports: - "3306:3306" environment: MYSQL_USER: sdgf MYSQL_DATABASE: sdgsdf MYSQL_PASSWORD: dsfgsdf MYSQL_ROOT_PASSWORD: dsfgsfg SERVICE_TAGS: dev SERVICE_NAME: MySQL networks: - laravel volumes: - ./data:/var/lib/mysql restart: always PHP: build: context: . dockerfile: php.dockerfile args: - USER_ID=1001 - GROUP_ID=1001 volumes: - .:/var/www/html:delegated - ./docker/php/php.ini:/usr/local/etc/php/conf.d/custom.ini ports: - "9000:9000" networks: - laravel restart: always artisan: build: context: . dockerfile: php.dockerfile args: - USER_ID=1001 - GROUP_ID=1001 volumes: - .:/var/www/html:delegated working_dir: /var/www/html user: laravel entrypoint: ['php', '/var/www/html/artisan'] networks: - laravel volumes: mysql-data: driver: local
php.ini配置
max_execution_time = 120 ;extension=php_gd2.dll upload_max_filesize = 40m post_max_size = 50m memory_limit=1024M
登录控制器核心代码
public function postAdminLogin(Request $request) { if (Auth::attempt(['email' => $request['email'], 'password' => $request['password'], 'role' => Constants::$ADMIN_USER])) { return redirect()->route('adminHome'); } if (Auth::attempt(['email' => $request['email'], 'password' => $request['password'], 'role' => Constants::$METER_READER])) { return redirect()->route('adminHome'); } // return redirect()->back()->with(['error' => 'Login Failed']); }
补充说明:代码本身无问题,这套代码在cpanel托管环境下已稳定运行两年,仅在迁移到云服务+Docker部署架构后出现该故障。先后尝试了Laravel的文件会话和数据库会话配置,均未解决问题。
问题排查与解决方案
优先排查Docker部署场景下的高频触发点
- 会话存储权限异常
文件会话默认存储在storage/framework/sessions目录下,检查Docker容器内该目录的所属用户是否为构建PHP镜像时创建的laravel用户(UID 1001),如果目录属主为root,PHP进程无写入权限会导致会话生成失败,登录后无有效会话自然会持续跳转。
排查命令:进入PHP容器执行ls -la /var/www/html/storage/framework/sessions,如果属主不是1001,执行以下命令修复:
docker-compose exec PHP chown -R laravel:laravel /var/www/html/storage
持久化修复可在php.dockerfile中加入目录权限赋值逻辑,避免挂载后权限重置。
- Nginx缓存规则冲突
检查Nginx配置,是否开启了对登录请求、会话Cookie的缓存,或者proxy_pass相关的缓存规则未排除后台路由,导致Nginx返回了过期的跳转响应。需在Nginx配置中添加规则,排除后台相关路径的缓存:
location ~* ^/admin/ { expires -1; add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate"; try_files $uri $uri/ /index.php?$query_string; }
- 磁盘inode耗尽
Oracle云实例默认系统盘容量较小,Docker运行过程中生成的日志、临时文件会快速占用inode,导致PHP无法写入会话文件、日志等数据,表现为运行几小时后功能异常,重启后临时恢复。
排查命令:宿主机执行df -i,如果使用率达到100%,执行以下命令清理冗余Docker资源:
docker system prune -af
同时建议在docker-compose中为所有服务添加日志大小限制,避免日志持续占用磁盘:
logging: driver: "json-file" options: max-size: "10m" max-file: "3"
- 会话域名配置不匹配
检查Laravel的.env文件中SESSION_DOMAIN配置是否与实际访问的域名完全一致,Docker部署后如果域名变更但该配置未同步,会导致浏览器无法存储会话Cookie,登录后会话不生效。
验证步骤
问题复现时,优先查看PHP容器的错误日志/var/log/php-fpm.log以及Laravel的storage/logs/laravel.log,根据具体报错信息可快速定位根因。
内容的提问来源于stack exchange,提问作者Rahul Reghunath
相关产品推荐
相关产品推荐

