Laravel:在多个服务器上运行单个Cron
#php #laravel #cron #multiserver

本文是在Laravel中的多个服务器上设置一个Cron。

在AWS中创建EC2实例

https://console.aws.amazon.com/ec2/打开Amazon EC2控制台,然后单击“运行实例”。

  • 单击启动实例。

选择要使用哪种类型的虚拟机。 Amazon Machine图像是预配置的虚拟机,可作为您实例的模板。

  • 对于我们的应用程序,选择“ ubuntu 20.04(64bit)”实例。

接下来,选择一个实例类型来设置实例的存储和大小。

  • t2.Micro默认设置为类型,并有资格获得亚马逊的自由层。

接下来,单击“评论”并启动以让AWS向导为您设置默认配置。

接下来,查看您的实例并修改安全组,在此

  • 添加“ http”作为端口80的类型,然后选择源“ 0.0.0.0/0”,然后单击“启动”

您将必须指定一个键对。如果您已经拥有AWS密钥对,则可以选择使用该对。如果没有,您将选择创建一个新的密钥对。输入密钥对的任何名称。然后,单击下载键对。这将是您唯一能够下载此密钥对的时间。将其移至某个安全的位置,或者您不会将其删除。您需要此密钥对以允许您输入实例。认为它是一个密码。现在,启动您的实例!

现在启动了实例,接下来我们必须通过SSH连接到实例。在EC2实例仪表板上,单击实例名称旁边的按钮,然后单击操作。下拉菜单应在操作下出现,然后单击连接。

打开终端,然后转到存储密钥对的文件夹。运行CHMOD命令以更改密钥对上的权限。然后,运行SSH命令输入您的实例。您需要重新运行CHMOD命令,以每次重新启动计算机以输入实例时修改密钥对的权限。

安装Laravel的依赖项

为了向我们的网站访问者显示网页,我们将采用高性能Web服务器Nginx。我们将使用APT软件包管理器获取此软件。

安装NGINX Web服务器

由于这是我们第一次使用此会话的APT,请从更新服务器的软件包索引开始。之后,您可以使用APT安装来安装NGINX:

sudo apt update
sudo apt install nginx

提示时,请输入Y确认您要安装nginx。安装完成后,NGINX Web服务器将处于活动状态并在Ubuntu 20.04服务器上运行。

如果您没有指向服务器的域名,并且您不知道服务器的公共IP地址,则可以通过运行以下命令来找到它:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

这将打印出一些IP地址。您可以在Web浏览器中依次尝试它们。
输入您在Web浏览器中收到的地址,它将带您到Nginx的默认着陆页:

http://server_domain_or_IP

安装PHP

您已安装了NGINX,以服务您的内容和MySQL,以存储和管理数据。现在,您可以安装PHP来处理代码并为Web服务器生成动态内容。

当Apache嵌入每个请求中的PHP解释器时,NGINX需要一个外部程序来处理PHP处理并充当PHP解释器本身和Web服务器之间的桥梁。这允许在大多数基于PHP的网站中取得更好的整体性能,但需要其他配置。您需要安装代表PHP FastCGI Process Manager的PHP-FPM,并告诉Nginx将PHP请求传递给此软件进行处理。此外,您需要PHP-MYSQL,这是一个允许PHP与基于MySQL的数据库通信的PHP模块。核心PHP软件包将自动安装为依赖项。

要安装PHP-FPM和PHP-MYSQL软件包,运行:

sudo apt install php-fpm php-mysql

提示时,输入y并输入以确认安装。
现在,您已经安装了PHP组件。接下来,您将配置nginx使用它们。

配置NGINX使用PHP处理器

使用您首选的命令行编辑器在NGINX启用网站的目录中打开配置文件。在这里,我们将使用vim:

sudo vim /etc/nginx/sites-enabled/default

粘贴在以下裸露的配置中:

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }
}

完成编辑后,保存并关闭文件。

这将告诉NGINX下次重新加载时使用配置。您可以通过输入来测试语法错误的配置:

sudo nginx -t

如果报告了任何错误,请返回您的配置文件以查看其内容。

准备就绪时,重新加载nginx应用更改:

sudo service nginx restart

您的LEMP堆栈现在已完全配置。在下一步中,我们将创建一个PHP脚本来测试NGINX实际上能够在您新配置的网站中处理.php文件。

用Nginx测试PHP

现在应该完全设置您的LEMP堆栈。您可以测试它以验证NGINX可以正确地将.php文件移交给您的PHP处理器。

您可以通过在文档根中创建测试PHP文件来做到这一点。在您的文本编辑器中的文档root中打开一个名为info.php的新文件:

vim /var/www/html/info.php

键入或将以下行粘贴到新文件中。这是有效的PHP代码,它将返回有关您的服务器的信息:

<?php
phpinfo();

完成后,保存并关闭文件。
现在,您可以通过访问您在Nginx配置文件中设置的域名或公共IP地址在Web浏览器中访问此页面,然后访问 /ininfo.php:

http://server_domain_or_IP/info.php

您将看到一个包含有关服务器的详细信息的网页:

通过该页面检查有关PHP服务器的相关信息后,最好删除您创建的文件,因为它包含有关您的PHP环境和Ubuntu Server的敏感信息。您可以使用RM删除该文件:

sudo rm /var/www/html/info.php

安装其他依赖项

除了应该包含在Ubuntu 20.04系统中的依赖项(例如Git和Curl)之外,作曲家还需要PHP-CLI才能在命令行中执行PHP脚本,而UNZIP则可以提取拉链式档案。我们现在将安装这些依赖项。

首先,通过运行:
更新软件包管理器缓存

sudo apt update

接下来,运行以下命令安装所需的软件包:

sudo apt install php-cli unzip

您将提示您通过键入y确认安装,然后输入。

安装先决条件后,您可以继续安装作曲家。

下载和安装作曲家

作曲家提供了以PHP编写的安装程序脚本。我们将下载它,验证它没有损坏,然后使用它来安装作曲家。

确保您在主目录中,然后使用卷曲:
检索安装程序

cd ~
curl -sS https://getcomposer.org/installer -o composer-setup.php

接下来,我们将验证下载的安装程序是否匹配SHA-384 HASH,以适用于在作曲家公共钥匙 /签名页面上找到的最新安装程序。为了促进验证步骤,您可以使用以下命令从“作曲家”页面编程获取最新哈希并将其存储在Shell变量中:

HASH=`curl -sS https://composer.github.io/installer.sig`

如果要验证获得的值,则可以运行:

echo $HASH

输出:

e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a

现在执行以下PHP代码,如“作曲家下载”页面所示,以验证安装脚本可以安全运行:

php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

您将看到以下输出:

Installer verified

要在全球安装作曲家,请使用以下命令,该命令将下载并安装作曲家作为系统范围的命令,名为Composer,under/usr/usr/local/bin:

sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

您会看到与此类似的输出:

All settings correct for using Composer
Downloading...

Composer (version 1.10.5) successfully installed to: /usr/local/bin/composer
Use it: php /usr/local/bin/composer

要测试安装,运行:

composer

输出:

   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.10.5 2020-04-10 11:44:22

Usage:
  command [options] [arguments]

Options:
  -h, --help                     Display this help message
  -q, --quiet                    Do not output any message
  -V, --version                  Display this application version
      --ansi                     Force ANSI output
      --no-ansi                  Disable ANSI output
  -n, --no-interaction           Do not ask any interactive question
      --profile                  Display timing and memory usage information
      --no-plugins               Whether to disable plugins.
  -d, --working-dir=WORKING-DIR  If specified, use the given directory as working directory.
      --no-cache                 Prevent use of the cache
  -v|vv|vvv, --verbose           Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
...

这验证了作曲家已成功安装在您的系统上并范围内可用。

安装Laravel所需的PHP模块

在安装Laravel之前,您需要安装一些框架​​所需的PHP模块。我们将使用APT安装PHP-MBSTRING,PHP-XML和PHP-BCMATH PHP模块。这些PHP扩展为处理字符编码,XML和精确数学提供了额外的支持。

通过运行:
更新软件包管理器缓存

sudo apt update

现在您可以使用以下方式安装所需的软件包

sudo apt install php-mbstring php-xml php-bcmath

您的系统现在准备通过作曲家执行Laravel的安装,但是在这样做之前,您需要一个数据库。

创建一个新的Laravel应用程序

现在,您将使用COMPOSER CREAT-PROXOXT命令创建一个新的Laravel应用程序。该作曲家命令通常用于基于现有框架和内容管理系统的新应用程序。

首先,转到您的用户主目录:

cd ~

以下命令将创建一个基于默认设置的Barebone Laravel应用程序的新的My_app_name目录:

composer create-project --prefer-dist laravel/laravel my_app_name

您会看到与此类似的输出:

Installing laravel/laravel (v5.8.17)
  - Installing laravel/laravel (v5.8.17): Downloading (100%)         
Created project in my_app_name
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 80 installs, 0 updates, 0 removals
  - Installing symfony/polyfill-ctype (v1.11.0): Downloading (100%)         
  - Installing phpoption/phpoption (1.5.0): Downloading (100%)         
  - Installing vlucas/phpdotenv (v3.4.0): Downloading (100%)         
  - Installing symfony/css-selector (v4.3.2): Downloading (100%)     
...

安装完成后,访问应用程序的目录并运行Laravel的Artisan命令以验证所有组件是否已成功安装:

cd my_app_name
php artisan

您会看到与此类似的输出:

Laravel Framework 8.11.0

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
      --env[=ENV]       The environment the command should run under
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
...

此输出确认应用程序文件已经到位,Laravel命令行工具正在按预期工作。但是,我们仍然需要配置应用程序以设置数据库和其他一些详细信息。

配置Laravel

Laravel配置文件位于应用程序根目录内的名为Config的目录中。此外,当您使用作曲家安装Laravel时,它会创建一个环境文件。该文件包含针对应用程序正在运行的当前环境的设置,并将优先于位于配置目录的常规配置文件中设置的值。在新环境上的每个安装都需要一个量身定制的环境文件来定义数据库连接设置,调试选项,应用程序URL等其他项目,这些项目可能会根据应用程序运行的环境而有所不同。

警告:环境配置文件包含有关服务器的敏感信息,包括数据库凭据和安全密钥。因此,您绝不应该公开共享此文件。

我们现在将编辑.env文件以自定义当前应用程序环境的配置选项。

使用您选择的命令行编辑器打开.env文件。

vim .env

即使此文件中有许多配置变量,您现在不需要现在设置所有配置变量。以下列表包含需要立即注意的变量的概述:

  • app_name:应用程序名称,用于通知和消息。
  • app_env:当前的应用程序环境。
  • app_key:用于生成盐和哈希的使用,在通过作曲家安装Laravel时会自动创建此唯一键,因此您不需要更改它。
  • app_debug:是否在客户端显示调试信息。
  • app_url:用于生成应用程序链接的应用程序的基本URL。
  • db_database:数据库名称。
  • db_username:连接到数据库的用户名。
  • db_password:连接到数据库的密码。

以下.env文件设置了我们的开发示例应用程序:

APP_NAME=My App Name
APP_ENV=production
APP_KEY=APPLICATION_UNIQUE_KEY_DONT_COPY
APP_DEBUG=true
APP_URL=http://domain_or_IP

LOG_CHANNEL=stack

# We will update the below database details after this setup
DB_CONNECTION=mysql
DB_HOST=DATABASE_HOST
DB_PORT=3306
DB_DATABASE=DATABASE_NAME
DB_USERNAME=DATABASE_USERNAME
DB_PASSWORD=DATABASE_PASSWORD

相应地调整变量。完成编辑后,保存并关闭文件以保持更改。如果您使用Nano,则可以使用Ctrl+X进行此操作,然后输入以确认。

现在已设置您的Laravel应用程序,但是我们仍然需要配置Web服务器,以便能够从浏览器访问它。在下一步中,我们将配置nginx为您的Laravel应用程序。

设置nginx

我们已经在您的远程用户主目录的本地文件夹上安装了Laravel,尽管这对于本地开发环境非常有效,但对于向公共Internet开放的Web服务器而言,这并不是推荐的实践。我们将应用程序文件夹移至/var/www,这是在Nginx上运行的Web应用程序的通常位置。

首先,使用MV命令将其所有内容的应用程序文件夹移动到/var/www/my_app_name:

sudo mv ~/my_app_name /var/www/my_app_name

现在,我们需要给Web服务器用户写入对存储和缓存文件夹的访问,Laravel存储应用程序生成的文件:

sudo chown -R www-data.www-data /var/www/my_app_name/storage
sudo chown -R www-data.www-data /var/www/my_app_name/bootstrap/cache

现在,应用程序文件是按顺序进行的,但是我们仍然需要配置Nginx以服务内容。为此,我们将在/etc/nginx/stites-babailable中创建一个新的虚拟主机配置文件:

sudo vim /etc/nginx/sites-available/my_app_name

以下配置文件包含nginx上Laravel应用程序的推荐设置:

server {
    listen 80;
    server_name _;
    root /var/www/my_app_name/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

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

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

将此内容复制到您的/etc/nginx/stite-nginx/stite-nabled/默认文件,并在必要时调整突出显示的值以与您自己的配置对齐。进行编辑后,保存并关闭文件。

确认配置不包含任何语法错误,您可以使用:

sudo nginx -t

您应该看到这样的输出:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

应用更改,重新启动nginx与:

sudo systemctl reload nginx

现在转到您的浏览器并使用服务器域名或IP地址访问应用程序,如配置文件中的Server_name指令所定义:

http://server_domain_or_IP

您将看到Laravel默认着陆页。

确认您的nginx服务器已正确配置为服务laravel。从这一点开始,您可以在默认安装提供的骨架上开始构建应用程序。

使用AWS RDS创建数据库

https://console.aws.amazon.com/rds/

上打开Amazon RDS控制台
  • 单击创建数据库。

  • 选择MySQL引擎,然后单击下一步。选择使我们在RDS免费使用层中的开发/测试用例。

  • 下一节是我们指定数据库详细信息的地方。选择T2.Micro DB实例类型,然后向下滚动到底部的设置行。

  • 设置DB实例标识符,主用户名,主密码和确认密码

  • cick在“创建数据库”上

现在正在创建您的DB实例。单击查看您的数据库实例。

注意:根据分配的DB实例类和存储,新的DB实例可能需要几分钟。

新的DB实例出现在RDS控制台上的DB实例列表中。 DB实例将具有创建状态,直到创建DB实例并准备使用。当状态更改为可用时,您可以连接到DB实例上的数据库。

创建了DB实例后,选择“修改”选项,然后选择“”

单击您创建的DB实例,然后在连接性和安全性中复制端点,您需要在MySQL Connection(主机名)中使用它。

  • 使用“终点”作为主机,并使用在数据库创建过程中创建的用户名和密码,在Laravel应用程序的“ .env”文件中。

配置Laravel .ENV文件

现在通过SSH登录回到我们的EC2实例,并导航到项目目录

cd /var/www/my_app_name

使用您的文本编辑器打开环境文件,

vim .env

并在以下字段中的.env文件中更新数据库详细信息,

...
DB_CONNECTION=mysql
DB_HOST=<RDS ENDPOINT>
DB_PORT=3306
DB_DATABASE=<RDS DATABASE NAME>
DB_USERNAME=<RDS DATABASE USERNAME>
DB_PASSWORD=<RDS DATABASE PASSWORD>
...

完成后,保存并关闭文件

现在我们需要给Nginx写入存储文件夹,否则Laravel会丢下写入权限错误。

sudo chmod -R 777 /var/www/my_app_name/storage

创建缓存表

我们正在使用数据库缓存驱动程序,您需要设置一个表格才能包含缓存项目。

工匠命令使用适当的模式产生迁移。在项目目录中运行以下命令

php artisan cache:table
php artisan migrate`

现在,缓存表已在数据库中创建。

更改缓存配置

我们需要告诉应用程序使用我们的数据库缓存以服务命令以在单个服务器中运行

对于“/米_app_name/config/cache.php”中的那个打开的高速缓存配置文件
在此中,将特定的“ cache_driver”配置更改为“数据库”,如下

 'default' => env('CACHE_DRIVER', 'database'),

保存并关闭文件。

接下来,打开“ .env”文件,然后将“ cache_driver”配置更改为“数据库”,如下

 CACHE_DRIVER=database

保存并关闭文件。
现在,我们已将所有缓存配置设置为应用程序中的数据库。

创建控制台命令

要创建一个新命令,您可以使用“ make:命令”工匠命令。此命令将在“ App/Console/Commands”目录中创建一个新的命令类。不用担心您的应用程序中是否不存在此目录 - 它将在您第一次运行“ make:command”工匠命令:
时创建。

php artisan make:command CommandName

将在位置中创建控制台命令文件
“/my_app_name/app/console/commands/commandname.php”

打开文件并替换下面的内容,

<?php

namespace App\Console\Commands;
use Illuminate\Support\Facades\DB;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Cache;

class CommandName extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:name';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        Cache::lock("update-visited-1")->get(function () {
            // Your command function code goes here
        });
    }
}

保存并关闭文件。

现在运行控制台命令以检查其使用以下命令是否正常工作,

php artisan command:name

之后,在“ kernal.php”中添加此命令。为此,打开“/米_app_name/app/console/kernel.php”,添加命令如下,

protected function schedule(Schedule $schedule)
    {
        $schedule->command('command:name')->everyMinute()->onOneServer();
    }

保存并关闭文件。

要检查上述条件,请运行以下命令来运行计划作业,

php artisan schedule:run

它应该运行我们在控制台命令中创建的函数。
验证后,最后一步是将此调度程序添加到crontab中。

使用,
打开crontab

crontab -e

在该文件中,添加以下行以在crontab中添加我们的调度程序,

* * * * * cd /var/www/my_app_name && php artisan schedule:run >> /dev/null 2>&1

仅此而已。中提琴!我们这样做了。

我们需要拍摄此实例的AMI映像,并启动AMI作为新实例,并检查所有“安全组”,以允许使用端口“ 80”以服务我们的应用程序并启动实例。

现在,我们有一个多个实例运行。

可以随意提取在我的github呼吸器上修改此内容的请求
https://github.com/manivaidhy/laravel-single-cron-on-multiple-servers