任何 AWS EB Laravel 路由都出现 404 Not Found nginx/1.16.1

Fel*_*uss 17 php nginx amazon-web-services laravel-7

我刚刚在 AWS Elastic beanstalk 上部署了一个新的 laravel 7 应用程序。我注意到他们将 Apache 服务器更改为 Nginx 服务器。

https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platform-history-php.html

这是我的 api 后端 URL:http : //mappab-api-staging.mappab.com.br/

这是登录路线:http : //mappab-api-staging.mappab.com.br/login - 404 状态。

你有没有遇到同样的问题?我该如何解决?

我的 php.conf 放在 /etc/nginx/conf.d/elasticbeanstalk/ 是:

root /var/www/html/public;

index index.php index.html index.htm;

location / {
   try_files $uri $uri/ /index.php?$query_string;
}

location ~ /\.ht {
   deny all;
}

location ~ /.well-known {
   allow all;
}

location ~ \.(php|phar)(/.*)?$ {
    fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;

    fastcgi_intercept_errors on;
    fastcgi_index  index.php;

    fastcgi_param  QUERY_STRING       $query_string;
    fastcgi_param  REQUEST_METHOD     $request_method;
    fastcgi_param  CONTENT_TYPE       $content_type;
    fastcgi_param  CONTENT_LENGTH     $content_length;

    fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
    fastcgi_param  REQUEST_URI        $request_uri;
    fastcgi_param  DOCUMENT_URI       $document_uri;
    fastcgi_param  DOCUMENT_ROOT      $document_root;
    fastcgi_param  SERVER_PROTOCOL    $server_protocol;
    fastcgi_param  REQUEST_SCHEME     $scheme;
    fastcgi_param  HTTPS              $https if_not_empty;

    fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
    fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

    fastcgi_param  REMOTE_ADDR        $remote_addr;
    fastcgi_param  REMOTE_PORT        $remote_port;
    fastcgi_param  SERVER_ADDR        $server_addr;
    fastcgi_param  SERVER_PORT        $server_port;
    fastcgi_param  SERVER_NAME        $server_name;

    # PHP only, required if PHP was built with --enable-force-cgi-redirect
    fastcgi_param  REDIRECT_STATUS    200;

    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_param  PATH_INFO $fastcgi_path_info;
    fastcgi_pass   php-fpm;
}
Run Code Online (Sandbox Code Playgroud)

小智 39

如果您将 Amazon Linux 2 与 Elastic Beanstalk 与 NGINX 服务器一起使用,则需要遵循此文档

基本上你需要做的就是创建一个文件夹结构映射你想要放置你的配置文件的 NGINX 配置位置 .platform 作为最上面的文件夹,它应该在你的应用程序根目录中

即在 Laravel 应用程序中,在与应用程序文件夹相同的级别创建一个名为 .platform 的文件夹。在这个 .platform 文件夹中创建以下内容

/nginx/conf.d/elasticbeanstalk
Run Code Online (Sandbox Code Playgroud)

所以你有一个像 .platform/nginx/conf.d/elasticbeanstalk 这样的文件夹结构

在此处输入图片说明

在最后一个文件夹 elasticbeanstalk 中放置您的配置文件

例如 laravel.conf

location / {
    try_files $uri $uri/ /index.php?$query_string;
    gzip_static on;
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

将应用程序上传到 EB 后,它会将文件复制到服务器上的相同位置并重新启动 NGINX。


额外的

在某些情况下,这可能还不够,当您尝试前往任何特定路线时,您会得到一个

第419话 页面已过期

在此处输入图片说明

要解决这个问题,只需通过 SSH 连接到您的实例,请转到项目位置并清除缓存

php artisan cache:clear
Run Code Online (Sandbox Code Playgroud)

  • 这是最终的修复方法,也是正确的方法,特别是因为在 ebs 上运行命令并不是一个很好的做法。 (9认同)
  • 这应该被接受为正确答案——ElasticBeanstalk 配置应该通过 .ebextensions/.platforms 等完成;而不是通过手动调整服务器 (4认同)

Joh*_*lsh 20

我遇到了同样的问题,因为 2020 年 4 月 30 日 EB 自动配置为 nginx 而不是 apache,因此 htaccess 文件不再有效。所以当我上传我的代码时,首页 (index.php) 正在工作,但 api 却没有。这就是我为解决这个问题所做的 - 取自 AWS 开发人员组:https : //forums.aws.amazon.com/thread.jspa? messageID = 942914

  1. SSH 进入弹性 beanstalk 环境(您可以在 EC2 实例中生成一个密钥对,这将下载一个 pem(私钥文件),然后将密钥对附加到弹性 beanstalk 环境中的配置/安全性中)。
  2. 在终端(在 Mac 上)中,导航到您的私钥存储位置并使用:
ssh -i "your_private_key_name.pem" ec2-user@your_server
Run Code Online (Sandbox Code Playgroud)

您可能会收到 PEM 太开放的错误消息,在这种情况下,请使用以下命令:

chmod 400 your_private_key_name.pem
Run Code Online (Sandbox Code Playgroud)
  1. 使用以下命令导航到 php.conf 文件:
cd /etc/nginx/conf.d/elasticbeanstalk
Run Code Online (Sandbox Code Playgroud)
  1. 使用它来输入文件:
sudo nano php.conf
Run Code Online (Sandbox Code Playgroud)
  1. 这将打开 php.conf 文件,它将看起来
# This file is managed by Elastic Beanstalk
#
# pass the PHP scripts to FastCGI server
#
# See conf.d/php-fpm.conf for socket configuration
#
root /var/www/html/public;

index index.php index.html index.htm;

location ~ \.(php|phar)(/.*)?$ {
    fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;

    fastcgi_intercept_errors on;
    fastcgi_index  index.php;

    fastcgi_param  QUERY_STRING       $query_string;
    fastcgi_param  REQUEST_METHOD     $request_method;
    fastcgi_param  CONTENT_TYPE       $content_type;
    fastcgi_param  CONTENT_LENGTH     $content_length;

    fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
    fastcgi_param  REQUEST_URI        $request_uri;
    fastcgi_param  DOCUMENT_URI       $document_uri;
    fastcgi_param  DOCUMENT_ROOT      $document_root;
    fastcgi_param  SERVER_PROTOCOL    $server_protocol;
    fastcgi_param  REQUEST_SCHEME     $scheme;
    fastcgi_param  HTTPS              $https if_not_empty;

    fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
    fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

    fastcgi_param  REMOTE_ADDR        $remote_addr;
    fastcgi_param  REMOTE_PORT        $remote_port;
    fastcgi_param  SERVER_ADDR        $server_addr;
    fastcgi_param  SERVER_PORT        $server_port;
    fastcgi_param  SERVER_NAME        $server_name;

    # PHP only, required if PHP was built with --enable-force-cgi-redirect
    fastcgi_param  REDIRECT_STATUS    200;

    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_param  PATH_INFO $fastcgi_path_info;
    fastcgi_pass   php-fpm;
}
Run Code Online (Sandbox Code Playgroud)
  1. 在索引之后和位置之前插入以下内容
location / {
    try_files $uri $uri/ /index.php?$query_string;
    gzip_static on;
}
Run Code Online (Sandbox Code Playgroud)
  1. 保存文档

  2. 运行此命令以重新启动 nginx

sudo nginx -s reload
Run Code Online (Sandbox Code Playgroud)
  1. 退出环境,你的 api 现在应该可以工作了


小智 6

我处于同样的情况,我准备了一个如下所示的配置文件来更新 Elastic Beanstalk 自动提供的默认 nginx 设置。

  1. 在 Laravel 项目中准备一个您自己的 nginx 设置的文件 (nginx.conf)。
~/workspace/your-laravel-app/
|-- .platform
|   -- nginx
|      -- nginx.conf
|-- other source files
Run Code Online (Sandbox Code Playgroud)
  1. 像下面这样编辑你自己的 nginx.conf。
user                    nginx;
error_log               /var/log/nginx/error.log warn;
pid                     /var/run/nginx.pid;
worker_processes        auto;
worker_rlimit_nofile    32153;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    include       conf.d/*.conf;

    map $http_upgrade $connection_upgrade {
        default     "upgrade";
    }

    server {
        listen        80 default_server;
        access_log    /var/log/nginx/access.log main;

        client_header_timeout 60;
        client_body_timeout   60;
        keepalive_timeout     60;
        gzip                  off;
        gzip_comp_level       4;
        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        # Do not include the Elastic Beanstalk generated locations
        # include conf.d/elasticbeanstalk/*.conf;

        # Move Elastic Beanstalk healthd.conf content here
        if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
            set $year $1;
            set $month $2;
            set $day $3;
            set $hour $4;
        }

        access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;

        # Move Elastic Beanstalk php.conf content here
        root /var/www/html/public;

        index index.php index.html index.htm;

        # This is an additional configuration
        location / {
            try_files $uri $uri/ /index.php?$query_string;
            gzip_static on;
        }

        location ~ \.(php|phar)(/.*)?$ {
            fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;

            fastcgi_intercept_errors on;
            fastcgi_index  index.php;

            fastcgi_param  QUERY_STRING       $query_string;
            fastcgi_param  REQUEST_METHOD     $request_method;
            fastcgi_param  CONTENT_TYPE       $content_type;
            fastcgi_param  CONTENT_LENGTH     $content_length;

            fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
            fastcgi_param  REQUEST_URI        $request_uri;
            fastcgi_param  DOCUMENT_URI       $document_uri;
            fastcgi_param  DOCUMENT_ROOT      $document_root;
            fastcgi_param  SERVER_PROTOCOL    $server_protocol;
            fastcgi_param  REQUEST_SCHEME     $scheme;
            fastcgi_param  HTTPS              $https if_not_empty;

            fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
            fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

            fastcgi_param  REMOTE_ADDR        $remote_addr;
            fastcgi_param  REMOTE_PORT        $remote_port;
            fastcgi_param  SERVER_ADDR        $server_addr;
            fastcgi_param  SERVER_PORT        $server_port;
            fastcgi_param  SERVER_NAME        $server_name;

            # PHP only, required if PHP was built with --enable-force-cgi-redirect
            fastcgi_param  REDIRECT_STATUS    200;

            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO $fastcgi_path_info;
            fastcgi_pass   php-fpm;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 部署您的更改并加载您的新配置。
$ eb deploy
Run Code Online (Sandbox Code Playgroud)


Mug*_*uck 2

所以我就遇到了这个问题,必须弄清楚。默认的 php 实现不考虑 laravel 导致的文件夹差异(并且文档中没有提到这一点)

您需要跟踪 ec2 服务器上的 nginx 站点配置。对我来说是:

/etc/nginx/conf.d/elasticbeanstalk/php.conf

sudo nano php.conf
Run Code Online (Sandbox Code Playgroud)

root默认为/var/www/html;这是不正确的,这里添加了laravel文件夹,需要将其添加到:

root /var/www/html/your-laravel-app-name/public;
Run Code Online (Sandbox Code Playgroud)

为此,您需要位于 ec2 服务器中,以便您始终可以导航到该文件夹​​并进行检查。

我确信其他人将能够提供在弹性 beanstalk 环境中自动配置此功能所需的内容。

我还在 nginx 配置中添加了以下行作为基本 Laravel 配置:

location / {
   try_files $uri $uri/ /index.php?$query_string;
}

location ~ /\.ht {
   deny all;
}

location ~ /.well-known {
   allow all;
}
Run Code Online (Sandbox Code Playgroud)