標籤:

把nginx改為一個普通的tcp伺服器,應用層協議自己定義,有可行性嗎?


可行。官方的mail proxy,和第三方的rtmp伺服器,都是這做的,可以參考一下。


可以的, 寫 stream { } 代替 http { } 即可. 你不用寫 nginx 模塊, 直接代理到監聽 TCP 連接的應用伺服器上更簡單.

這樣有幾個作用:

  • nginx 用高許可權的用戶運行, 應用層用低許可權的用戶運行, 降低應用層被攻破後造成的危害.
  • nginx 可以做 load balance, 只是這套 health check 有點複雜.
  • 可以用 ngx_stream_ssl_module 把 TCP 做成 secure socket, 這樣應用服務程序就不用考慮 ssl 證書問題了.
  • 如果應用伺服器處理大量慢連接性能不夠好, 可以用緩存來緩解這個問題.
  • 還可以和 UDP 和視頻流服務什麼的一起配置.
  • 如果不需要 nginx 做解析 HTTP 協議的話, 純作為 TCP 代理效果也能提高一點點性能.

性能是有差別的, 不過應用伺服器和 nginx 之間用 Unix domain socket 就可以減少這種損耗.


有可行性,但不高。

nginx代碼不少,且近乎沒有文檔,連開發個nginx插件都麻煩的要死。只有少量API文檔,但沒有解釋核心概念和流程。

且nginx是基於回調模型的。如果只是自己寫個定製協議的伺服器,大不了直接在socket上加epoll就是了。沒必要再去招惹nginx。nginx並不會在這個過程裡帶給你什麼功能上的優勢,反倒要花大量時間去學nginx的內部實現。這是得不償失的。


ZMQ 的 XREP/XREQ 模式應該就能滿足你的需求了,請不要重複造輪子。


事實上 淘寶的改版tegine有了一個nginx proc模塊,可以復用nginx網路組件,但是,為什麼不用http協議呢?


openresty已經有這樣的支持了,stream模塊


nginx 1.9+

./configure --with-stream

stream {

server {

listen ...;

proxy_pass ...;

}

}


可以利用nginx的設計思想自己寫,性能一點也不比nginx差,還可以根據自己的業務場景進行制定。另外可以參考openresty中的stream模塊


用nginx_tcp_proxy_module


推薦閱讀:

如何配置nginx+uwsgi+django?
使用uwsgi和nginx做伺服器和django框架,為什麼每次修改代碼都需要重啟uwsgi呢?
為什麼感覺現在搜索到的東西,越來越糟呢?

TAG:Nginx |