使用Docker与Laravel访问http://localhost时出现404错误
Docker部署Laravel访问localhost出现404错误排查与解决
问题背景
使用Docker部署Laravel 8应用(PHP 7.3),访问http://localhost时出现404错误,相关配置文件如下:
docker-compose.yml配置
version: "3.7" services: php: build: context: . volumes: - ".:/app" - "~/.ssh:/root/.ssh" #- '$SSH_AUTH_SOCK:/ssh-agent' environment: SSH_AUTH_SOCK: "/ssh-agent" APP_NAME: "Docker Laravel" APP_ENV: "test" APP_KEY: "" APP_DEBUG: "true" APP_URL: "/" APP_TIMEZONE: "UTC" DB_ECLIPSE_HOST: "db" DB_ECLIPSE_PORT: "3306" DB_ECLIPSE_DATABASE: "app_menu" DB_ECLIPSE_USERNAME: "homestead" DB_ECLIPSE_PASSWORD: "homestead" expose: - 9000 depends_on: - db nginx: build: context: "./docker/nginx" ports: - "80:80" environment: NGINX_PHP_UPSTREAM: php # Start URI with /template/... NGINX_URI_PREFIX: / volumes: - "./var/log/nginx:/var/log/nginx" depends_on: - php db: build: context: ./docker/mysql ports: - "3306:3306" volumes: - db_volume:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: "homestead" MYSQL_ECLIPSE_HOST: db MYSQL_ECLIPSE_DATABASE: "app_menu" MYSQL_ECLIPSE_USER: "homestead" MYSQL_ECLIPSE_PASSWORD: "homestead" MYSQL_AUTH_COMMAND: --default-authentication-plugin=mysql_native_password elk: image: "willdurand/elk" ports: - "900:85" volumes: - "./docker/logstash:/etc/logstash" - "./docker/logstash/patterns:/opt/logstash/patterns" - "./var/log/laravel:/var/log/laravel" - "./var/log/nginx:/var/log/nginx" volumes: db_volume:
Dockerfile配置
FROM php:7.3-fpm RUN apt-get update RUN apt-get install -y libzip-dev git procps unzip RUN docker-php-ext-install -j$(nproc) zip RUN pecl install xdebug-3.0.4 && docker-php-ext-enable xdebug RUN curl -o /tmp/security_checker -L "https://github.com/fabpot/local-php-security-checker/releases/download/v1.0.0/local-php-security-checker_1.0.0_linux_amd64" \ && mv /tmp/security_checker /usr/bin/local-php-security-checker \ && chmod +x /usr/bin/local-php-security-checker # Install composer from docker repo COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN docker-php-ext-install mysqli pdo pdo_mysql && docker-php-ext-enable pdo_mysql WORKDIR /app ADD docker/php/php.ini $PHP_INI_DIR/conf.d/ ADD docker/php/xdebug.ini $PHP_INI_DIR/conf.d/ EXPOSE 9000 # Likely don't need to force this to the foreground. If it fails add `-F` option CMD ["php-fpm"]
排查与修复步骤
1. 修复Nginx的目录挂载与配置
当前Nginx容器无法访问Laravel项目文件,导致无法找到入口文件index.php。
- 修改
docker-compose.yml中nginx服务的volumes,添加项目目录挂载:nginx: # ... 其他配置保留 volumes: - ".:/app" # 新增:让Nginx能访问Laravel项目文件 - "./var/log/nginx:/var/log/nginx" - 确保Nginx配置文件(位于
./docker/nginx/下的配置文件)设置了正确的根目录和URL重写规则:server { listen 80; root /app/public; # 指向Laravel的public入口目录 index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; # Laravel路由重写规则,确保所有请求指向index.php } location ~ \.php$ { fastcgi_pass ${NGINX_PHP_UPSTREAM}:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
2. 生成并配置APP_KEY
Laravel需要有效的APP_KEY才能正常运行,当前环境变量中APP_KEY为空,会导致路由解析异常:
- 进入PHP容器执行密钥生成命令:
docker-compose exec php php artisan key:generate - 将生成的密钥复制到
docker-compose.yml的APP_KEY环境变量中,例如:APP_KEY: "base64:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx="
3. 修正APP_URL配置
当前APP_URL: "/"配置错误,应设置为完整的访问地址:
APP_URL: "http://localhost"
4. 修复Laravel目录权限
确保存储和缓存目录权限正确,避免因权限问题导致路由或视图加载失败:
docker-compose exec php chmod -R 775 storage bootstrap/cache docker-compose exec php chown -R www-data:www-data storage bootstrap/cache
5. 验证服务通信状态
查看容器日志确认Nginx和PHP-FPM服务是否正常启动并通信:
# 查看Nginx日志 docker-compose logs nginx # 查看PHP-FPM日志 docker-compose logs php
如果日志中出现连接拒绝错误,检查PHP容器的9000端口是否正常暴露,以及Nginx配置中的fastcgi_pass是否指向php:9000(当前配置的NGINX_PHP_UPSTREAM: php是正确的)。
内容的提问来源于stack exchange,提问作者Prathyush Lal
相关产品推荐
相关产品推荐

