Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Any AWS EB Laravel route getting 404 Not Found nginx/1.16.1

I've just deploy a new laravel 7 application on AWS Elastic beanstalk. I've noticed they changed the Apache server to Nginx server.

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

This is my api backend URL: http://mappab-api-staging.mappab.com.br/

This is the login route: http://mappab-api-staging.mappab.com.br/login - 404 status.

Did you get the same problem? How can I fix it?

My php.conf placed at /etc/nginx/conf.d/elasticbeanstalk/ is:

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;
}
like image 359
Felipe Neuhauss Avatar asked May 06 '20 16:05

Felipe Neuhauss


2 Answers

If you are using Amazon Linux 2 with Elastic Beanstalk with an NGINX server then you need to follow this documentation.

Basically all you need to do is create a folder structure mapping the NGINX config location you want to place you config file with .platform as the topmost folder this should be in your application root

i.e. in a laravel app create a folder called .platform in the same level as the app folder. Within this .platform folder create the following

/nginx/conf.d/elasticbeanstalk

so you have a folder structure like .platform/nginx/conf.d/elasticbeanstalk

enter image description here

in this last folder elasticbeanstalk place your config file

e.g. laravel.conf

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

enter image description here

Once you upload the application to EB it will copy the file to the same location on the server and restart NGINX.


Extra

In some cases this might not be enough and when you try to go to any specific route you'll get a

419 | PAGE EXPIRED

enter image description here

To fix that simply SSH into your instance, go to the project location and clear the cache

php artisan cache:clear
like image 163
niallD Avatar answered Oct 11 '22 21:10

niallD


I encountered the same issue, since April 30th 2020 EB is auto configured to nginx instead of apache so the htaccess file no longer works. So when I uploaded my code the front page (index.php) was working but not the api. This is what I did to solve the issue - taken from the AWS developer group: https://forums.aws.amazon.com/thread.jspa?messageID=942914&#942914

  1. SSH into the elastic beanstalk environment (you can generate a keypair in the EC2 instance, this will download a pem (private key file) and then attach the keypair in configurations/security in the elastic beanstalk environment).
  2. In terminal (on mac), navigate to where your private key is stored and use:
ssh -i "your_private_key_name.pem" ec2-user@your_server

You may get the error message that your PEM is too open in which case use the command:

chmod 400 your_private_key_name.pem
  1. Navigate to the php.conf file using:
cd /etc/nginx/conf.d/elasticbeanstalk
  1. Use this to enter the file:
sudo nano php.conf
  1. This will open the php.conf file which will look
# 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;
}
  1. Insert the following into this after index and before location
location / {
    try_files $uri $uri/ /index.php?$query_string;
    gzip_static on;
}
  1. Save the document

  2. Run this command to restart nginx

sudo nginx -s reload
  1. Exit the environment, you're api should now work
like image 25
John Welsh Avatar answered Oct 11 '22 20:10

John Welsh