programing

동일한 서버의 Apache 및 Node.js

telecom 2023. 5. 25. 21:31
반응형

동일한 서버의 Apache 및 Node.js

노드는 빠르고 클라이언트 측에서 사용하는 것과 동일한 언어를 사용하며 정의상 논블로킹이기 때문에 사용하고자 합니다.하지만 파일 처리(저장, 편집, 이름 바꾸기, 다운로드, 파일 업로드 등)를 위해 프로그램을 작성하기 위해 고용한 사람은 아파치를 사용하기를 원합니다.그래서, 나는 해야만 합니다.

  1. 노드를 사용하도록 설득합니다(그는 그것에 대한 근거를 거의 포기하지 않습니다).

  2. 노드에서 파일을 업로드, 다운로드, 이름 변경, 저장 등의 방법을 확인합니다.

  3. 나는 아파치와 노드를 같은 서버에 설치해야 합니다.

어떤 것이 가장 유리한 상황이며, 어떻게 구현해야 합니까?

좋은 질문입니다!

Apache에서 실행되는 PHP에는 많은 웹 사이트와 무료 웹 앱이 구현되어 있습니다. 많은 사람들이 사용하기 때문에 매우 쉬운 것을 매쉬할 수 있고, 게다가 정적 콘텐츠를 제공하는 더 쉬운 방법입니다.노드는 빠르고 강력하며 우아하며 V8의 물리적 성능과 내장된 종속성이 없는 플랫 스택을 갖춘 섹시한 툴입니다.

또한 Apache의 용이성/유연성과 동시에 Node의 투덜거림과 우아함을 원합니다.JS, 왜 둘 다 못 먹어요?

다행히도 Apache에서 ProxyPass 지시문이 있습니다.httpd.conf특정 URL의 모든 요청을 노드에 파이프로 연결하는 것은 그리 어렵지 않습니다.JS 애플리케이션.

ProxyPass /node http://localhost:8000

또한 http 요청을 재라우팅하기 위한 올바른 프록시 및 하위 모듈을 얻을 수 있도록 다음 행이 주석 처리되지 않았는지 확인합니다.

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

그런 다음 포트 8000에서 노드 앱을 실행합니다!

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Apache!\n');
}).listen(8000, '127.0.0.1');

그러면 모든 노드에 액세스할 수 있습니다.다음을 사용하는 JS 로직/node/당신의 URL에 있는 경로, 당신의 기존 PHP 페이지를 호스팅하기 위해 웹사이트의 나머지 부분을 Apache에 남겨둘 수 있습니다.

여기에 이미지 설명 입력

이제 남은 것은 호스팅 회사에 이 구성으로 실행할 수 있도록 설득하는 것입니다.

이 질문은 Server Fault에 더 많이 포함되지만 FWIW Node.js 앞에서 Apache를 실행하는 것은 대부분의 경우 좋은 접근 방식이 아닙니다.

Apache의 ProxyPass는 Tomcat 기반 서비스를 사이트의 일부로 노출하는 것과 같은 다양한 용도에 적합하며, Node.js 앱이 특정한 작은 역할을 수행하거나 제한된 수의 사용자만 보유할 수 있는 내부 도구일 경우에는 이를 사용하는 것이 더 쉬울 수 있습니다.하지만 그것은 여기의 경우처럼 들리지 않습니다.

성능과 확장성을 활용하려면 Node.js를 사용하는 것이 좋습니다. 특히 웹 소켓과 같은 영구 연결을 유지하는 것과 관련된 것을 사용하려면 다른 포트(예: localhost:8080, Node의 Apache)에서 Apache와 Node.js를 모두 실행하는 것이 좋습니다.js on localhost:3000)을 실행한 다음 nginx, Vanish 또는 HA 프록시와 같은 것을 앞에서 실행하고 트래픽을 그런 식으로 라우팅합니다.

바니시 또는 nginx와 같은 것을 사용하여 경로 및/또는 호스트를 기준으로 트래픽을 라우팅할 수 있습니다.둘 다 시스템 리소스를 훨씬 적게 사용하고 Apache를 사용하여 동일한 작업을 수행하는 것보다 훨씬 확장성이 높습니다.


를 실행하는 방법node server를 따라서apache2(v2.4.xx) server:

특정 URL의 모든 요청을 노드에 파이프로 연결합니다.JS 응용프로그램 만들기CUSTOM.conf줄을 지어 안으로 들어가다/etc/apache2/conf-available디렉토리를 지정하고 생성된 파일에 다음 행을 추가합니다.

ProxyPass /node http://localhost:8000/

을 기본 합니다. 8000은 기본 설정 포트 번호입니다.node server.
다음 명령을 사용하여 사용자 지정 구성을 사용하도록 설정합니다.

$> sudo a2enconf CUSTOM

확장자 입니다. CUSTOM을 활성화합니다. 그런 다음 활성화합니다.proxy_http다음 명령을 사용합니다.

$> sudo a2enmod proxy_http

다 .proxy그리고.proxy_http모듈 사용하여 의 활성화 할 수 .다음을 사용하여 모듈의 활성화 여부를 확인할 수 있습니다.

$> sudo a2query -m MODULE_NAME

구성 및 모듈을 활성화한 후 Apache 서버를 다시 시작해야 합니다.

$> sudo service apache2 restart

이제 노드 서버를 실행할 수 있습니다.에 대한 URL/node노드 서버에서 처리됩니다.

한 서버에서 노드와 Apache를 실행하는 것은 충돌하지 않기 때문에 사소한 일입니다.NodeJS는 JavaScript 서버 측을 실행하는 방법일 뿐입니다.진정한 딜레마는 외부에서 노드와 Apache에 모두 액세스하는 것에서 비롯됩니다.제가 보기에 당신은 두 가지 선택권이 있습니다.

  1. 일치하는 모든 요청을 NodeJS에 프록시하도록 Apache를 설정합니다. 그러면 파일 업로드 및 노드의 다른 모든 작업이 수행됩니다.

  2. 서로 다른 IP:포트 조합에 Apache와 Node가 있어야 합니다(서버에 IP가 두 개 있는 경우 하나는 노드 수신기에 바인딩되고 다른 하나는 Apache에 바인딩될 수 있습니다).

저는 또한 이것이 당신이 실제로 찾고 있는 것이 아닐 수도 있다는 의심이 들기 시작했습니다.최종 목표가 애플리케이션 로직을 Nodejs로 작성하고 일부 "파일 처리" 부분을 계약업체에 오프로드하는 것이라면 웹 서버가 아닌 언어 선택입니다.

nodejs로 역방향 프록시 서버를 작성하여 Apache 및 다른 모든 nodejs 앱을 프록시하는 등의 다른 접근 방식을 사용할 수 있습니다.

먼저 Apache를 포트 80이 아닌 다른 포트에서 실행해야 합니다. ex: 포트 8080

그런 다음 nodejs를 사용하여 역방향 프록시 스크립트를 작성할 수 있습니다.

var proxy = require('redbird')({port: 80, xfwd: false);

proxy.register("mydomain.me/blog", "http://mydomain.me:8080/blog");
proxy.register("mydomain.me", "http://mydomain.me:3000");

다음 기사는 이것을 만드는 전체 과정을 설명합니다.

NODE JS 역방향 프록시로 Apache 실행 – RedBird 사용

위의 답변을 certbot SSL cert와 CORS access-control-allow-header를 조합하여 사용할 수 있도록 하여 결과를 공유하고자 합니다.

Apache httpd.conf가 파일 하단에 추가되었습니다.

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

Apache VirtualHost 설정(PHP용 doc 루트는 Apache 및 SSL 아래 Certbot에 있으며 node.js/socket.io 사이트는 포트 3000에서 실행되며 Apache의 SSL 인증서를 사용합니다) 또한 node.js 사이트는 /nodejs, socket.io 및 ws(웹 소켓) 폴더에 대해 프록시를 사용합니다.

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName www.example.com
    ServerAlias www.example.com
    DocumentRoot /var/html/www.example.com
    ErrorLog /var/html/log/error.log
    CustomLog /var/html/log/requests.log combined
    SSLCertificateFile /etc/letsencrypt/live/www.example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf

    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^socket.io          [NC]
    RewriteCond %{QUERY_STRING} transport=websocket [NC]
    RewriteRule /{.*}       ws://localhost:3000/$1  [P,L]

    RewriteCond %{HTTP:Connection} Upgrade [NC]
    RewriteRule /(.*) ws://localhost:3000/$1 [P,L]

    ProxyPass /nodejs http://localhost:3000/
    ProxyPassReverse /nodejs http://localhost:3000/

    ProxyPass /socket.io http://localhost:3000/socket.io
    ProxyPassReverse /socket.io http://localhost:3000/socket.io

    ProxyPass /socket.io ws://localhost:3000/socket.io
    ProxyPassReverse /socket.io ws://localhost:3000/socket.io

</VirtualHost>
</IfModule>

그러면 내 node.js app(app.js):

var express = require('express');
var app = express();
    app.use(function(req, res, next) {
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "X-Requested-With");
        res.header("Access-Control-Allow-Headers", "Content-Type");
        res.header("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS");
        next();
    });
var http = require('http').Server(app);
var io = require('socket.io')(http);

http.listen({host:'0.0.0.0',port:3000});

ip4 수신기를 강제로 사용하지만, 이는 선택 사항입니다. 대체할 수 있습니다.

http.listen(3000);

node.js app(app.js) 코드는 다음과 같이 계속됩니다.

io.of('/nodejs').on('connection', function(socket) {
    //optional settings:
    io.set('heartbeat timeout', 3000); 
    io.set('heartbeat interval', 1000);

    //listener for when a user is added
    socket.on('add user', function(data) {
         socket.join('AnyRoomName');
         socket.broadcast.emit('user joined', data);
    });

    //listener for when a user leaves
    socket.on('remove user', function(data) {
         socket.leave('AnyRoomName');
         socket.broadcast.emit('user left', data);
    });

    //sample listener for any other function
    socket.on('named-event', function(data) {
         //code....
         socket.broadcast.emit('named-event-broadcast', data);
    });

    // add more listeners as needed... use different named-events...
});

마지막으로 클라이언트 측에서(nodejs.js로 생성됨):

//notice the /nodejs path
var socket = io.connect('https://www.example.com/nodejs');

//listener for user joined
socket.on('user joined', function(data) {
    // code... data shows who joined...
});

//listener for user left
socket.on('user left', function(data) {
    // code... data shows who left...
});

// sample listener for any function:
socket.on('named-event-broadcast', function(data) {
    // this receives the broadcast data (I use json then parse and execute code)
    console.log('data1=' + data.data1);
    console.log('data2=' + data.data2);
});

// sample send broadcast json data for user joined:
socket.emit('user joined', {
    'userid': 'userid-value',
    'username':'username-value'
});

// sample send broadcast json data for user left 
//(I added the following with an event listener for 'beforeunload'):
// socket.emit('user joined', {
//     'userid': 'userid-value',
//     'username':'username-value'
// });

// sample send broadcast json data for any named-event:
socket.emit('named-event', {
    'data1': 'value1',
    'data2':'value2'
});

이 예에서는 JS가 로드될 때 JSON의 데이터를 node.js/socket.io 서버로 보내는 "named-event"를 소켓으로 내보냅니다.

경로/nodejs(클라이언트에 의해 연결됨) 아래 서버의 IO 및 소켓을 사용하여 데이터를 수신한 다음 브로드캐스트로 다시 보냅니다.소켓의 다른 사용자는 "이름 지정 이벤트 브로드캐스트" 수신기와 함께 데이터를 수신합니다.보낸 사람은 자신의 브로드캐스트를 수신하지 않습니다.

ProxyPass /node http://localhost:8000/     
  • 이것은 내가 httpd.conf 대신 httpd-vhosts.conf에서 위의 항목을 만들 때 나에게 효과가 있었습니다.
  • 환경에 XAMPP가 설치되어 있으며 8080 포트에서 실행 중인 NodeJS 애플리케이션을 사용하여 apache 80의 모든 트래픽을 처리하려고 했습니다(예: http://localhost/[name_of_node_application]).

저는 최근에 이런 종류의 문제에 부딪혔습니다. PHP 기반의 코드 점화기 프로젝트에서 웹 소켓을 사용하여 클라이언트와 서버 간에 통신해야 합니다.

는 포트중인 앱를 포트실에를이에 했습니다.Allow incoming TCP ports&Allow outgoing TCP ports목록입니다.

은 이러구에수있다에서 할 수 .Firewall Configurations서버의 WHM 패널에 있습니다.

저는 같은 정보를 찾고 있었습니다.마침내 @Straseus의 위 답변 링크에서 답을 찾았습니다.

http://arguments.callee.info/2010/04/20/running-apache-and-node-js-together/

다음은 포트 80에서 Apache 웹 사이트를 실행하고 포트 8080에서 노드 js 서비스를 실행하고 .htaccess RewriteRule을 사용하는 최종 솔루션입니다.

Apache 웹 사이트의 DocumentRoot에서 다음을 추가합니다.

Options +FollowSymLinks -MultiViews

<IfModule mod_rewrite.c>

RewriteEngine on

# Simple URL redirect:
RewriteRule ^test.html$ http://arguments.callee.info:8000/test/ [P]

# More complicated (the user sees only "benchmark.html" in their address bar)
RewriteRule ^benchmark.html$ http://arguments.callee.info:8000/node?action=benchmark [P]

# Redirect a whole subdirectory:
RewriteRule ^node/(.*) http://arguments.callee.info:8000/$1 [P]

디렉터리 수준 리디렉션의 경우 위의 링크에서 'node/' 뒤에 하나 이상의 문자가 필요한 (.+) 규칙을 제안했습니다.제 물건이 작동하려면 0 이상인 (.*)으로 변환해야 했습니다.

@Straseus 링크 정말 감사합니다.

당신이 Apache와 Node를 언급하기 때문에 웹 앱을 만들고 있다고 생각합니다.빠른 답변 - 가능한가요 - 네.권장됩니까? - 아니요.노드는 자체 웹 서버를 번들로 제공하며 대부분의 웹 사이트는 포트 80에서 실행됩니다.또한 현재 Nodejs에서 지원하는 Apache 플러그인이 없다고 가정하고 가상 호스트를 생성하는 것이 이를 구현하는 가장 좋은 방법인지 확신할 수 없습니다.Joyent의 좋은 사람들처럼 Nodejs를 유지하는 개발자들이 대답해야 할 질문들입니다.

포트 대신, 대부분의 다른 기술 스택과 완전히 다른 Node의 기술 스택을 평가하는 것이 더 나을 것입니다. 그래서 제가 이 스택을 좋아하는 이유이기도 하지만 미리 알아야 할 몇 가지 타협점도 있습니다.

예제는 CMS 또는 공유 웹 앱과 유사하며 Apache에서 잘 실행되는 수백 개의 즉시 사용 가능한 앱이 있습니다.기성 솔루션이 마음에 들지 않더라도 PHP/Java/Python으로 웹 앱을 작성하거나 기성 앱 몇 개와 혼합하여 사용할 수 있으며, 이들은 모두 단일 Apache 인스턴스에서 실행되도록 설계 및 지원됩니다.

잠시 멈추고 제가 방금 한 말에 대해 생각해 볼 시간입니다.

이제 사용할 기술 스택을 결정할 준비가 되었습니다.만약 당신의 웹사이트가 Apache를 필요로 하는 수천 개의 미리 만들어진 앱 중 어떤 것도 사용하지 않는다면, 당신은 먼저 제가 앞서 말한 가정을 제거해야 합니다.

결국, 기술 스택을 선택하는 것이 그 어떤 개별 구성요소보다 훨씬 더 중요합니다.

업로드와 다운로드를 처리하기 위해 node.js 파일 시스템 api를 사용하는 것은 상대적으로 사소한 일이지만 장기적으로 웹 사이트에서 원하는 것이 무엇인지 더 많이 생각한 다음 기술 스택을 선택한다는 @Straseus의 의견에 전적으로 동의합니다.

노드의 프레임워크를 학습하는 것은 다른 프레임워크를 학습하는 것보다 쉽지만 만병통치약은 아닙니다.조금 더 노력하면(그 자체로 가치 있는 노력이 될 수도 있음) 다른 프레임워크도 배울 수 있습니다.우리 모두는 서로에게서 배우고 있으며, 혼자서 일하는 것보다 소규모 팀으로 일하는 경우 생산성이 향상되고 백엔드 기술력도 빠르게 발전할 수 있습니다.그러므로, 당신의 팀의 다른 멤버들의 기술을 그렇게 싸게 할인하지 마세요.

이 게시물은 1년 정도 된 것으로 이미 결정하셨을 가능성이 높지만, 저의 고함소리가 비슷한 결정을 하고 있는 다음 사람에게 도움이 되길 바랍니다.

읽어주셔서 감사합니다.

언급URL : https://stackoverflow.com/questions/9831594/apache-and-node-js-on-the-same-server

반응형