2013-07-21 64 views
63

我正在寫一些webservices返回JSON數據,它有很多的用戶。Go(golang)webservices的Webserver:是否使用NGINX?

你會推薦使用NGINX作爲網絡服務器還是使用Go的標準http服務器?

+0

fyi,有很多tcp錯誤,如通過對等重置連接以及使用Go http服務器處理大量POST請求100秒的服務的I/O超時。把nginx放在它的前面 - 沒有更多的問題。 –

+0

最終我決定使用Go http服務器,而不使用NGINX,它工作得很好。我沒有遇到任何問題。但是我的服務沒有像你的情況那樣運行大量的POST請求。 –

+8

這不是必要的意見。如此結束,表明對這樣一個問題的答案可以填補和提供的注意事項和注意事項缺乏理解。所選的答案就是一個很好的例子。事實上,我在所有提供的答案中看到了相關的新考慮。 –

回答

107

這取決於。

開箱,把nginx的前反向代理將會給你:

  • 訪問日誌
  • 錯誤日誌
  • 易SSL終止
  • SPDY支持
  • gzip支持
  • 簡單的方法爲幾行中的某些路由設置HTTP標頭
  • 非常快速的靜態資產服務(如果您服務於S3/etc。不過,這並不是相關)

轉到HTTP服務器是非常好的,但你需要推倒重來做一些事情(這是罰款:它並不意味着是一切給大家)。

我一直髮現把nginx放在前面更容易 - 這是它擅長的 - 並讓它做「web服務器」的東西。我的Go應用程序執行應用程序的任務,並且只有最低限度的頭文件/ etc。它需要。不要把nginx作爲一個「壞」的東西放在前面。

+0

感謝您的回覆! - 1)Go HTTP是否產生某種日誌? - 2)nginx是否減少了請求/響應吞吐量? –

+3

@DanieleB Go HTTP服務器只生成你想要的日誌(即使用'log'包)。如果你想記錄IP地址,資源訪問等,你需要寫這個。除了基礎知識之外,還可以設置標題。 雖然我沒有任何具體的數據,但Go前的nginx應該不會比Go慢:實際上,由於gzip和它自己的優化,它可能會更快。 「成本」將更多的內存/ CPU利用率,但nginx也是非常有效的。 – elithrar

+13

另一大特色:你將如何升級/維護你的應用(不丟包) Nginx會讓你引導流量而不丟包。 – BraveNewCurrency

15

Go的標準http服務器沒問題。如果你的應用程序大部分/只是「動態」請求/響應,那麼它確實是最好的方法。

您可以使用nginx來提供靜態資產,但最有可能的標準Go one也很好。如果您需要更高的性能,您應該儘可能多地使用CDN或緩存(例如)。

如果您需要在同一IP地址上提供不同的應用程序,nginx是代理在不同應用程序之間分配請求的不錯選擇;儘管我更經常從工具箱中獲得Varnish或HAProxy等類似的東西。

+0

是的,我實際上只使用它來提供動態數據。所以,我想我不需要NGINX!感謝您的回覆 –

+0

Varnish/HAProxy不是必需的,Nginx具有類似的緩存和負載均衡工具集。 – Anatoly

+0

@mikhailov是不是我說的? nginx適合它;儘管我個人經常喜歡清漆或HAproxy。我發現它們更容易配置和操作。 –

4

Gorilla web toolkit爲您提供:

  • 高級路由(域/子域的限制,正則表達式匹配的路徑)。
  • gzip支持(通過middleware handlers。)
  • 以Apache公用日誌格式輸出的日誌記錄中間件處理程序。
  • 安全加密的cookie。
  • 會議。
  • schema包將表單值轉換爲結構體。

這填補了Go的net/http和HTTP服務器(如NGINX)之間的很大差距。

就我個人而言,如果我知道我可以插入CDN,我會避免在net/http之上安裝和配置另一個HTTP服務器。

我認爲net/http在任何標準庫中都有最強大的HTTP服務器。

1

https://blog.gopheracademy.com/caddy-a-look-inside/它看起來像Go可以使用中間件來處理gzip,錯誤,靜態文件,路由和http標頭。 從博客下面的行顯示了你將如何處理這樣的請求。

logHandler(gzipHandler(fileServer)) 

他們以一種非常有趣的方式處理錯誤日誌記錄。只要您的中間件返回錯誤代碼(int),錯誤處理中間件就會自動處理它。他們甚至像Nginx一樣在Go中配置整個網站。 「所有Gopher學院網站的nginx.conf文件長度超過115行,等效的Caddyfile只有50行。」

相關問題