Node.js
IISNode를 사용하여 IIS에서 Node.js 웹 응용 프로그램 호스팅
수색…
비고
뷰가있는 가상 디렉터리 / 중첩 된 응용 프로그램
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에 몇 가지 요구 사항이 있습니다.
- Node.js는 IIS 호스트에 설치해야합니다 (32 비트 또는 64 비트).
- IISNode가 x86 또는 x64를 설치 한 경우 IIS 호스트의 비트 수와 일치해야합니다.
- IIS 호스트에 설치된 IIS 용 Microsoft URL 다시 쓰기 모듈
- 이것은 중요합니다. 그렇지 않으면 Node.js 앱에 대한 요청이 예상대로 작동하지 않습니다.
- Node.js 앱의 루트 폴더에있는
Web.config
. - 를 통해 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" />