2014-07-18 8 views
0

의 Zend Framework 1.12.x 응용 프로그램에서 문서 루트를 설정하여 Azure Web Site의 문서 루트를 설정하는 방법에 관한 다른 질문과 관련하여 클라우드 서비스에서 동일한 작업을 수행하는 방법을 알고 싶습니다.Azure Cloud Service

저는 Azure Powershell 도구를 사용하여 응용 프로그램 패키지를 만들고이를 클라우드에 성공적으로 업로드했습니다. 그러나 문서 루트 설정이 작동하지 않습니다.

내 ServiceDefinition.csdef은 다음과 같습니다

이제
<?xml version="1.0" encoding="utf-8"?> 
<ServiceDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="myCloudService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> 
    <WebRole name="myWebRole" vmsize="ExtraSmall"> 
    <Imports /> 
    <Startup> 
     <Task commandLine="setup_web.cmd &gt; log.txt" executionContext="elevated"> 
     <Environment> 
      <Variable name="EMULATED"> 
      <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" /> 
      </Variable> 
      <Variable name="RUNTIMEVERSIONPRIMARYKEY" value="5.3.17" /> 
      <Variable name="RUNTIMEID" value="PHP" /> 
      <Variable name="RUNTIMEURL" value="http://az413943.vo.msecnd.net/php/5.3.17.exe" />  
     </Environment> 
     </Task> 
    </Startup> 
    <Endpoints> 
     <InputEndpoint name="Endpoint1" protocol="http" port="80" /> 
    </Endpoints> 
    <Sites> 
     <Site name="Web"> 
     <Bindings> 
      <Binding name="Endpoint1" endpointName="Endpoint1" /> 
     </Bindings> 
     </Site> 
    </Sites> 
</WebRole> 
</ServiceDefinition> 

내가 사이트를 직접

<Sites> 
    <Site name="Web" physicalDirectory="../htdocs"> 
    ... 
    </Site> 
</Sites> 

의 physicalDirectoryPath 설정을 시도하고 나는 VirtualApplication를 사용하려고했지만, 모두 작동하지 않는 것 같습니다.

<Sites> 
    <Site name="Web"> 
    <VirtualApplication name="MyWeb" physicalDirectory="../htdocs" /> 
    ... 
    </Site> 
</Sites> 

어떤 도움이 필요합니까?

답변

1

블로그 항목 다음으로 나는 작동하는 해결책을 발견했습니다. 나는 그것을 수행하는 방법에 대한 빠른 통찰력을 제공하기 위해 정리해 것 :

링크 : Change your azure websites root folder

당신은 파일

<Startup> 
    <Task commandLine="changeroot.cmd" executionContext="elevated" taskType="background" /> 
</Startup> 

에게 ServiceDefinition.csdef에 다 시작 작업을 추가해야 이 명령은 시작시 'changeeroot.cmd'를 실행하도록 각 인스턴스에 지시합니다. 이 파일은 웹 역할 인스턴스 디렉토리의 /bin 디렉토리에 있습니다.

@echo off 
cd "%~dp0" 

icacls %RoleRoot%\approot /grant "Everyone":F /T 

powershell.exe Set-ExecutionPolicy Unrestricted 
powershell.exe .\changeroot.ps1 
ECHO Changeroot Run. >> ..\startup-tasks-log.txt 

이것은 PowerShell을 changeroot.ps1 스크립트를 실행, 상승 된 사용자 권한으로,이 생성되면 IIS에서 사이트의 PhysicalPath 인자를 이동합니다 :

이것은 다음과 같은 코드가 포함되어 있습니다. 이것은 또한 웹 역할에서 /bin 경로로 이동해야합니다.

은 다음 코드를 포함

$siteName = "Web" 
$serverIP = "127.0.0.1" 
$newPath = "htdocs" ## your document root 

$pathset = $false 
$trycount = 0 

##loop until physical path has changed 
while($pathset -eq $false) { 
    $trycount += 1 

    ##if the role id can be determined 
    if([Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::CurrentRoleInstance.Id -ne $null) 
    { 
      $fullName = [Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::CurrentRoleInstance.Id + "_" + $siteName 
      $op = "Changeroot: Site Full Name: $fullName`r`n" 
      Write-Output $op | Out-File -Encoding Ascii ..\startup-tasks-log.txt 

      ##init server manager 
      $serverManager = [Microsoft.Web.Administration.ServerManager]::OpenRemote($serverIP) 
      if($serverManager -ne $null) 
      { 
       $op = "Changeroot: Site Manager Setup`r`n" 
       Write-Output $op | Out-File -Encoding Ascii ..\startup-tasks-log.txt 

       ##load site 
       $site = $serverManager.Sites | where { $_.Name -eq $fullName } 
       if($site -ne $null) 
       { 
         $op = "Changeroot: Site loaded ($fullName)`r`n" 
         Write-Output $op | Out-File -Encoding Ascii ..\startup-tasks-log.txt 
         ##change physical path 
         $rootApp = $site.Applications | where { $_.Path -eq "/" } 
         $rootVdir = $rootApp.VirtualDirectories | where { $_.Path -eq "/" } 
         $dir = $rootVdir.PhysicalPath.EndsWith('\') 
         if($dir -eq $true) { 
           $rootVdir.PhysicalPath += $newPath + "\" 
         } else { 
           $rootVdir.PhysicalPath += "\" + $newPath + "\" 
         } 
         $serverManager.CommitChanges() 
         $op = "Root changed for $fullName (after $trycount tries)`r`n" 
         Write-Output $op | Out-File -Encoding Ascii ..\startup-tasks-log.txt 
         $pathset = $true 
         exit 
       } 
      } 
    } else { 
      startup-tasks-log.txt 
    } 
    # Restart the loop in 5 seconds 
    Start-Sleep -Seconds 5 
} 

이 마지막 날 위해 일했습니다.

자세한 설명은 링크를 클릭하십시오.

당신이 당신의 패키지를 구축해야합니다 (또는 publish-azureserviceproject 사용하여 배포) 클라우드 호스트와 일치하는 (또는 낮은) .NET 프레임 워크를 가지고 빌드 시스템을 사용 :

은이주의 사항을 덧붙였다. Windows 8.1 시스템에 배포하는 경우 OSFamily가 4로 설정되어 있는지 확인해야 할 수 있습니다. 빌드 머신에서 .net 런타임이 클라우드 호스트에있는 것보다 최신인지 확인하려면

  • 두 컴퓨터 모두에서 powershell을 엽니 다.
  • [System.Environment]::Version 또는 powershell 2를 사용 중인지 확인하십시오.0 이상, 당신은 당신이 이렇게하지 않는 경우에 실행하는거야 $PSVersionTable 변수

문제점을 볼 수 있습니다 - 당신은 가능성이 마이크로 소프트로 푸른 어셈블리 중 하나를 사용할 수 없습니다. WindowsAzure.ServiceRuntime. 웹 사이트의 실제 경로 변경은 웹 사이트 이름을 아는 것에 달려 있으며 이는 해당 어셈블리에서만 (동적으로) 사용할 수 있습니다.

+0

이 솔루션은 더 이상 작동하지 않습니다. changeroot 태스크를 실행하면 오류가 발생하고 클라우드 서비스가 제대로 시작되지 않습니다. – AndrewPK

+0

이 솔루션은 이전에 발견 한 것과는 다른 방식으로 작동합니다. 배포 호스트에 클라우드 호스트보다 새로운 .net 프레임 워크가 필요하지 않습니다. 나는 8.1 및 WindowsAzure.ServiceRuntime 어셈블리를로드하지 않았으므로 배포했습니다. 나는 downvote를 upvote로 바꿀 수 있도록이 예방책을 간단히 추가하기 위해 답을 편집 할 것입니다. – AndrewPK

관련 문제