하나의 서버에서 nginx와 node.js를 어떻게 실행할 수 있나요?

하나의 서버에서 nginx와 node.js를 어떻게 실행할 수 있나요?

동일한 서버에서 wordpress/php와 node.js를 모두 호스팅하려면 어떤 설정을 사용할 수 있나요? Ubuntu 12.04 서버인 Digitalocean의 VPS가 있습니다.

Apache -> Nginx -> Varnish와 같은 일부 용도를 읽었지만 Nginx가 있으면 Varnish가 필요하지 않다는 내용을 다시 읽었습니다.

내가 지금 가지고 있는 솔루션은 2개의 백엔드(Apache용 하나, Node.js용 하나)가 있는 포트 80의 Varnish입니다.

Varnish 뒤의 Apache 대신 nginx에서 작동합니까?

답변1

예, Apache를 Nginx용으로 전환하면 기존 설정(Apache 및 Node.js 백엔드가 포함된 Varnish 프런트 엔드)이 동일하게 작동합니다(예: Varnish는 백엔드에 특별히 신경 쓰지 않습니다. Nginx와 Apache는 동일하게 처리됩니다). .

Node.js는 일반적으로 Nginx와 함께 실행됩니다. 왜냐하면 Node.js를 통하는 것보다 Nginx를 통해 직접 정적 자산을 제공하는 것이 훨씬 더 효율적이기 때문입니다. 간단한 설정을 위해 Varnish를 완전히 제거할 수 있습니다. Node.js는 포트 80에서 실행되고 선택 요청을 Node.js 업스트림 서버로 프록시합니다.

upstream nodejs  {
      server 127.0.0.1:3000;
      server 127.0.0.1:3000;
}

server {
        listen 80 default_server;
        server_name  www.example.com;
        error_log /var/log/nginx/www.example.com/error.log;
        access_log /var/log/nginx/www.example.com/access.log;
        root   /var/www/www.example.com/public;

        location / {
             try_files $uri @nodejs;
        }

        location @nodejs {
             proxy_pass  http://nodejs;
             proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
             proxy_redirect off;
             proxy_buffering off;
             proxy_set_header        Host            $host;
             proxy_set_header        X-Real-IP       $remote_addr;
             proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

이 설정 전에 Varnish를 사용하는 (이전) 이유 중 하나는 Nginx가 기본적으로 프록시 HTTP 1.1 연결(웹소켓과 함께 사용되는 업그레이드 헤더에 필요함)을 지원하지 않았기 때문입니다. 이는 더 이상 문제가 되지 않으며 현재 버전의 Nginx는 웹소켓 연결도 프록시할 수 있습니다. 그 외에도 실제로 Varnish를 사용하여 파일을 캐시하는 경우 파일을 프런트 엔드 서버로 유지해야 하는 강력한 이유입니다. 하지만 Varnish를 사용하여 동적으로 생성된 파일의 캐시된 복사본을 제공하는 경우 유일한 실제 이득이 발생한다는 점은 주목할 가치가 있습니다. 페이지). 예를 들어 Nginx가 포트 81에서 수신 대기하고 Node.js가 포트 3000에서 수신 대기하는 경우 Varnish VCL에 다음이 있을 수 있습니다(Nginx를 사용하여 Node.js를 사용하여 example.com/nodejs의 경로를 제공하고 Nginx를 사용하는 다른 모든 항목을 제공함). :

backend default {
  .host = "127.0.0.1";
  .port = "81";
}

backend nodejs{
  .host = "127.0.0.1";
  .port = "3000";
}

...

sub vcl_recv {
    set req.grace = 120s;
    ...
    if (req.http.Host ~ "^(www\.)?example.com") {
        if (req.url ~ "^/nodejs/") {
            set req.backend = nodejs;                       
        }
    }

    return (lookup);
}

관련 정보