使用 nginx 的 Droplet 和 google 云存储之间的状态 500 内部服务器错误
Status 500 Internal Server Error between droplet with nginx and google cloud storage
我在一个带有 Digital Ocean 的 droplet 中有一个 web 系统,droplet 已经安装了 nginx,系统有一个上传文件的选项,这些文件被发送到一个 Google 云存储桶。当我在本地主机中时,文件已正确发送,但已经在系统中,我收到状态 500 内部服务器错误。
我留下一些截图
Image of the System and Error
同时得到响应:
{
"message": "Server Error"
}
但是当我 运行 它来自本地主机时
All good in localhost
这是我的 GoogleStorageServiceProvider
public function boot()
{
\Storage::extend('gcs', function($app, $config){
$storageClient = new StorageClient([
'projectId' => $config['project_id'],
'keyFilePath' => $config['key_file'],
]);
$bucket = $storageClient->bucket($config['bucket']);
$adapter = new GoogleStorageAdapter($storageClient, $bucket);
return new Filesystem($adapter);
});
}
这是我的 .env
APP_NAME=Laravel
APP_ENV=production
APP_KEY=MY_KEY
APP_DEBUG=false
APP_URL=http://.com
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=root
DB_PASSWORD=databasepass
GOOGLE_CLOUD_PROJECT_ID=starlit...
GOOGLE_CLOUD_KEY_FILE=/my-project/credentials.json
GOOGLE_CLOUD_STORAGE_BUCKET=my-bucket
FYLESYSTEM_DRIVER=gcs
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
这是我的 sudo vim /etc/nginx/sites-available/YOUR.DOMAIN.COM 文件
server {
listen 80;
listen [::]:80;
server_name YOUR.DOMAIN.COM;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name YOUR.DOMAIN.COM;
root /var/www/html/first-project/public;
ssl_certificate /etc/letsencrypt/live/YOUR.DOMAIN.COM/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/YOUR.DOMAIN.COM/privkey.pem;
ssl_protocols TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM- SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_prefer_server_ciphers on;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.php index.html index.htm index.nginx-debian.html;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
location ~ /\.ht {
deny all;
}
location ~ /.well-known {
allow all;
}
}
知道发生了什么事吗?
正如@AlecJoy 所说,我必须检查 laravel 日志以获取更多上下文。位于默认文件夹 storage/logs/ 中。在那里我发现了一个错误,说 "production.ERROR: class 'Google\Cloud\Storage\StorageClient' not found" 所以我使用命令 composer install,无法使用它,所以我尝试使用 composer update,这给了我一个错误 "mmap() failed: [12] Cannot allocate memory" 我正在搜索并找到了这个命令。此外,我必须在所有命令中使用 sudo。
/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1
在那之后,我遇到了同样的问题,所以我再次进入 Laravel 日志,我发现了这个错误“ production.ERROR: Given keyfile path /my-project/credentials.json不存在”所以我不得不编辑我的.env文件并给出完整路径“/var/www/html/my-project/credentials.json”
我在一个带有 Digital Ocean 的 droplet 中有一个 web 系统,droplet 已经安装了 nginx,系统有一个上传文件的选项,这些文件被发送到一个 Google 云存储桶。当我在本地主机中时,文件已正确发送,但已经在系统中,我收到状态 500 内部服务器错误。 我留下一些截图
Image of the System and Error
同时得到响应:
{ "message": "Server Error" }
但是当我 运行 它来自本地主机时
All good in localhost
这是我的 GoogleStorageServiceProvider
public function boot()
{
\Storage::extend('gcs', function($app, $config){
$storageClient = new StorageClient([
'projectId' => $config['project_id'],
'keyFilePath' => $config['key_file'],
]);
$bucket = $storageClient->bucket($config['bucket']);
$adapter = new GoogleStorageAdapter($storageClient, $bucket);
return new Filesystem($adapter);
});
}
这是我的 .env
APP_NAME=Laravel
APP_ENV=production
APP_KEY=MY_KEY
APP_DEBUG=false
APP_URL=http://.com
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=root
DB_PASSWORD=databasepass
GOOGLE_CLOUD_PROJECT_ID=starlit...
GOOGLE_CLOUD_KEY_FILE=/my-project/credentials.json
GOOGLE_CLOUD_STORAGE_BUCKET=my-bucket
FYLESYSTEM_DRIVER=gcs
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
这是我的 sudo vim /etc/nginx/sites-available/YOUR.DOMAIN.COM 文件
server {
listen 80;
listen [::]:80;
server_name YOUR.DOMAIN.COM;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name YOUR.DOMAIN.COM;
root /var/www/html/first-project/public;
ssl_certificate /etc/letsencrypt/live/YOUR.DOMAIN.COM/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/YOUR.DOMAIN.COM/privkey.pem;
ssl_protocols TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM- SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_prefer_server_ciphers on;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.php index.html index.htm index.nginx-debian.html;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
location ~ /\.ht {
deny all;
}
location ~ /.well-known {
allow all;
}
}
知道发生了什么事吗?
正如@AlecJoy 所说,我必须检查 laravel 日志以获取更多上下文。位于默认文件夹 storage/logs/ 中。在那里我发现了一个错误,说 "production.ERROR: class 'Google\Cloud\Storage\StorageClient' not found" 所以我使用命令 composer install,无法使用它,所以我尝试使用 composer update,这给了我一个错误 "mmap() failed: [12] Cannot allocate memory" 我正在搜索并找到了这个命令。此外,我必须在所有命令中使用 sudo。
/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1
在那之后,我遇到了同样的问题,所以我再次进入 Laravel 日志,我发现了这个错误“ production.ERROR: Given keyfile path /my-project/credentials.json不存在”所以我不得不编辑我的.env文件并给出完整路径“/var/www/html/my-project/credentials.json”