
wordpress/php と node.js の両方を同じサーバーでホストするには、どのような設定を使用すればよいですか? 私は Digitalocean の VPS、Ubuntu 12.04 サーバーを使用しています。
Apache -> Nginx -> Varnish を使用する人もいると読んだことがありますが、一方で、Nginx があれば Varnish は必要ないという記述もいくつかありました。
私が現在持っている解決策は、ポート 80 の Varnish と 2 つのバックエンド (1 つは Apache 用、もう 1 つは Node.js 用) です。
これは、Varnish の背後にある Apache の代わりに nginx でも機能しますか?
答え1
はい、既存のセットアップ (Varnish フロントエンド、Apache および Node.js バックエンド) は、Apache を Nginx に切り替えても同じように動作します (つまり、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 を使用する (以前の) 理由の 1 つは、Nginx が HTTP 1.1 接続のプロキシをネイティブにサポートしていなかったためです (これは Websocket で使用される Upgrade ヘッダーに必要でした)。これはもう問題ではなく、現在のバージョンの Nginx は Websocket 接続もプロキシできます。それはさておき、実際に Varnish を使用してファイルをキャッシュしている場合は、フロントエンド サーバーとして保持する説得力のある理由になります (ただし、Varnish を使用して動的に生成されたページのキャッシュされたコピーを提供する場合にのみ、実際の利点が発生することに注意してください)。たとえば、Nginx がポート 81 でリッスンし、Node.js がポート 3000 でリッスンしている場合、Varnish VCL に次の内容を含めることができます (これにより、example.com/nodejs からのパスが Node.js を使用して提供され、その他すべてが 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);
}