我可以使用哪种设置在同一台服务器上托管 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 也能够代理 websocket 连接。除此之外,如果您实际上使用 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);
}