在Azure上为Laravel应用设置存储磁盘时遇到问题

时间:2020-02-28 15:24:40

标签: php laravel azure

我在Azure上使用Laravel 6应用遇到麻烦。我正在使用TCG / Navigator构建我的管理界面。本地开发中的所有工作都是笨拙的,但是当我将代码推送到Azure中的开发站点时,存储磁盘中的项目将不可用。我在“导航器”管理面板中将其视为损坏的图像。

Laravel的文件存储似乎需要符号链接才能运行:

https://laravel.com/docs/6.x/filesystem#the-public-disk

,但是Azure的Windows Web应用程序似乎不支持符号链接。我需要其他东西才能将/ public / storage映射到/ storage / app / public。

我可以创建一个新的虚拟目录,但这并不能解决问题。我已将“ / storage”映射到“ site \ wwwroot \ storage \ app \ public”,但在“导航器”管理面板中仍然看到损坏的图像。

我在导航器的存储库中发现了此问题:

https://github.com/the-control-group/voyager/issues/417#issuecomment-304525223

似乎只是我需要的修复程序,但它也不起作用。

我添加了:

        'azure' => [
            'driver' => 'local',
            'root' => storage_path('..\public\storage'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
        ],

到filesystems.php。在voyager.php中,我看到了:

    'storage' => [
        'disk' => env('FILESYSTEM_DRIVER', 'public'),
    ],

因此,为了让事情在本地开发人员中保持不变(即正在工作),我已经在Web应用程序中添加了应用程序设置:

FILESYSTEM_DRIVER,设置为“ azure”

我知道我的Azure Web应用正在尝试使用azure文件系统,因为我最初忘记推送更新的代码,而我的应用告诉我它丢失了。

所以现在我认为我的问题可能是我在天蓝色存储磁盘的定义中没有正确的值。有任何想法吗?也许有其他建议,试图使Laravel的文件存储在Azure上运行?

1 个答案:

答案 0 :(得分:1)

我已经以正确的方式解决了这个问题,但这不是我一直在寻找的解决方案。

最终,我需要一个地方来存储通过网站的管理界面上传的媒体。 Navigator使用Laravel File Storage,默认情况下,本地开发人员会将上传的文件拖放到/ storage / app / public。如果您的dev / staging / prod服务器以相同的方式工作,那么部署的快速简便的解决方案是:也就是说,上传的文件存储在同一服务器上的/ storage / app / public中。这是我最初尝试做的。

我的开发和生产服务器都在Azure上。它们是可扩展的Web应用程序,因此,从理论上讲,如果我的网站被大量享受我的内容的用户所淹没,则可能有多个实例正在提供我的内容。我不应该期望每个实例具有相同的本地存储。更好的可扩展性解决方案是,对于所有上传的内容,无论哪个实例正在运行上传该内容的管理界面,都必须驻留在专用文件存储位置。乍一看似乎很古怪,但这与让一个数据库向任何数量的Web服务器吐出内容以显示给用户一样。

因此,在与不合作的符号链接搏斗了2天之后,我跳到了专用的文件存储位置解决方案。而且有效!这是我为实现魔术而采取的步骤:

  1. 在Azure中创建一个存储帐户。
  2. 在存储帐户中创建了一个Blob容器。
  3. 将Laravel Azure存储软件包添加到了我的项目(https://github.com/matthewbdaly/laravel-azure-storage)。
  4. 按照软件包的说明更新filesystems.php:
       'azure' => [
            'driver'    => 'azure',
            'name'      => env('AZURE_STORAGE_NAME'),
            'key'       => env('AZURE_STORAGE_KEY'),
            'container' => env('AZURE_STORAGE_CONTAINER'),
            'url'       => env('AZURE_STORAGE_URL'),
            'prefix'    => null,
        ],
  1. 将AZURE_STORAGE_NAME(我的存储帐户的名称),AZURE_STORAGE_CONTAINER(我的容器的名称)和AZURE_STORAGE_KEY(在存储帐户数据的“访问密钥”下找到)添加到了我的Web应用程序的“应用程序设置”中。
  2. 在我的视图中使用'''Storage :: url($ page-> image)'''在本地dev(使用本地存储)和Azure(使用存储帐户)中为我的图像正确创建src值。
  3. 通过更新项目的.gitignore文件,从存储库中排除了本地存储数据。 (我的测试图像不必由git跟踪。)

he。我仍然对是否可以在Azure Web应用程序中运行本地存储感兴趣,但是这种配置使我跳过了绊脚石,转向了生产就绪型解决方案。