nginx配置同一域名下,共存2個nodejs項目


項目背景:

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')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM