Любой AWS EB Laravel маршрут с 404 Not Found nginx / 1.16.1 - PullRequest
9 голосов
/ 06 мая 2020

Я только что развернул новое приложение laravel 7 на AWS Elasti c beanstalk. Я заметил, что они изменили сервер Apache на сервер Nginx.

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

Это мой URL-адрес сервера api : 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;
}

Ответы [ 5 ]

19 голосов
/ 12 мая 2020

Если вы используете Amazon linux 2 с elasti c beanstalk с сервером nginx, вам необходимо следовать приведенным здесь инструкциям https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html

Просто, хотя все вам нужно создать структуру папок, отображающую расположение конфигурации nginx, в которое вы хотите поместить файл конфигурации с .platform в качестве самой верхней папки, которая должна быть в вашем приложении root

т.е. в laravel приложение создает папку с именем .platform на том же уровне, что и папка приложения в этой папке .platform, создайте следующий /nginx/conf.d/elasticbeanstalk, чтобы у вас была структура папок, такая как .platform / nginx / conf.d / elasticbeanstalk в в этой последней папке elasticbeanstalk поместите ваш файл конфигурации

например, laravel .conf

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

как только вы загрузите приложение на eb, он скопирует файл в то же место на сервере и перезапустится nginx Надеюсь, что это имеет смысл

13 голосов
/ 12 мая 2020

Я столкнулся с той же проблемой, поскольку 30 апреля 2020 года EB автоматически настроен на nginx вместо apache, поэтому файл htaccess больше не работает. Поэтому, когда я загрузил свой код, первая страница (index. php) работала, но не api. Вот что я сделал для решения проблемы - взято из группы разработчиков AWS: https://forums.aws.amazon.com/thread.jspa?messageID=942914&#942914

  1. S SH в среду elasti c beanstalk ( вы можете создать пару ключей в экземпляре EC2, это загрузит pem (файл закрытого ключа), а затем присоединит пару ключей в конфигурациях / безопасности в среде elasti c beanstalk).
  2. В терминале (на ma c) перейдите туда, где хранится ваш закрытый ключ, и используйте:
    ssh -i "your_private_key_name.pem" ec2-user@your_server

Вы можете получить сообщение об ошибке, что ваш PEM тоже открыть, в этом случае используйте команду:

    chmod 400 your_private_key_name.pem
Перейдите к файлу php .conf, используя:
    cd /etc/nginx/conf.d/elasticbeanstalk
Используйте это, чтобы ввести файл:
    sudo nano php.conf
Это откроет файл 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;
    }
Вставьте следующее после индекса и перед местоположением
    location / {
        try_files $uri $uri/ /index.php?$query_string;
            gzip_static on;
    }

Сохраните документ

Запустите эту команду для перезапуска nginx

sudo nginx -s reload
Выйдите из среды, теперь у вас должен работать api
2 голосов
/ 23 мая 2020

Я был в той же ситуации, и я подготовил файл конфигурации, как показано ниже, чтобы обновить настройку nginx по умолчанию, которую Elasti c Beanstalk автоматически предоставляет.

  1. Подготовьте файл (nginx .conf) вашей собственной настройки nginx в проекте Laravel.
~/workspace/your-laravel-app/
|-- .platform
|   -- nginx
|      -- nginx.conf
|-- other source files
Отредактируйте свой собственный 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;
        }
    }
}
Разверните изменения, и ваша новая конфигурация должна быть загружена.
$ eb deploy
2 голосов
/ 07 мая 2020

Итак, у меня возникла эта проблема, и мне пришлось с ней разобраться. Реализация по умолчанию php не учитывает разницу в папках, которую вызывает laravel (и это нигде не упоминается в документации)

Вам необходимо отслеживать конфигурацию nginx сайта на вашем ec2 сервер. Для меня это было:

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

sudo nano php.conf

root по умолчанию / var / www/html; Это неверно, здесь добавляется папка laravel, вам нужно добавить это в:

root /var/www/html/your-laravel-app-name/public;

Для этого вам нужно будет находиться на вашем сервере ec2, поэтому вы всегда можете перейти к этой папке и проверить ее.

Я уверен, что другие люди смогут предоставить то, что необходимо для автоматической настройки этого в среде elasti c beanstalk.

Я также добавил следующие строки в конфигурацию nginx для базовой laravel конфигурации:

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

location ~ /\.ht {
   deny all;
}

location ~ /.well-known {
   allow all;
}
0 голосов
/ 16 мая 2020

Я столкнулся с той же проблемой и решил ее, осознав, что неправильно понял AWS документы.

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/php-laravel-tutorial.html#php - laravel -tutorial-generate

Где сказано: «Установить Laravel и создать веб-сайт»

Это не означает, что нужно делать это на AWS. Вы должны делать это на месте. А затем разверните его в AWS через Source Bundle, как описано ниже.

После этого все заработало.

...