1. Inertia 服务端渲染

Inertia 在服务端渲染时,需要运行服务端,我们新增 Supervisor 配置:

vim /etc/supervisor/conf.d/demo-inertia.ilaoniu.cn.conf

输入以下内容:

[program:demo-inertia]
process_name=%(program_name)s
command=php /home/wwwroot/demo.ilaoniu.cn/current/artisan inertia:start-ssr
autostart=true
autorestart=true
user=deployer
redirect_stderr=true
stdout_logfile=/home/wwwroot/demo.ilaoniu.cn/current/storage/logs/inertia.log

接下来我们需要让 Supervisor 重新加载配置:

supervisorctl update

现在通过以下命令检查是否正常运行:

supervisorctl status

状态是 RUNNING 说明运行正常。

同时,还需要更新部署脚本:

task('artisan:inertia:stop', function () {
    run('cd {{release_path}} && {{bin/php}} artisan inertia:stop-ssr');
});

// 停止 inertia ssr node,supervisor 会自动开启新进程
after('deploy:symlink', 'artisan:inertia:stop');

2. 重置 Opcache

2.1 方案一

调用 opcache_reset() 重置 Opcache。

首先安装扩展包:

composer require appstract/laravel-opcache

添加到部署脚本:

task('artisan:opcache:clear', function () {
    run('cd {{release_path}} && {{bin/php}} artisan opcache:clear');
});

task('opcache:clear', function () {
    run('cd {{release_path}} && {{bin/php}} -r \'opcache_reset();\'');
});

// 重置 PHP-FPM Opcache
after('deploy:symlink', 'artisan:opcache:clear');

// 重置 CLI Opcache
after('deploy:symlink', 'opcache:clear');

2.2 方案二

Deployer 符号链接 current 指向最新发布的目录。

current -> releases/3/
releases/
    1/
    2/
    3/

Opcache 使用 SCRIPT_FILENAME 值作为文件路径来缓存,所以当使用符号链接之类的方式来部署时,由于部署后仍然指向 current,所以不会触发更新。我们修改这个变量指向实际的路径即可重新缓存。

/usr/local/nginx/conf/fastcgi.conf

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

$document_root 改为 $realpath_root 即可。

3. Vite 编译失败

在阿里云 ECS 服务器上,使用 Vite 打包代码时出现内存耗尽问题导致失败,而同样配置的腾讯云服务器没有遇到该问题,经排查是 vm.swappiness 配置导致的,默认值为 60,而阿里云将其值改为了 0。

要查看该值,运行以下命令即可:

cat /proc/sys/vm/swappiness

只需要在 /etc/sysctl.conf 中修改 vm.swappiness 或删除这一行使用默认值即可。

4. 支持 HTTP3

在虚拟主机配置文件 server 块中增加:

# http3
listen 443 quic reuseport;

# http2 and http1.1
listen 443 ssl;
http2 on;
.
.
.
# used to advertise the availability of HTTP/3
add_header Alt-Svc 'h3=":443"; ma=86400';

# sent when quic was used
add_header QUIC-Status $http3;

5.自动更新 SSL 证书

默认情况下,LNMP 使用 acme.sh 自动更新证书,安装时会在 crontab 中添加一个定时任务:

31 0 * * * "/usr/local/acme.sh"/acme.sh --cron --home "/usr/local/acme.sh" > /dev/null

更新证书之后需要重新启动 Nginx,不然虽然证书更新了,Nginx 配置还是使用的原来的,导致仍然显示证书已过期:

nginx -s reload

我们将该命令也加到定时任务里面:

31 0 * * * "/usr/local/acme.sh"/acme.sh --cron --home "/usr/local/acme.sh" > /dev/null && nginx -s reload