>  기사  >  웹 프론트엔드  >  Node.js_node.js 실행을 위한 IIS 확장 iisnode 설치 및 구성 참고 사항

Node.js_node.js 실행을 위한 IIS 확장 iisnode 설치 및 구성 참고 사항

WBOY
WBOY원래의
2016-05-16 16:11:441491검색

올해 초에는 Node.js를 사용하여 Express 프레임워크를 기반으로 블로그 프로그램을 다시 작성하고 ASP.NET과 작별할 계획이었습니다. 그러나 현재 사용하고 있는 VPS는 Windows Server 시스템과 IIS 서버입니다. Express와 IIS가 모두 포트 80을 수신하도록 허용되면 분명히 충돌이 발생합니다. 다행히 IIS에서 Node.js 프로그램을 호스팅할 수 있는 iisnode라는 확장이 있습니다. 또한 이러한 호스팅은 IIS의 다양한 기능(프로세스 관리, GZip 압축, 로그, 캐시, 권한 제어, 도메인 이름 바인딩 등)을 사용할 수 있음을 의미합니다.

iisnode를 사용하려면 다음을 설치해야 합니다.

1.Node.js
2.IIS의 URL 재작성 모듈
3.iisnode

설치 후 일반적인 작업을 수행하고 IIS 관리자에서 Express 프로그램의 디렉터리를 가리키는 사이트를 만듭니다. 핵심은 web.config 파일을 추가하는 것입니다.

코드 복사 코드는 다음과 같습니다.

<구성>

>                  
추가 >
  <다시 작성> ~ ~                                                         ~

안에 ~                                                  
>




이 콘텐츠는 IIS 관리자의 시각적 인터페이스를 통해서도 구성할 수 있습니다. 이는 아마도 bin/www에 대한 모든 요청을 다시 작성하고 iisnode 확장을 사용하여 bin/www를 실행하는 것을 의미할 것입니다. 그런데 사이트를 연 후 다음과 같은 오류 메시지가 나타났습니다:



코드 복사


코드는 다음과 같습니다.

요청 필터링 모듈은 HiddenSegment 섹션이 포함된 URL의 경로를 거부하도록 구성됩니다 처음에는 불분명하다고 생각했는데 갑자기 ASP.NET의 bin 디렉터리가 액세스가 허용되지 않는 특수 디렉터리라는 것을 깨달았습니다. 이 규칙에 부합하는 bin/www에 대한 요청을 다시 작성합니다. 따라서 디렉토리 이름만 변경하면 됩니다. 예를 들어 bin을 실행으로 변경하면(이것은 좋은 습관이 아닌 것으로 밝혀졌으므로 나중에 이에 대해 설명하겠습니다) web.config도 이에 따라 조정되어야 합니다.


코드 복사


코드는 다음과 같습니다.

<구성>

>                
추가 >
  <다시 작성> ~ ~                                                         ~

                                  
~                                                  
>




IIS 관리자에서 사이트를 다시 시작하고 다시 접속해 보세요. 드디어 실행이 쉽지 않습니다. 하지만 아직 기뻐하기엔 이르다.

프로그램 기능을 테스트하는 과정에서 획득한 IP가 비어있는 것을 발견했습니다. Express 프레임워크에서 IP는 req.ip를 통해 획득되며, 이는 요청 헤더의 REMOTE_ADDR에서 값을 획득합니다. 간단한 테스트 코드를 통해 REMOTE_ADDR 값도 비어있는 것을 확인했습니다. 분명히 이 헤더 정보는 IIS에서 Node.js로 이동하는 과정에서 손실되었습니다. Google을 검색한 결과 iisnode에
이 문제

가 있음을 발견했습니다. 공식적인 해결책은 X-Forword-For를 사용하는 것이지만 다른 방법을 찾았습니다.

REMOTE_ADDR을 유지할 수 있는 Web.config 구성( 앞에 추가됨)이 있습니다.

코드 복사


코드는 다음과 같습니다.
지침에 따라 예약된 REMOTE_ADDR의 이름이 x-iisnode-REMOTE_ADDR로 변경되므로 req.ip 값을 한 번 덮어쓰고 Express app.js에 미들웨어 기능을 추가해야 합니다.


코드 복사



그러나 이렇게 조정한 후에도 획득한 IP는 여전히 비어 있어 req.ip 할당이 실패한 것이 아닌가 하는 의문이 듭니다. Express의 소스 코드를 보면, req.ip가 Define getter에 의해 정의된 것을 알 수 있으므로 덮어쓰려면 다시 정의해야 합니다.



코드 복사

코드는 다음과 같습니다. app.use(function(req, res, next) { Object.defineProperty(req, 'ip', {           get: function() { return this.headers['x-iisnode-REMOTE_ADDR'] } });
다음();
});



이 문제는 마침내 해결되었지만 Express가 나중에 req.ip를 읽기 전용으로 설정하면 이는 좋은 방법이 아닙니다.

계속 테스트를 진행한 결과 또 다른 문제가 발견되었습니다. 일반적으로 블로그 백그라운드의 파일 업로드 기능은 파일을 public/upload 디렉터리로 전송하지만 실제로는 public/upload 폴더가 launch 디렉터리(원본 bin 디렉터리)에 생성됩니다. 실제로 그 이유는 프로그램 항목인 www 파일이 실행 디렉터리에 있으므로 실행 디렉터리가 애플리케이션의 실행 디렉터리가 되기 때문입니다. 내 해결책은 시작 디렉터리의 이름을 다시 bin으로 변경하고 루트 디렉터리에 launch.js를 만들어 bin/www를 호출하는 것입니다.

코드 복사


코드는 다음과 같습니다. #!/usr/bin/env 노드 require('./bin/www');

然后把程序入口改为launch.js:

复主代码 代码如下:

<구성>
   
        <핸들러>
           
추가        

        <다시 작성>
           
                <규칙 이름="모두">
                   
일치                    
               
           
       

       
   

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.