2014-10-11 63 views
0

我已經寫了使用兩個完全解耦的組件的Web應用程序的應用程序:部署脫鉤前+後端

  1. 是基於離地構架,是 類型的請求的API:/api/*任何客戶。
  2. 解耦基於AngularJS建成使用grunt build

現在前端,到API但我想這兩個單位的前端會談將要部署一個代理之後,像nginx可以代理傳入的請求到相應的組件。例如,我想所有的/web/*請求都會從包含所有客戶端源代碼(js/html/etc)的web目錄和所有/api/*請求代理到我的Play框架服務器(我們需要傳遞到服務器的路徑以確保正確路徑返回)以返回所有與API相關的數據。例如,像GET domain.com/api/users這樣的請求應在內部代理爲GET 127.0.0.1:9000/api/users

我已經在網上看到了一些關於這方面的討論,我仍然希望通過你們運行它,看看哪種方法是這種部署的最佳方法。最終,我想要一個面向服務的體系結構,我希望能夠更靈活地解耦事物。

回答

2

我已經構建並部署了Play Framework + AngularJS應用程序,發現nginx是一個很好的方法。

隨着您的應用程序體系結構的發展,Nginx還爲您提供了一條增長途徑來處理更多服務。例如,您可以爲/api/user/*添加專用服務,同時保留所有其他/api/*路線的標準服務。

在某些時候,你可能需要去商業產品,但爲了我現在和可預見的將來的需要,nginx是驚人的。

我nginx的配置的相關部分是:

server { 
    listen  80; 

    # Without this, Play serves the assets from within it's bundled jar. That's 
    # fine and works but seems unnecessary when nginx can serve the files directly. 
    location /assets { 
     alias /app/live/my-play-app-here/active/public; 
    } 

    location/{ 
     proxy_pass   http://localhost:9000; 
     proxy_set_header  X-Real-IP $remote_addr; 
    } 
} 

這裏的關鍵部分是/assets URI空間。你的可能會有所不同,因爲你完全獨立地打包你的AngularJS應用程序。我的角度應用程序位於Play應用程序的/app/assets/javascripts文件夾內。這有利有弊(我很喜歡你的想法,保持它完全分開)。我對/assets塊所做的工作允許nginx直接提供靜態內容,因爲當nginx做得很好時,Play似乎很愚蠢。

這不是在您的情況,但對別人有戲中的一切,對上述服務靜態資產戰略工作,部署過程需要解壓從存檔的public目錄由play dist做,像這樣有關這(從我的bash部署腳本摘錄):

unzip lib/$SERVICE_BASE_NAME.$SERVICE_BASE_NAME-$VERSION.jar "public/*" 

爲您的特定情況下,像下面可能是一個良好的開端:

server { 
    listen  80; 

    location /api { 
     proxy_pass   http://localhost:9000; 
     proxy_set_header  X-Real-IP $remote_addr; 
    } 

    location/{ 
     alias /app/live/my-angularjs-app-here/active/public; 
    } 
} 
+0

+1上nginx的。我們使用Play + EmberJS。儘管如此,關於OP的URL方法的評論之一。您可以考慮分隔您的公共Web界面(例如域名)使用的主機名。com)和您的API(例如api.domain.com)。另外,如果你這樣做,一個頭與nginx。您需要設置CORS標頭以允許domain.com使用在api.domain.com上調用URL的JavaScript。另請參閱'headers_more' nginx模塊來正確設置它。 – 2014-10-12 15:37:48

+0

這對我來說就像一個魅力,有一些陷阱。 '咕嚕',我似乎有一種困擾的關係 - 我遇到了嚴重的問題,並且我幾乎總是以一個破損的包裹結束。但這並不是一個嚴重的問題,因爲我手動將缺少的組件複製到'dist /'文件夾。我稍後通過將靜態符號鏈接添加到'dist'中缺失的文件夾來解決此問題。 – Ashesh 2014-10-15 15:06:26

相關問題