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

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

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

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



답변

아파치를 통해 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 서비스를 다시 시작하십시오.


답변

아니요. 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 저장소에는 인증에서 앱 구성에 이르기까지 모든 것에 대한 좋은 예가 많이 포함되어 있습니다.


답변

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

즉, 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를 코딩 할 수 있습니다.

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


답변

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


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

보다:

http://expressjs.com/

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


답변

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

#!/usr/bin/node

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

exit;


답변

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

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


답변

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}'");
?>