Azure Web应用上Docker中的Laravel无法从已装载的文件存储提供图像

piah890a  于 2023-01-12  发布在  Docker
关注(0)|答案(2)|浏览(104)

我有一个azure web应用程序,它有一个运行apache的自定义容器,带有laravel的php7.4和一个挂载的azure文件存储器。
从挂载存储中提供.png文件确实适用于我在Docker Desktop中的本地构建,而且它适用于物理机器上的测试系统。
存储器安装到/var/www/data_persistent,laravel从/var/www/API/public提供数据。为了保留显示的数据,图像被写入要提供服务的存储器。
我有一个从公共文件夹到存储ln -fs /var/www/data_persistent/maps /var/www/api/public/maps中的一个文件夹的链接
在Azure上,如果我请求Map的任何文件夹中的图像,我会得到400的响应,如果文件完全为空,它就可以工作。
这是它在webapp上的样子:

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

这是在Map里

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配置文件中的sites-enabled,但直到现在还没有运气。有趣的是,Apache日志在提供映像时显示状态代码200。
另外,服务html文件确实可以从装载的存储中工作,但前提是它们是有效的html内容(!)。

cclgggtu

cclgggtu1#

问题似乎出在apache中的设置EnableMMAP上。
EnableMMAP Off加到apache2.conf中的<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/

atmip9wb

atmip9wb2#

我遇到了相同的根本问题,因此感谢您分享您的解决方案。Azure支持人员将我指向此处以解决我的问题。我将分享其他信息以供将来参考,并希望能帮助其他人。
在我的例子中,我只是将这一行添加到Apache配置文件中,因为我的所有DocumentRoot都在/home中:

EnableMMAP Off

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

重要性能说明

我得到了非常低的性能与此配置:

  • Linux Docker容器
  • 从持久性/home目录存储和提供的网站(PHP)

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

调查

我解决这个问题的出发点是我想用一个Docker映像来托管多个PHP网站,而不是将网站存储在单独的Docker映像中。Web App持久存储似乎非常适合这个问题。
当我的网站托管在/home中时,我注意到的症状是:

  • HTML和JS文件工作正常
  • 图像文件返回状态400

我使用LogLevel trace8提高了Apache的日志级别,并注意到通过mod_deflate提供的文件工作正常,而直接提供的文件则不能。禁用mod_deflate会使HTML和JS文件也失败,状态为400。使用mod_deflate意味着文件不能直接从磁盘提供,
不幸的是,我自己没有把这些点联系起来,我花了很多时间尝试Docker映像和Apache配置的各种组合...
EnableMMAP是一种性能优化,但是,它可能是值得的,实际上存储在单独的Docker映像中的不同的Web应用程序,而不是使用一个具有外部挂载点的单一通用映像。
我也在考虑使用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

相关问题