rails api server + node front end server 的架構問題


#1

我找到一篇相關的文章

裡面有一張架構圖

上面這篇文章內文提到:這種架構不會有cors的問題
因為browser所有的request都只會打到node front-end server
但是在front-end server的web server (nginx/apache)會依照request url而採取不同行動:
若url帶有api字串,則導向rails api server;若無,則導向node front-end server
而從圖上看來:node server 跟 rails server應該不是部署在同一台機器

我的問題是:從node front-end server發給rails api server的request不會有cors問題嗎?


web/mobile共用同一個api server?
#2

所謂的 CORS 是對 client 而言(瀏覽器自動判定,而非 Server 判定),所以在同一個 domain name 下是不會發生的,CORS = Cross-Origin Resource Sharing,…你的 origin ( domain name ) 一樣哪來的 cross ?

而 Apache / Nginx 都可以用 proxy 的方式把某個網址的需求導到另外一個 IP/Port 去,甚至再加上一些 header(因為內網所以都是 private ip),這也是最早 Rails deploy 的方式就是(類似開 8080~8088,然後打 proxy 到這 9 台去),或是 loading balance 或是 route 類的機器大都可以做到這個需求:導流量,其實之後架構就隨便你打隨你切了才是

不過因為有過 proxy,原始 IP 會被改變,所以通常會有另外加 http header 來存原始 IP,這邊要小心下面這個有趣的漏洞

so~ 以上


#3

感謝回覆!
這邊有點不清楚:
node server位置:http://app.com
rails server位置:http://api.app.com (subdomain不同)
這樣是否代表rails server跟node server部署在同一台機器?
如果不是的話,要怎麼讓兩台位置不同的機器共享同樣的domain name?


#4

你可以在去看一次你的圖…

# C = Client , S = Server

C => S(app.com) ==(intranet proxy)==> S(api.app.com)
  <=========================================

請問 C 溝通和回傳的對象是 app.com 還是 api.app.com?答案是進出一直都是 app.com 這個 domain , 對 C 來說 api.app.com 這個 domain name 是完全不存在的(因為要遵循原路回去,那張圖也有標123給你,也就是循序圖),單純只有內部轉向而已

實際的東西找 Nginx Proxy 架看看就知道了,類似同台或不同台電腦開個 Sinatra,然後 Nginx Proxy 到該 port 你就可以嘗試得出來

剛找了一下這篇文章都有寫到重點,類似 Load Balance 都有,就是一打一票 server 然後 proxy 對象設那個集合之類的,所以我就不另外寫 demo conf 了

anyway 這邊其實算是簡單,設定過一次就會瞭解怎樣弄,而 Apache 也有類似的東西就是


#5

感謝回覆,這部分我可能想複雜了,
想再請問一下:nginx可以proxy到不同的domain嗎?

ex:


C => S(test1.com) ==(intranet proxy)==> S(api.test2.com)
  <=========================================

#6

當然可以,你可以丟去 M$ 或 Google 不過對方可能會擋你就是了 X"D


#7

好的XD 謝謝回覆


#8

這串討論讓我查了不少資料,也學到不少東西,感謝提問!!