수색…


비고

뷰가있는 가상 디렉터리 / 중첩 된 응용 프로그램

View Engine을 사용하여 Express를 사용하여 뷰를 렌더링하려면 virtualDirPath 값을 뷰에 전달해야합니다

`res.render('index', { virtualDirPath: virtualDirPath });`

이렇게하는 이유는 배포 후에 모든보기를 수정하지 않고 사이트가 호스팅되는 위치를 알기 위해 앱 및 정적 리소스 경로로 다른보기 호스트에 대한 하이퍼 링크를 만드는 것입니다. 이는 IISNode와 함께 가상 디렉터리를 사용하는 데있어서 더욱 귀찮고 지루한 함정 중 하나입니다.

버전

위의 모든 예제는

  • Express v4.x
  • IIS 7.x / 8.x
  • Socket.io v1.3.x 이상

시작하기

IISNode를 사용하면 .NET 애플리케이션처럼 Node.js 웹 애플리케이션을 IIS 7/8에서 호스팅 할 수 있습니다. 물론 Windows에서는 node.exe 프로세스를 스스로 호스팅 할 수 있지만 IIS에서 앱을 실행할 수있는 경우에는 왜 그렇게합니까?

IISNode는 멀티 코어의 처리 manageement 이상 확장 처리 할 node.exe 등을 자동으로 재활용 앱이 업데이트 될 때마다, 단지 그것의 몇 가지 이름을 IIS 응용 프로그램 혜택을 .

요구 사항

IIS에서 Node.js 응용 프로그램을 호스팅하려면 IISNode에 몇 가지 요구 사항이 있습니다.

  1. Node.js는 IIS 호스트에 설치해야합니다 (32 비트 또는 64 비트).
  2. IISNode가 x86 또는 x64를 설치 한 경우 IIS 호스트의 비트 수와 일치해야합니다.
  3. IIS 호스트에 설치된 IIS 용 Microsoft URL 다시 쓰기 모듈
    • 이것은 중요합니다. 그렇지 않으면 Node.js 앱에 대한 요청이 예상대로 작동하지 않습니다.
  4. Node.js 앱의 루트 폴더에있는 Web.config .
  5. 를 통해 IISNode 구성 iisnode.yml 파일이나 <iisnode> 당신의 내부 요소 Web.config .

익스프레스를 사용하는 기본 Hello World 예제

이 예제가 작동하려면 IIS 호스트에 IIS 7/8 응용 프로그램을 만들고 Node.js 웹 응용 프로그램이 들어있는 디렉토리를 실제 디렉토리로 추가해야합니다. 응용 프로그램 / 응용 프로그램 풀 ID가 Node.js 설치에 액세스 할 수 있는지 확인하십시오. 이 예에서는 Node.js 64 비트 설치를 사용합니다.

프로젝트 구조

이것은 IISNode / Node.js 웹 응용 프로그램의 기본 프로젝트 구조입니다. Web.config 추가하는 것을 제외하고는 IISNode가 아닌 웹 응용 프로그램과 거의 동일하게 보입니다.

- /app_root
  - package.json
  - server.js
  - Web.config

server.js - 빠른 애플리케이션

const express = require('express');
const server = express();

// We need to get the port that IISNode passes into us 
// using the PORT environment variable, if it isn't set use a default value
const port = process.env.PORT || 3000;

// Setup a route at the index of our app    
server.get('/', (req, res) => {
    return res.status(200).send('Hello World');
});

server.listen(port, () => {
    console.log(`Listening on ${port}`);
});

구성 및 Web.config

Web.config 는 다음 두 가지가 존재해야한다는 것을 제외하고는 다른 IIS Web.config 와 같습니다. URL <rewrite><rules> 및 IISNode <handler> . 이 두 요소는 모두 <system.webServer> 요소의 하위 요소입니다.

구성

iisnode.yml 파일을 사용하거나 <iisnode> 요소를 Web.config<system.webServer> 하위로 추가하여 IISNode를 구성 할 수 있습니다. 이러한 구성은 모두이 경우에, 하나 그러나 서로 함께 사용할 수 Web.config 지정해야합니다 iisnode.yml 파일 모든 구성 충돌이 걸릴 것 iisnode.yml 대신 파일을 . 이 구성 재정의는 다른 방법으로는 발생할 수 없습니다.

IISNode 처리기

IIS가 server.js 에 Node.js 웹 앱이 있다는 것을 알기 위해서는 그것을 명시 적으로 말해야합니다. IISNode <handler><handlers> 요소에 추가하여이 작업을 수행 할 수 있습니다.

<handlers>
  <add name="iisnode" path="server.js" verb="*" modules="iisnode"/>
</handlers>

URL 다시 쓰기 규칙

구성의 마지막 부분은 IIS 인스턴스로 들어오는 Node.js 응용 프로그램을위한 트래픽이 IISNode로 전달되도록하는 것입니다. URL 다시 쓰기 규칙이 없으면 우리는 http://<host>/server.js 로 이동하여 응용 프로그램을 방문해야하며 server.js 제공하는 리소스를 요청할 때 404 됩니다. 이것이 IISNode 웹 앱에 URL 재 작성이 필요한 이유입니다.

<rewrite>
    <rules>
        <!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
        <rule name="StaticContent" patternSyntax="Wildcard">
            <action type="Rewrite" url="public/{R:0}" logRewrittenUrl="true"/>
            <conditions>
                <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
            </conditions>
            <match url="*.*"/>
        </rule>

        <!-- All other URLs are mapped to the Node.js application entry point -->
        <rule name="DynamicContent">
            <conditions>
                <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
            </conditions>
            <action type="Rewrite" url="server.js"/>
        </rule>
    </rules>
</rewrite>

이 예제 의 64 비트 Node.js 설치를 위한 작업 Web.config 파일입니다 .


이제 IIS 사이트를 방문하여 Node.js 응용 프로그램이 작동하는지 확인하십시오.

를 통해 IIS 가상 디렉터리 또는 중첩 응용 프로그램 사용

IIS에서 가상 디렉터리 또는 중첩 된 응용 프로그램을 사용하는 것이 일반적인 시나리오이며 IISNode를 사용할 때 이점을 활용하려는 경우가 많습니다.

IISNode는 구성을 통해 가상 디렉터리 또는 중첩 응용 프로그램을 직접 지원하지 않으므로이를 구현하기 위해 구성의 일부가 아니며 훨씬 덜 알려진 IISNode의 기능을 활용해야합니다. Web.config 가 포함 된 <appSettings> 요소의 모든 하위 요소는 appSetting 키를 사용하여 process.env 개체에 속성으로 추가됩니다.

<appSettings> 디렉토리에 가상 디렉토리를 만들 수 있습니다.

<appSettings>
  <add key="virtualDirPath" value="/foo" />
</appSettings>

Node.js 앱 내에서 virtualDirPath 설정에 액세스 할 수 있습니다.

console.log(process.env.virtualDirPath); // prints /foo

이제 구성을 위해 <appSettings> 요소를 사용할 수 있으므로이를 활용하여 서버 코드에서 사용할 수 있습니다.

// Access the virtualDirPath appSettings and give it a default value of '/'
// in the event that it doesn't exist or isn't set
var virtualDirPath = process.env.virtualDirPath || '/';

// We also want to make sure that our virtualDirPath 
// always starts with a forward slash
if (!virtualDirPath.startsWith('/', 0))
  virtualDirPath = '/' + virtualDirPath;

// Setup a route at the index of our app    
server.get(virtualDirPath, (req, res) => {
    return res.status(200).send('Hello World');
});

정적 리소스와 함께 virtualDirPath를 사용할 수 있습니다.

// Public Directory
server.use(express.static(path.join(virtualDirPath, 'public')));
// Bower
server.use('/bower_components', express.static(path.join(virtualDirPath, 'bower_components')));

그 모든 것을 하나로 합칠 수 있습니다.

const express = require('express');
const server = express();

const port = process.env.PORT || 3000;

// Access the virtualDirPath appSettings and give it a default value of '/'
// in the event that it doesn't exist or isn't set
var virtualDirPath = process.env.virtualDirPath || '/';

// We also want to make sure that our virtualDirPath 
// always starts with a forward slash
if (!virtualDirPath.startsWith('/', 0))
  virtualDirPath = '/' + virtualDirPath;

// Public Directory
server.use(express.static(path.join(virtualDirPath, 'public')));
// Bower
server.use('/bower_components', express.static(path.join(virtualDirPath, 'bower_components')));

// Setup a route at the index of our app    
server.get(virtualDirPath, (req, res) => {
    return res.status(200).send('Hello World');
});

server.listen(port, () => {
    console.log(`Listening on ${port}`);
});

IISNode와 함께 Socket.io 사용하기

IISNode와 함께 작동하는 Socket.io를 얻으려면 Virtual Directory / Nested Application을 사용하지 않을 때 필요한 유일한 변경 사항이 Web.config 내에 있어야 Web.config .

Socket.io로 시작하는 요청을 보내는 때문에 /socket.io , IISNode이 또한 IISNode을 처리하고 정적 인 파일 요청 또는 다른 트래픽하지해야한다는 IIS에 통신 할 필요가있다. 이를 위해서는 표준 IISNode 응용 프로그램과 다른 <handler> 가 필요합니다.

<handlers>
    <add name="iisnode-socketio" path="server.js" verb="*" modules="iisnode" />
</handlers>

<handlers> 에 대한 변경 외에도 추가 URL 재 작성 규칙을 추가해야합니다. 다시 쓰기 규칙은 모든 /socket.io 트래픽을 Socket.io 서버가 실행중인 서버 파일로 보냅니다.

<rule name="SocketIO" patternSyntax="ECMAScript">
    <match url="socket.io.+"/>
    <action type="Rewrite" url="server.js"/>
</rule>

IIS 8을 사용하는 경우 Web.config 의 webSockets 설정을 해제하고 위의 처리기를 추가하고 규칙을 다시 작성해야합니다. webSocket을 지원하지 않으므로 IIS 7에서는 불필요합니다.

<webSocket enabled="false" />



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow