Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 用于零停机时间的负载平衡nodejs应用程序使用nginx部署服务于不同的静态资产_Node.js_Nginx - Fatal编程技术网

Node.js 用于零停机时间的负载平衡nodejs应用程序使用nginx部署服务于不同的静态资产

Node.js 用于零停机时间的负载平衡nodejs应用程序使用nginx部署服务于不同的静态资产,node.js,nginx,Node.js,Nginx,我有两个目录www-1和www-2,它们都有相同的nodejs应用程序。它有一些jade视图、一些端点等 还有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 f

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

还有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;
    }
}

但是,正如您在中所看到的,我也在为nginx中的所有静态数据提供服务,但是我希望通过某种方式指定根目录为www-1或www-2,具体取决于哪个服务器启动

让我解释一下原因:

在服务器中,我有一个git-repo,通常每当我进行更改时,我都会
git-pull
。然后我将构建新的代码
gulp dist
,该代码生成一个
dist
目录,然后
rm-rf www-1和&cp-r dist www-1
,因此在最后一个命令执行时,www-1(运行在5000中的应用程序)中可能会有一些停机时间,例如,由于未找到视图或其他原因而给出500分的jade文件,因此nginx将平衡到端口5001。这是可行的,但如果这些静态资产被替换,nginx也将无法为来自www-1的静态文件提供服务。在此之后,我还将重新启动第一个upstart脚本,以重新运行新部署的应用程序。在此之后,我将对www-2执行相同的过程

这就是我的问题,如何使静态资产的
root
成为动态的。或者如果有更好的方法来处理这个问题,我将非常感谢您的帮助

编辑:第二个配置

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

通过创建两个新的服务器块来侦听端口3000和3001,这两个端口分别向5000和5001进行代理传递,并且每个服务器块都有一个静态资产路由,一个指向www-1,另一个指向www-2

还需要将
http_502
http_404
添加到
proxy_next_upper
指令中,以确保所有失败的请求都应负载平衡(如正在替换的映像中的404)


你可以考虑在静态内容的URL中放置一个版本ID,只要你刷新了你的后端,就简单地保留前一个版本。