我有两个目录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_502
和http_404
添加到proxy_next_upstream
指令,以确保所有失败的请求都应进行负载平衡(如正在替换的图像中的404)< / p>
https://gist.github.com/dciccale/2331d2e0a1a6e76e05bd#file-my-nginx-2-conf
答案 0 :(得分:0)
您可以考虑在静态内容的网址中添加版本ID,只要您重新刷新后端,就可以将之前的版本保留为活动状态。