简体   繁体   中英

Deploy Laravel on Google App Engine - Flexible

After deploying Laravel 6 to Google App Engine, got this error when run the url https://PROJECT_ID.appspot.com/ .

The stream or file "/app/storage/logs/laravel-2019-12-31.log" could not be opened: failed to open stream: Permission denied

在此处输入图片说明

I have followed the instrucation given on https://cloud.google.com/community/tutorials/run-laravel-on-appengine-flexible 2

Here is my app.yaml file

runtime: php  # language of the app
env: flex     # let app engine know we use flexible environment
runtime_config:
 document_root: .   #folder where index.php is
# Ensure we skip ".env", which is only for local development
skip_files:
 - .env #we want to skip this to make sure we don’t mess stuff up on the server
env_variables:
 # Put production environment variables here.
 APP_ENV: production   # or production
 APP_DEBUG : true # or false 
 APP_KEY: YOUR_API_KEY
#go to generate app key paragraf in this tutorial
 CACHE_DRIVER: database
# instead of putting the cache in the database I recommend using redis
 SESSION_DRIVER: database #or file since both work
 APP_LOG: errorlog
 APP_TIMEZONE: UTC #your timezone of choice
# follow the part of the tutorial on setting up your SQL database
 DB_CONNECTION: mysql
 DB_HOST: localhost
 DB_DATABASE: XXX
 DB_USERNAME: XXX
 DB_PASSWORD: XXX
 DB_SOCKET: /cloudsql/YOUR_CLOUDSQL_CONNECTION_NAME
 QUEUE_DRIVER: database #in case you execute queued jobs
 MAIL_DRIVER: mail
 MAIL_HOST: smtp.sparkpostmail.com
 MAIL_PORT: 587
 MAIL_USERNAME: null
 MAIL_PASSWORD: null
 LOG_DELETE:  true # this is a parameter added by us in the project .env file. You can add here any setting you would add to your .env file
 GOOGLE_VISION_PROJECT_ID : PROJECT_ID
#we need this for the flex environment
beta_settings:
   # for Cloud SQL, set this value to the Cloud SQL connection name,
   # e.g. "project:region:cloudsql-instance"
   cloud_sql_instances: "YOUR_CLOUDSQL_CONNECTION_NAME"  

composer.json

"scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi"
        ],
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi"
        ],
        "post-install-cmd": [
           "Illuminate\\Foundation\\ComposerScripts::postInstall",
           "@php artisan optimize",
           "chmod -R 755 storage bootstrap\/cache"
       ],
       "post-update-cmd": [
           "Illuminate\\Foundation\\ComposerScripts::postUpdate",
           "@php artisan optimize"
       ]
    }

I have Tested on local machine and its working successfully.

In the App Engine Flex environment you can't write files because the file system is read only. There is neat solution though since you can integrate Stackdriver Logging into Laravel.

You need to execute the following command:

composer require google/cloud-logging google/cloud-error-reporting

Additionally you need to change the report function in the app/Exceptions/Handler.php file:

/**
 * Report or log an exception.
 *
 * @param  \Exception  $exception
 * @return void
 */
public function report(Exception $exception)
{
    if (isset($_SERVER['GAE_SERVICE'])) {
        Bootstrap::init();
        Bootstrap::exceptionHandler($exception);
    } else {
        parent::report($exception);
    }
}

At the top of the file you need to add use Google\\Cloud\\ErrorReporting\\Bootstrap;

In your app.yaml you need to add the following to the env_variables :

LOG_CHANNEL: stackdriver

In the logging.php you need to add the following to the 'channels' array:

'stackdriver' => [
    'driver' => 'custom',
    'via' => App\Logging\CreateStackdriverLogger::class,
    'level' => 'debug',
],

The last thing you need to do is create the CreateStackdriverLogger class in the app/Logging directory:

<?php

namespace App\Logging;

use Google\Cloud\Logging\LoggingClient;
use Monolog\Handler\PsrHandler;
use Monolog\Logger;

class CreateStackdriverLogger
{
    /**
     * Create a custom Monolog instance.
     *
     * @param array $config
     * @return \Monolog\Logger
     */
    public function __invoke(array $config)
    {
        $logName = isset($config['logName']) ? $config['logName'] : 'app';
        $client = new LoggingClient([
            'projectId' => 'YOUR-PROJECT-ID'
        ]);

        $psrLogger = $client->psrLogger($logName);

        $handler = new PsrHandler($psrLogger);
        $logger = new Logger($logName, [$handler]);

        return $logger;
    }
}

Now all your logs go to the Stackdriver system.

The stream or file "/app/storage/logs/laravel-2019-12-31.log" could not be opened: failed to open stream: Permission denied

As mentioned in this post , the reason behind this error could be because of directory permissions :

Directories within the storage and the bootstrap/cache directories should be writable by your web server or Laravel will not run.

You will find more information about it following this two posts:

I hope it helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM