如何在一台服务器上运行 nginx 和 node.js?

如何在一台服务器上运行 nginx 和 node.js?

我可以使用哪种设置在同一台服务器上托管 wordpress/php 和 node.js?我有一个来自 Digitalocean 的 VPS,一个 Ubuntu 12.04 服务器。

我读过一些用法:Apache -> Nginx -> Varnish,但是我又读到一些地方说如果你有 Nginx 你就不需要 Varnish。

我现在的解决方案是在端口 80 上使用 Varnish,它有 2 个后端,一个用于 Apache,一个用于 Node.js。

这是否适用于 Varnish 背后的 nginx 而不是 Apache?

答案1

是的,如果您将 Apache 替换为 Nginx,您现有的设置(Varnish 前端,带有 Apache 和 Node.js 后端)将以相同的方式工作(即 Varnish 并不特别关心后端 - Nginx 和 Apache 将被相同对待)。

Node.js 通常与 Nginx 一起运行,因为直接通过 Nginx 提供静态资产比通过 Node.js 更高效。对于简单的设置,您可以完全消除 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 连接(这是 Websockets 使用的升级标头所需要的) - 这不再是问题,并且当前版本的 Nginx 也能够代理 w​​ebsocket 连接。除此之外,如果您实际上使用 Varnish 来缓存文件,那么这是一个令人信服的理由将其保留为前端服务器(尽管,值得注意的是,只有当您使用 Varnish 来提供动态生成页面的缓存副本时才会发生真正的收益)。例如,如果您让 Nginx 在端口 81 上监听,让 Node.js 在端口 3000 上监听,则您的 Varnish VCL 中可能会有以下内容(它将使用 Node.js 和 Nginx 提供来自 example.com/nodejs 的路径):

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);
}

相关内容