node.js - 설치 - 도커 노드




Node.js+Nginx-지금은 무엇입니까? (8)

내 서버에 Node.js와 Nginx를 설정했습니다. 이제 그것을 사용하고 싶지만 시작하기 전에 다음 두 가지 질문이 있습니다.

  1. 그들은 어떻게 함께 일해야합니까? 요청을 어떻게 처리해야합니까?
  2. Node.js 서버에는 다음 두 가지 개념이 있습니다.

    에이. 필요한 각 웹 사이트에 대해 별도의 HTTP 서버를 만듭니다. 그런 다음 프로그램 시작시 모든 JavaScript 코드를로드하면 코드가 한 번 해석됩니다.

    비. 모든 Node.js 요청을 처리하는 하나의 Node.js 서버를 만듭니다. 이것은 요청 된 파일을 읽고 내용을 밝힙니다. 따라서 파일은 각 요청에서 해석되지만 서버 논리는 훨씬 간단합니다.

Node.js를 올바르게 사용하는 방법이 명확하지 않습니다.


Nginx 구성을 가진 Node.js.

$ sudo nano /etc/nginx/sites-available/subdomain.your_domain.com

우리가 "subdomain.your_domain.com"에서 왔을 때 Nginx가 프록시 역할을하는 서버의 포트 3000 트래픽으로 리디렉션되도록 다음 구성을 추가하십시오.

upstream subdomain.your_domain.com {
  server 127.0.0.1:3000;
}
server {
  listen 80;
  listen [::]:80;
  server_name subdomain.your_domain.com;
  access_log /var/log/nginx/subdomain.your_domain.access.log;
  error_log /var/log/nginx/subdomain.your_domain.error.log debug;
  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://subdomain.your_domain.com;
    proxy_redirect off;
  }
}

Nginx가 역방향 프록시 역할을하는 Nodejs 앱을 쉽게 설정할 수 있습니다.
다음 구성에서는 NodeJS 응용 프로그램이 127.0.0.1:8080에서 실행되고 있다고 가정합니다.

  server{
     server_name domain.com sub.domain.com; # multiple domains

     location /{ 
      proxy_pass http://127.0.0.1:8080;  
      proxy_set_header Host $host;
      proxy_pass_request_headers on;  
     }

     location /static/{
       alias /absolute/path/to/static/files; # nginx will handle js/css
     }
   } 

위의 설정에서 Nodejs 응용 프로그램은,

  • 도메인 특정 로직을 적용하여 응답을 제공 할 수있는 HTTP_HOST 헤더를 가져옵니다. '
  • 상황 처리 / 소켓이나 자원 재사용 등을 위해 pm2 나 관리자와 같은 프로세스 관리자가 귀하의 응용 프로그램을 관리해야합니다.

  • sentry 또는 rollbar 같은 생산 오류를위한 오류보고 서비스 설정

참고 : 도메인 지정 요청 경로를 전달하고 expressjs 응용 프로그램 용 middleware 를 만들 수있는 논리를 설정할 수 있습니다


Nginx는 프로젝트 관리자처럼 작동하는 리버스 프록시 서버의 역할을 할 수 있습니다. 요청을 받으면 요청을 분석하여 요청을 업스트림 (프로젝트 구성원)에게 전달하거나 처리합니다. Nginx는 어떻게 구성되었는지에 따라 요청을 처리하는 두 가지 방법이 있습니다.

  • 요청을 제공하다
  • 요청을 다른 서버로 전달

    server{
     server_name mydomain.com sub.mydomain.com;
    
     location /{ 
      proxy_pass http://127.0.0.1:8000;  
      proxy_set_header Host $host;
      proxy_pass_request_headers on;  
     }
    
     location /static/{
       alias /my/static/files/path;
     }
    

    }

서버 요청

이 구성을 사용하면 요청 URL이 mydomain.com/static/myjs.js 일 때 /my/static/files/path 폴더에 myjs.js 파일이 반환됩니다. 정적 파일을 제공하도록 nginx를 구성하면 요청 자체를 처리합니다.

요청을 다른 서버로 전달

요청 URL이 mydomain.com/dothis nginx는 요청을 http://127.0.0.1:8000으로 전달합니다. localhost 8000 포트에서 실행중인 서비스는 요청을 수신하고 nginx에 대한 응답을 반환하며 nginx는 클라이언트에 응답을 반환합니다.

포트 8000에서 node.js 서버를 실행하면 nginx는 node.js로 요청을 전달합니다. node.js 논리를 작성하고 요청을 처리하십시오. 그것은 당신이 당신의 nodejs 서버가 nginx 서버 뒤에 실행되도록했습니다.

nodejs가 아닌 다른 서비스를 실행하고 싶다면 Django, flask, php 같은 다른 서비스를 다른 포트에서 실행하고 nginx에서 설정하십시오.


Nginx를 통해 독립적 인 노드 익스프레스 어플리케이션을 프록시합니다.

따라서 새로운 응용 프로그램을 쉽게 탑재 할 수 있으며 다른 위치의 동일한 서버에서 다른 응용 프로그램을 실행할 수도 있습니다.

다음은 Nginx 설정 예제를 사용한 내 설정에 대한 자세한 내용입니다.

Nginx를 사용하여 하나의 웹 서버에 여러 노드 응용 프로그램을 하위 폴더로 배포

localhost에서 인터넷으로 애플리케이션을 옮겨야하는 경우 Node를 사용하는 것이 까다로워집니다.

노드 배포에는 일반적인 방법이 없습니다.

Google은이 주제에 대한 수많은 기사를 찾을 수 있지만 필자는 필요한 설정에 대한 적절한 해결책을 찾으려고 애 쓰고있었습니다.

기본적으로 웹 서버가 있고 응용 프로그램 코드에 구성 종속성을 도입하지 않고 노드 응용 프로그램을 하위 폴더 (예 : http://myhost/demo/pet-project/ )에 탑재해야합니다.

동시에 나는 블로그와 같은 다른 것들이 동일한 웹 서버에서 실행되기를 원한다.

간단한 것 같네요? 명백하게.

웹 노드 응용 프로그램의 많은 예제에서 포트 80에서 실행되거나 Nginx에서 루트로 프록시 처리됩니다.

두 가지 접근법이 특정 유스 케이스에 대해 유효하더라도 내 단순하면서도 이국적인 기준을 충족시키지 못합니다.

이것이 내가 Nginx 구성을 작성한 이유이며 여기에 추출물이 있습니다.

upstream pet_project {
  server localhost:3000;
}

server {
  listen 80;
  listen [::]:80;
  server_name frontend;

  location /demo/pet-project {
    alias /opt/demo/pet-project/public/;
    try_files $uri $uri/ @pet-project;
  }

  location @pet-project {
    rewrite /demo/pet-project(.*) $1 break;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $proxy_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://pet_project;
    proxy_redirect http://pet_project/ /demo/pet-project/;
  }
}

이 예제에서 포트 3000에서 실행중인 Pet Project Node 응용 프로그램을 http://myhost/demo/pet-project 마운트한다는 것을 알 수 있습니다.

우선 Nginx는 요청 된 리소스가 / opt / demo / pet-project / public /에 있는 정적 파일인지 여부를 확인합니다. 그렇다면 매우 효율적이기 때문에 Nginx는 Connect와 같은 중복 레이어가 필요하지 않습니다. 정적 미들웨어.

그런 다음 다른 모든 요청을 덮어 쓰고 Pet Project Node 응용 프로그램으로 프록시 처리하므로 노드 응용 프로그램은 실제로 마운트 된 위치를 알 필요가 없으므로 구성별로 어디든 이동할 수 있습니다.

proxy_redirect 는 Location 헤더를 올바르게 처리해야합니다. 노드 응용 프로그램에서 res.redirect () 를 사용하는 경우 매우 중요합니다.

다른 포트에서 실행중인 여러 노드 응용 프로그램에 대해이 설정을 쉽게 복제하고 다른 목적으로 위치 처리기를 더 추가 할 수 있습니다.

보낸 사람 : http://skovalyov.blogspot.dk/2012/07/deploy-multiple-node-applications-on.html


각 마이크로 서비스 수단을 관리하고 실행하려면 pm2를 사용하여 nodej를 실행할 수 있습니다. 노드가 nginx (/etc/nginx/sites-enabled/domain.com)에서 해당 포트를 구성하는 바로 그 포트에서 실행됩니다.

server{
    listen 80;
    server_name domain.com www.domain.com;

  location / {
     return 403;
  }
    location /url {
        proxy_pass http://localhost:51967/info;
    }
}

ping을 사용하여 localhost가 실행 중인지 확인하십시오.

Create one single Node.js server which handles all Node.js requests. This reads the requested files and evals their contents. So the files are interpreted on each request, but the server logic is much simpler.

이것은 당신이 더 쉽게 말했듯이 최고입니다.


귀하의 질문에 대답 2 :

옵션 b 를 사용하는 이유는 훨씬 적은 자원을 소비하기 때문입니다. 옵션 'a'를 사용하면 모든 클라이언트가 서버가 많은 메모리를 소비하게하여 필요한 모든 파일을로드합니다 (PHP가 마음에 들지만이 문제도 마찬가지입니다). 옵션 'b'를 사용하면 라이브러리 (재사용 가능한 코드)를로드하고 모든 클라이언트 요청간에 공유 할 수 있습니다.

하지만 다중 코어를 사용한다면 node.js를 모두 조정해야합니다.


또한 nginx로 여러 도메인을 설정하고 여러 node.js 프로세스로 전달할 수 있습니다.

예를 들어 다음을 달성하십시오.

/ etc / nginx / sites-enabled / domain1

server {
    listen 80;
    listen [::]:80;
    server_name domain1.com;
    access_log /var/log/nginx/domain1.access.log;
    location / {
        proxy_pass    http://127.0.0.1:4000/;
    }
}

/ etc / nginx / sites-enabled / domain2에 있음

server {
    listen 80;
    listen [::]:80;
    server_name domain2.com;
    access_log /var/log/nginx/domain2.access.log;
    location / {
        proxy_pass    http://127.0.0.1:5000/;
    }
}

한 서버 구성에서 앱에 대해 다른 URL을 가질 수도 있습니다.

/ etc / nginx / sites-enabled / yourdomain에 있음 :

server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com;

    location ^~ /app1/{
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass    http://127.0.0.1:3000/;
    }

    location ^~ /app2/{
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass    http://127.0.0.1:4000/;
    }
}

nginx를 다시 시작하십시오.

sudo service nginx restart

응용 프로그램 시작.

노드 app1.js

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello from app1!\n');
}).listen(3000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:3000/');

노드 app2.js

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello from app2!\n');
}).listen(4000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:4000/');




concept