올해 초, 나는 node.js를 사용한 Express Framework를 기반으로 블로그 프로그램을 다시 작성하고 지금부터 ASP.NET에 작별 인사를 할 계획이었습니다. 그러나 현재 사용하고있는 VPS는 Windows Server 시스템 및 IIS 서버입니다. Express와 II가 둘 다 포트 80을 듣는다면 분명한 충돌이있을 것입니다. 다행히도 iisnode라는 확장 프로그램이 iis에 node.js 프로그램을 호스팅합니다. 또한 호스팅 후 IIS의 다양한 기능 (프로세스 관리, GZIP 압축, 로깅, 캐시, 권한 제어, 도메인 이름 바인딩 등)을 사용할 수 있음을 의미합니다.
iisnode를 사용하려면 다음을 설치해야합니다.
1.node.js
2. IIS URL 재 작성 모듈
3. iisnode
설치 후에도 여전히 일반적인 작업을 따라 IIS 관리자에 사이트를 작성하고 Express 프로그램의 디렉토리를 가리 킵니다. 키는 web.config 파일을 추가하는 것입니다.
코드 사본은 다음과 같습니다.
<구성>
<System.WebServer>
<핸들러>
<name = "iisnode"path = "bin /www"동사 = "*"modules = "iisnode"resourcetype = "nisspecified"requireeaccess = "script" />
</핸들러>
<다시 쓰기>
<규칙>
<규칙 이름 = "all">
<match url = " /*" />
<action type = "rewrite"url = "bin /www" />
</규칙>
</규칙>
</rewrite>
</system.webserver>
</구성>
이 컨텐츠는 IIS 관리자의 시각적 인터페이스를 통해 구성 할 수도 있습니다. 그것은 대략 모든 요청을 bin/www에 다시 작성하고 iisnode 확장을 사용하여 bin/www를 실행하는 것을 의미합니다. 그러나 사이트를 열면 오류 메시지가 나타납니다.
코드 사본은 다음과 같습니다.
요청 필터 모듈은 Hiddensegment 섹션을 포함하는 URL의 경로를 거부하도록 구성됩니다.
처음에 나는 분명하지 않다고 생각했지만 나중에 ASP.NET의 빈 디렉토리가 액세스 할 수없는 특수 디렉토리라는 것을 갑자기 깨달았습니다. BIN/WWW에 요청을 다시 작성 하여이 규칙에 도달하십시오. 예를 들어 디렉토리 이름을 변경하십시오. 예를 들어 Bin Bin을 시작하여 시작하십시오 (좋은 연습이 아닌 나중에 이야기합시다). Web.Config도 다음과 같이 조정해야합니다.
코드 사본은 다음과 같습니다.
<구성>
<System.WebServer>
<핸들러>
<name = "iisnode"path = "launch /www"Verb = "*"modules = "iisnode"resourcetype = "nisspecified"requireaccess = "script" />
</핸들러>
<다시 쓰기>
<규칙>
<규칙 이름 = "all">
<match url = " /*" />
<action type = "rewrite"url = "런치 /www" />
</규칙>
</규칙>
</rewrite>
</system.webserver>
</구성>
IIS 관리자의 사이트를 다시 시작하여 다시 액세스 한 후 마침내 실행되기 시작했지만 쉽지 않았습니다! 그러나 나는 여전히 너무 행복했다.
프로그램 기능을 테스트하는 과정에서 얻은 IP가 비어있는 것으로 나타났습니다. Express Framework에서 IP는 Req.IP를 통해 얻어진다. 간단한 테스트 코드를 통해 Remote_addr의 값도 비어 있습니다. 이 헤더 정보는 IIS에서 Node.js까지 프로세스 중에 손실된다는 것이 분명합니다. Google 이후 IISNODE 에이 문제가 있음을 알았습니다. 공식 해결책은 x-forword-for를 사용하는 것이지만 다른 솔루션을 찾았습니다.
web.config (</system.webserver>에 추가하기 전에)에 구성이 있습니다.
코드 사본은 다음과 같습니다.
<iisnode promoteservervars = "remote_addr" />
지침에 따르면, 예약 된 remote_addr의 이름이 x-iisnode-remote_addr로 이름을 바꾸므로 req.ip의 값을 한 번 덮어 내고 Express의 app.js에 미들웨어 함수를 추가해야합니다.
코드 사본은 다음과 같습니다.
app.use (function (req, res, next) {
req.ip = req.headers [ 'x-iisnode-remote_addr'];
다음();
});
그러나이 조정 후에도 얻은 IP는 여전히 비어있어 필연적으로 사람들이 req.ip 할당이 실패했는지 궁금해합니다. Express의 소스 코드를 살펴보면 req.ip가 정의 getter를 통해 정의되므로 덮어 쓰려면 다시 정의해야합니다.
코드 사본은 다음과 같습니다.
app.use (function (req, res, next) {
Object.DefineProperty (Req, 'IP', {
get : function () {return this.headers [ 'x-iisnode-remote_addr']; }
});
다음();
});
이 문제는 마침내 해결되었지만 이것은 좋은 방법이 아닙니다. Express가 REQ.IP를 앞으로 읽기 전용으로 설정하면 문제가 될 것입니다.
테스트를 계속하고 다른 문제를 찾으십시오. 일반적으로 블로그 배경의 파일 업로드 기능은 파일을 공개/업로드 디렉토리로 전달하지만 실제로는 공개/업로드 폴더가 시작 디렉토리 (즉, 원래 빈 디렉토리)에서 생성됩니다. 실제로, 그 이유는 프로그램 입구로서의 www 파일이 시작 디렉토리에 있으므로 시작 디렉토리가 응용 프로그램의 실행 디렉토리가되기 때문입니다. 내 솔루션은 발사 디렉토리의 이름을 bin으로 다시 변경하고 루트 디렉토리에서 bin/www를 호출하기 위해 launch.js를 작성하는 것입니다.
코드 사본은 다음과 같습니다.
#!/usr/bin/env 노드
요구 ( './ bin/www');
그런 다음 프로그램 항목을 launk.js로 변경합니다.
코드 사본은 다음과 같습니다.
<구성>
<System.WebServer>
<핸들러>
<name = "iisnode"path = "launch.js"동사 = "*"modules = "iisnode"resourcetype = "nisspecified"requireaccess = "script" />
</핸들러>
<다시 쓰기>
<규칙>
<규칙 이름 = "all">
<match url = " /*" />
<action type = "rewrite"url = "launch.js" />
</규칙>
</규칙>
</rewrite>
<iisnode promoteservervars = "remote_addr" />
</system.webserver>
</구성>
분명히, iisnode는 성숙한 제품이 아니며, 물론 Node.js는 아직 1.0이 아니다 (아직 1.0이 아님). 모든 것이 더 많은 탐색과 개선이 필요합니다.