Laravel 是 PHP 里非常重要的一个框架,对于一个 PHPer 来讲,就算你没有用过 Laravel 也一定听说过它。

同事用 Laravel 开发了一个项目,需要部署一个测试环境,由于服务器的 PHP 环境不满足他项目的要求,所以需要多加一个 PHP 环境。

为了减少对原有系统的影响和更快的安装,我们决定用 Docker 来部署新项目的 PHP 环境。

本以为整个流程会无比的丝滑,但是在推进的过程中遇到了一些问题,也就有了这篇文章记录一下当时的经历,同时也为后续遇到类似问题的同仁提供解决思路。

整个部署方案如下: 无标题-2023-02-25-1548.png

Dockerfile 很快就编写好了,本地测试能够成功的构建出 Docker Image。到此一切都很顺利,后续只需要把 Dockerfile 上传到服务器在服务器上把镜像构建出来,用 Nginx 解析一下就大功告成了。

当把代码上传到服务器,开始构建 Docker Image 时,问题出现了。在执行 apt update 的时候出现了下面的错误。

The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131

本地构建好好的,怎么上线就出现问题了呢?简单的用搜索引擎搜索了一下,找了几篇带有"亲测"字样的文章进行验证,却都失败了。

后来我想既然这样问问 GPT 吧,看看它有没有什么高见。GPT 告诉我时因为服务器证书问题导致的,这里我就产生了一个疑问,我构建 Dcoker Image 执行 apt update 应该是在 Docker 环境里执行的呀,为什么会跟服务器证书有关系呢?

于是我继续追问,它给出了自己的解释,让我开始质疑自己了。

image.png

好的,它让我按照它的方案解决,我就试试吧,不出所料的失败了。到此我决定放弃对 GPT 的依赖,再次尝试用引擎来解决问题。

在 stackoverflow 有人遇到了类似的问题,在下面的回答中有人提出是 Docker 版本过低导致的

第一眼看到这个答案时,我就有一种直觉—我要成功了。因为我觉得它的解释更符合我的对 Docker 的理解,并且我们服务器上的 Docker 确实是好几年前装的了。

既然认定了这个答案,下面就是升级 Docker 。升级完成后问题也真正解决了,Docker Image 被成功的构建出来。

到此整个问题就完整的解决了,下面补充一下如何用 Nginx 解析到 Docker 里的 php-fpm。

这里有个前提需要注意下,你需要把项目通过 -v 的方式映射到 docker php-fpm 的容器中,因为 php-fpm 需要找到对应的文件进行解析,所以容器需要知道项目的内容。

废话不多说直接上配置文件

location /server-test
{
    rewrite ^/server-test/(.*)$ /$1 break;
    fastcgi_index   index.php;
    include         fastcgi_params;
    fastcgi_param   REQUEST_URI $1;
    fastcgi_param   SCRIPT_FILENAME    /var/www/public/index.php;
    fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
    fastcgi_pass    127.0.0.1:9002;
}

介绍几个重点:

Rewrite 是为了把 server-test 这个前缀给去掉,比如 /server-test/api/test 经过 Rewirte 到 Laravel 其实是 /api/test
REQUEST_URI 这个是配置 Rewrite, 把 /api/test 赋值给 REQUEST_URI 参数。
SCRIPT_FILENAME :这里写的是 Docker 里的 Laravel 入口文件路径。
fastcgi_pass Docker php-fpm 监听的端口。

到此整个过程就结束了,部署完成。

总结

不可否认 GPT 确实让工作效率有了很大的提升,但是在一些问题上 GPT 的幻觉也容易迷惑我们,所以在 GPT 的使用中需要保持一些警惕,以免被它给误导。

此外,如果可以的话尽量还是通过英文去搜索问题,这样问题解决得概率会大上不少,中文社区一篇文章发多个平台已是家常便饭,还存在着各种互相抄袭得情况,搜索时有可能一页下来都是同一种解决思路,导致搜索效率比较低下。

本篇文章到此结束,如果有不同得想法和见解,欢迎评论与我交流。