Apache에서 Node.js를 실행하고 있습니까?


78

Perl을 사용하여 페이지를 제공하는 시스템에 Apache Webserver가 설치되어 있습니다.

프로젝트의 경우 Perl / Ruby 대신 Node.js를 사용하기로 결정했습니다. Apache를 내 웹 서버로 사용하고 (페이지를 제공하므로) Node.js를 사용하여 웹 페이지를 동적으로 생성 할 수 있는지 궁금하십니까?

즉, Apache / Perl 또는 Apache / PHP 등과 같이 함께 작동 할 수 있습니다.

답변:


73

아파치를 통해 nodejs 사이트를 호스팅하는 것은 아파치 프록시 모듈로 구성 할 수 있습니다.

기본 포트 1337을 사용하여 localhost에서 nodejs 서버를 시작하는 것이 좋습니다.

다음 명령으로 프록시를 활성화합니다.

sudo a2enmod proxy proxy_http

서버를 보호 할 때까지 ProxyRequests로 프록 싱을 활성화하지 마십시오. 개방형 프록시 서버는 네트워크와 인터넷 모두에 위험합니다. ProxyRequests를 Off로 설정해도 ProxyPass 지정 문의 사용이 비활성화되지 않습니다.

/ etc / apche2 / sites-availables 구성

<VirtualHost *:80>
    ServerAdmin admin@site.com
    ServerName site.com
    ServerAlias www.site.com 

    ProxyRequests off

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    <Location />
        ProxyPass http://localhost:1337/
        ProxyPassReverse http://localhost:1337/
    </Location>
</VirtualHost>

apache2 서비스를 다시 시작하십시오.



3
첫째, 매우 멋지다. 둘째-실제로 노드의 기본 포트는 leet speak에서 'elite'여야합니까?
Gerard ONeill

1
그것은 단지 추천이었습니다.
Evgeny Karpov

/ProxyPass 및 ProxyPassReverse 지시문 의 후행 슬래시 가 중요하다는 점을 지적하고 싶습니다 . 설정하지 않으면 502 (프록시 오류) 응답을 받게됩니다. 친구에게 일어났습니다.
Nicolás Fantone

43

아니요. NodeJS는 mod-perl 및 mod-php와 같은 방식으로 Apache 모듈로 사용할 수 없으므로 Apache "위에서"노드를 실행할 수 없습니다. hexist가 지적했듯이 노드를 별도의 프로세스로 실행하고 둘 사이의 통신을 정렬 할 수 있지만 이것은 이미 사용중인 LAMP 스택과는 상당히 다릅니다.

Apache를 대체하는 노드는 동시 연결이 많은 경우 성능 이점을 제공합니다. 또한 여러분이 생각할 수있는 거의 모든 것을위한 거대한 모듈 생태계가 있습니다.

귀하의 질문에 따르면 모든 요청에 ​​대해 동적으로 페이지를 생성해야하는지 아니면 캐싱 및 제공을 위해 주기적으로 새 콘텐츠를 생성해야하는지 명확하지 않습니다. 후자의 경우 별도의 노드 작업을 사용하여 Apache가 제공 할 디렉토리에 콘텐츠를 생성 할 수 있지만, 이는 PHP 또는 Perl과는 상당히 다릅니다.

노드는 정적 콘텐츠를 제공하는 가장 좋은 방법이 아닙니다. Nginx와 Varnish가 더 효과적입니다. Node가 동적 데이터를 처리하는 동안 정적 콘텐츠를 제공 할 수 있습니다.

웹 애플리케이션에 노드 사용을 고려하고 있다면 Express가 목록에 있어야합니다. Node에서만 웹 애플리케이션을 구현할 수 있지만 Express (및 Flatiron, Derby 및 Meteor와 같은 유사한 프레임 워크)는 많은 고통과 지루함을 없애도록 설계되었습니다. Express 문서는 처음에는 약간 드물게 보일 수 있지만 여기에서 여전히 사용 가능한 화면 캐스트를 확인하십시오. http://expressjs.com/2x/screencasts.html Express에서 제공하는 내용과 이유에 대한 좋은 이해 쓸모있다. ExpressJS 용 github 저장소에는 인증에서 앱 구성에 이르기까지 모든 것에 대한 좋은 예가 많이 포함되어 있습니다.


1
감사합니다 대런! 다행스럽게도이 프로젝트는 끝난 지 오래되었습니다!
JackSparrow123 2014

2015 년이고이 게시물에서 Express에 대해 방금 배웠습니다. Express vs. Meteor의 장단점에 대해 궁금합니다. Express는 유성보다 Google 트렌드에서 더 크지 만 감소하고 있으며 Meteor는 성장하고 있습니다.
Irina Rapoport 2015

참고로, Express를 가져온 사람들은 이제 Koa를 개발하고 있습니다. 나는 그것을 사용하고 그것을 사랑합니다. 비동기를 수행하는 가장 좋은 방법 인 JavaScript의 async / await 구문을 훌륭하게 사용합니다.
John Deighan

26

여기에 좋은 팁이 많이 있지만 질문에 답하고 싶습니다.

즉, Apache / Perl 또는 Apache / PHP 등과 같이 함께 작동 할 수 있습니다.

, 당신은 측면 Perl과 PHP 함께 아파치에 Node.js를 실행할 수 있습니다 경우 당신이 CGI 모듈로 실행합니다. 아직 아파치 용 모드 노드를 찾을 수 없지만 http://www.cgi-node.org/ 에서 Apache 용 CGI-Node를 확인 하십시오 .

cgi-node 의 흥미로운 부분은 PHP를 사용하여 동적 콘텐츠를 생성하고, 정적 페이지를 서비스하고, SQL 데이터베이스에 액세스하는 것과 똑같이 JavaScript를 사용한다는 것입니다. 서버와 클라이언트 / 브라우저간에 핵심 JavaScript 라이브러리를 공유 할 수도 있습니다.

클라이언트와 서버간에 단일 언어로의 전환이 일어나고 있으며 JavaScript가 좋은 후보 인 것 같습니다.

cgi-node.org 사이트의 간단한 예 :

<? include('myJavaScriptFile.js'); ?>
<html>
   <body>
      <? var helloWorld = 'Hello World!'; ?>
      <b><?= helloWorld ?><br/>
      <? for( var index = 0; index < 10; index++) write(index + ' '); ?>
   </body>
</html>

결과는 다음과 같습니다.

Hello World!
0 1 2 3 4 5 6 7 8 9

또한 HTTP 요청에 대한 전체 액세스 권한이 있습니다. 여기에는 양식, 업로드 된 파일, 헤더 등이 포함됩니다.

현재 Godaddy의 cgi-node 모듈을 통해 Node.js를 실행하고 있습니다.

CGI-Node.org 사이트에는 시작하는 데 필요한 모든 문서가 있습니다.

나는 이것에 대해 열광하고 있다는 것을 알고 있지만 마침내 PHP가 아닌 다른 것을 사용하는 것이 안도감입니다. 또한 클라이언트와 서버 모두에서 JavaScript를 코딩 할 수 있습니다.

도움이 되었기를 바랍니다.


야생에 node-cgi 패키지가 몇 개있는 것 같습니다. CGI-Node는 다음과 같습니다. larsjung.de/node-cgi ? 그렇지 않다면 어느 것이 더 성숙하고 완전한지 알 수 있습니까?
Daniel Sokolowski 2015

1
이것은 Dreamhost에서 동적 콘텐츠를 처리하고 PHP로 작성하지 않기 위해 찾던 솔루션입니다. Viva la JavaScript!
Sukima

이 답변은 질문에 더 직접적으로 대답합니다. php 스크립트를 실행하는 것과 같은 방식으로 node.js 스크립트를 실행할 수있는 다른 웹 서버가 있습니까?
Lonnie Best

@uei No Man, 나는 nodejs를 설치 한 enitre 자습서를 따랐지만 여전히 셸 / 터미널에서 노드 명령을 실행할 수 없습니다. 노드 명령을 찾을 수 없습니다. godaddy 서버에서 index.js 파일을 어떻게 시작 했습니까 ?? 터미널에 명령을 작성하지 않으면 서버 파일을 실행하고 포트 수신을 시작할 방법이 없기 때문에
Faizan

CGI는 프로세스 생성 오버 헤드를 주입 합니다 . 이 나쁜 영향은 FastCGI 또는 네이티브 Apache Node.js 모듈 (mod_php와 같은)을 사용 하여 줄일 수 있습니다 . 어느 경우 - Node.js를 동적 자바 스크립트 페이지는 그것의 초기 단계에있다
Agnius Vasiliauskas

5

원하는 작업을 수행하는 일반적인 방법은 나란히 실행하고 도메인 / URL을 기반으로 아파치에서 node.js로 프록시 요청을하거나 단순히 node.js 콘텐츠를 노드에서 가져 오도록하는 것입니다. Node.js 포트. 이 나중 방법은 사이트에 socket.io 기반 위젯과 같은 것을 갖는 데 매우 잘 작동합니다.


그러나 노드에서 모든 동적 콘텐츠 생성을 수행하려는 경우 node.js를 기본 웹 서버로 사용할 수도 있습니다. 정적 및 동적 http 요청을 모두 제공하는 데 매우 효과적입니다.

보다:

http://expressjs.com/

https://github.com/joyent/node/wiki/modules


Apache Node와 함께 실행하면 실제로 Apache '위에'앉아 있지 않습니까? PHP처럼. 여전히 별도의 인스턴스입니다. 그 맞습니까? 또 다른 질문 ... 동적 페이지를 만들려면 Express가 필요합니까 아니면 Node.js를 단독으로 사용할 수 있습니까? 표현에 많은 정보를 ...있을 것 같지 않습니다
JackSparrow123

맞습니다. node.js는 자체 프로세스에서 실행됩니다. Express는 http 요청 항목을 처리합니다 . expressjs.com/api.html을 참조 하세요 . 시작하기가 매우 쉽습니다. 페이지 시작 부분의 hello world는 첫 페이지에 필요한 모든 것입니다. 동적 콘텐츠를 생성하려면 Express를 통해 반환 할 콘텐츠를 생성하는 템플릿 엔진의 형태를 원할 것입니다. github.com/joyent/node/wiki/modules#wiki-templating for a 좋은 목록입니다.
hexist

그러나 순수한 Node.js를 사용하여 hello world 페이지를 만들 수도 있습니다.
JackSparrow123

그것은 본질적으로 아파치에서 얻는 모든 라우팅 항목을 제공합니다 (조금 더 유연하고 강력하지만).
hexist

1

항상 다음과 같은 쉘 스크립트를 수행 할 수 있습니다.

#!/usr/bin/node

var header = "Content-type: text/plain\n";
var hi = "Hello World from nodetest!";
console.log(header);
console.log(hi);

exit;

0

내 자신의 서버 측 JS 실험을 수행하는 동안 나는 teajs 를 사용하게 되었습니다 . common.js를 준수하고 V8을 기반으로하며 'mod_teajs'아파치 서버 모듈을 제공하는 유일한 프로젝트입니다.

내 생각에 Node.js 서버는 프로덕션 준비가되어 있지 않고 너무 많은 기능이 부족합니다. Apache는 전투 테스트를 거쳐 SSJS를 수행하는 올바른 방법입니다.


0

PHP를 사용하는 경우 shell_exec를 통해 노드 스크립트에 요청을 전달하여 명령 줄에서 JSON 문자열로 스크립트에 인수를 전달할 수 있습니다. 통화 예 :

<?php
    shell_exec("node nodeScript.js"); // without arguments
    shell_exec("node nodeScript.js '{[your JSON here]}'"); //with arguments
?>

주의 할 점은 사용자 데이터가 명령 줄 근처로 이동할 때 매우 주의 해야한다는 것입니다 . 악몽의 예 :

<?php
    $evilUserData = "'; [malicious commands here];";
    shell_exec("node nodeScript.js '{$evilUserData}'");
?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.