ํ๋ก๋์ IIS ์๋ฒ์์ FTP๋ฅผ ์ฌ์ฉํ์ฌ .NET Core ์ ํ๋ฆฌ์ผ์ด์ DLL ํ์ผ์ ๋ฎ์ด ์ฐ๋ ค๊ณ ํ๋ฉด ํ์ผ์ด ์ ๊ฒจ์์ด ๋ฎ์ด ์ธ ์ ์์ต๋๋ค.
์ ๋ฒ์ ์ ๋ฐฐํฌํ๋ ค๋ฉด IIS์์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ค์งํ์ฌ ์ ๊ธ์ ํด์ ํ ๋ค์ ๋ฎ์ด ์จ์ผํฉ๋๋ค.
์์ฉ ํ๋ก๊ทธ๋จ์ ์ค์งํ์ง ์๊ณ ๋ฐฐํฌ ํ ์ ์์ต๋๋ค.
app_offline.htm์ ์ฐธ์กฐํ์ญ์์ค. https://docs.asp.net/en/latest/hosting/aspnet-core-module.html#asp -net-core-module-app-offline-htm
PowerShell ๋ฐฉ์์ ์ํ๋ ๊ฒฝ์ฐ IIS Admin cmdlet์ ์ฌ์ฉํ ์ ์์ต๋๋ค. https://technet.microsoft.com/en-us/library/ee790599.aspx
Stop-WebAppPool -Name $appPoolName
... deploy ...
Start-WebAppPool -Name $appPoolName
@Tratcher ์ค๋ช
์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
์ด๊ฒ์ด ๊ทํ์ ๊ณํ์ ์๋์ง ํ์คํ์ง ์์ง๋ง ์ด์ ASP.NET MVC์์ ์๋ํ๋ค๊ณ ์๊ฐํฉ๋๊น?
์ด ๊ธฐ๋ฅ์ ๊ตฌํํ ๊ณํ์
๋๊น?
@GuardRex ๊ณต์ ํธ์คํ ํ๊ฒฝ์ด๊ณ AppPool์ ์ค์ง ํ ๊ถํ์ด ์๊ธฐ ๋๋ฌธ์ ํ ์ ์์ต๋๋ค.
msdeploy.exe ๋ฐ Azure๋ก '๊ทธ๋ฅ ์๋'ํ ์ ์์ต๋๊น? ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ฉด ํ์ผ ์ ๊ธ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์น ์ฌ์ดํธ๋ฅผ ๋ค์ ์์ํด์ผํฉ๋๋ค. -enableRule:AppOffline
์ (๋) ์๋ํ์ง๋ง ์ ์ฒด ์น ์ฌ์ดํธ๊ฐ ๋ช ๋ถ ๋์ ์คํ๋ผ์ธ ์ํ์ด๋ฏ๋ก ํนํ ํ๋ฃจ์ ๋ช ๋ฒ ๋ฐฐํฌํ๋ค๋ ์ ์ ๊ณ ๋ คํ ๋ ํ๋ฅญํ ์ฌ์ฉ์ ๊ฒฝํ์ด ์๋๋๋ค.
@chuchuva ์ผ ์๋ ์์ง๋ง ๋ชจ๋ ๋ง๋ฒ์๋ ๋น์ฉ์ด
๋ง์ ์ด๋ ์๋๋ ์ ์๋ํ์ต๋๋ค. ASP.NET ์ฝ์ด๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ํ ์ง๊ธ์ ์ข ๊ทธ๋ฆฌ์์ ...
@HarelM๊ณผ ๋์ํ์ต๋๋ค. ์๋ํ ๋ ๋ฐฐํฌ์์ ์ต์ข ์ฌ์ฉ์ ๊ฒฝํ์ ์ด๋ฅด๊ธฐ๊น์ง ์ด์ ๊ด๋ จํ์ฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด์ MVC๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฃจ์ ์ฝ 10 ๋ฒ ๋ฐฐํฌํ๋ ๊ฒ์์ ๋ฐค์ ๋งค์ผ ๋ฐฐํฌํ๋ ๊ฒ์ผ๋ก ์ ํํ์ผ๋ฉฐ Core ์ฑ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ด ์คํ๋ผ์ธ์ผ๋ก ์ ํ ํ ๋ ์ง์ฆ์ด ๋ ๊ฒ์ด๋ผ๋ ์ ์ ๋ฐ์ ๋ค์์ต๋๋ค. ์ผ ์คํ ํผ๋ ์๋์ง๋ง Core ์ฑํ์ ๋ํ ๋ง์ฐฐ์ด ์ถ๊ฐ๋์์ต๋๋ค.
๐
์ค๋ณต ์ฌํ์ฉ์ ์ง์ํ์ง ์๋ ๊ฒ์ ํ๊ท์ ๋๋ค.
์ด ๊ธฐ๋ฅ์ ๋ค์ ๋ฐฉ๋ฌธํ์ฌ ๋ก๋๋งต์ ์ฌ๋ฆด ๊ณํ์ด ์์ต๋๊น? ๋ค์ด ํ์์๋ ๋ฐฐํฌ๋ฅผ ์ง์ํ๋ ค๋ ๊ฒฝ์ฐ .Net Core ์น ์ฌ์ดํธ๋ฅผ ๋ฐฐํฌํ๋ ๋ชจ๋ ์ฌ๋์ด ์คํ ์ด์ง ์ฌ๋กฏ ์ ๋ต์ ์๋์ผ๋ก ๊ตฌํํ๋๋ก ์๊ตฌํ๋ ๊ฒ์ ๋งค์ฐ ๋ถํธํ๊ณ ๋น์ฐํธ์ ์ ๋๋ค.
์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋ง์ ์ฌ๋๋ค์ด .Net Core ์น ์ฌ์ดํธ๋ก ํจ์ฌ ์ํํ๊ฒ ์ ํ ํ ์ ์์ผ๋ฉฐ .Net Core ์น ์ฌ์ดํธ๋ฅผ ๋ ๋น ๋ฅด๊ฒ ์ฑํ ํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์๊ณ ์ถ์ต๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ ๋๋ ํ ๋ฆฌ์ app_offline.htm์ ๋ฃ๋ ๊ฒ์ ์๋ํ์ง ์์ต๋๋ค.
์ฌ๋ฌ ์ฌ์ดํธ๋ฅผ AspNetCore๋ก ์ด๋ ํ ํ์์ผ์ด '๊ธฐ๋ฅ'์ ๊นจ๋ฌ์์ต๋๋ค. ๊ฒ์ ํ ๋๋ง๋ค ๋ช ๋ถ ๋์ ์ฌ์ดํธ๋ฅผ ์คํ๋ผ์ธ์ผ๋ก ์ ํํ๋ ๊ฒ์ด ํ์ฉ๋๋ค๊ณ ์๊ฐํ ์ ์์ต๋๋ค!
์ด๊ฒ์ ์๊ท๋ชจ ํ์ ๋ฆฌ๋๋ก์ ๋์๊ฒ ์ถฉ๋ถํ์ง ์์ต๋๋ค. AspNetCore๊ฐ ๋๊ท๋ชจ๋ก ์ฐ์ ํตํฉ์ ์คํํ๊ณ ์์ต๋๊น? ๋ค์ ๊ฒ์ํ๊ธฐ ์ํด ๋งค์๊ฐ ๋ช ๋ถ ๋์ ์ฌ์ดํธ๋ฅผ ์คํ๋ผ์ธ ์ํ๋ก ๋ง๋ค ์๋ ์์ต๋๋ค.
FTP ๋๋ xcopying์ ์ฌ์ฉํ์ฌ ๋ฐฐํฌํ๊ณ ์์ต๋๊น? ์๋๋ฉด webdeploy๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
์น ๋ฐฐํฌ๋ฅผ ํตํด IIS์ ๊ฒ์ํ๊ณ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ํ์ฌ web.config๋ฅผ ๋จผ์ ์ญ์ (ํจ๊ณผ์ ์ผ๋ก ์์ฉ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ)ํ์ฌ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ง๋ง ์ฅ๊ธฐ์ ์ผ๋ก๋ ์ค์ ๋ก ํ์ฉ๋๋ ์๋ฃจ์ ์ด ์๋๋๋ค.
@DaleMckeown ์ด์์ ์ผ๋ก ์ง์์ ์ธ ํตํฉ ์ํฌ ํ๋ก๋ฅผ ์ฌ์ฉํ๋ฉด๋ก๋ ๋ฐธ๋ฐ์ ๋ค์ ์ฌ๋ฌ ์๋ฒ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ๋์ ์๋ฒ๋ฅผ ๊ฐ์ ธ ์์ ์ ๋ฐ์ดํธ ํ ๋ค์ ๋ค์ ๋ฃ๊ณ ๋ค์ ์๋ฒ๋ก ์ด๋ํฉ๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ด ํญ์ ๊ฐ๋ฅํ ๊ฒ์ ์๋๋ฏ๋ก (์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์ฒ๋ผ) ๋ช ๋ถ์ ๋ค์ด ํ์์ ๊ฐ์ง๊ณ ์ด์์ผํฉ๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ์ฑ์ด 30 ์ด ์ด๋ด์ ๋ฐฑ์ ๋๋ฏ๋ก ์ค์ ๋ก๋ ๋ฌธ์ ๊ฐ๋์ง ์์ต๋๋ค.
ํํ
์น ๋ฐฐํฌ๋ฅผ ํตํด IIS์ ๊ฒ์ํ๊ณ ์์ต๋๋ค.
webdeploy๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐํฌํ๋ ๋ฐ ์ฌ์ฉํ ์์๋ ๋ช ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค (์ ๊ธด ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊พธ๊ณ ์ฑ์ ์คํ๋ผ์ธ์ผ๋ก ์๋์ผ๋ก ์ญ์ ํ ์ ์์). ๊ธฐ๋ณธ์ ์ผ๋ก @shirhatti ์ ๋๊น?
๋ฟก ๋นต๋จ
์ฐ๋ฆฌ๋ ํ์ฌ web.config๋ฅผ ๋จผ์ ์ญ์ (ํจ๊ณผ์ ์ผ๋ก ์์ฉ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ)ํ์ฌ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ง๋ง ์ฅ๊ธฐ์ ์ผ๋ก๋ ์ค์ ๋ก ํ์ฉ๋๋ ์๋ฃจ์ ์ด ์๋๋๋ค.
xcopy ๋ฐฐํฌ๋ฅผ ์ํํ๋ค๋ ์๋ฏธ์ ๋๊น?
webdeploy๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐํฌํ๋ ๋ฐ ์ฌ์ฉํ ์์๋ ๋ช ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค (์ ๊ธด ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊พธ๊ณ ์ฑ์ ์คํ๋ผ์ธ์ผ๋ก ์๋์ผ๋ก ์ญ์ ํ ์ ์์). ๊ธฐ๋ณธ์ ์ผ๋ก @shirhatti ์ ๋๊น?
๊ฐ์ฌํฉ๋๋ค David-๋ด๊ฐ ํ์ฌํ๊ณ ์๋ ๊ฒ๋ณด๋ค ๋ ์ข๊ฒ ๋ค๋ฆฝ๋๋ค (IIS์์ ์ฌ์ดํธ ๋ฐ ์ฑ ํ์ ์๋์ผ๋ก ์ค์ง). ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ์๋ฏธ๋ฅผ ์กฐ์ฌ ํ ์ ์๋๋ก ๋ช ๊ฐ์ง ๋ฆฌ์์ค๋ฅผ ์๋ ค ์ฃผ์๊ฒ ์ต๋๊น?
์ง์ค์ ๊ทผ์์ ์ฐพ์ ๋๊น์ง @DaleMckeown ๋ช ๊ฐ์ง ์ ๋ณด https://github.com/Microsoft/vsts-tasks/issues/5259#issuecomment -346202503
@davidfowl ์ฐ๋ฆฌ๋ webdeploy๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ ์๋ฒ (btw๋ ์ฐ๋ฆฌ์๊ฒ ๋ฌธ์ ๋ฅผ์ฃผ์ง ์์)์ ๋ฐฐํฌํ๊ณ , ๊ฑฐ๊ธฐ์์ robocopy๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์ ๋ผ์ด๋ธ ์๋ฒ๋ก ๋ณต์ฌํฉ๋๋ค.
๋ฟก ๋นต๋จ
ํ์ฌ web.config๋ฅผ ๋จผ์ ์ญ์ ํ์ฌ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ต๋๋ค.
web.config ๊ฐ ๋ฐฐํฌ์์ ์ ๊ฑฐ๋๋ฉด IIS๋ ๋ฐฐํฌ์์ ์ค์ํ ํ์ผ์ ์ ๊ณตํฉ๋๋ค. ๊ณต๊ฒฉ์๋ 30 ๋๊ฐ ์ด๋ฆด ๋๊น์ง ๋ฐค๋ฎ์ผ๋ก ๊ณ์ ํ์ผ์ ์์ฒญํ ์ ์์ต๋๋ค.
ํํ
PS ์ ๊ทผ ๋ฐฉ์์ผ๋ก ์ก์ด์ ์กฐ๊ธ์ด๋ผ๋ ๋ค์ด๊ฐ๊ณ ์ถ๋ค๋ฉด @ajeckmans์ ์กฐ์ธ์ ๋ฐ๋ผ ์น ํ์ ๋ฐฐํฌํ๊ธฐ ์ํด AppPools๋ฅผ ํ ๋ฒ์ ํ๋์ฉ ์ญ์ ํ๋ ํ๋ก์ธ์ค๋ฅผ ์คํฌ๋ฆฝํ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ ๋ https://github.com/guardrex/aspnetcore-iis-ps-publish ...๋ฅผ ์ฐธ์กฐ
@guardrex ๋น์ ์ด ๋ง์์. ๋จผ์ app_offline.htm์ dir์ ๋ณต์ฌ ํ ๋ค์ web.config๋ฅผ ์ ๊ฑฐํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ฌ ํ ๋ค์ web.config๋ฅผ ๋ค์ ๋ฃ๊ณ app_offline์ ์ ๊ฑฐํฉ๋๋ค (๋ชจ๋ ofc ์คํฌ๋ฆฝํธ ์ฌ์ฉ). ๋ถํํ๋ ์น ์ฌ์ดํธ ๋๋ ํ ๋ฆฌ์ app_offline ํ์ผ์ ๋ฐฐ์นํ๋ ๊ฒ๋ง์ผ๋ก๋ dll์ ๋ํ ์ ๊ธ์ด ํด์ ๋์ง ์์ต๋๋ค. web.config๋ฅผ ์ ๊ฑฐํด์ผํฉ๋๋ค. ์ด๋ ์ด์ ์ asp.net ์ ์ฒด ์ฑ (์ : ์ด์ ์น ์์ ๋ฑ)์ ๋ํด ์ํ ํ ํ์๊ฐ์๋ ์์ ์ ๋๋ค.
@ajeckmans ์๋ํ์ง ์์์ผํฉ๋๋ค. web.config ํ์ผ์ด ์ ๊ฑฐ๋๋ฉด IIS๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ฆ์ ์ ํํ๋ฏ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ ํ์ผ ๋ชจ๋์ ๋ํ ์์ฒญ์ ์ํํ๊ณ ํ์ผ ์ ๊ณต์ ์์ํด์ผํฉ๋๋ค. ๊ทธ๊ฒ์ ์๋ํ๊ณ ๊ทธ๊ฒ์ด ์ผ์ด๋๋์ง ํ์ธํ์ญ์์ค ...
http://localhost:<PORT>/<ASSEMBLY_NAME>.deps.json
... PORT ๋ฐ ASSEMBLY_NAME ๋์ฒด).๋๋ ๋จ์ํ ๋ชจ๋์ ์ ๊ฑฐํ๋ ๊ฒ์ ์ ๋ขฐํ์ง ์์ ๊ฒ์ ๋๋ค ...
<configuration>
<system.webServer>
<modules>
<remove name="StaticFileModule" />
</modules>
</system.webServer>
</configuration>
... ๋ค๋ฅธ ๋ชจ๋์ด ๋จ์ ์๊ณ ๋ค๋ฅธ ๊ณต๊ฒฉ ๋ฒกํฐ๋ฅผ ์ ๊ณต ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์๊ฐ ์๋ ๋ชจ๋์ ๋ชจ๋ ์ ๊ฑฐ ํ ์๋ ์์ง๋ง web.config ์ ๊ฑฐ๋ฅผ ํตํด ๋ฐฐํฌ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ด์ ๊ฐ์ ์์ง์์ผ๋ก ๋ฏธ์ง์ ์์ญ์ ์ง์ ํ๊ณ ์์ต๋๋ค. ์ด๋ ๊ณต์ ์ง์นจ์ ๋ฐ๋ฅธ ์ต์ ์ด ์๋๋ฏ๋ก ์์ ํ ์ง์๋์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, AppPool์ ์ค๋จํ๊ฑฐ๋ ๋ค๋ฅธ ์ ๋ต์ ์ฌ์ฉํ๋ ค๋ฉด PS ์คํฌ๋ฆฝํ ์ ๊ถ์ฅํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ๋์ ์ ๋ฉ๋ชจ๋ฅผ ์ถ๊ฐํด์ผํ๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๊ฒ์ ๋ณด์ ๊ด์ ์์ ์ฝ๊ฐ์ ๋์น์ ์ฌ๋ ธ๋ค. ๋ฐฐํฌ ๋ ์ด์์์ด ๋ณ๊ฒฝ๋์์ ๋ ํ์ผ์ wwwroot
๋ค์ ๋ฃ๋ ๊ฒ์ ํฌํจํ์ฌ ๋
ผ์๋์์ต๋๋ค.
ํ ๋ก ๋์ : IIS ๋ณ๊ฒฝ ์ฌํญ์ web.config ์์น์ ๊ฒ์ (IISIntegration 158)
web.config
๋ค์ wwwroot
(IISIntegration 164)๋ก ์ด๋์์ฃผ์
[ํธ์ง] ์๋ง๋ ๊ทธ๊ฒ์ ๋น์ ์ (์ง์๋์ง ์๋) ํด๊ฒฐ ๋ฐฉ๋ฒ ์ผ ๊ฒ์ ๋๋ค : web.config๋ฅผ ๋ค์ wwwroot ๋ก ์ด๋ ํ ๋ค์ ๋น์ ์ดํ๋ ์ผ์ ๊ณ์ํ์ญ์์ค. ์์ง๋ tho ... ์ด๋ป๊ฒ ์คํ๋ผ์ธ ์ํ๋ก ๋ง๋ค๋ ค๋ฉด ์ฑ์ ๊นจ๋ ๊ฒ์ด ๋ฌด์ญ์ต๋๋ค.
์ด ์ํฉ์์ ์ฐ๋ฆฌ๊ฐํด์ผ ํ ์ผ์ ๋ํด ๋์ฑ ํผ๋์ค๋ฌ์ํฉ๋๋ค.
ํ์ผ ์ ๊ธ์ ๋ฐฉ์ง ํ ์์๋ ๋ฐฉ์์ผ๋ก ์น ๋ฐฐํฌ๋ฅผ ํตํด IIS์ AspNetCore ์ฌ์ดํธ๋ฅผ ๊ฒ์ํ๊ธฐ์ํ ํ์ฌ ๊ถ์ฅ ์ฌํญ์ ๋ฌด์์ ๋๊น?
์ ๋ ์๊ณ ์ถ์ต๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ ์กฐ์ง์์ .net ํต์ฌ ์ฑํ์ ๋ํ ์ฃผ์ ์ฅ์ ๋ฌผ์ด๋๊ณ ์์ต๋๋ค.
๋ด .net ํต์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ ์ค์ด๊ณ ์ ๋น๋๋ฅผ ๊ฒ์ํ๋ ค๊ณ ํ ๋ DLL์ด ์ฌ์ฉ ์ค์ด๋ผ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ผ์ ์ฑ ํ์ ์ค์ง ํ ๋ค์ DLL์ ์ ๋ฐ์ดํธํ๊ณ ์ฑ ํ์ ์์ํด์ผํฉ๋๋ค.
.Net Core์์ ์ฑ ํ์ ์ค์งํ์ง ์๊ณ ์ ๋น๋ / DLL์ ๊ฒ์ ํ ์์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ด๊ฒ์ ์๋์ฐ ๋ณต์ฌ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ .Net ํ๋ ์ ์ํฌ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋ฉ๋๋ค. ์ํ๊น๊ฒ๋ .Net ์ฝ์ด๊ฐ ์ถ์ ๋ ์ง 2 ๋ ์ด ์ง๋ฌ๊ณ ์ฌ์ ํ ๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ ํ์ ๊ธฐ๋ฅ์ ๋ํ ์ง์์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์ผ๋ก์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ณํ์ด ์์ต๋๊น?
๋์์ ์ฃผ์ ์ ๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
@guardrex dll์ ํด์ ํ๊ธฐ ์ํด IIS (๋๋ ์ ๊ธ์ ์ ์งํ๋ ๋ชจ๋ ๊ฒ)๋ฅผ ์ป๊ธฐ ์ํด ์ฑ์ ์ค๋จํ๋ ๊ฒ์ ์ค์ ๋ก ๋ฌด์ญ์ง ๋ง ํซํฝ์ค๋ฅผ ์ ํ์ ํธ์ ํ ์์๋ ๊ฒ์ ๋ ๋ฌด์ญ์ต๋๋ค. ๋น๋ถ๊ฐ์ ์ฑ์ ๊นจ๋ ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ํ ์์๋ ์ ์ผํ ์ผ์ด์ง๋ง, ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ฒ๋ฆฌํ๋ ๋ค๋ฅธ ๋ ํ๋์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์์ฃผ ์ฐพ๊ณ ์์ต๋๋ค. :)
@ shahjay748 ์จ์
๋น๋ถ๊ฐ ์ค๋๋ ํ๋ก์ธ์ค์ ๊ฐํ์๋ ์ฐ๋ฆฌ์๊ฒ ๋์์ด๋์ง ์๋ ofc :)
๋ด๊ฐํ๋ ์ผ์ (์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ธ์ง ํ์คํ์ง ์์) ์ฌ์ดํธ๋ฅผ ๋ค๋ฅธ ๋๋ ํ ๋ฆฌ์ ์ ๋ก๋ํ๊ณ iis์์ ๊ฒฝ๋ก๋ฅผ ์ ํํ๋ ๊ฒ์ ๋๋ค.
์ด ๋ฌธ์ ์ ๋ํด ๋ด๋ถ ์กฐ์ฌ๋ฅผํ์ต๋๋ค. ๋ด๊ฐ ์ ์ ์๋ฏ์ด ANCM์ ๋ฐฐํฌ ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ํ์ผ / ํธ๋ค์ ๋ณด๊ดํ์ง ์์ต๋๋ค. webdeploy ์์ฒด์ ๋ฌธ์ ๋ก ๋ณด์ด๋ฉฐ ๋ฐฐํฌ์ ์คํจํฉ๋๋ค. app_offline์ด ์ญ์ ๋ ํ ๋ช ๋ฒ ์ฌ ์๋ํ ํ์๋ ์ง์์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ์ ์คํจํ ์ ์ด ์์์ต๋๋ค.
๊ทธ๊ฒ์ ๋ํ ๋น ๋ฅธ PowerShell ์ฌ์ด๋ ๋ ธํธ ์ถ๊ฐ : ์ฑ ์ด์ ๋ธ๋ฆฌ์ ๋ํ ์ ๊ธ์ ํญ์ ํด์ ๋ฉ๋๋ค ... ๋๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค ( ์์ง! lol).
@ bpetersen1 ... "์คํ ์ด์ง"์ ๊ทผ ๋ฐฉ์์ ์ ๋ฐฐํฌ๊ฐ ์ค๋จ ๋ ๊ฒฝ์ฐ ๋น ๋ฅธ ๋กค๋ฐฑ ์ต์ ์ ์ ๊ณตํ๋ ๋ฌ์ฝคํ ๋ถ์์ฉ์ด ์์ต๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์คํฌ๋ฆฝํ ํ๊ธฐ ์ฝ์ต๋๋ค.
์ด๊ฒ์ ์ฌ์ ํ โโ์ธ๋ถ ์ ์ผ๋ก ์ฑ๊ฐ์ ์ผ์ ๋๋ค. ์ฐ๋ฆฌ๋ IIS๋ฅผ ๋ค๋กํ๊ธฐ ์ํด ๋์ปค ์๋ฃจ์ ์ ์กฐ์ฌํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๋๋ ํด๊ฒฐ์ฑ ์ ์คํ ํ ๊ฒ์ ๋๋ค. ๊ณ์ ์ง์ผ๋ด์ฃผ์ธ์.
FTP๋ฅผ ์ฌ์ฉํ์ฌ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด์ ๋ํ Microsoft์ ์กฐ์ธ์ ๋ฌด์์ ๋๊น?!
FTP๋ฅผ ์ฌ์ฉํ์ฌ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด์ ๋ํ Microsoft์ ์กฐ์ธ์ ๋ฌด์์ ๋๊น?!
appoffline.htm ํ์ผ์ ๋๋กญ ํ ๋ค์ ftp๋ฅผ ์ ๊ฑฐํ ๋ค์ ์ ๊ฑฐํฉ๋๋ค.
@davidfowl ์, ์ด๊ฒ์ด
๊ฐ์ฌํฉ๋๋ค. ๋ฐฐ์น ํ์ผ์ ์ด๋ป๊ฒ ์คํํ๊ณ ์์ต๋๊น?
์ด๊ฒ์ ๋ํ MIcrosoft์ ๋ฌธ์์ ๋ํ ๋งํฌ๋ ๊ฐ์ฌํฉ๋๋ค. Google์์ ์ฐพ์ ์ ์์ต๋๋ค. ๊ฐ์ฌ.
@ niico100 ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐฐ์น ํ์ผ์ ํ์ผ์ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ์ ๋ณต์ฌํ๊ณ ๋จผ์ ๋ฐฑ์
ํด๋๋ฅผ ๋ง๋ญ๋๋ค. ํ์ผ์ ๋ณต์ฌํ๊ธฐ ์ ์ appoffline.htm์ ํ๋ก์ ํธ ํด๋์ ๋ฃ์ผ์ญ์์ค.
ํ์ผ ์ ๊ธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ๋ณต์ฌ๊ฐ ๋ค์ ์๋๋ฉ๋๋ค. ๋๋ robcopy๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy
๊ด์ฌ์๋ ์ฌ๋์ด์๋ ๊ฒฝ์ฐ ๋ค์ ์คํฌ๋ฆฝํธ๋ Appveyor์์ ๋ฐฐํฌ ํ์ผ์ ๋ค์ด๋ก๋ํ๊ณ , ์ฌ์ดํธ๋ฅผ ์ค์งํ๊ณ , ํ์ํ ํ์ผ์ ๋ณต์ฌํ๊ณ , ์ฌ์ดํธ๋ฅผ ๋ฐฑ์
ํฉ๋๋ค.
https://github.com/IsraelHikingMap/Site/blob/master/Scripts/Deploy.ps1
๊ทธ๋๋ ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ์คํํด์ผํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ง์ด๊ทธ๋ ์ด์
ํ๋ฉด docker ๊ฐ์ด ๋ชจ๋ ๋ง๋ ์๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
Stop-WebAppPool
๋ฐ Start-WebAppPool
powershell ๋ช
๋ น์ ์ฌ์ฉํฉ๋๋ค.
๋ก์ปฌ ๊ฐ๋ฐ์ ๊ฒฝ์ฐ WebDeploy๊ฐ ์๋ํ์ง ์์์ต๋๋ค. ๋ด ๋ก์ปฌ IIS์ ๋ํด ์ฌ์ฉํด ๋ณด์์ง๋ง ์ฌ์ ํ ์ ๊ธด ํ์ผ์ ๋ํด ๋ถํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ VS ์ฌ์ / ์ฌํ ๋น๋ ์ด๋ฒคํธ์์ ์์ powershell ์ปค๋งจ๋ ๋ ์ ์ฌ์ฉํด ๋ณด์์ง๋ง 32 ๋นํธ powershell์ด โโ64 ๋นํธ IIS ์ค์ ์ ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ํ์ง ์์์ต๋๊น? ์ด์จ๋ ๋ด ASP.Net Core ํ๋ก์ ํธ์ ๋ค์ ์ฌ์ / ์ฌํ ๋น๋ ์ด๋ฒคํธ๊ฐ ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋น๋ ์ ์ด๋ฒคํธ :
echo "App Offline" /a > $(ProjectDir)app_offline.htm
๋น๋ ํ ์ด๋ฒคํธ :
del $(ProjectDir)app_offline.htm
๋๋ ์ฌ๊ธฐ์ ๋ถํ์ ๊ฐ๋ตํ ์๋ ํ๊ณ , ์ด๊ฒ์ด ๊ด๋ จ์ด์๋ ๊ฒ ๊ฐ๋ค. CI ๋ฐฐํฌ๋ฅผ ์ผ๋ฐ์ ์ผ๋ก "๋ฐฉ๊ธ ์๋ ํ"octopus ๋ฐฐํฌ์์ iis ๊ด๋ฆฌ ์์ ๊ณผ ํจ๊ป azure devops ๋ฆด๋ฆฌ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์ฎ๊ฒผ์ต๋๋ค. ์น์ฑ์ ์ค์งํ๊ณ ์ฑ ๋๋ฉ์ธ์ ์ค์ง ํ ํ์๋ ํ์ผ์ด ์ฌ์ ํ ๋จ์ ์๊ธฐ ๋๋ฌธ์ ์ ํ์ผ์ ๋ฐฐํฌํ๋ ๋ฐ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฌ์ฉํ๋ค.
์ด๊ฒ์ ์๋ง๋ 3 ๋ฒ์ ๋ฐฐํฌ ์ค ์ ์ด๋ 1 ๋ฒ์ด๋ฉฐ ์ํฉ์ ๊ฐ์ ํ๊ฑฐ๋๋ณด๋ค ์์ ์ ์ธ ๋ฐฐํฌ๋ฅผ ํ ์์๋ ๊ฒ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
@Tratcher @ronnyek Application Insights์ ๊ด๋ จ๋ ๊ฒ ๊ฐ์ต๋๋ค. App Insights ํ์ฅ์ ์ถ๊ฐ ํ ํ ์น ์ฑ DLL์ ๊ฐ์๊ธฐ ์ ๋ฐ์ดํธํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต๊ณ ๊ทธ ์ ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด๋ App Insights๊ฐ ํ๋กํ์ผ ๋ฌ๋ฅผ ์ฑ ํ๋ก์ธ์ค ๋ฐ DLL์ ์ฐ๊ฒฐํด์ผํ๋ค๋ ์ ์ ๊ณ ๋ คํ ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค.
๋๋ ์ฌ์ ํ์ด ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค. ๋๋ ํ๋๊ทธ -e nableRule : AppOffline์ ์ฌ์ฉํฉ๋๋ค
๋ฆด๋ฆฌ์ค๋ฅผ ์์ํ ํ ์น ์์ฉ ํ๋ก๊ทธ๋จ ํด๋๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ msdeploy์์ ์ญ์ ํ App_Offline.html์ ํ์ธํฉ๋๋ค. ๋ค์์ผ๋ก ์์ ๋ฉ์์ง์ ํจ๊ป ๋ฆด๋ฆฌ์ค๊ฐ ์คํจํ๊ณ App_Offline ํ์ผ์ด ์ฌ์ ํ ํด๋์ ์์ต๋๋ค. ๋ฆด๋ฆฌ์ค๋ฅผ ๋ค์ ์์ํฉ๋๋ค. ์ด๋ฒ์๋ ๋ชจ๋์ด ํด๋์ ํ์ผ์ ๋ณผ ๋ ์ ์๋ํฉ๋๋ค.
๋ง์ง๋ง asp.net ์ฝ์ด ๋ฐํ์ ์ค์น-> aspnetcore.dll 12.1.18263.2
์ด๋ค ์์ด๋์ด? ์์ง๋ ๋ฒ๊ทธ?
@dhtek app_offline.htm
๋ฐฐ์น ํ ํ ์ฆ์ ํ์ผ์ ๊ต์ฒดํ๋ ค๊ณ ํ๋ฉด ์๋ฒ๊ฐ ์์ง ์์ฉ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃ ํ ์๊ฐ์ด ์ถฉ๋ถํ์ง ์์ ๊ฒ์
๋๋ค. ํ์ผ ๊ต์ฒด๋ฅผ ์๋ํ๊ธฐ ์ ์ ์ ์ ๊ธฐ๋ค๋ ค์ผํฉ๋๋ค.
์ข์, ์ดํดํ์ง๋ง msdeploy์์ -e nableRule : AppOffline ์ต์ ์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ํ์ด์ง๊ฐ ์๋์ผ๋ก ํด๋์ ๋๋กญ๋๊ณ ๋๊ธฐํ๊ฐ ์ฆ์ ์๋ฃ๋ฉ๋๋ค. ๋๋ ์๋ฌด๊ฒ๋ํ์ง ์๋๋ค.
์ด ๋ฌธ์ ๋ ์ฌ์ ํ๋ณด๊ณ ์์ต๋๋ค. ๋ด ํ๋ก์ ํธ ํ์ผ์ Microsoft.NET.Sdk.Web
๋ฅผ ์ฐธ์กฐํ์ง๋ง ๋ฌธ์์ ๋ช
์๋๋๋ก app_offline.htm
ํ์ผ์ ์๋์ผ๋ก ์ญ์ ํ์ง ์์ต๋๋ค.
์๋ ํ์ธ์. ์ด ์ฑ๊ฐ์ ๋ฌธ์ ๋ ์ต์ VS 2017์ด ์ค์น๋ Core 2.1์์ ์ฌ์ ํ ์กด์ฌํฉ๋๋ค. ์ ๋ appoffline์ ์ฌ์ฉํ์ง๋ง ์ฌ์ ํ ์ฃผ ํ๋ก์ ํธ dll์ ํญ์ ์ฌ์ฉ ์ค์ด๋ฉฐ ๊ฒ์ํ๋ ๋์ ์น ์ฌ์ดํธ๋ฅผ ์์ ํ ์ค์งํด์ผํฉ๋๋ค. ์ด๊ฒ์ ์น ๋ฐฐํฌ๋ฅผ ๊ฑฐ์ ์ธ๋ชจ ์๊ฒ ๋ง๋ญ๋๋ค.
๋ก๋ ๋ฐธ๋ฐ์ ๋ค์์ ํธ์คํธ๋ฅผ ์คํ๋ผ์ธ์ผ๋ก ์ ํ ํ ์์๊ณ ๋ ๋นจ๋ฆฌ ์ํํ๋ ค๋ ๊ฒฝ์ฐ ์ฌ๋ณผ๋ฆญ ๋งํฌ์ ์ผ๋ถ powershell์ ์ฌ์ฉํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ด๋ฐ ์์ผ๋ก ์๊ฐํ๊ณ ์์์ด์.
๋ณต์ฌ + ์ฌํ์ฉ ์ค์ ์ฑ ํ์ ์ค์ง ํ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋ ๋น ๋ฆ ๋๋ค. ํ์ฌ ์์ฒญ์ ์๋ฃ ํ ์ ์์ผ๋ฏ๋ก ์ค๋จ ์๊ฐ์ด ์ค์ด๋ค ๊ธฐ ๋๋ฌธ์ ํ๋ ์ค์ง๋ณด๋ค ๋ซ์ต๋๋ค.
# Setup
Import-Module WebAdministration
# create 2 site root directories
$a = 'C:\inetpub\AspNetCoreSampleA'
$b = 'C:\inetpub\AspNetCoreSampleB'
$siteRoot = 'C:\inetpub\aspnetcoresample'
$siteName = 'AspNetCoreSample'
$poolName = "aspnetcore"
New-Item -Type Directory $a
New-Item -Type Directory $b
# create a symlink to targeting one side
New-Item -Type SymbolicLink -Path $siteRoot -Target $a
# point the site root to the symlink
Set-ItemProperty "IIS:\Sites\$siteName" -name physicalPath -value $siteRoot
# make sure it get's picked up
Restart-WebAppPool -Name $poolName
# this tells you the active side
Get-Item -Path $siteRoot | Select-Object -ExpandProperty target
# Flip the symlink
$current = (Get-Item -Path $siteRoot).Target
$newTarget = if ($current -eq $a) {$b} else {$a}
New-Item -Type SymbolicLink -Path $siteRoot -Target $newTarget -Force
# at this point w3wp.exe still locks the current target folder until it's getting recycled
# Deploy new version to the symlink which is now pointing to the other side which should have no locks
robocopy \\myshare\myapp $siteRoot /mir
# recycle app pool, so it picks up the new files
Restart-WebAppPool -Name $poolName
# bonus point: rollback is easy
$current = (Get-Item -Path $siteRoot).Target
$newTarget = if ($current -eq $a) {$b} else {$a}
New-Item -Type SymbolicLink -Path $siteRoot -Target $newTarget -Force
Restart-WebAppPool -Name $poolName
์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
https://gist.github.com/csharmath/b2af0f50700ce9fbdd8c5c3e582fd41b
Restart-WebAppPool์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌํ์ฉ์
๋๋ค. ์ด๋ ์ค์ฒฉ ๋ ์ฌํ์ฉ์ ํ์ฑํ ํ ๊ฒฝ์ฐ (๊ธฐ๋ณธ๊ฐ) ์ ์ฉํฉ๋๋ค. ์ w3wp.exe๋ฅผ ์์ฑํ๊ณ ํ์ฌ ์คํ์ค์ธ ํ๋ก์ธ์ค๊ฐ ์๋ฃ๋๋ ๋์ ๋ชจ๋ ์ ์์ฒญ์ด ํด๋น ์ ํ๋ก์ธ์ค์์ ์ ๊ณต๋๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด์ w3wp.exe์ ์ํด.
์ด๋ ๊ฒํ๋ฉด ์ด์ ๋ฒ์ ์ด ์์ฒญ์ผ๋ก ์๋ฃ ๋ ๋๊น์ง ๊ฒน์น๋ฉฐ ์ ๋ฒ์ ์ ๊ฐ๋ฆฌํค๋ ๋จ์ผ w3wp.exe๋ก ๋๋๊ณ ์ ๊ธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด๊ฒ์ ์๋์ฐ ๋ณต์ฌ์ ๋น์ทํ์ง๋ง ํจ์ฌ ๋ฉ์ง๊ณ ๋งค๋๋ฌ์ด xcopy ์๋๋ฆฌ์ค๋ฅผ ์ ๊ณตํ๋ฏ๋ก 100 %๋ ์๋๋๋ค.
์ง๊ธ๊น์ง๋ ๋ฆด๋ฆฌ์ค ์ค์ ์จ๋ผ์ธ ์ํ๋ฅผ ์ ์งํด์ผํ๋ ๊ฒฝ์ฐ ์ ๊ฐ ์๊ฐํ ์์๋ ์ต์ ์ ๋ฐฉ๋ฒ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
@csharmath ๋๋ ๋ด๊ฐ ์ถ์ธกํ๋๋
๋ฌผ๋ก ๊ทธ๊ฒ ๋ ์ข์ต๋๋ค. ํ์จ, ๋ชจ๋ ์ฅ์๊ฐ ์์ง ๊ทธ๋ฐ ๊ฒ์ ์๋๋๋ค.
๋๋จธ์ง ๊ตฌ์ ์ค์ ์ ๊ฒฝ์ฐ ๊ฐ๋ ์ค์ง ์๊ฐ์ด ์๊ฑฐ๋ ์ต์ํ๋์ง ์๊ณ ์๋ ํ ๋๊น์ง ์ผํฌ๋ฅผํด์ผํฉ๋๋ค.
@csharmath ๋์ํ์ง๋ง,์ด ์์ ์์ ์ด๊ฒ์ด _years_ ๋์ ์์ ๋์ง ์์ ๋ฌธ์ ์์์ ๊ฐ์ํ ๋ ๊ธฐ์ ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์๋ํ๋ ์๋ฃจ์ ์ ์ ์ฉํ๊ณ ์ถ๊ตฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค ...
๋๋ ์๋์ ํ์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ผ๋ฉฐ IIS๊ฐ ์ถฉ๋ํ๊ณ ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ ํ์๋ ์ํฅ์ ๋ฏธ์น๊ณ ๋ชจ๋ ๊ฒ์ ๋์ฐพ๊ธฐ ์ํด ์ปดํจํฐ๋ฅผ ๋ค์ ์์ํด์ผํฉ๋๋ค ...์ด ํ๋ก์ธ์ค๋ ๊ณต์ ๋ฌธ์์์ ๊ฐ์ ธ ์์ผ๋ฉฐ ์ฌ์์ด์์ต๋๋ค. ๋ด ์ถฉ๊ณ ๋ ์์ฉ ํ๋ก๊ทธ๋จ ํ์ ์ค์ง ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ์์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค DO NOT USE์ app_offline.htm์ด๊ณ , ํ๋๋ ๋ด๊ฐ์ด ์ค๋ ๋์์ ๋ฐ๊ฒฌ https://github.com/IsraelHikingMap/Site/blob/master/Scripts/Deploy .ps1
$pathToApp = 'G:\prod_web_core'
$pathToAppOfflineHtml = 'G:\prod_web_core\app_offline.htm'
# Stop the AppPool
New-Item -Path $pathToApp -Name app_offline.htm
# Provide script commands here to deploy the app
Copy-Item "G:\prod_web_core_temp\*" -Destination $pathToApp -Recurse -Force
# Restart the AppPool
Remove-Item -Path $pathToAppOfflineHtml
Get-ChildItem -Path "G:\prod_web_core_temp" -Recurse | Remove-Item -Force
๋ฐฐํฌ ์ฑ๊ณต์ ์ํด AppPool์ ๊ฐ์ ๋ก ์ค์งํด์ผํฉ๋๋ค.์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์ํ ์งํ ์ํฉ์ด ์์ต๋๊น?!
dotnet ์ฝ์ด๊ฐ ์ฐ๋ฆฌ์๊ฒ ์๋ก์ด ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ ์ฒ์์ผ๋ก์ด ํ์ผ ์ ๊ธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋๋ ์ด๊ฒ ๋๋ฌธ์ ์ ๋ง๋ก ๊ฒฝ๊ณ๋ฅผ ์์๋ค. ๋ฒ ํ ๋ฒ์ (~ 2001)์์๋ ๋์ Classic ASP์์ .Net Framework๋ก ์ ํ ํ ๊ฐ์ฅ ํฐ ์ด์ ๋ ํ์ผ ์ ๊ธ์์ด ํซ ๋ฐฐํฌ๋ฅผ ์ํ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ต์ฅํ์ต๋๋ค! ๊ฑฐ์ 18 ๋ ์ด ์ง๋ ์ง๊ธ ์ ๋ ์ ๊ฐ ์์ํ ๊ณณ์ผ๋ก ๋์ ์์ต๋๋ค. ์ค ๊ธ์์, ๋น์ ์ ์ผ๋ถ๋ฅผ ์ด๊ธฐ๊ณ ์ผ๋ถ๋ ์์ต๋๋ค.
๋ฐฉ๊ธ ์ ๋ฌธ์ ๋ฅผ ์ธ๊ธํ์ต๋๋ค. ์ ๊ฒฝ์ฐ์๋ Blazor ์๋ฒ ์ธก ์๋ฃจ์
์ ๋ฐฐํฌํฉ๋๋ค ....
๋ฉฐ์น ์ ์๋ ์
๋ชฝ์ด์์ต๋๋ค. app_offline.htm์ ์ ์ฉํ๊ณ ์ฑ ํ์ ์ข
๋ฃํ๊ณ ์ ์ฒด IIS ์ธ์คํด์ค๋ฅผ ๋ค์ ์์ํ์ฌ ํ์ผ ์ ๊ธ์ ํด์ ํ์ต๋๋ค. ๋ค์ ๋จ๊ณ๋ ์ ์ฒด ์๋ฒ๋ฅผ ๋ค์ ์์ํ๋ ๊ฒ์ด ์์ต๋๋ค. ๋คํํ 5 ๋ถ ํ์ .dll์ด ์ ๊ธ ํด์ ๋์์ต๋๋ค.
2019 ๋ , ์ ์๊ฒ๋ ๊ฐ์ ๋ฌธ์ ์ ๋๋ค.์ด ๋ฌธ์ ๋ 2016 ๋ ์ ๋ง๋ค์ด์ก์ต๋๋ค ... ์์ง ํด๊ฒฐ์ฑ ์ด ์๋์?
2020 ๋ , ์ ์๊ฒ๋ ๊ฐ์ ๋ฌธ์ ์ ๋๋ค. ์ญ๋ ๊ฐ์ฅ ํฐ ํ๊ท. .Net 4.6์ dll ํ์ผ์ ๋ฐ๊พธ๊ณ ์ฑ์ด ์ ๋ฒ์ ์์ ๋ค์๋ก๋๋ฉ๋๋ค. .Net ์ฝ์ด๋ ๋ชจ๋ ๊ฒ์ ์ ๊ธ๋๋ค.
@bladefist ์ค๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ Docker ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
@kanadaj ๊ฐ์ฌํ์ง๋ง Dockers๋ ์ฒ๋ฆฌํด์ผ ํ ๋ ๋ค๋ฅธ ๊ณจ์นซ๊ฑฐ๋ฆฌ์ ๋๋ค. ๊ฒฐ๊ตญ App_offline.htm์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์ ๋ธ ๋ค์ ์ ์ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ํ์ผ์ด ๋ฌด๋ฃ๊ฐ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. 99 %์ ์๊ฐ ๋์ ๊ธฐ๋ค๋ ค์ผํฉ๋๋ค. ๋ด ์ฑ์ ์ ์์ด ๊บผ์ง๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๊ฒ ๊ฐ์ต๋๋ค.
dll์ ๋ณต์ฌํ๊ณ ์ฑ์ด ์๋ ์ฌํ์ฉ๋๋ .net 4.6์ ์๋๋ ์ง๋ฌ์ต๋๋ค. ๋๋ฌด ๊ฐ๋จํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ ๋ฐฐ๋ก ์ค๋ง์ค๋ฌ์ด ๊ฒ์ ์ด๊ฒ์ด ๋ฆฌ๋ ์ค์์ ๋ฌธ์ ๊ฐ๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. Linux์์ ์ฌ์ฉ์ค์ธ ํ์ผ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
๋ฌผ๋ก ๊ทธ๋ ๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ ๋ฐฉ๋ฒ์ ํ๋ก๋์ ํ๊ฒฝ์์ ๊ทธ๋ฆฌ ๊ฐ๋จํ์ง ์์ต๋๋ค. HA๊ฐ ์์ผ๋ฉด ์ฑ์ด 1 ๋ถ ๋์ ์๋ตํ์ง ์๊ณ HA๋ฅผ ์ฌ์ฉํ๋ฉด๋ก๋ ๋ฐธ๋ฐ์๊ฐ ์ฑ์ด ๋ค์ด๋์์์ ์ ๋๊น์ง ์์์ ์๋ชป๋ ์์ฒญ์ ๋ฐ๊ฒ๋ฉ๋๋ค.๋ก๋ ๋ฐธ๋ฐ์์์ ํธ์คํธ๋ฅผ ์๋์ผ๋ก ์ํํ์ง ์๋ ํ. ๊ทธ๋ฌ๋ ์ค์ ํ๋ ๋ฐ ๋ ๋ง์ ๋ฌธ์ ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@kanadaj ๊ทธ๋, ์ฐ๋ฆฌ๋๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์ฌ์ฉํ๊ณ ์๋ฒ๋ฅผ ์ ํ ์ ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค. ๋ค์ด ํ์์ด ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ฑ๊ณตํ์ต๋๋ค
appcmd
์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ ํ์ ๋ค์ ์์ํฉ๋๋ค.@davidglassborow ๋ ์ฐฝ์์ ์ธ ์๋ฃจ์ ์ ๋๋ค. ๊ฐ์ฌ. ํ์ง๋ง ์ฐฝ์์ ์ธ ์๋ฃจ์ ์ด ํ์ํ์ง๋ ์์ต๋๋ค.
๋ด ๊ฒฝํ์ ์ฌ์ดํธ๊ฐ๋ก๋ ์ํ ์ผ ๋ ์ด์ ๋ฉ์ปค๋์ฆ์ ์ ๋ขฐํ ์ ์์์ผ๋ฉฐ ํธ๋ํฝ์ด ๋ง์ ์ฌ์ดํธ์ ๋ํด ์ญ๋ฐฉํฅ ํ๋ก์๋ฅผ ์ฌ์ฉํ๊ฒ๋์์ต๋๋ค.
๋ง์ต๋๋ค. ์ธํ๋ ์ด์ค ๋ฐฐํฌ๋ ์ ๋ขฐํ ์ ์๊ฑฐ๋ ์์ ์ ์ด ์ง ์์์ต๋๋ค. ์ด์ด ์ข๊ฑฐ๋ ํธ๋ํฝ์ด ๋ง์ง ์์ผ๋ฉด ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค. ๋๋ถ๋ถ์ ๋ถ๋ง์ด ์ด๋ฌํ ์๋๋ฆฌ์ค์ ๊ดํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ ์์ต๋๋ค. .NET 5.0 ์๊ฐ ํ๋ ์์์ ๊ฐ์ ์ฌํญ์ ์ดํด๋ณผ ๊ฒ์ ๋๋ค. ๋ช ๊ฐ์ง์ฃผ์ ์ฌํญ :
@davidfowl 5.0์ ๋ํด ์ค๋ช ํ ๊ณํ์ ํ๋ฅญํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ๋ ์ ์ํฌ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
ํ์ฌ ์์น ๋ฐฐํฌ์ ์์ ์ฑ์ ๋ํด ์ ์คํ ๋์ํ์ง ์์ต๋๋ค. ๋๋ ๋งค์ฐ ๋์ ๋ถํ๋ฅผ ๊ฐ์ง ์ฌ์ดํธ์์ ์๋ ๊ฐ ๊ทธ๊ฒ์ ํด์๊ณ ํ ๋ฒ๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ฒ์ ๊ฐ์ง ๋ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์ฑ์ด ์ฌ์ค์ ๋๊ณ ,๋ก๋ ๋ฐธ๋ฐ์๋ ์ธ์คํด์ค๊ฐ ์๋ตํ์ง ์๋ ๊ฒ์ ํ์ธํ๊ณ , ์คํ๋ผ์ธ์ผ๋ก ์ ํํ๊ณ , ๋ชจ๋ DLL์ด ๊ต์ฒด๋๋ฉด๋ก๋ ๋ฐธ๋ฐ์๊ฐ ์ํ ํ์ธ์ ์๋ฃํ๊ณ ๋ค์ ์จ๋ผ์ธ ์ํ๊ฐ๋ฉ๋๋ค. ์ด์ ๋ก๋ ๋ฐธ๋ฐ์ ์ํ ํ์ธ์ด ์์ผ๋ฉด ๋๋ฐ์ ๋๋ค.ํ์ง๋ง ํ๋ก์์์ด ํ๋ก๋์ ํ๊ฒฝ์์ DLL์ ๋์ฒดํ๋ ์ฌ๋์ ๋๊ตฌ์ ๋๊น? ์์ธ๊ฐ ์๋ ๊ท์น์ ์ด์ ์ ๋ง ์ถฅ๋ ๋ค. ํ๋ก์๊ฐ ์์ผ๋ฉด ์ค๋จ์์ด ์ฑ์ ์ ๋ฐ์ดํธ ํ ๋ฐฉ๋ฒ์ ์๊ฐํ ์ ์์ต๋๋ค. ํซ ๋ฆฌ๋ก๋ฉ์ ์ง์ํ๋๋ผ๋ ์ผ๋ถ ์์ฒญ์ ์ค๋จ๋๊ฑฐ๋ ์คํจ ํ ์ ์์ต๋๋ค.
ํ์ฌ ์์น ๋ฐฐํฌ์ ์์ ์ฑ์ ๋ํด ์ ์คํ ๋์ํ์ง ์์ต๋๋ค. ๋๋ ๋งค์ฐ ๋์ ๋ถํ๋ฅผ ๊ฐ์ง ์ฌ์ดํธ์์ ์๋ ๊ฐ ๊ทธ๊ฒ์ ํด์๊ณ ํ ๋ฒ๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ฒ์ ๊ฐ์ง ๋ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์ฑ์ด ์ฌ์ค์ ๋๊ณ ,๋ก๋ ๋ฐธ๋ฐ์๋ ์ธ์คํด์ค๊ฐ ์๋ตํ์ง ์๋ ๊ฒ์ ํ์ธํ๊ณ , ์คํ๋ผ์ธ์ผ๋ก ์ ํํ๊ณ , ๋ชจ๋ DLL์ด ๊ต์ฒด๋๋ฉด๋ก๋ ๋ฐธ๋ฐ์๊ฐ ์ํ ํ์ธ์ ์๋ฃํ๊ณ ๋ค์ ์จ๋ผ์ธ ์ํ๊ฐ๋ฉ๋๋ค. ์ด์ ๋ก๋ ๋ฐธ๋ฐ์ ์ํ ํ์ธ์ด ์์ผ๋ฉด ๋๋ฐ์ ๋๋ค.ํ์ง๋ง ํ๋ก์์์ด ํ๋ก๋์ ํ๊ฒฝ์์ DLL์ ๋์ฒดํ๋ ์ฌ๋์ ๋๊ตฌ์ ๋๊น? ์์ธ๊ฐ ์๋ ๊ท์น์ ์ด์ ์ ๋ง ์ถฅ๋ ๋ค. ํ๋ก์๊ฐ ์์ผ๋ฉด ์ค๋จ์์ด ์ฑ์ ์ ๋ฐ์ดํธ ํ ๋ฐฉ๋ฒ์ ์๊ฐํ ์ ์์ต๋๋ค. ํซ ๋ฆฌ๋ก๋ฉ์ ์ง์ํ๋๋ผ๋ ์ผ๋ถ ์์ฒญ์ ์ค๋จ๋๊ฑฐ๋ ์คํจ ํ ์ ์์ต๋๋ค.
๋ก๋ ๋ฐธ๋ฐ์๊ฐ ์์ต๋๋ค. ๋ง์ ์ฌ๋๋ค์ด๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๊ณ ๋์คํฌ์ ํ์ผ์ ์ ์๋ฆฌ์ ๋๊ณ ๋ง๋ฒ์ ๊ธฐ๋ํ๊ณ ์์ต๋๋ค ๐
@davidfowl ๋ง์ง๋ง ๋์ ํธ๋ํฝ + ํ์ด๋ ์์ = ๋ฌด๋ชจํจ
๋ํ app_offline.htm์ ๋ฌธ์ ๋ ci / cd ํ๋ก์ธ์ค์์ ํ๋ก์ธ์ค๊ฐ ์ธ์ ์ค์ง๋๋์ง ์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ข ๋ฃ ํ๋ก์ธ์ค๊ฐ 1 ๋ถ์์ 1 ๋ถ๊น์ง ๊ฑธ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ํด๋น ํ์ผ์ ๋ง๋ค๊ณ DLL์ ํธ์ํ๋ ์ฌ์ด์ ์์ฒญ๋ ์ ์ ๋ช ๋ น์ ์ถ๊ฐํด์ผํ์ต๋๋ค. ์๋ง์ ์ธ์คํด์ค๋ฅผ๋ก๋ ๋ฐธ๋ฐ์ฑ ํ ๋ ์ด๋ฌํ ํด๋ฉด์ด ์ถ๊ฐ๋์ด ๋ฐฐํฌ์ฃผ๊ธฐ๊ฐ ๋งค์ฐ ๊ธธ์ด์ง๋๋ค.
๋ฉ๋ชจ๋ฆฌ์ ํ์ผ์๋ก๋ํ๋ฉด ๋ชจ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
@davidfowl ๋ง์ง๋ง ๋์ ํธ๋ํฝ + ํ์ด๋ ์์ = ๋ฌด๋ชจํจ
๐
๋ํ app_offline.htm์ ๋ฌธ์ ๋ ci / cd ํ๋ก์ธ์ค์์ ํ๋ก์ธ์ค๊ฐ ์ธ์ ์ค์ง๋๋์ง ์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ข ๋ฃ ํ๋ก์ธ์ค๊ฐ 1 ๋ถ์์ 1 ๋ถ๊น์ง ๊ฑธ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ํด๋น ํ์ผ์ ๋ง๋ค๊ณ DLL์ ํธ์ํ๋ ์ฌ์ด์ ์์ฒญ๋ ์ ์ ๋ช ๋ น์ ์ถ๊ฐํด์ผํ์ต๋๋ค. ์๋ง์ ์ธ์คํด์ค๋ฅผ๋ก๋ ๋ฐธ๋ฐ์ฑ ํ ๋ ์ด๋ฌํ ํด๋ฉด์ด ์ถ๊ฐ๋์ด ๋ฐฐํฌ์ฃผ๊ธฐ๊ฐ ๋งค์ฐ ๊ธธ์ด์ง๋๋ค.
๋ง์ต๋๋ค. ๋ฐ๋ผ์ ๋ฌธ์ ๋ ํด๋น ํ์ผ์ ์ญ์ ํด๋ ANCM์์ ์๋ฆผ์๋ฐ์ ๋๊น์ง ํ์ผ์ด ์ฌ์ ํ ์ ๊ฒจ ์๊ธฐ ๋๋ฌธ์ ๋ฐฐํฌ๋ฅผ ์์ํด๋๋๋์ง ์๋ ค์ฃผ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
๋ํ app_offline.htm์ ๋ฌธ์ ๋ ci / cd ํ๋ก์ธ์ค์์ ํ๋ก์ธ์ค๊ฐ ์ธ์ ์ค์ง๋๋์ง ์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ง์ต๋๋ค. VS ๊ฒ์์๋ ์งง์ ์ ์ ๋ชจ๋์ ์ฌ๋ฌ ๋ฒ์ ์ฌ ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌํ์ฉํ๋ ค๋ฉด ์ฌ์ ํ appoffline ํ์ผ์ ์ถ๊ฐํ๊ณ ์ ๊ฑฐํด์ผํฉ๋๋ค. appoffline ํ์ผ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋ฐฐํฌ์ ๊ฒฐ๊ณผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ ์์ํ๊ธฐ๋ฅผ ์ํ๋ค๋ ์ ํธ๋ฅผ ๋ณด๋ด๋ ๋ฐฉ๋ฒ์ ๋๋ค.
๋์ค์ appoffline ํ์ผ์ ์ญ์ ํ์ง ์๊ณ ๋ ์ฌํ์ฉ ํ ์ฑ์ ํ์ํ๋ "apprestart"ํ์ผ์ ๊ฐ์ง ์ ์์ต๋๊น?
@Socolin ์
@Socolin ์
๋ด๊ฐ ์ ์ดํดํ๋ค๋ฉด (๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ์๋ ค์ฃผ์ธ์) ์ ๊ธ์ ์ ๊ฑฐํ๋ ๊ฒ์ด ๊ณํ์ด์ง๋ง ๋น๋๊ฐ ์๋ฃ๋ ํ IIS์ ์ฑ์ ์ฌํ์ฉํ๋๋ก ์๋ฆฌ๊ธฐ ์ํด appoffline์ ๋ง๋ค์ด์ผํฉ๋๊น?
์ด๋ ๊ฒํ๋ ค๋ฉด appoffline ํ์ผ์ ๋ง๋ ๋ค์ ์ญ์ ํด์ผํฉ๋๋ค. ํ์ผ์ด ์์ฑ ๋ ์งํ์ด ํ์ผ์ ์ญ์ ํ ์ ์์ต๋๊น? ์๋๋ฉด IIS๊ฐ ๊ฐ์ง ํ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผํฉ๋๊น? ์กฐ๊ธ๋ง ๊ธฐ๋ค๋ ค์ผํ๋ค๋ฉด IIS๊ฐ ์์ ํ "apprestart"์ ๊ฐ์ ํ์ผ์ ์ ํธํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฐ์ง๋๋ฉด ์ญ์ ํ๊ณ ์ฌํ์ฉ์ ์์ํฉ๋๋ค.
๋ ๋ค๋ฅธ ์ง๋ฌธ์ด ์์ต๋๋ค. ๋น๋ ์ค IDE ์ต์ ํ์ ๊ดํ ๊ฒ์ ๋๋ค.
ํ์ฌ ์ ๋ ์ข ์์ฑ์ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์์ ์์ ํ๊ณ ์์ผ๋ฉฐ ์น ๋ ์ด์ด ์ฉ ํ๋ก์ ํธ์ ๋ก์ง ๋ฐ ๋ฐ์ดํฐ ์ฉ ๋ค๋ฅธ ํ๋ก์ ํธ๊ฐ ์์ต๋๋ค. ๋น๋ํ๋ ๋์ ์น ๋ ์ด์ด (ASP.NET Core)์์ ์์ ํ ๋ ๋น๋ ์ ์ appoffline ํ์ผ์ ๋ง๋ ๋ค์ ๋น๋ ํ์ ์ญ์ ํ๋ฉด ์๋ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ข ์์ฑ ์ค ํ๋์์ ์์ ํ ๋ Rider์์ ๋น๋ ํ ๋ (msbuild๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ VS์์ ๋์ผํ ์์ ์ ์ํํ๋ค๊ณ ์๊ฐํฉ๋๋ค) msbuild๊ฐ ์ํํ๋ ์์ ์ ๋ณผ ๋ ํ๋ก์ ํธ ๋น๋๊ฐ ์๋ฃ๋๋ฉด .dll์ .Web ํ๋ก์ ํธ๋ฅผ ๋ค์ ๋น๋ํ์ง ์๊ณ .Web / bin ๋๋ ํฐ๋ฆฌ์ ์ง์ ๋ณต์ฌ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ dll์ด ์ ๊ฒจ ์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์คํจํ๊ณ ์๋ฒ๋ฅผ ์๋์ผ๋ก ๋ค์ ์์ํ๊ฑฐ๋ .Web ํ๋ก์ ํธ ๋น๋๋ฅผ ์๋์ผ๋ก ํธ๋ฆฌ๊ฑฐํด์ผํฉ๋๋ค.
์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ
์ด ์์ต๋๊น?
์ง๊ธ๊น์ง ๋ด๊ฐ ์ฐพ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ด .Web ํ๋ก์ ํธ์ / bin์ ์ฐพ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ ์์ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๊ฒ์
๋๋ค. ํ์ผ์ด ๋ณ๊ฒฝ๋๋ฉด IIS๊ฐ ์์ ํ๋ ๋๋ ํ ๋ฆฌ์ appoffline ํ์ผ์ ์์ฑ ํ ๋ค์ ์์ ๋ ํ์ผ์ ๋ณต์ฌ ํ ๋ค์ appoffline์ ์ญ์ ํฉ๋๋ค. ํ์ง๋ง ์ฝ๊ฐ ์๋ง์ธ ๊ฒ ๊ฐ์ง๋ง ์ง๊ธ๊น์ง๋ ๋น๋ ํ ์์๋ ์ ์ผํ ๋ฐฉ๋ฒ ์ธ ๋ค์ F5 ํค๋ฅผ ๋๋ฅด๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ํ
์คํธํฉ๋๋ค.
์ด๋ ๊ฒํ๋ ค๋ฉด appoffline ํ์ผ์ ๋ง๋ ๋ค์ ์ญ์ ํด์ผํฉ๋๋ค. ํ์ผ์ด ์์ฑ ๋ ์งํ์ด ํ์ผ์ ์ญ์ ํ ์ ์์ต๋๊น? ์๋๋ฉด IIS๊ฐ ๊ฐ์ง ํ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผํฉ๋๊น? ์กฐ๊ธ๋ง ๊ธฐ๋ค๋ ค์ผํ๋ค๋ฉด IIS๊ฐ ์์ ํ "apprestart"์ ๊ฐ์ ํ์ผ์ ์ ํธํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฐ์ง๋๋ฉด ์ญ์ ํ๊ณ ์ฌํ์ฉ์ ์์ํฉ๋๋ค.
IIS๋ ํ์ผ ๋ณต์ฌ๊ฐ ๋๋ฌ์์ ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น? ์ฐข์ด์ง ์ํ๋ฅผ ์ด๋ป๊ฒ ํผํฉ๋๊น? ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฑฐ๋์ ์์๊ณผ ์๋ฃ๋ฅผ ์๋ฆฌ๋ ์ ํธ๊ฐ ํ์ํฉ๋๋ค. ํ์ผ์ ์์ฑ์ ์์ ์ ํธ๋ฅผ ๋ณด๋ด๊ณ ์ญ์ ๋ ๋ ์ ํธ๋ฅผ ๋ณด๋ ๋๋ค.
์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
์ง๊ธ๊น์ง ๋ด๊ฐ ์ฐพ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ด .Web ํ๋ก์ ํธ์ / bin์ ์ฐพ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ ์์ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ํ์ผ์ด ๋ณ๊ฒฝ๋๋ฉด IIS๊ฐ ์์ ํ๋ ๋๋ ํ ๋ฆฌ์ appoffline ํ์ผ์ ์์ฑ ํ ๋ค์ ์์ ๋ ํ์ผ์ ๋ณต์ฌ ํ ๋ค์ appoffline์ ์ญ์ ํฉ๋๋ค. ํ์ง๋ง ์ฝ๊ฐ ์๋ง์ธ ๊ฒ ๊ฐ์ง๋ง ์ง๊ธ๊น์ง๋ ๋น๋ ํ ์์๋ ์ ์ผํ ๋ฐฉ๋ฒ ์ธ ๋ค์ F5 ํค๋ฅผ ๋๋ฅด๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ํ ์คํธํฉ๋๋ค.
VS๋ ํด๋น ํ๋ก์ ํธ์ ๋น๋์ ์ํฅ์ ๋ฏธ์น ์์๋ ๋ชจ๋ ๊ฒ์ ๋ํด ์ ํ์ผ์ ์์ํ๊ธฐ ์ ์ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ์ฌ์ด๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
์ด๋ ๊ฒํ๋ ค๋ฉด appoffline ํ์ผ์ ๋ง๋ ๋ค์ ์ญ์ ํด์ผํฉ๋๋ค. ํ์ผ์ด ์์ฑ ๋ ์งํ์ด ํ์ผ์ ์ญ์ ํ ์ ์์ต๋๊น? ์๋๋ฉด IIS๊ฐ ๊ฐ์ง ํ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผํฉ๋๊น? ์กฐ๊ธ๋ง ๊ธฐ๋ค๋ ค์ผํ๋ค๋ฉด IIS๊ฐ ์์ ํ "apprestart"์ ๊ฐ์ ํ์ผ์ ์ ํธํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฐ์ง๋๋ฉด ์ญ์ ํ๊ณ ์ฌํ์ฉ์ ์์ํฉ๋๋ค.
IIS๋ ํ์ผ ๋ณต์ฌ๊ฐ ๋๋ฌ์์ ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น? ์ฐข์ด์ง ์ํ๋ฅผ ์ด๋ป๊ฒ ํผํฉ๋๊น? ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฑฐ๋์ ์์๊ณผ ์๋ฃ๋ฅผ ์๋ฆฌ๋ ์ ํธ๊ฐ ํ์ํฉ๋๋ค. ํ์ผ์ ์์ฑ์ ์์ ์ ํธ๋ฅผ ๋ณด๋ด๊ณ ์ญ์ ๋ ๋ ์ ํธ๋ฅผ ๋ณด๋ ๋๋ค.
์ ๊ธ์ด์๋ ๊ฒฝ์ฐ ๋น๋๊ฐ ์์๋ ๋ IIS์ ์๋ฆฌ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋ชจ๋ ํ์ผ์ด ์ ๋ฐ์ดํธ๋๊ณ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฌํ์ฉํด์ผ ํ ๋ ์ ํธ๋ฅผ ๋ณด๋ผ ์ ์์ต๋๊น? ๋ญ๊ฐ ์คํด ํ ๊ฒ ๊ฐ์์.
์ ๊ธ์ด์๋ ๊ฒฝ์ฐ ๋น๋๊ฐ ์์๋ ๋ IIS์ ์๋ฆฌ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋ชจ๋ ํ์ผ์ด ์ ๋ฐ์ดํธ๋๊ณ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฌํ์ฉํด์ผ ํ ๋ ์ ํธ๋ฅผ ๋ณด๋ผ ์ ์์ต๋๊น? ๋ญ๊ฐ ์คํด ํ ๊ฒ ๊ฐ์์.
์, ์๋ํฉ๋๋ค. ๋๋ ๋น์ ์ด ํ์ฌ์ ์์ ์ํ๋ฅผ ์ค๋ช ํ๊ณ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ค๋๋ web.config๋ฅผ ์ฌ์ฉํ์ฌ์ด ์์ ์ ์ํ ํ ์๋ ์์ต๋๋ค. ํ์ผ์ ํฐ์นํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ๋ถํ ๋ฉ๋๋ค.
๋ค์์ ํตํด ์ธํ๋ ์ด์ค ๋ฐฐํฌ (https://flukefan.github.io/ZipDeploy/)๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ํํ์ต๋๋ค.
๋ก๋ ๋ฐธ๋ฐ์ฑ ์์; ๋จ์ผ IIS ์ธ์คํด์ค; IIS ๋ณ๊ฒฝ ์ฌํญ์ด ์์ต๋๋ค. YMMV.
@FlukeFan ์ฐข์ด์ง ๋ฐฐํฌ๋ฅผ ์ด๋ป๊ฒ ๋ฐฉ์งํฉ๋๊น? ์๋๋ฉด ๊ฑฑ์ ํ์ง ์์ต๋๊น? ์กฐ๊ฐ๋ ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ ์์ํ๊ธฐ ์ ์ ์ด์ ์ฑ์ด ์ ์ด์ ๋ธ๋ฆฌ๋ฅผ๋ก๋ํ๋ ์ฐฝ์ด ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋ชจ๋ ์ด์ ๋ธ๋ฆฌ์ ์ด๋ฆ์ด ๋ณ๊ฒฝ / ์ ๋ฐ์ดํธ ๋ ๋๊น์ง web.config๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์ต๋๋ค. ๊ทธ ์๊ฐ ๋์ ๋ค๋ฅธ ๋ฌด์ธ๊ฐ๋ก ์ธํด ์ฑ ํ์ด ์ฌํ์ฉ ๋ ๊ฐ๋ฅ์ฑ์ ์ ์ง ๋ง ์์ง ๋ฐ์ํ์ง ์์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ๋ชจ๋ ์๋ ์ฌํ์ฉ ์ต์ ์ ๋๊ณ IIS ์ฑ ํ ์ค์ ์์ ์ค๋ณต ๋ ์ฌํ์ฉ์ ๋นํ์ฑํํฉ๋๋ค.
@FlukeFan ์ ์ฌํ์ฉ์ด ์๋์ง๋ง ์์ง ๊ต์ฒด ๋ ์ด์ ๋ธ๋ฆฌ๋ฅผ๋ก๋ํ์ง ์์ ๊ฒฝ์ฐ. ์๋ฅผ ๋ค์ด, ์ด์ ๋ธ๋ฆฌ A.dll ๋ฐ B.dll์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ค์ ํ์ด์ง๋ก ์ด๋ํ ๋ B๊ฐ ์ฌ์ฉ๋์ด๋ก๋๋์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. B.dll์ด ์ ๊ฒ์ผ๋ก ๊ต์ฒด๋์์ ๋ ์ค์ ํ์ด์ง๋ก ์ด๋ํ๋ฉด ์ B.dll๋ก ์คํ๋๋ ์ด์ ์ฑ์ด ๋๋ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ ํ์ ๋ฐฐํฌ๋ฅผ ์ง์ํ๊ธฐ ์ํด dotnet ๊ธ๋ก๋ฒ ๋๊ตฌ๋ฅผ ๋ง๋ค์ด์ผํ๋์ง ๊ถ๊ธํฉ๋๋ค. ์ด ๋๊ตฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๋๋ค์ด์ด ์ค๋ ๋์์ ์ธ๊ธ ํ ๋ชจ๋ ์ด๋ ค์ด ์์ ์ ์ํ ํ ์ ์์ต๋๋ค.
์๊ฐ?
@FlukeFan ์ ์ฌํ์ฉ์ด ์๋์ง๋ง ์์ง ๊ต์ฒด ๋ ์ด์ ๋ธ๋ฆฌ๋ฅผ๋ก๋ํ์ง ์์ ๊ฒฝ์ฐ. ์๋ฅผ ๋ค์ด, ์ด์ ๋ธ๋ฆฌ A.dll ๋ฐ B.dll์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ค์ ํ์ด์ง๋ก ์ด๋ํ ๋ B๊ฐ ์ฌ์ฉ๋์ด๋ก๋๋์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. B.dll์ด ์ ๊ฒ์ผ๋ก ๊ต์ฒด๋์์ ๋ ์ค์ ํ์ด์ง๋ก ์ด๋ํ๋ฉด ์ B.dll๋ก ์คํ๋๋ ์ด์ ์ฑ์ด ๋๋ ์ ์์ต๋๋ค.
๊ทธ๋์ ์ง๊ธ์ ๊ทธ ์ฌ๊ฑด์ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค. https://github.com/FlukeFan/ZipDeploy/blob/master/ZipDeploy/ZipDeploy.cs#L55
๋ค๋ฅธ ์์๋ก ์์ ์ ์ํํ๊ณ web.config๋ฅผ ๋จผ์ ํฐ์นํ๊ณ ๋ชจ๋ '๋ค๋ฅธ'์์ฒญ์ด ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ ๋ค์ ๋ง์ง๋ง์ผ๋ก ๋ง์ง๋ง ์์ฒญ์ด ์๋ฃ๋๊ธฐ ์ง์ ์ ๊ต์ฒด๋ฅผ ์ํ ํ ์ ์์ต๋๋ค (IIS๊ฐ ์ฝ์ ๋ํ ์ ์์ฒญ์ ๋๊ธฐ์ด์ ๋ฃ๋ ๋์). recycle app-pool), ๊ทธ๋ฌ๋ ๋ด๊ฐ ๊ฐ์ง ๊ฒ์ ์ง๊ธ ์ ์๊ฒ ํจ๊ณผ์ ์ ๋๋ค.
ํ์ฌ ์ค๋ช ํ๊ณ ์๋ ์๋๋ฆฌ์ค์ ๋ํด์๋ ์ถฉ๋ถํ ๊ฒฌ๊ณ ํ์ง ์์ ๊ฒ์ ๋๋ค (ํ์ง๋ง ์์ ์๊ฐ ์ธ์๋ ๋์ ์ด์ ๋ธ๋ฆฌ๋ก๋์ ๋ํด ๋ฉ์ง ์์ ์ ์ํํ์ง ์์์ต๋๋ค).
์ด ๊ธฐ๋ฅ์ ๋ค์ ๋ฐฉ๋ฌธํ์ฌ ๋ก๋๋งต์ ์ฌ๋ฆด ๊ณํ์ด ์์ต๋๊น? ๋ค์ด ํ์์๋ ๋ฐฐํฌ๋ฅผ ์ง์ํ๋ ค๋ ๊ฒฝ์ฐ .Net Core ์น ์ฌ์ดํธ๋ฅผ ๋ฐฐํฌํ๋ ๋ชจ๋ ์ฌ๋์ด ์คํ ์ด์ง ์ฌ๋กฏ ์ ๋ต์ ์๋์ผ๋ก ๊ตฌํํ๋๋ก ์๊ตฌํ๋ ๊ฒ์ ๋งค์ฐ ๋ถํธํ๊ณ ๋น์ฐํธ์ ์ ๋๋ค.
์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋ง์ ์ฌ๋๋ค์ด .Net Core ์น ์ฌ์ดํธ๋ก ํจ์ฌ ์ํํ๊ฒ ์ ํ ํ ์ ์์ผ๋ฉฐ .Net Core ์น ์ฌ์ดํธ๋ฅผ ๋ ๋น ๋ฅด๊ฒ ์ฑํ ํ ์ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์๊ฐํ์ง ๋ชปํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋น์ ์ ๋จธ๋ฆฌ์ ๋ชป์ ๋ฐ์์ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ฌ๋๋ค์ด ํ๋๋น ์ฌ๋กฏ์ ์ฌ์ฉํ๋๋ก ๊ฐ์ํ๋ ์ฌ์ ํ ๋น์ฆ๋์ค ๊ฒฐ์ ์ผ ์ ์์ต๋๋ค. ๊ณผ๊ฑฐ์ ๊ฐ๋ฅํ๋ค๋ฉด ์ง๊ธ "๊ณ ์น๋"๋ฐ ์ ๊ทธ๋ ๊ฒ ์ค๋ ๊ฑธ๋ ธ์ต๋๊น? ๊ทธ๊ฒ์ด ๋ฌด์์ ์ผ๋์๋๊ณ ์๋์ง ๋น์ฆ๋์ค ๊ด์ ์์ ๊นจ์ง์ง ์์์ต๋๋ค. ๋ด๊ฐ ์ข ๋์์ ์ผ์ง๋ ๋ชฐ๋ผ. ํ์ง๋ง ์ด์ ์๋ ๋ฌด๋ฃ๋ก ์ ๊ณต๋์ด ๋ ๋น์ผ ๊ณ์ธต์ผ๋ก ์ด๋ ํ ํธ๋ฅธ ์ ๊ธฐ๋ฅ์ ์ฒ์ฒํ ์ง์ผ ๋ดค์ต๋๋ค.
์ด๋ฌํ ์ ํ์ ๋ฐฐํฌ๋ฅผ ์ง์ํ๊ธฐ ์ํด dotnet ๊ธ๋ก๋ฒ ๋๊ตฌ๋ฅผ ๋ง๋ค์ด์ผํ๋์ง ๊ถ๊ธํฉ๋๋ค. ์ด ๋๊ตฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๋๋ค์ด์ด ์ค๋ ๋์์ ์ธ๊ธ ํ ๋ชจ๋ ์ด๋ ค์ด ์์ ์ ์ํ ํ ์ ์์ต๋๋ค.
์๊ฐ?
์ด๊ฒ์ CI ์๋ฒ์์ ์คํํ๋ ๊ฒ์ ๋๋ค. ๋ฐ์ด๋๋ฆฌ / ํจํค์ง๋ฅผ ๋์ ์๋ฒ๋ก ์ด๋ป๊ฒ ํธ์ํฉ๋๊น?
๋๋ ๊ทธ๊ฒ์ ์๊ฐํ์ง ๋ชปํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋น์ ์ ๋จธ๋ฆฌ์ ๋ชป์ ๋ฐ์์ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ฌ๋๋ค์ด ํ๋๋น ์ฌ๋กฏ์ ์ฌ์ฉํ๋๋ก ๊ฐ์ํ๋ ์ฌ์ ํ ๋น์ฆ๋์ค ๊ฒฐ์ ์ผ ์ ์์ต๋๋ค. ๊ณผ๊ฑฐ์ ๊ฐ๋ฅํ๋ค๋ฉด ์ง๊ธ "๊ณ ์น๋"๋ฐ ์ ๊ทธ๋ ๊ฒ ์ค๋ ๊ฑธ๋ ธ์ต๋๊น? ๊ทธ๊ฒ์ด ๋ฌด์์ ์ผ๋์๋๊ณ ์๋์ง ๋น์ฆ๋์ค ๊ด์ ์์ ๊นจ์ง์ง ์์์ต๋๋ค. ๋ด๊ฐ ์ข ๋์์ ์ผ์ง๋ ๋ชฐ๋ผ. ํ์ง๋ง ์ด์ ์๋ ๋ฌด๋ฃ๋ก ์ ๊ณต๋์ด ๋ ๋น์ผ ๊ณ์ธต์ผ๋ก ์ด๋ ํ ํธ๋ฅธ ์ ๊ธฐ๋ฅ์ ์ฒ์ฒํ ์ง์ผ ๋ดค์ต๋๋ค.
์กฐ์ ์ด์๋ ์ ์๋ฆฌ ๋ฐฐํฌ๋ ์์์ ์ธ๊ธ ํ ์ด์ ๋ก ๊ทผ๋ณธ์ ์ผ๋ก ์ ๋ขฐํ ์ ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ญ์ฌ์ ์ผ๋ก ์ ๋ขฐํ ์ ์์๊ณ .NET ํ๋ ์ ์ํฌ์ ASP.NET์์ ๋ง์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ๊ธฐ ๋๋ฌธ์ ์๋ ๋ณต์ฌ๋ฅผ ๋ค์ ๊ตฌํํ์ง ์์ ๊ฒ์ ๋๋ค. ๋ํ ๋ชจ๋ .NET Framework๊ฐ ์ง์๋๋ ํน์ ์ ํ์ ๋ฐฐํฌ, ํ๋ ์ ์ํฌ์ ๋ฐ๋ผ ์๋ํฉ๋๋ค. .NET core๋ ์์ฒด ํฌํจ ๋ ๋จ์ผ ํ์ผ์ ์ง์ํ๋ฏ๋ก ์ง์ํ๊ธฐ๊ฐ ํจ์ฌ ๋ ์ด๋ ต์ต๋๋ค. ์์ ์ ์์กฐ์ฐจ๋ ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ๋ค๋ฃจ์ง ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ์ ํ ์ธํ๋ ์ด์ค ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํ ํ ์์ ์ ์ด์ด์ผํ๋ค๊ณ ๋ฏฟ๊ณ ์์ผ๋ฉฐ,์ด ๋ฌธ์ ์ ๋ํ ๋ง์ ๋ฌธ์ ๋ ๋ฒ๊ทธ์ app_offline ๊ฐ์ง ๋ฐ ์ฌํ์ฉ์ ๋น ์ ๋ขฐ์ฑ์์ ๋น๋กฏ๋์์ผ๋ฏ๋ก์ด๋ฅผ ์์ ํ๋ ๋ฐ ๋ง์ ์๊ฐ์ ๋ณด๋์ต๋๋ค (๋ฐ pdb ์ ๊ธ๋ ํฌํจ).
์น ๋ฐฐํฌ๋ ๋ฐฐํฌํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํ๋ ํ๋ฆ์ ๊ตฌํํ๋ ์ ์ผํ ๋๊ตฌ์ด์ง๋ง ํด๋น ๊ธฐ์ ์ ๊ฐํ ์์ผ๋ฏ๋ก ์๋ฒ์ ftp๋ฅผ ๋ฐฐํฌํ๊ฑฐ๋ ํ์ผ ๊ณต์ ์ ๋ณต์ฌํ๋ ๊ฒฝ์ฐ์๋ ๋์์ด๋์ง ์์ต๋๋ค. ํ ์ ์์๋ค).
์ฌ๊ธฐ์ dotnet ๊ธ๋ก๋ฒ ๋๊ตฌ๊ฐ ๋ต์ด ๋ ์ ์์ต๋๋ค.
์ด๊ฒ์ CI ์๋ฒ์์ ์คํํ๋ ๊ฒ์ ๋๋ค. ๋ฐ์ด๋๋ฆฌ / ํจํค์ง๋ฅผ ๋์ ์๋ฒ๋ก ์ด๋ป๊ฒ ํธ์ํฉ๋๊น?
๋๋ ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์๋๋ค. ์๋ง๋ FTP์ ์ง์ ๋ณต์ฌ๋ฅผ ์ง์ํ ๊ฒ์ ๋๋ค. ๊ทธ ์ด์ธ์ ๊ฒ์ ๋ ์ ํ๋กํ ์ฝ ์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
FTP๋ฅผ ๋งํ ๋ ssh๋ฅผ ํตํ ftp๋ ์๋ฏธํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๋ฌํ ๋๊ตฌ๋ ๋งค์ฐ ๊ฐ์น๊ฐ์์ ๊ฒ์ ๋๋ค.
FTP๋ฅผ ๋งํ ๋ ssh๋ฅผ ํตํ ftp๋ ์๋ฏธํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๋ฌํ ๋๊ตฌ๋ ๋งค์ฐ ๊ฐ์น๊ฐ์์ ๊ฒ์ ๋๋ค.
์๋ ๋๋ ftp๋ฅผ ์๋ฏธํ๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด์น์ ๋ง๋ ๋ชจ๋ ๊ฒ์ ํ ๊ฒ์ ๋๋ค. ๋์ ์ปดํจํฐ์์ ์คํํด์ผํ๋ ๋ณต์ฌ ๋๊ตฌ ์ธ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๋ฅผ ์ด๋๋ก ๋ ๋นํธ๋ฅผ ๋ณด๋ด์ผํ๋ ์ฌ์ ์์ ๋ฒ์ด๋๊ฒํฉ๋๋ค.
๋ํ IIS์ ๋ฐฐํฌํ๊ธฐ ์ํด Windows ์์คํ ์ SSH๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
@davidfowl ๋ฐฐํฌ ์ฌ๋กฏ์ ๋ํ ์ง์์ ์ถ๊ฐ (์ตํธ ์ธ)ํ์ญ์์ค.
https://github.com/dotnet/aspnetcore/issues/3719#issuecomment -473183712
https://github.com/dotnet/aspnetcore/issues/3793#issuecomment -335666414
์ฐ๋ฆฌ๋ ์์ฉ ํ๋ก๊ทธ๋จ ์ด์ ๋ธ๋ฆฌ๋ฅผ ๋์คํฌ์์๋ก๋ํ๊ณ ํ์ผ์ ์ ๊ทธ๋ ๋์ ๋ฐ์ดํธ๋ก ๋ฉ๋ชจ๋ฆฌ์๋ก๋ํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณผ ๊ณํ์ ๋๋ค. ์ด๊ฒ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ๋ฌธ์ ๊ฐ ์์ง๋ง ๊ฒฝ์ฐ ์ ๋ฐ๋ผ ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค .
๋๊ตฐ๋ค๋ ์ด๋ ๋ค์ด ํ์์ ์ ๋ก๋ก ๋ง๋ค ์ ์์ต๋๋ค.
๋ชจ๋๋ก ์ด์ ๊ฐ์ ๊ธฐ๋ฅ์ ํฌ์ ํ ๋ฐฉ๋ฒ์ ์์ต๋๋ค.
FTP๋ฅผ ๋งํ ๋ ssh๋ฅผ ํตํ ftp๋ ์๋ฏธํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๋ฌํ ๋๊ตฌ๋ ๋งค์ฐ ๊ฐ์น๊ฐ์์ ๊ฒ์ ๋๋ค.
์๋ ๋๋ ftp๋ฅผ ์๋ฏธํ๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด์น์ ๋ง๋ ๋ชจ๋ ๊ฒ์ ํ ๊ฒ์ ๋๋ค. ๋์ ์ปดํจํฐ์์ ์คํํด์ผํ๋ ๋ณต์ฌ ๋๊ตฌ ์ธ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๋ฅผ ์ด๋๋ก ๋ ๋นํธ๋ฅผ ๋ณด๋ด์ผํ๋ ์ฌ์ ์์ ๋ฒ์ด๋๊ฒํฉ๋๋ค.
๋ํ IIS์ ๋ฐฐํฌํ๊ธฐ ์ํด Windows ์์คํ ์ SSH๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
์. CI / CD๋ฅผ ์ฌ์ฉํ๊ณ Linux์ Windows ์์คํ ๋ชจ๋์ ๋ฐฐํฌํ๋ฏ๋ก Windows ์์์ openssh๋ฅผ ์ค์นํ๋ ๊ฒ์ด ํจ์ฌ ์ฌ์ ์ต๋๋ค.
$ appPool = '๊ธฐ๋ณธ๊ฐ'
Stop-WebAppPool-์ด๋ฆ $ appPool -Passthru
... ๋ฐฐํฌ ...
Start-WebAppPool-์ด๋ฆ $ appPool -Passthru
... ๋ฐฐํฌ .....
๋๋
$ appPool = '๊ธฐ๋ณธ๊ฐ'
์ค์ง -WebAppPool-์ด๋ฆ $ appPool
while ((Get-WebAppPoolState -Name $ appPool) .Value -ne '์ค์ง') {
์๋ฉด 1 # ์ด
}
... ๋ฐฐํฌ ...
Start-WebAppPool-์ด๋ฆ $ appPool
while ((Get-WebAppPoolState -Name $ appPool) .Value -ne '์์') {
์๋ฉด 1 # ์ด
}
... ๋ฐฐํฌ .....
๊ฐ๋ํ ์ฌ๋์ ๋ฐฐํฌ ์ฌ๋กฏ
์ฝ 1 ๋
์ ์ ์ฌ์ดํธ ๋ฃจํธ ํด๋ 2 ๊ฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ฒ์ํ์ผ๋ฉฐ ๊ทธ ์ค ํ๋์ ๋ํ ์ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ IIS ์ฌ์ดํธ ์ฉ์ผ๋ก ๊ตฌ์ฑ๋์์ต๋๋ค.
์ฅ์ ์ ๋ค๋ฅธ ๊ฐ๋จํ ์๋ฃจ์
์ ๋นํด ๋ค์ด ํ์์ด ์ ๋ค๋ ๊ฒ์
๋๋ค.
์ค๋ณต ์ฌํ์ฉ์ด ํ์ฑํ ๋ ๊ฒฝ์ฐ ๋ค์ด ํ์์ด ์์ผ๋ฉฐ ์ด์จ๋ ์ฒซ ๋ฒ์งธ ์์ฒญ์ ๋ํ ์๋ฐ์
ํจ๋ํฐ ๋ง ๋ฐ์ํฉ๋๋ค.
๋ฐฐํฌ / ๋ณต์ฌ ์์
์ด ์๋ฃ๋๋ ๋ฐ N ์ด๊ฐ ์์๋๋ ๊ฒฝ์ฐ N ์ด ๋์ ์ฑ ํ์ ์ค์ง ํ ํ์๊ฐ ์์ต๋๋ค.
์คํ๋ผ์ธ์์ ์์ฌ์ค๋ฌ์ด ์ฑ์ ๋ง์น ํ์๊ฐ ์์ต๋๋ค.
๋นํ์ฑ ํด๋์ ๋ณต์ฌํ๊ณ ํ์ผ์ด์์ ๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๊ต์ฒด ํ ๋ค์ ์ฑ ํ์ ์ฌํ์ฉํ์ญ์์ค.
์์ ๋ฐฐํฌ, ๋ค์ด ํ์์์ด ํ์์ฒ๋ผ ์ฒซ ๋ฒ์งธ ์์ฒญ์ด ๋๋ ค์ง๋๋ค.
https://github.com/dotnet/aspnetcore/issues/3793#issuecomment -459870870
๋๊ตฌ ์๋ ํ์ด?
์ด์ ๊ฐ์ ๊ฒ์ด ์๋ํ๋ฉด ํด๋ผ์ด์ธํธ ์ธก ๋ฐฐํฌ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค๋ก ์ ํ ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ๋ฐฐํฌ ์ ๊ธ ํ์ผ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฑ ํธ์คํ
์์. ์ฑ ํ์ ์ค์งํ๋ ค๊ณ ํ์ง๋ง ํ์ผ์ด ์ ๊ฒจ ์์ต๋๋ค. ๋๋ app_offline.htm์ ๋ฐ๋ ค ๊ณ ์๋ํ์ง๋ง ๊ฑฐ๊ธฐ์์๋ ์ด์ด ์๋ค.
๋ํ app_offline.htm ํ์ผ ์ญ์ ๋ฅผ ๊ด๋ฆฌํ๋ ค๋ฉด program.cs์์ ์ฑ์ ์์ํ ๋ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒํ๋ฉด ์ธ์ ์จ๋ผ์ธ ์ํ๊ฐ๋๋์ง ์ ์ ์์ต๋๋ค.
๋ด๊ฐ ์ง๋ฉด ํ ํ์ฌ ๋ฌธ์ ๋ dll์ด ์ค๋จ๋๊ณ ์ด๋ฆ์ ๋ฐ๊พผ ๋ค์ ํ์ผ์ ๋ณต์ฌํ๋๋ผ๋ ์ด๋ฆ์ด ๋ฐ๋ ํ์ผ์ ๋ํด ์ด์ ํ๋ก์ธ์ค๊ฐ ์ฌ์ ํ ์คํ๋๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ๋ฐฐํฌ๋ฅผ ๋ค์ ์๋ํ๋ฉด ํ์ผ ์ด๋ฆ์ ๋ค์ ๋ณ๊ฒฝํด์ผํฉ๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ํ์ผ ์ด๋ฆ ๋์ฒด๋ก ์ผ์ข
์ ๋ ์ง๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
IIS ์๋ฒ Windows 2012 R2์์์ด๋ฅผ ์ํด dotnet core 3.1.4๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
@foxjazz ์ฑ ํ / ํ๋ก์ธ์ค๊ฐ ์ค์ง ๋์ด๋ ํ์ผ์ ์ด๋ป๊ฒ ์ ๊ธฐ๋์? ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
@foxjazz ์ฑ ํ / ํ๋ก์ธ์ค๊ฐ ์ค์ง ๋์ด๋ ํ์ผ์ ์ด๋ป๊ฒ ์ ๊ธฐ๋์? ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
์ฌ์ฉํ dll์ ์ญ์ ํ๋ ค๊ณ ํ ๋ ๊ทธ๋ฆผ์ ๋ค๋ฅธ ํ๋ก์ธ์ค์์ ์ฌ์ฉ ์ค์ด๋ผ๊ณ ํ์๋ฉ๋๋ค.
์ฑ ํ์ด ํ๋์ ์คํ๋ผ์ธ ์ํ์์ต๋๋ค.
ํ๋ก์ธ์ค๊ฐ ์ฌ์ ํ ์คํ ์ค์ธ์ง ํ์ธํ๋ ค๋ฉด ์์ ๊ด๋ฆฌ์๋ฅผ ํ์ธํ์ญ์์ค. ์ค์ง ๋ฒํผ์ ๋๋ ๋ค ๊ณ ํด์ ์ฆ์ ์ข ๋ฃ๋๋ ๊ฒ์ ์๋๋๋ค.
ํ๋ก์ธ์ค๊ฐ ์ฌ์ ํ ์คํ ์ค์ธ์ง ํ์ธํ๋ ค๋ฉด ์์ ๊ด๋ฆฌ์๋ฅผ ํ์ธํ์ญ์์ค. ์ค์ง ๋ฒํผ์ ๋๋ ๋ค ๊ณ ํด์ ์ฆ์ ์ข ๋ฃ๋๋ ๊ฒ์ ์๋๋๋ค.
์์ ์ฌ์ง์ ์์ ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์จ ๊ฒ์ ๋๋ค. ์ด๋ ํ์ผ์ธ์ง ํ์คํ์ง ์์ง๋ง ์ญ์ ํ๋ฉด ํ์ผ์ด ํด์ ๋ฉ๋๋ค. ํธ๋ค์ ์ฌ์ฉํ์ฌ ์ข ๋ฃ ํ pid๋ฅผ ์์๋ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐฐํฌ๋ฅผ ์ํด ์ด๋ฌํ ๊ธธ์ด๋ก ๊ฐ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ํธ๋ค์ w3wp.exe 2 ํ๋ก์ธ์ค์ ํ์ผ ์ค ํ๋๊ฐ ์ ๊ฒจ ์๋ค๊ณ ๋งํฉ๋๋ค. ์ฑ ํ์ด ์ข ๋ฃ ๋ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
์ ๋ง ์ข์ ๊ฒ์ ํ๋ก์ธ์ค๋ฅผ ์ค์งํ๋ ๊ฒฝ๋ก๋ฅผ ๊ฐ๋ ๊ฒ์
๋๋ค.
api \ KillDeathKill
{
Program.KillProcess ()
}
๊ทธ๋ด ๊ฒ ๊ฐ์ง ์์ต๋๋ค. ํ๋ก์ธ์ค์ ์ํด ํ์ผ์ด ์ ๊ฒผ์ต๋๋ค. w3wp๊ฐ ํด๋น ํ๋ก์ธ์ค์ด๋ฉด ์์ํ๊ธฐ ์ํด ์ ๋๋ก ์ฃฝ์ง ์์๊ฑฐ๋ ๋์ผํ ํ์ผ์ ๋ค๋ฅธ pid๋ก ์ ๊ทธ๋ ์ ๊ฒ์ด ์์๋์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ์ผ์ ์ ๊ทธ๊ณ , ๊ธฐ์กด ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๊ณ , ์ ๋นํธ๋ฅผ ๋ฐฐํฌํ๊ณ , ์ฑ์ ์คํ๋ผ์ธ์ผ๋ก ์ ๊ฑฐํ๋ ์๋ก์ด ํ๋ก์ธ์ค๊ฐ ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋จผ์ ์ฑ ์คํ๋ผ์ธ์ด ๋ค์ด๋์๋์ง ํ์ธํด์ผํฉ๋๋ค.
๊ทธ๋ด ๊ฒ ๊ฐ์ง ์์ต๋๋ค. ํ๋ก์ธ์ค์ ์ํด ํ์ผ์ด ์ ๊ฒผ์ต๋๋ค. w3wp๊ฐ ํด๋น ํ๋ก์ธ์ค์ด๋ฉด ์์ํ๊ธฐ ์ํด ์ ๋๋ก ์ฃฝ์ง ์์๊ฑฐ๋ ๋์ผํ ํ์ผ์ ๋ค๋ฅธ pid๋ก ์ ๊ทธ๋ ์ ๊ฒ์ด ์์๋์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ์ผ์ ์ ๊ทธ๊ณ , ๊ธฐ์กด ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๊ณ , ์ ๋นํธ๋ฅผ ๋ฐฐํฌํ๊ณ , ์ฑ์ ์คํ๋ผ์ธ์ผ๋ก ์ ๊ฑฐํ๋ ์๋ก์ด ํ๋ก์ธ์ค๊ฐ ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋จผ์ ์ฑ ์คํ๋ผ์ธ์ด ๋ค์ด๋์๋์ง ํ์ธํด์ผํฉ๋๋ค.
app_offline.htm์ด ๋จผ์ ๋ค์ด๋์๋ค๊ณ ๋งํ ๋. ๋ค, ๊ทธ๋ ์ต๋๋ค. get ์์ฒญ์ ํตํด ํ์ธํ ์์๋ ์ํ ๊ฒฝ๋ก๊ฐ ์์ผ๋ฉฐ ํ์คํ ์คํ๋ผ์ธ ์ํ์ ๋๋ค. ๋ํ ์ฑ ํ์ ์๋์ผ๋ก ์ค์งํ์ต๋๋ค. ๊ทธ๋ฌ๋ w3wp ํ๋ก์ธ์ค๋ ์ฌ์ ํ ํ์ผ์ ์ค๋จํ์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ํ๋ก์ธ์ค๊ฐ ์ค์ง๋์ง ์์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ํ๋ก์ธ์ค๊ฐ ์ค์ง๋์ง ์์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ํ๋ก์ธ์ค๋ฅผ ์ค์งํ๋ ๊ฒ์ด ์๋๋ผ ์ฑ ํ์ ์ค์งํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ฑ ํ์ ํ๋ก์ธ์ค๋ฅผ ๋ํ๋ด๋ฉฐ ์ฑ ํ์ ์ค์งํ๋ฉด ํ๋ก์ธ์ค๊ฐ ์ค๋จ๋ฉ๋๋ค. ํ์ผ์ ์ ๊ธ ํ๋ก์ธ์ค๊ฐ ์์ผ๋ฉด ํ์ผ์ ์ ๊ธ ์ ์์ผ๋ฏ๋ก ๋ค๋ฅธ ์ด๋ก ์ค ํ๋๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
์ฑ ํ์ ํ๋ก์ธ์ค๋ฅผ ๋ํ๋ด๋ฉฐ ์ฑ ํ์ ์ค์งํ๋ฉด ํ๋ก์ธ์ค๊ฐ ์ค๋จ๋ฉ๋๋ค. ํ์ผ์ ์ ๊ธ ํ๋ก์ธ์ค๊ฐ ์์ผ๋ฉด ํ์ผ์ ์ ๊ธ ์ ์์ผ๋ฏ๋ก ๋ค๋ฅธ ์ด๋ก ์ค ํ๋๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
ํ, ๋น์ ์ ๋ฅ์ ๋งํ๋ค. ๋ด๊ฐ ๋น์ ์ ๊ดด๋กญํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ค๋ ๋ป์ ์๋๋๋ค. ๋๋ ์ฑ ํ์ ์ค์งํ๋ ๊ฒ์ด ๋ชจ๋ ๋ฌธ์์์ ๊ด๊ณ ๋๋๋ก ์๋ํ์ง ์๋๋ค๊ณ ๋งํ๊ณ ์์ต๋๋ค. ์ด ๊ณผ์ ์ 90 ์ด ํ์๋ ์๋ง์ด๋์ง ์๊ณ ์ฌ์ ํ ์คํ ์ค์ ๋๋ค. ์ฑ ํ์ด ์ค์ง ๋ ๊ฒ์ ๋ช ํํ๊ฒ ๋ณผ ์ ์์ด๋ ํ์ผ์ด ์ ๊น๋๋ค. ์ด ํ๋ก์ธ์ค์๋ ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ์ป๊ธฐ์ํ ๋จ์ผ ํญ๋ชฉ์ด ํฌํจ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ์ปจํธ๋กค๋ฌ. ์ ๊ธด ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๋ ์คํฌ๋ฆฝํธ๊ฐ ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋๋ ค์์์ด ๋ฐฐ์น ํ ์ ์์ต๋๋ค. ์ด๋ฆ ๋ฐ๊พธ๊ธฐ๋ ์๋ ํ ์ ์์ต๋๋ค. ํ์ผ ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค. (dotnet core 3.1.4) ๋ง
์ฝ 1 ๋ ์ ์ ์ฌ์ดํธ ๋ฃจํธ ํด๋ 2 ๊ฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ฒ์ํ์ผ๋ฉฐ ๊ทธ ์ค ํ๋์ ๋ํ ์ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ IIS ์ฌ์ดํธ ์ฉ์ผ๋ก ๊ตฌ์ฑ๋์์ต๋๋ค.
๋๊ตฌ ์๋ ํ์ด?
์ด์ ๊ฐ์ ๊ฒ์ด ์๋ํ๋ฉด ํด๋ผ์ด์ธํธ ์ธก ๋ฐฐํฌ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค๋ก ์ ํ ํ ์ ์์ต๋๋ค.
@CJHarmath- ๋๋ ์ด๊ฒ์ ์๋ํ๊ณ ์๋์์ ์ฌ์ฉํ๋ ์์ ๋ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์์ฃผ ์ ์๋ํฉ๋๋ค, ๊ฐ์ฌํฉ๋๋ค!
์
๋ฐ์ดํธ๋ฅผ ๋ ๋ง์ด ๊ฒ์ํ๋ฉด ํด๋ผ์ด์ธํธ ๋ฐฐํฌ ๋๊ตฌ๋ฅผ ๊ณ ๋ คํ ์ ์์ง๋ง ์ค์ ๋ก๋ IIS ์๋ฒ์ ์๊ฒฉ ์
ธ์ ์ ์ฉํ๊ณ powershell ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ฌ ๋ค์ง์ ์ ์์ต๋๋ค.
psexec.exe \\IIS_SERVER cmd /c "powershell -noninteractive -file C:\FlipSymLink.ps1"
# FlipSymLink.ps1
Import-Module WebAdministration # run as admin
# create 2 site root directories
$a = 'C:\Websites\MySiteA'
$b = 'C:\Websites\MySiteB'
$appRoot = 'C:\Websites\MySite'
$appName = 'MyAppName'
$siteName = 'MySiteName'
$poolName = "MyPoolName"
New-Item -Type Directory $a -ErrorAction SilentlyContinue
New-Item -Type Directory $b -ErrorAction SilentlyContinue
# create a symlink to targeting one side
New-Item -Type SymbolicLink -Path $appRoot -Target $a -Name A -ErrorAction SilentlyContinue
New-Item -Type SymbolicLink -Path $appRoot -Target $b -Name B -ErrorAction SilentlyContinue
# point the site root to the symlink
$currentPath = (Get-ItemProperty "IIS:\Sites\$siteName\$appName" -name physicalPath)
if ($currentPath -eq "$appRoot\A") {
Write-Host "Switched to B"
New-Item $b\active.txt
Remove-Item $a\active.txt
Set-ItemProperty "IIS:\Sites\$siteName\$appName" -name physicalPath -value $appRoot\B
} else {
Write-Host "Switched to A"
New-Item $a\active.txt
Remove-Item $b\active.txt
Set-ItemProperty "IIS:\Sites\$siteName\$appName" -name physicalPath -value $appRoot\A
}
Restart-WebAppPool -Name $poolName
psexec.exe \\IIS_SERVER cmd /c "powershell -noninteractive -file C:\FlipSymLink.ps1"
์ด๊ฒ์ ๋ํ JEA ์๋ ํฌ์ธํธ ๋ก ์ ํ ๋ ์ ์์ผ๋ฏ๋ก flip
๋ฅผ ๊ถํ์ด์๋ ์ฌ์ฉ์๋ก ์คํํ ์ ์์ต๋๋ค (์ : CI / CD ์๋ฒ ๋ฐฐํฌ ๋จ๊ณ์์)
Invoke-Command -ComputerName IIS_SERVER -ConfigurationName IIS-Flip -ScriptBlock { Switch-SymlinkTarget -SiteName MySite}
์น์ธ ๋ ๋์ฌ์ด๋ฏ๋ก Flip
๋์ Switch
์ฌ์ฉํ์ต๋๋ค.
์น์ธ ๋ ๋์ฌ์ด๋ฏ๋ก
Flip
๋์Switch
์ฌ์ฉํ์ต๋๋ค.
Swap
๋ ์ฌ๋กฏ์ ๋ค๋ฃฐ ๋ ์ฌ์ฉ๋๋ ๋์ฌ์
๋๋ค. ์ฌ๊ธฐ์ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ๊น์?
4 ๋
์ ์ ์ค๋ช
ํ ๊ฒ๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด๊ฒ์ ๋ํ ์
๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
์ dll ํ์ผ์ ์
๋ก๋ํ๊ธฐ ์ํด ์๊ฒฉ ๋ฐ์คํฌํฑ์ ์ด๊ณ ์ถ์ง ์์ต๋๋ค.
ํ๋ก๋์ IIS ์๋ฒ์์ FTP๋ฅผ ์ฌ์ฉํ์ฌ .NET Core ์ ํ๋ฆฌ์ผ์ด์ DLL ํ์ผ์ ๋ฎ์ด ์ฐ๋ ค๊ณ ํ๋ฉด ํ์ผ์ด ์ ๊ฒจ์์ด ๋ฎ์ด ์ธ ์ ์์ต๋๋ค.
์ ๋ฒ์ ์ ๋ฐฐํฌํ๋ ค๋ฉด IIS (RDP ์ด๊ธฐ)์์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ค์งํ์ฌ ์ ๊ธ์ ํด์ ํ ๋ค์ ๋ฎ์ด ์จ์ผํฉ๋๋ค.
์์ฉ ํ๋ก๊ทธ๋จ์ ์ค์งํ์ง ์๊ณ ๋ฐฐํฌ ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น? ๊ฐ์ฌ
๋ก๋ ๋ฐธ๋ฐ์ ๋ค์์ ํธ์คํธ๋ฅผ ์คํ๋ผ์ธ์ผ๋ก ์ ํ ํ ์์๊ณ ๋ ๋นจ๋ฆฌ ์ํํ๋ ค๋ ๊ฒฝ์ฐ ์ฌ๋ณผ๋ฆญ ๋งํฌ์ ์ผ๋ถ powershell์ ์ฌ์ฉํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ด๋ฐ ์์ผ๋ก ์๊ฐํ๊ณ ์์์ด์.๋ณต์ฌ + ์ฌํ์ฉ ์ค์ ์ฑ ํ์ ์ค์ง ํ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋ ๋น ๋ฆ ๋๋ค. ํ์ฌ ์์ฒญ์ ์๋ฃ ํ ์ ์์ผ๋ฏ๋ก ์ค๋จ ์๊ฐ์ด ์ค์ด๋ค ๊ธฐ ๋๋ฌธ์ ํ๋ ์ค์ง๋ณด๋ค ๋ซ์ต๋๋ค.
# Setup Import-Module WebAdministration # create 2 site root directories $a = 'C:\inetpub\AspNetCoreSampleA' $b = 'C:\inetpub\AspNetCoreSampleB' $siteRoot = 'C:\inetpub\aspnetcoresample' $siteName = 'AspNetCoreSample' $poolName = "aspnetcore" New-Item -Type Directory $a New-Item -Type Directory $b # create a symlink to targeting one side New-Item -Type SymbolicLink -Path $siteRoot -Target $a # point the site root to the symlink Set-ItemProperty "IIS:\Sites\$siteName" -name physicalPath -value $siteRoot # make sure it get's picked up Restart-WebAppPool -Name $poolName # this tells you the active side Get-Item -Path $siteRoot | Select-Object -ExpandProperty target # Flip the symlink $current = (Get-Item -Path $siteRoot).Target $newTarget = if ($current -eq $a) {$b} else {$a} New-Item -Type SymbolicLink -Path $siteRoot -Target $newTarget -Force # at this point w3wp.exe still locks the current target folder until it's getting recycled # Deploy new version to the symlink which is now pointing to the other side which should have no locks robocopy \\myshare\myapp $siteRoot /mir # recycle app pool, so it picks up the new files Restart-WebAppPool -Name $poolName # bonus point: rollback is easy $current = (Get-Item -Path $siteRoot).Target $newTarget = if ($current -eq $a) {$b} else {$a} New-Item -Type SymbolicLink -Path $siteRoot -Target $newTarget -Force Restart-WebAppPool -Name $poolName
์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
https://gist.github.com/csharmath/b2af0f50700ce9fbdd8c5c3e582fd41b
์ฌ๊ธฐ ์ ๊ฐ ๊ผฌ์์ด ํด๊ฒฐ๋์๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ด ์์ต๋๋ค. ASP.NET์ผ๋ก ๋ง ์๋ํ์ง๋ง net core ์ฉ ํธ์คํ ๋ชจ๋์์๋ ๋์ผํ๊ฒ ์๋ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์คํ์ ์ฌ์ดํธ๋ฅผ ์ ์ ์ค๋จํ๋ฏ๋ก ์ฝ๊ฐ ์กฐ์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
param(
[Parameter(Mandatory = $true)]
[string] $iisRootPath,
[Parameter(Mandatory = $true)]
[string] $siteName,
[Parameter(Mandatory = $true)]
[string] $artifactPath,
[Parameter(Mandatory = $false)]
[string] $siteFolderName,
[Parameter(Mandatory = $false)]
[string] $appPoolName
)
Import-Module WebAdministration
#populate optional parameters
if (!($PSBoundParameters.ContainsKey('siteFolderName'))) { $siteFolderName = $siteName }
if (!($PSBoundParameters.ContainsKey('appPoolName'))) { $appPoolName = $siteName }
#set A, B and C paths
$a = "$iisRootPath\$siteFolderName" + 'A'
$b = "$iisRootPath\$siteFolderName" + 'B'
$c = "$iisRootPath\$siteFolderName"
#existence test
$cName = Get-Item -Path $c -ErrorAction SilentlyContinue | Select-Object -ExpandProperty name -ErrorAction SilentlyContinue
$bName = Get-Item -Path $b -ErrorAction SilentlyContinue | Select-Object -ExpandProperty name -ErrorAction SilentlyContinue
#get the shudown timeout for the app pool
$shutdownTimeout = Get-WebConfigurationProperty -Filter 'system.web/httpRuntime' -PSPath "IIS:\Sites\$siteName" -Name shutdownTimeout | Select-Object -ExpandProperty Value
#create symlink, if symlink source is an existing directory, rename existing
if($cName -eq $null)
{
Write-Output "Creating SymbolicLink $c -> $a"
New-Item -Type SymbolicLink -Path $c -Target $a
}
else
{
#directories don't have a target property
$cTarget = Get-Item -Path $c | Select-Object -ExpandProperty target -ErrorAction SilentlyContinue
#this is a directory, rename and create symlink
if($cTarget -eq $null)
{
#restart AppPool first so no locked files
#Write-Output "Restarting AppPool $appPoolName"
#Restart-WebAppPool -Name $appPoolName
#stop AppPool first so no locked files
Write-Output "Stopping AppPool $appPoolName"
Stop-WebAppPool -Name $appPoolName
#sleep for shutdownTimeout
Write-Output "Sleeping for $shutdownTimeout"
Start-Sleep -Seconds (([System.TimeSpan]::Parse("$shutdownTimeout").TotalSeconds) * 1.1)
try {
#if the rename fails, there are files in use. stop the script
$newName = $siteFolderName + 'A'
Write-Output "Renaming $c to $newName"
Rename-Item -Path $c -NewName $newName -ErrorAction Stop
}
catch {
Write-Error -Message "Failed to rename $c to $newName due to files in use."
#start AppPool
Write-Output "Starting AppPool $appPoolName due to failed folder rename. Consider trying again durring a time with reduced traffic."
Start-WebAppPool -Name $appPoolName
}
#create symlink
Write-Output "Creating SymbolicLink $c -> $a"
New-Item -Type SymbolicLink -Path $c -Target $a
#start AppPool
Write-Output "Starting AppPool $appPoolName"
Start-WebAppPool -Name $appPoolName
#copy a to b to pick up directory permissions
if($bName -eq $null)
{
Write-Output "Copying Directory $a to $b"
robocopy $a $b /e /sec /sl
}
}
}
#existence test
$aName = Get-Item -Path $a -ErrorAction SilentlyContinue | Select-Object -ExpandProperty name -ErrorAction SilentlyContinue
$bName = Get-Item -Path $b -ErrorAction SilentlyContinue | Select-Object -ExpandProperty name -ErrorAction SilentlyContinue
#create if needed
if($aName -eq $null)
{
Write-Output "Creating Directory $a"
New-Item -Type Directory $a
}
if($bName -eq $null)
{
Write-Output "Creating Directory $b"
New-Item -Type Directory $b
}
#make sure site pointing to symlink
Write-Output "Pointing Website $siteName to Path $c"
Set-ItemProperty "IIS:\Sites\$siteName" -name physicalPath -value $c
#restart so we know it's loading from symlink
Write-Output "Restarting AppPool $appPoolName"
Restart-WebAppPool -Name $appPoolName
#sleep for shutdownTimeout
Write-Output "Sleeping for $shutdownTimeout"
Start-Sleep -Seconds ([System.TimeSpan]::Parse("$shutdownTimeout").TotalSeconds)
#get current symlink target and set new target
Get-Item -Path $c | Select-Object -ExpandProperty target
$current = (Get-Item -Path $c).Target
$newTarget = if ($current -eq $a) {$b} else {$a}
$fileOrDirectoryName = Get-Item $artifactPath | Select-Object -ExpandProperty name
#test for .zip
if(($fileOrDirectoryName).ToLower().EndsWith(".zip") -eq $true)
{
#copy to temp location
$guid = [System.Guid]::NewGuid()
$tempPath = "$iisRootPath\temp-$guid"
$tempDest = "$iisRootPath\temp-dest-$guid"
Write-Output "Creating temp directory $tempPath"
New-Item -Type Directory $tempPath
$artifactDirectory = [System.IO.Path]::GetDirectoryName($artifactPath)
$artifactFile = [System.IO.Path]::GetFileName($artifactPath);
#TODO: first robocopy arg needs to be a directory, not a file
Write-Output "Copying archive from $artifactPath to $tempPath"
robocopy $artifactDirectory $tempPath $artifactFile
#extract to temp destination (seems a failed extract can leave empty folders)
Write-Output "Extracting archive to $tempDest"
Expand-Archive -Path "$tempPath\$fileOrDirectoryName" -DestinationPath $tempDest -Force
#copy from temp destination to destination
Write-Output "Copying files from $tempDest to $newTarget"
robocopy $tempDest $newTarget /e
#delete temp directory
Write-Output "Removing temp directory $tempPath"
Remove-Item -Path $tempPath -Recurse -Force
#delete temp directory
Write-Output "Removing temp directory $tempDest"
Remove-Item -Path $tempDest -Recurse -Force
}
else
{
#copy new files
Write-Output "Copying files from $artifactPath to $newTarget"
robocopy $artifactPath $newTarget /e
}
#swap symlink
Write-Output "Pointing SymbolicLink $c -> $newTarget"
New-Item -Type SymbolicLink -Path $c -Target $newTarget -Force
#restart so it loads from newly swapped symlink
Write-Output "Restarting AppPool $appPoolName"
Restart-WebAppPool -Name $appPoolName
@LucidObscurity ๊ทธ๊ฒ ๋ญ์ผ? cmd ์ฝ๋? ๊ทธ ์ฝ๋๋ฅผ ์ด๋์ ์ถ๊ฐํด์ผํฉ๋๊น?
๊ฐ์ฌ
ํ๋ก์ธ์ค๊ฐ ํด์ ๋ ๋๊น์ง msdeploy
๋ช
๋ น์ ๋ํ ์ฌ์๋ ํ์ (๋งค๊ฐ ๋ณ์ : -retryAttempts:X
) ๋๋ ์ฌ์๋ ์๊ฐ ๊ฐ๊ฒฉ (๋งค๊ฐ ๋ณ์ : -retryInterval:XXXX
)์ ๋๋ฆฌ๋ ์์ด๋์ด๋ ์ด๋ป์ต๋๊น? ํ์ผ ์ ๊ธ?
@davidfowl ์ด ์ณ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ๋ก์ธ์ค๊ฐ ์ด๋ป๊ฒ ๋ ์ฌ์ ํ ๊ฑฐ๊ธฐ์ ์๊ณ ํ์ผ์ ์ ๊ธ๋๋ค. IIS ์ฌ์ค์ ์ ๋์์ด ๋์ง ์์ง๋ง ์๊ฐ์ด ์ด๊ณผ ๋ ๋๊น์ง ํ๋ก์ธ์ค๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค. app_offline.htm์ ์ญ์ ํ๊ณ 90 ์ด ๋์ ๊ธฐ๋ค๋ ธ๋ค๊ฐ (AppPool์ ์ข
๋ฃํ๋ ๊ธฐ๋ณธ ์๊ฐ ์ ํ ์ค์ ) ๋ค์ ์๋ํ๋ฉด ์๋ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋ก์ปฌ์์ ๋๋ ๊ทธ๋ ๊ฒ ์ค๋ ๊ธฐ๋ค๋ฆฌ์ง ์๊ธฐ ๋๋ฌธ์์ด ์ข
๋ฃ ์๊ฐ ์ ํ (์ด)์ 5๋ก ์
๋ฐ์ดํธํ๊ณ ํ๋ก์ ํธ ํ์ผ์ ์
๋ฐ์ดํธํ์ฌ ๋น๋ ์ ์ app_offline.htm ์ ์์ฑ
์๋ฒ์ ๊ฒฝ์ฐ msdeploy ๋ฅผ ์ฌ์ฉํ์ฌ app_offline.htm์ ์ญ์ ํ๊ณ ์ ๋ฒ์ ์ ๋๊ธฐํ ํ ๋ค์ app_offline.htm์ ์ ๊ฑฐํฉ๋๋ค. msdeploy๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ผ์ด ์ ๊ฒจ ์์ง๋ง ๋๋๋ก 90 ์ด ์ ์ ํฌ๊ธฐํ๋ฉด ์ฌ ์๋ํ๋ฏ๋ก ๋ฐฐํฌ๋ฅผ ๋ค์ ํธ๋ฆฌ๊ฑฐํด์ผํ๋ฉฐ ๋ ๋ฒ์งธ ์๋์์ ์๋ํฉ๋๋ค.
์ด๊ฒ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์ด ์๋ก์ด ๋ฆด๋ฆฌ์ค๊ฐ ์ธ์ ์ค๋น ๋ ๊น์?
์ฐ๋ฝ ํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
ํฅํ ํ๊ฐ / ๊ณ ๋ ค๋ฅผ ์ํด์ด ๋ฌธ์ ๋ฅผ Next sprint planning
๋ง์ผ์คํค์ผ๋ก ์ด๋ํฉ๋๋ค. ๋ค์ ๋ง์ผ์คํค์ ๋ํ ์์
์ ๊ณํ ํ ๋ ์์ฒญ์ ํ๊ฐํ ๊ฒ์
๋๋ค. ๋ค์์ ์์๋๋ ์ฌํญ๊ณผ์ด ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์์ ๋ณด๋ ค๋ฉด ์ฌ๊ธฐ์์ ์ฌ์ฌ ํ๋ก์ธ์ค์ ๋ํด ์์ธํ ์ฝ์ด๋ณด์ญ์์ค.
.NET 4.5.2 ์์ฉ ํ๋ก๊ทธ๋จ์ .NET 5.0์ผ๋ก ๋ณํ ํ ํ ์ด๋ฒ ์ฃผ์์ด ๋ฌธ์ ์ ๋ํด ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ์ํ ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ด ์์ต๋๋ค. IIS ์๋ฒ์์ ์คํ๋๋ Windows ์๋น์ค๋ฅผ ๋ง๋ค์์ต๋๋ค. ํด๋น ์๋น์ค์๋ ์ฌ์ฉ์ ์ง์ ํฌํธ์์ ์คํ๋๋ ๊ฐ๋จํ HTTP ์๋ฒ๊ฐ ์์ต๋๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋น ์๋ฒ์ ์ฌํ ์์ฒญ์ ์ํํ์ฌ ์ ๊ทธ๋ ์ด๋๋ฅผ ์์ํ ์ ์์ต๋๋ค. ์ฑ ํ์ ์ค์งํ๋ฉด ํด๋น ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ชจ๋ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๊ณ ํ์ฌ ๋ฆด๋ฆฌ์ค์ ๋ฐฑ์ ์ ๋ง๋ค๊ณ ํ์ฌ ๋ฆด๋ฆฌ์ค๋ฅผ ์ ๊ฑฐํ๊ณ upgradepackage๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์ถ์ถํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฑ ํ์ ๋ค์ ์์ํฉ๋๋ค.
์์์ ์ธ๊ธ ํ Windows ์๋น์ค๊ฐ ๊ฐ์ ธ ์ค๋ ์ ์ฅ์๋ก ํธ์๋๋ ์ ๊ทธ๋ ์ด๋ ํจํค์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๊ฐ๋จํ Windows Forms ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๐
์ค๋ณต ์ฌํ์ฉ์ ์ง์ํ์ง ์๋ ๊ฒ์ ํ๊ท์ ๋๋ค.