FrankenPHP 在高负载下崩溃

问题描述 投票:0回答:1

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

候选人网站示例:

http://adaiu.dns.navy/1

由于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
}
php
1个回答
0
投票

现在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
    }
© www.soinside.com 2019 - 2024. All rights reserved.