소프트웨어/C# & ASP.NET

L4스위치나 NLB로 웹서버 웹팜 구성시 특정 웹서버 오류...

falconer 2008. 9. 11. 08:59

몇몇 사이트에서 간혹 발생하는 문제로 각각 웹서버 로컬상에서 웹페이지가 이상없이 동작하나 L4장비에 서버를 붙이면 viewstate값의 오류가 발생하는 문제가 발생할 수 있으며, 이는 아래 노란색 부분의 machineKey값이 없어서 발생할 수 있습니다.

<!-- machineKey
            validationKey="AutoGenerate,IsolateApps"
            decryptionKey="AutoGenerate,IsolateApps"
            validation="SHA1" / -->
             <machineKey validationKey="8A3EBB645F310967C2C3DC76C7B6D5336313B1A3C20E3456CADA1566F25E8A8540642E50396A69FB04CA05AB3CB6BCDD83705BF6224623D32E4E20B31073ED38"
decryptionKey="5FA3EE464868418BEB56B183ECB156347DC13EB91163F0F6"

validation="SHA1"/>

l  Machine.config validationKey 설정

   WebFarm 구조에서는 viewstate corrupt 되었다는 오류 페이지가 간혹 발생할 수 있습니다. 이것은 해쉬 방식의 L4를 사용하지 않아 사용자가 웹서버 사이를 이동할 수 있는 형태의 WebFarm에서 발생하는데, 닷넷 페이지의 특성인 포스트백이 일어날 때 원본 viewstate을 다른 서버에서 해독하지 못하는 경우에 발생합니다.. 이 문제는 MS 디자인 버그이며 이를 해결하기 위해서는 모든 웹서버의 validationKey를 동일하게 설정해야 합니다. 이러한 validationKey를 얻기 위해 home밑의 GetValidationKey.aspx를 호출하거나 etc폴더 밑의 GetValidationKey.exe를 실행하여 결과물을 Machine.config의 다음 부분에 대체하면 됩니다.

 <machineKey validationKey="AutoGenerate,IsolateApps"
  decryptionKey="AutoGenerate,IsolateApps" validation="SHA1"/> 


참고글: http://blog.naver.com/saltynut?Redirect=Log&logNo=120019245399

L4
NLB를 사용하여 여러 대의 웹 서버를 묶어서 동작시키는 웹 팜(Web Farm) 환경에서 ASP.NET을 사용하는 경우, 상태 관리 문제가 이슈가 됩니다. 대표적인 것이 ViewState Session, 폼 인증 쿠키 등이 있겠습니다.

예를 들어 ViewState와 관련하여 PostBack 시에 다음과 같은 에러 메시지가 발생할 수 있습니다.

HttpException (0x80004005): The View State is invalid for this page and might be corrupted.]
   System.Web.UI.Page.LoadPageStateFromPersistenceMedium() +150
   System.Web.UI.Page.LoadPageViewState() +16
   System.Web.UI.Page.ProcessRequestMain() +421
.

 아마 한글 메시지로는 '이 페이지의 뷰 상태가 유효하지 않거나 훼손되었습니다.'라는 걸로 나오던 걸로 기억합니다.

 
이 문제가 발생하는 원인을 살펴보겠습니다.

웹 팜 환경에서는 최초 페이지 접근은 A 서버로 하고, PostBack B 서버로 날라갈 수도 있습니다.


PostBack
동안 ViewState가 페이지에서 저장/로드될 때는 특정한 키를 사용하여 Encrypt/Decrypt 되는 과정을 거치게 됩니다. 그런데, 이때 사용하는 키 값이 A 서버와 B 서버가 서로 다르게 설정되어 있을 것이기 때문에 위와 같은 에러가 발생하게 됩니다.

폼 인증 사용 시 쿠키와 관련한 문제도 이것과 동일합니다.


 
이 문제를 해결할 수 있는 방법은 크게 2가지입니다.

우선 첫번째는 L4 장비에서 세션이 유지되도록(, 한 사용자는 최초 접근한 서버로 계속 접근하도록) 설정하는 방법이 있습니다. 이 방법을 사용하면 상태 관리 문제(세션변수, ViewState, 폼인증 쿠키)를 모두 잊어버려도 된다는 장점이 있는 대신에, 로드 밸런싱의 효율성이 떨어지게 됩니다.

그래서 권장되는 두번째 방법은 바로 모든 웹 서버의 키 값을 동일하게 설정해주는 것입니다. 키를 생성하고, machine.config를 수정하는 부분에 대해서는 다음 KB를 참고하십시오.


 
http://support.microsoft.com/default.aspx?scid=312906

 
그러나, 세션변수(Session)의 경우에는 두번째 방법으로 해결되지 않습니다. 세션 변수는 페이지에 저장되는 것이 아니라 웹 서버의 메모리에 저장되는 것이기 때문입니다. L4 설정을 하지 않고 세션 변수를 공유하는 방법은 없을까요? 바로 ASP.NET StateServer SqlServer 모드 등을 통해 세션을 별도로 관리하는 방법이 있습니다. 여기에 관해서는 다음 URL을 참조하십시오.

 
http://msdn.microsoft.com/library/KOR/cpguide/html/cpconSessionState.asp

 
웹 팜에서 StateServer SqlServer 모드를 사용할 때는 주의해야 할 사항이 하나 있습니다. 다음 URL을 반드시 참고하시기 바랍니다.

 
http://support.microsoft.com/default.aspx?scid=325056

 
마지막으로 Session 변수와 ViewState에 대해 참고할 만한 좋은 문서가 있습니다. ASP.NET Program Manager Susan Warren이 작성한 다음 문서를 보기 바랍니다.

 
http://msdn.microsoft.com/library/en-us/dnaspnet/html/asp11222001.asp


출처 : http://pinkwine79.tistory.com/187