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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:25:18