把nginx改為一個普通的tcp伺服器,應用層協議自己定義,有可行性嗎?
01-24
可行。官方的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 |