使用 Laravel Octane 加速你的 Laravel 应用

分类: 编程
日期: 2021-12-27
浏览: 1956

安装 Laravel Octane

GitHub 地址:https://github.com/laravel/octane

composer require laravel/octane

安装完 Octane 后,执行 octane:install 命令,把配置文件安装到 config 目录下。

php artisan octane:install

输入 1 选择 swoole

 Which application server you would like to use?:
  [0] roadrunner
  [1] swoole
 >

安装成功后会提示我们修改 OCTANE_SERVER 环境变量

修改 .env 文件,添加以下内容

OCTANE_SERVER=swoole

安装 Swoole 扩展

切勿安装 swoole 4.8.4 版本,已安装该版本请升级或降级到其它版本,否则会报错。

单版本 PHP 安装 swoole 扩展请参阅 CentOS8 搭建 PHP 环境

多版本 PHP 安装 swoole 扩展请参阅 CentOS8 搭建 PHP 多版本共存的环境

启动 Octane

php artisan octane:start

如果执行该命令,报了以下错误,请更换 swoole 版本,不要为 4.8.4

PHP Fatal error:  Declaration of Laravel\Octane\Tables\SwooleTable::column($name, $type, $size = 0) must be compatible with Swoole\Table::column(string $name, int $type, int $size = 0): bool in /var/www/html/leblog/vendor/laravel/octane/src/Tables/SwooleTable.php on line 26
Fatal error: Declaration of Laravel\Octane\Tables\SwooleTable::column($name, $type, $size = 0) must be compatible with Swoole\Table::column(string $name, int $type, int $size = 0): bool in /var/www/html/leblog/vendor/laravel/octane/src/Tables/SwooleTable.php on line 26

默认情况下会启用 8000 端口,可以通过 http://127.0.0.1:8000 来访问应用程序。但是在开发环境中,文件是在不停地修改的,如果不重启 Octane 服务直接访问一个新的路由,将会收到 404 错误响应,所以我们需要不停地重启 Octane 服务,但是这么做肯定不方便而且显得很傻。

启动 Octane 同时监控文件变化

参阅文档:Laravel Octane

先安装 chokidar

npm install --save-dev chokidar

再使用 --watch 来启动 Octane

php artisan octane:start --watch
启动 Octane 命令的其它参数

指定进程数

php artisan octane:start --workers=4

指定异步任务进程数

php artisan octane:start --workers=4 --task-workers=6

指定最大请求数

php artisan octane:start --max-requests=250

Laravel Octane 的安装和使用都很简单,但是一般都不直接使用 cli 模式来启动服务,尤其是正式环境中,使用 Nginx 是一种普遍做法。

结合 Nginx 使用 Octane

一般使用 Supervisor 来管理 Octane 服务

使用 Supervisor 管理进程

如何安装和使用 supervisor 进程管理器请参阅 进程管理器 Supervisor 的安装和使用

/etc/supervisor/conf.d 目录下创建 laravel-octane-worker.conf 进程配置文件。

your_laravel_app_path 更换成自己的应用路径(最好是绝对路径)。

[program:laravel-octane-worker]
process_name=%(program_name)s_%(process_num)02d
command=php your_laravel_app_path/artisan octane:start --server=swoole --max-requests=1000 --workers=4 --task-workers=12 --port=8089
autostart=true
autorestart=true
user=ztlcoder
redirect_stderr=true
stdout_logfile=your_laravel_app_path/storage/logs/laravel-octane-worker.log
stopwaitsecs=3600

启用进程三板斧

# 重新读取配置文件
sudo supervisorctl reread

# 更新进程组
sudo supervisorctl update

# 启动某个 supervisor 进程
sudo supervisorctl start laravel-octane-worker:*

查看进程是否开启

supervisorctl status

返回以下内容则表示启用成功

laravel-octane-worker:laravel-octane-worker_00   RUNNING   pid 3229463, uptime 6:19:12

查看 8089 端口

lsof -i:8089

应该会返回类似下面的内容,也能说明进程启用成功了。

php     3229473 root    6u  IPv4 37718676      0t0  TCP VM-16-11-centos:8089 (LISTEN)

使用 pstree 来查看进程数

选项 含义
-a 显示启动每个进程对应的完整指令,包括启动进程的路径、参数等。
-c 不使用精简法显示进程信息,即显示的进程中包含子进程和父进程。
-n 根据进程 PID 号来排序输出,默认是以程序名排序输出的。
-p 显示进程的 PID。
-u 显示进程对应的用户名称。

比如执行 pstree -a 可以也看到进程是否执行成功

配置 Nginx

示例,把带有 your_ 的部分更换成自己真实的需要即可,包含了 httpshttp 强转 https 的配置,如不需要删除即可。记得重启 Nginx

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 80;
    listen 443 ssl;
    server_name your_server_name;
    server_tokens off;
    root your_app_path;

    index index.php;

    charset utf-8;

    if ($scheme = http) {
        return 301 https://$host$request_uri;
    }

    location /index.php {
        try_files /not_exists @octane;
    }

    location / {
        try_files $uri $uri/ @octane;
    }

    ssl_certificate your_cert.pem_path;
    ssl_certificate_key your_key.pem_path;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

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

    access_log off;
    error_log  /var/log/nginx/your_server_name-error.log error;

    error_page 404 /index.php;

    location @octane {
        set $suffix "";

        if ($uri = /index.php) {
            set $suffix ?$query_string;
        }

        proxy_http_version 1.1;
        proxy_set_header Host $http_host;
        proxy_set_header Scheme $scheme;
        proxy_set_header SERVER_PORT $server_port;
        proxy_set_header REMOTE_ADDR $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        proxy_pass http://127.0.0.1:8089$suffix;
    }
}
版权声明
作者:不二
来源:不二博客
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论
赶快发表评论吧~
发表评论