安装 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_
的部分更换成自己真实的需要即可,包含了 https
和 http
强转 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;
}
}