Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (kevin13@chol.net)
홈페이지
첨부 파일
 

아파치 서버에서 ASP.NET을 실행하는 mod_aspdotnet 모듈

지난 글에서 XAMPP의 아파치 구성을 알아봤는데요.

윈도우용 XAMPP의 아파치 서버 구성 방법
; https://www.sysnet.pe.kr/2/0/11288

물론, 저걸로 하지 않고 그냥 아파치 서버만 다운로드해 mod_aspdotnet를 얹으셔도 됩니다. 그런데, 제가 저것을 설명한 이유는 mod_aspdotnet을 구성하기 위해 참고했던 자료가 아래의 글이었기 때문입니다.

How To Run ASP.NET on XAMPP
; http://xehroz.tumblr.com/post/43884721903/how-to-run-aspnet-on-xampp

그런데, 막상 구성해 보니 XAMPP이어야 할 필요는 없고 단순히 아파치 서버만 있어도 가능한 것이었습니다.




다음의 사이트에서 mod_aspdotnet을 다운로드할 수 있습니다.

mod_aspdotnet
; http://sourceforge.net/project/platformdownload.php?group_id=175077

다운로드 가능한 파일은 .msi 설치 파일인데요, 제가 참... 설치 파일을 싫어합니다. ^^; 그래서 해당 .msi 파일을 다음의 방법을 이용해 압축을 해제했습니다.

msiexec /a mod_aspdotnet-2.2.0.2006-setup-r2.msi TARGETDIR=c:\temp\mod /qb

이 글에서는 해제한 파일들을 대상으로 수작업으로 설치를 해보겠습니다. 딱 2가지의 작업만 하면 되므로 복잡하지 않습니다.

우선, 첫 번째 작업이 Apache.Web.dll 파일을 GAC에 등록하는 것입니다.

.\mod\GlobalAssemblyCache\Apache.Web.dll

근데, 이게 좀 어려운데요. .msi 파일로 설치했으면 저 작업이 자동으로 되었을 텐데 직접 설치하려면 gacutil.exe가 필요합니다. 문제는 gacutil.exe는 닷넷 런타임에 포함되어 있지 않다는 것입니다. 그래도 대개의 경우 위의 작업을 하는 대상이 .NET 개발자들이기 때문에 개발자 PC에 있는 gacutil.exe를 복사해와서 등록하시면 됩니다. (그렇지 않은 경우에는 Windows SDK를 다운로드해 gacutil.exe를 구하거나 속편하게 .msi 설치 파일을 실행하시면 됩니다.)

참고로 Visual Studio 2017을 설치한 닷넷 개발자의 경우 다음의 경로에서 gacutil.exe를 구할 수 있습니다.

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\gacutil.exe

관리자 권한의 명령행 창을 띄우고 다음과 같이 등록해 줍니다.

C:\temp\mod\GlobalAssemblyCache> gacutil.exe Apache.Web.dll

그다음 역시 압축을 해제한 폴더 내에 있는 mod_aspdotnet.so 파일을,

.\mod\Program Files\Apache Software Foundation\apache2\modules\mod_aspdotnet.so

아파치 서버의 /modules 폴더에 복사해 주면 됩니다. XAMPP의 경우에는 ".\xampp\apache\modules" 폴더 안에 복사해 주면 됩니다. mod_aspdotnet.so 파일은 depends.exe로 확인하면 다음의 DLL들에 대해 의존성을 가지고 있습니다.

  • libapr-1.dll
  • libhttpd.dll

위의 파일들은 모두 .\apache\bin 폴더에 있는 것들이기 때문에 아파치만 제대로 구성되어 있다면 별문제 없이 사용할 수 있습니다.




모듈 설치는 이것으로 끝이 났고, 이제 ASP.NET을 실행할 수 있도록 구성 파일을 변경해야 합니다.

xampp의 경우 ".\xampp\htdocs\apache\conf\extra\httpd-xampp.conf" 파일에 구성할 수도 있습니다. 하지만 어차피 아파치 서버이기 때문에 동일하게 httpd.conf 파일에 설정해도 무방합니다.

원하는 .conf 파일을 열고 다음의 내용을 파일의 마지막에 추가해 줍니다. (꼭 마지막일 필요는 없지만 그냥 간편하게 그렇게 하시면 됩니다.)

# ASP.NET on XAMPP

LoadModule aspdotnet_module modules/mod_aspdotnet.so
AddHandler asp.net asax ascx ashx asmx aspx axd config cs csproj licx rem resources resx soap vb vbproj vsdisco webinfo

<IfModule mod_aspdotnet.cpp>
    AspNetMount /aspdocs "c:/temp/xampp/aspdocs"
    Alias /aspdocs "c:/temp/xampp/aspdocs"

    <Directory "c:/temp/xampp/aspdocs">
    Options FollowSymlinks ExecCGI
    Order allow,deny
    Allow from all
    DirectoryIndex index.htm index.aspx index.asp
    </Directory>

    AliasMatch /aspnet_client/system_web/(\d+)_(\d+)_(\d+)_(\d+)/(.*) "C:/Windows/Microsoft.NET/Framework/v$1.$2.$3/ASP.NETClientFiles/$4"

    <Directory "C:/Windows/Microsoft.NET/Framework/v*/ASP.NETClientFiles">
    Options FollowSymlinks
    Order allow,deny
    Allow from all
    </Directory>

</IfModule>

# /ASP.NET on XAMPP

위의 설정에서 가장 중요한 것은 "c:/temp/xampp/aspdocs" 경로입니다. 저 경로에 ASP.NET 웹 사이트 리소스를 넣어주면 되는데 물론 여러분이 원한다면 임의의 값으로 변경해도 됩니다.

이후, 테스트를 위해 "c:/temp/xampp/aspdocs" 폴더에 test.aspx 파일 하나를 만들고 다음의 내용으로 채워 넣습니다.

<%@ Page Language="C#"%>

<html>

    <head>
        <title>ASP.NET Test Page</title>
    </head>

    <body>

    <%
    for(int fontSize = 1; fontSize < 7; fontSize++)
    {
        Response.Write("<p style=\"font-size: " + (fontSize * 10) + "pt; text-align: center;\">It Works!</p>");
    }
    %>

    </body>

</html>

아파치 서버를 재시작하고 웹 브라우저에 http://localhost:8080/aspdocs/test.aspx URL을 입력해 실행하면 다음과 같은 결과를 볼 수 있습니다. ^^

mod_aspdotnet_run_1.png




그런데, 문제가 있습니다. 현재 2.4 버전의 아파치 서버를 사용하게 되면 .conf 파일 변경 후 다음과 같은 예외가 발생할 것입니다.

Diese Eingabeforderung nicht waehrend des Running beenden
Bitte erst bei einem gewollten Shutdown schliessen
Please close this command only for Shutdown
Apache 2 is starting ...
httpd.exe: Syntax error on line 532 of C:/temp/xampp/apache/conf/httpd.conf: Syntax error on line 21 of C:/temp/xampp/apache/conf/extra/httpd-xampp.conf: Cannot load modules/mod_aspdotnet.so into server: The specified procedure could not be found.  

Apache konnte nicht gestartet werden
Apache could not be started

또는 이런 오류가 발생합니다.

---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Runtime Error!

Program: C:\temp\Apache2\bin\Apache.exe

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

위와 같은 오류가 나는 것은 mod_aspdotnet과 아파치의 버전이 맞지 않기 때문입니다. 우선, 다음의 명령어로 아파치 서버 버전을 확인합니다.

// 2.4
C:\temp\xampp\apache\bin>httpd -v
Server version: Apache/2.4.27 (Win32)
Apache Lounge VC14 Server built:   Jul  9 2017 11:48:22

// 2.0
C:\temp\Apache2\bin>Apache.exe -v
Server version: Apache/2.0.63
Server built:   Jan 17 2008 22:58:29

아쉽게도 현재 2.4 버전의 아파치에 대해서는 mod_aspdotnet이 지원하지 않습니다. 대신 아파치 2.0과 2.2에 대해서는 각각 다음의 경로에서 다운로드한 mod_aspdotnet으로 설치하시면 됩니다.

// 아파치 2.0용 mod_aspdotnet 다운로드
mod_aspdotnet-2.0.0.msi   
; https://archive.apache.org/dist/httpd/mod_aspdotnet/mod_aspdotnet-2.0.0.msi

// 아파치 2.2용 mod_aspdotnet 다운로드
; http://sourceforge.net/project/platformdownload.php?group_id=175077




또 한가지 알아둬야 할 것은, GAC에 설치되는 Apache.Web.dll 파일은 CLR 2 대상의 c:\windows\assembly에 등록됩니다. 즉 CLR 4를 대상으로 만들어지지 않은 것인데요. 따라서 .NET 4.0만 설치된 윈도우에서는 정상적으로 동작하지 않습니다. 물론, .NET 2.0/4.0 모두 설치되어 있다면 .NET 4.0 ASP.NET이 올라와도 2.0용의 GAC에서 Apache.Web.dll 파일을 로드하기 때문에 정상적으로 동작합니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]





[최초 등록일: ]
[최종 수정일: 9/3/2017 ]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:kevin13@chol.com

비밀번호

댓글 쓴 사람
 



2019-03-12 08시12분
[sVeloper] 안녕하세요. 글 잘 읽었습니다.
apache/2.2.17 (win32) 에 aspdotnet module 설치해서 사용중입니다.
매 요청마다 메모리가 증가하는 문제가 있어 이것저것 다 찾아보다가 여기까지 오게 되었습니다.

위에 언급하신 .conf 내용을 httpd.conf에 추가하고, test.aspx 파일을 만들어서 접속하면 브라우저에 페이지는 잘 나옵니다.
그런데 마찬가지로 요청시마다 메모리가 증가하네요.

(예전에 aspdotnet 대응 종료한걸로 봐서는)이게 windows 10 이라 그런건지, 아니면 다른 문제가 있는건지 못 찾겠네요.
httpd.conf 에 MaxRequestsPerChild 1000 정도 설정해서 사용할까 싶었는데.. 이것도 적용이 안되네요.
혹시 잘 아실까 싶어 문의 드립니다.
[손님]
2019-03-13 01시04분
현재 이 모듈은 제 관심사 밖이어서 버그 수정은 힘듭니다.
정성태

[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
11852정성태3/20/201934개발 환경 구성: 434. 존재하지 않는 IP 주소에 대한 Dns.GetHostByAddress/gethostbyaddr/GetNameInfoW 실행이 느리다면?파일 다운로드1
11851정성태3/19/201968Linux: 8. C# - 리눅스 환경에서 DllImport 대신 라이브러리 동적 로드 처리
11850정성태3/18/201997.NET Framework: 813. C# async 메서드에서 out/ref/in 유형의 인자를 사용하지 못하는 이유
11849정성태3/18/201956.NET Framework: 812. pscp.exe 기능을 C#으로 제어하는 방법파일 다운로드1
11848정성태3/17/201964스크립트: 14. 윈도우 CMD - 파일이 변경된 경우 파일명을 변경해 복사하고 싶다면?
11847정성태3/17/201950Linux: 7. 리눅스 C/C++ - 공유 라이브러리 동적 로딩 후 export 함수 사용 방법파일 다운로드1
11846정성태3/15/201958Linux: 6. getenv, setenv가 언어/운영체제마다 호환이 안 되는 문제
11845정성태3/15/201956Linux: 5. Linux 응용 프로그램의 (C++) so 의존성 줄이기(ReleaseMinDependency)
11844정성태3/14/201968개발 환경 구성: 434. Visual Studio 2019 - 리눅스 프로젝트를 이용한 공유/실행(so/out) 프로그램 개발 환경 설정파일 다운로드1
11843정성태3/14/201940기타: 75. MSDN 웹 사이트를 기본으로 영문 페이지로 열고 싶다면?
11842정성태3/13/201962개발 환경 구성: 433. 마이크로소프트의 CoreCLR 프로파일러 예제를 Visual Studio CMake로 빌드하는 방법파일 다운로드1
11841정성태3/13/201947VS.NET IDE: 132. Visual Studio 2019 - CMake의 컴파일러를 기본 g++에서 clang++로 변경
11840정성태3/13/201933오류 유형: 526. 윈도우 10 Ubuntu App 환경에서는 USB 외장 하드 접근 불가
11839정성태3/12/2019106디버깅 기술: 124. .NET Core 웹 앱을 호스팅하는 Azure App Services의 프로세스 메모리 덤프 및 windbg 분석 개요 [1]
11838정성태3/8/2019211.NET Framework: 811. (번역글) .NET Internals Cookbook Part 1 - Exceptions, filters and corrupted processes [1]파일 다운로드1
11837정성태3/14/201967기타: 74. [예약]
11836정성태3/5/2019119오류 유형: 525. Visual Studio 2019 Preview 4/RC - C# 8.0 Missing compiler required member 'System.Range..ctor' [1]
11835정성태3/5/2019211.NET Framework: 810. C# 8.0의 Index/Range 연산자를 .NET Framework에서 사용하는 방법 및 비동기 스트림의 컴파일 방법파일 다운로드1
11834정성태3/4/2019170개발 환경 구성: 432. Visual Studio 없이 최신 C# (8.0) 컴파일러를 사용하는 방법
11833정성태3/4/201999개발 환경 구성: 431. Visual Studio 2019 - CMake를 이용한 공유/실행(so/out) 리눅스 프로젝트 설정파일 다운로드1
11832정성태3/4/201948오류 유형: 524. Visual Studio CMake - rsync: connection unexpectedly closed
11831정성태3/4/201987오류 유형: 523. Visual Studio 2019 - 새 창으로 뜬 윈도우를 닫을 때 비정상 종료
11830정성태2/26/201970오류 유형: 522. 이벤트 로그 - Error opening event log file State. Log will not be processed. Return code from OpenEventLog is 87.
11829정성태2/26/201990개발 환경 구성: 430. 마이크로소프트의 CoreCLR 프로파일러 예제 빌드 방법 - 리눅스 환경
11828정성태2/26/201969개발 환경 구성: 429. Component Services 관리자의 RuntimeBroker 설정이 2개 있는 경우
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...