項目背景:
1、官網需要改版,使用nodejs nuxt框架進行重構
2、官網改版沒有全部完成、但需要上線首頁
項目需求:
1、讓首頁內容顯示為新項目
2、讓老官網的內容可以被訪問到(比如www.n.com/cart,但新項目沒有cart接口)
3、首頁域名必須是www.n.com
這樣的話就會引出一些問題,比如我nginx配置的后端,目前是7100端口,但是新項目端口為3000,如果我直接替換location / port:3000,這樣替換勢必會使舊官網項目404
舊官網nginx配置如下:
server { listen 80; listen 443 ssl; server_name www.n.com include ssl/niu.com; include error/40x; include error/50x; location / { proxy_pass http://127.0.0.1:7100; add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
解決過程:
從nginx下手,一開始嘗試的一種為多寫一層location,locatin = / prot=3000 location / port=7100
這樣解決是比較方便的解決方案,先匹配3000端口,3000端口匹配不到就去7100端口,配置文件如下:
server { listen 80; listen 443 ssl; server_name www.n.com include ssl/niu.com; include error/40x; include error/50x; location = / { proxy_pass http://127.0.0.1:3000; add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } location / { proxy_pass http://127.0.0.1:7100; add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
但是!雖然這種解決方方案可以配置成功,但是由於我前端使用的是nuxt框架,這個框架有個比較坑的axios插件。
這個插件需要寫死域名:我寫的是www.n.com ,他會去dns上搜一下有沒有www.n.com ,如果搜到了,和自己的node進程也匹配上了,才會訪問成功,否則,會報錯404.
所以基於這種location優先級的配置,如果我寫了location = / port=3000 這種模式下,后端的node會直接掛掉,也就是說會報404,頁面無法訪問。
因此上述的辦法就沒辦法在nuxt框架上實現。。。
這時候就需要第二種解決方案:
當nginx匹配到404的時候,自動去舊官網上查詢,如果查詢到了,就返回結果。
配置如下
location / { proxy_pass http://127.0.0.1:3000; add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; #新網站報錯,跳轉到老網站 2019.06.02 error_page 404 = @old_niu; } #新網站報錯,跳轉到老網站 2019.06.02 location @old_niu{ proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:7100; #這里配置 老系統的錯誤頁面 }
這樣就可以先去新官網上匹配,然后如果報錯404,就去舊官網,也算一種解決方案。
def ver_keys = [ 'bash', '-c', 'curl http://oss.niu.local/tar/prod/shop-api/sydney/sydney.list | head -n 20' ]
ver_keys.execute().text.tokenize('\n')