Node.js 用于零停机时间的负载平衡nodejs应用程序使用nginx部署服务于不同的静态资产
我有两个目录www-1和www-2,它们都有相同的nodejs应用程序。它有一些jade视图、一些端点等 还有2个运行的upstart脚本: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
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,只要你刷新了你的后端,就简单地保留前一个版本。