如何在Azure WebRole上正确设置ImageResizer的缓存目录?
本文关键字:ImageResizer 缓存 设置 Azure WebRole | 更新日期: 2023-09-27 18:16:57
ImageResizer的DiskCache插件在本地工作得很好,但是当我将WebRole部署到Azure时,部署分区太小,无法缓存大量文件。
具体来说,WebRole分区在一个小角色上大约是1GB。我想把缓存目录指向:
- "C:"驱动器(小角色上大约200+GB)。
- 附加驱动器(我指定的任何大小)。
问题是WebRole所需的写权限。是否有一个临时目录的简单解决方案,或者我是否需要一个PowerShell脚本来配置虚拟目录上的acl并将其附加到WebRole的站点?
在我走这条路之前,我想知道是否有人有合理的解决方法。
In ServiceDefinition.csdef:
<Task commandLine="makevdir.cmd" executionContext="elevated" taskType="background" />
Makevdir.cmd:
PowerShell -ExecutionPolicy Unrestricted .'makevdir.ps1 >> "%RoleRoot%'makevdir.txt" 2>&1
EXIT /B %errorlevel%
Makevdir.ps1:
# Make Virtual Directory for ImageResizer DiskCache plugin (/imagecache)
Write-Host "makevdir.ps1 starting"
# $ImageCacheDir = $env:temp + "'imagecache"
#
# The TEMP paths are quota limited to ~100MB, so use a hard coded path:
$ImageCacheDir = "C:'Resources'AspNetTemp'imagecache"
Write-Host "ImageCacheDir = $ImageCacheDir"
md -Path $ImageCacheDir
# Set the ACL to allow IIS access to the new directory
$acl = Get-Acl $ImageCacheDir
$identity = "IIS_IUSRS"
$fileSystemRights = "Modify"
$inheritanceFlags = "ContainerInherit, ObjectInherit"
$propagationFlags = "None"
$accessControlType = "Allow"
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($identity, $fileSystemRights, $inheritanceFlags, $propagationFlags, $accessControlType)
$acl.SetAccessRule($rule)
Set-Acl $ImageCacheDir $acl
# Get the AppName by appending _Web/ to the RoleInstanceID environmental variable
$AppName = $env:RoleInstanceID + "_Web/"
Write-Host "AppName = $AppName"
# Retry creating the virtual directory every five seconds for a maximum of 20 tries
$tries = 0
& $Env:WinDir'system32'inetsrv'appcmd.exe add vdir /app.name:$AppName /path:/imagecache /physicalpath:$ImageCacheDir
while (!$? -and $tries -lt 20) {
$tries++
sleep 5
& $Env:WinDir'system32'inetsrv'appcmd.exe add vdir /app.name:$AppName /path:/imagecache /physicalpath:$ImageCacheDir
}
Write-Host "makevdir.ps1 exiting"
Exit
由于DiskCache将文件服务委托给IIS以提高性能,因此您将需要一个IIS虚拟文件夹。
DiskCache可以缓存/服务任何虚拟文件夹中的文件,而不考虑其物理位置(尽管本地存储是最好的-延迟是不可接受的)。
临时文件夹将不起作用,因为IIS和ASP。NET运行时用户帐户需要读/写访问,并且您肯定希望DiskCache是持久的。
听起来您需要为此编写脚本设置。我认为很多人都能从这样的剧本中受益,如果你能在完成后分享它。下面是如何编写IIS虚拟文件夹的脚本。