Azure Web App 上的 Docker 中的 Laravel 无法从装载的文件存储中提供映像



我有一个azure web应用程序,它有一个自定义容器,运行apache,php 7.4,带有laravel和一个安装的azure文件存储
从挂载的存储中提供.png文件确实适用于我的本地内置docker桌面,它也适用于物理机器上的测试系统。

存储安装到/var/www/data_persistent,laravel提供来自/var/www/api/public的数据。为了保存所显示的数据,将图像写入要服务的存储器。

我有一个从公用文件夹到存储中的链接ln -fs /var/www/data_persistent/maps /var/www/api/public/maps

在Azure上,如果我在任何地图文件夹中请求图像,我会得到400的响应,如果文件完全为空,它就可以工作。

这就是它在网络应用程序上的样子:

total 28
4 drwxr-xr-x 2 root root 4096 Aug 11 13:17 css
0 -rwxr-xr-x 1 root root    0 Jan 28  2022 favicon.ico
4 drwxr-xr-x 3 root root 4096 Aug 11 13:17 images
4 -rwxr-xr-x 1 root root 1785 Feb  4  2022 index.php
4 drwxr-xr-x 2 root root 4096 Aug 11 13:17 js
0 lrwxrwxrwx 1 root root   29 Aug 11 13:20 maps -> /var/www/data_persistent/maps 

这是内部地图:

total 29943
0 drwxrwxrwx 2 nobody nogroup        0 Jul 10 23:41 .
0 drwxrwxrwx 2 nobody nogroup        0 May 29 16:23 ..
0 drwxrwxrwx 2 nobody nogroup        0 Jul 28 15:36 1
2715 -rwxrwxrwx 1 nobody nogroup  2779239 Jul 28 15:47 1.tif
0 drwxrwxrwx 2 nobody nogroup        0 Jul 28 12:34 7
27229 -rwxrwxrwx 1 nobody nogroup 27881853 Jul 28 12:43 7.tif 

写入文件存储工作,您看到的文件夹和文件是从前端和脚本上传的结果。感谢您的帮助。

2022年8月17日更新:我已经尝试了很多选项,比如在apache conf中启用了
EnableSendfile-off
,但直到现在都没有成功。有趣的是,Apache日志显示了提供图像时的状态代码200。

也可以从装载的存储中提供html文件,但前提是这些文件是有效的html内容(!(。

问题似乎是在apache中设置EnableMMAP。

apache2.conf中将EnableMMAP Off添加到<Directory "${APACHE_DOCUMENT_ROOT}">

此块/etc/apache2/apache2.conf的示例

<Directory "${APACHE_DOCUMENT_ROOT}">
Options Indexes FollowSymLinks
EnableMMAP Off
AllowOverride None
Require all granted
</Directory>

来源:https://azureossd.github.io/2020/09/15/unable-to-download-static-content-php-on-azure-app-service-linux/

我遇到了同样的根本问题,所以感谢您分享您的解决方案。Azure的支持让我在这里解决了我的问题。我将分享更多信息以供将来参考,并希望能帮助其他人。

在我的例子中,我只是将这一行添加到Apache配置文件中,因为我所有的DocumentRoot都在/home:中

EnableMMAP Off

我没有测试它,但基于Apache文档,启用EnableSendfile可能也不起作用。

重要业绩说明

这种配置的性能很低:

  • Linux Docker容器
  • 从持久/home目录存储和服务的网站(PHP(

存储在Docker映像中而不是/home中的同一网站在B1计划上的请求时间增加了6倍。B3计划显示了1.5倍的加速。我没有测试其他网络应用程序计划。

调查

我解决这个问题的出发点是,我想使用一个Docker映像来托管多个PHP网站,而不是将网站存储在单独的Docker映像中。Web应用程序的持久存储似乎非常适合这种情况。

当我的网站托管在/home时,我注意到的症状是:

  • HTML和JS文件运行良好
  • 图像文件返回状态400

我用LogLevel trace8提高了Apache的日志级别,并注意到通过mod_deflate提供服务的文件运行良好,而直接提供服务的则不然。禁用mod_deflate使HTML和JS文件也失败,状态为400。使用mod_deflate意味着文件不是直接从磁盘提供的,

不幸的是,我自己没有把这些点连接起来,我花了很多时间尝试Docker映像和Apache配置的各种组合。。。

然而,EnableMMAP是一种性能优化,因此可能值得将不同的web应用程序实际存储在单独的Docker映像中,而不是使用带有外部安装点的单个通用映像。

我也在考虑使用Nginx而不是Apache,看看这是否会改变什么:https://learn.microsoft.com/en-us/answers/questions/835092/app-service-stack-image.htmlhttps://techcommunity.microsoft.com/t5/apps-on-azure-blog/use-php-fpm-log-to-troubleshoot-php-8-linux-azure-app-service/ba-p/3275136

相关内容

最新更新