You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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部署场景下的高频触发点

  1. 会话存储权限异常
    文件会话默认存储在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中加入目录权限赋值逻辑,避免挂载后权限重置。

  1. 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;
}
  1. 磁盘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"
  1. 会话域名配置不匹配
    检查Laravel的.env文件中SESSION_DOMAIN配置是否与实际访问的域名完全一致,Docker部署后如果域名变更但该配置未同步,会导致浏览器无法存储会话Cookie,登录后会话不生效。

验证步骤

问题复现时,优先查看PHP容器的错误日志/var/log/php-fpm.log以及Laravel的storage/logs/laravel.log,根据具体报错信息可快速定位根因。


内容的提问来源于stack exchange,提问作者Rahul Reghunath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:54:01