使用nginx为不同的静态资产提供零停机部署的负载均衡nodejs应用程序

时间:2015-09-05 12:24:20

标签: node.js nginx

我有两个目录www-1和www-2,两者都有相同的nodejs应用程序。它有一些玉视图,一些端点等。

还有2个运行的upstart脚本:

PORT=5000 node www-1/app.js

PORT=5001 node www-2/app.js

现在,我有以下nginx配置来加载平衡传入流量到其中一个。

upstream backend {
   server 127.0.0.1:5000 fail_timeout=0;
   server 127.0.0.1:5001 fail_timeout=0;
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    gzip on;
    gzip_types text/plain application/xml text/css application/x-javascript text/javascript application/javascript image/x-icon image/jpeg;
    gzip_vary on;
    charset UTF-8;

    index index.html index.htm;

    server_name myserver.com;

    location / {
        proxy_pass http://backend;
        proxy_next_upstream error timeout invalid_header http_500;
        proxy_connect_timeout 2;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect off;
        proxy_buffering off;
    }

    location ~* \.(ico|css|js|gif|jpe?g|png|svg|woff2?|ttf|eot)$ {
        expires 168h;
        add_header Pragma public;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        root /home/user/myserver.com/www-1/public;
    }
}

https://gist.github.com/dciccale/2331d2e0a1a6e76e05bd

这是有效的,但正如您在line 34中所看到的,我也在服务nginx的所有静态,但是我想要某种方式将根指定为www-1或www-2,具体取决于哪个服务器已启动

让我解释原因:

在服务器中我有一个git repo,通常我会git pull每当我做出改变时。然后我将构建新代码gulp dist,它生成一个dist目录然后rm -rf www-1 && cp -r dist www-1,所以当最后一个命令执行时,www-1可能会有一些停机时间(app运行在5000)为了提供例如jade文件给出500以便找不到视图或其他什么,所以nginx将平衡到端口5001.这是有效的,但是如果正在替换那些静态资产,nginx将无法从www-1提供静态文件。在此之后,我还将重新启动第一个upstart脚本以重新运行新部署的应用程序。在此之后,我将为www-2执行相同的过程。

这是我的问题,如何让静态资产root动态化。或者如果有更好的方法来处理这个问题,我将不胜感激。

编辑:第二种配置

我设置了另一个配置,但是在几秒钟内用户可以看到更新的内容,而另一个配置可以看到旧内容,这是我能得到的最佳内容。

创建2个侦听端口3000和3001的新服务器块,分别执行proxy_pass到5000和5001,每个服务器块都有静态资产的路由,一个指向www-1,另一个指向www- 2。

还需要将http_502http_404添加到proxy_next_upstream指令,以确保所有失败的请求都应进行负载平衡(如正在替换的图像中的404)< / p>

https://gist.github.com/dciccale/2331d2e0a1a6e76e05bd#file-my-nginx-2-conf

1 个答案:

答案 0 :(得分:0)

您可以考虑在静态内容的网址中添加版本ID,只要您重新刷新后端,就可以将之前的版本保留为活动状态。