FrankenPHP 在高负载下崩溃
VM、10G Vram、40G VHD 中的 FrankenPHP 崩溃。 问题是崩溃了会自动退出,需要设置自动重启。切换到最新的正式版本1.2.5也会出现同样的情况。那就是:
wget https://github.com/dunglas/frankenphp/releases/download/v1.2.5/frankenphp-linux-x86_64
sudo chmod 777 ./frankenphp-linux-x86_64
sudo ./frankenphp-linux-x86_64 run --config caddyfile
free_mem=800001
while [ $free_mem -gt 800000 ]
do
free_mem=cat /proc/meminfo | grep '^MemAvailable' | awk '{ print $2 }'
echo " Free_mem:"$free_mem
while [ $free_mem -lt 800000 ]
do break 3
done
./frankenphp-linux-x86_64 run --config caddyfile
done
SSH 无法连接。 重启就OK了
我们从 ATS 移植到 FrankenPHP,PHP 源代码保持不变,并且我们对 PHP 代理和在线程序使用相同的基本技术,例如:
https://en.wikipedia.org/wiki/PHProxy
https://github.com/PHProxy/phproxy
候选人网站示例:
由于PHP程序是原始代码,没有经过编译,并且不知道PHP环境使用的库,PHP程序员并不关心。就像在记事本中编写网页一样,您不必担心网络服务器所使用的技术。测试与上述代理项目的兼容性也可能解决这个问题。
shenzhou-app 静态构建的 Dockerfile。
FROM dunglas/frankenphp:static-builder
# Copy your app
WORKDIR /go/src/app/dist/app
COPY . .
# Build the static binary
WORKDIR /go/src/app/dist/app
RUN rm -r dist/static-php-cli/watcher
RUN EMBED=dist/app/ . /build-static.sh
Translated with DeepL.com (free version)
caddyfile :
{
frankenphp
order php_server before file_server
}
# Website root directory (adjust path as needed)
:80 {
# Enable compression
encode zstd br gzip
# PHP program location, here please modify according to the actual root directory
root * /tmp/frankenphp_1b73543cc848c8af8018b0cb0a54feee/public/
# Return to empty page
@blank path_regexp blank ^//blank/|^/blank/|^/favicon\.ico$
route @blank {
header Access-Control-Allow-Origin “*”
header Cache-Control “public, max-age=31536000”
respond “” 200
abort
}
# Access the resource cache file directly
@f1 path_regexp f1 ^/files/(\w)(\w\w)(\w{13})-\w-[\w\-]+(\. \w{2,4})$
route @f1 {
rewrite /temp/{http.regexp.f1.1}/{http.regexp.f1.2}/{http.regexp.f1.1}{http.regexp.f1.2}{http.regexp.f1.3}{http.regexp.f1.4}
}
@f2 path_regexp f2 ^/files/\w/\w{10}(\w)(\w\w)(\w{13})\w{6}/[\w/]+(\. \w{2,4})$
route @f2 {
rewrite /temp/{http.regexp.f2.1}/{http.regexp.f2.2}/{http.regexp.f2.1}{http.regexp.f2.2}{http.regexp.f2.3}{http.regexp.f2.4}
}
@tempfiles {
path_regexp tempfiles {
path_regexp tempfiles ^/temp/\w/\w\w/\w{16}\. \w{2,4}$
}
route @tempfiles {
# Don't process any content, pass directly to static file
file_server
abort
}
# If no matching file or directory is found, pass to unified entry
@notFound {
not file
}
route @notFound {
rewrite /index.php?__nonematch__=1
}
# Forbidden directories or files
@forbidden {
__nonematch__=1 } # Forbidden directories or files @forbidden {
not {
path /robots.txt
}
path_regexp forbidden ^/(data|include|temp|plugin)/|\.db$|\.htaccess$|~\w+$|\\.bak$|\.inc$|\\.sh$\\\\.yaml$|\.ini$|\.bat$|\.dat$\\\\.txt$| \.lock$|\.conf$|\.inc\.php$|^/images/enc\.js$
}
respond @forbidden “” 404
# PHP server
php_server
}
现在frankenphp测试应用最新版本是1.4.0,“Segmentation failure”的解决办法是PHP程序员发现原来的PHP代理可能是基于单线程设计的,frankenphp目前是多线程执行环境。通过num_threads 1解决了问题。看来还有很大的进步空间。 如果将 Caddyfile 设置为仅使用单线程,则不会出现段错误。暂时可以这样使用,问题解决后再启用多线程。 修改的话,在 Frankenphp { 下添加 num_threads 1 ,修改后的代码如下
frankenphp {
num_threads 1
order php_server before file_server
}