nginx(一、概念篇)
為什麼要用nginx?
在網上搜索負載均衡的時候,總會跳出nginx這個字眼,對於我這樣只關注開發功能卻從未關心過架構的人來說,還是比較陌生的,印象中用了nginx好像可以扛更多的訪問量。
過完年後開發工作告一段落,正好有時間,就決定從一個初學者的角度來描述一下,為什麼要用nginx。
經查閱各種資料,nginx的主要功能和使用方式包括
- nginx反向代理
- nginx負載均衡
- nginx配置https
- nginx靜態資源伺服器
- 整合keepalive、lvs等
以上5點主要作為後續實踐內容的大綱。
nginx反向代理
這個名稱和概念有點讓人懵逼,從資料的流向方面來說一下我的理解。

nginx反向代理.jpg
通過時序圖可以看出,相當於nginx就是個方案公司的FAE,你的所有需求和溝通交流,都和對方公司的FAE對接,並不需要知道對方公司的工程師如何開發能不能實現你的需求,一旦有結果之後,也是FAE告訴你,並且給你部署實施或者燒錄,這就是反向代理。
那什麼是正向代理呢,就是你作為公司內部的工程師,需要第三方公司的配合才能搞定任務,其他公司都是工程師直接對接三方公司,但你們公司為了節省工程師的時間,減少扯皮帶來的精力消耗,所以專門給你配備了個FAE,你告訴FAE我需要第三方公司給我搞定晶片我才能開發,FAE去三方公司溝通,然後你只用忙其他事情,最後FAE搞定了這坨事,把晶片交給你,這就是正向代理。
所以我個人理解的是,正向還是反向代理,關鍵看nginx這個FAE為誰代言,為伺服器代言就是反向代理,為客戶端代言就是正向代理。
正向代理的用途,由於沒有實踐,目前實在想不到使用場景,這裡暫且不提。
反向代理的用途就比較直接了,如果單從這個代理功能來說,腦子進水了,本來直接就能和伺服器通訊,為什麼要多一個東西不嫌麻煩嗎?這就牽涉到nginx的其他特性了。
nginx負載均衡
nginx有一些負載均衡演算法,細節部分等後面實際操作時再談,要想實現負載均衡,就必須要用到前面的 反向代理 特性了,看圖:

典型負載均衡
所有的請求先到nginx,然後nginx根據演算法分發請求到某個伺服器,伺服器再通過nginx返回資料給客戶端。
當然選擇nginx還有一些其他效能方面的優勢,比如併發能力比apache還強等其他因素。
nginx配置https
這個是為後續的實踐提供大綱,現在伺服器是java編寫的,用的是springMVC、spring、mybatis開發,因為我們的硬體客戶端裝置能用很長時間,長時間積累下來,併發不算太小,而本人的java併發經驗幾乎都停留在理論階段實踐為零,既然都是重新嘗試為什麼不學一下新技術呢,所以出於個人意願,後期打算換成golang,聽說golang的https好像比較難搞,並且做叢集的時候每個業務伺服器都搞一下https好像不現實,所以提前把這個功能實踐了。
nginx靜態資源伺服器
這個動靜分離功能是必須要做的,這樣也可以顯著提升效能,如果一些圖片和js指令碼都放在web容器裡,比如tomcat裡,就損耗了一部分tomcat的效能。
整合keepalive、lvs等
為什麼要整合這些呢,有這樣一種場景:nginx部署在A雲伺服器,然後後面叢集了B、C、D三臺雲伺服器上,然後A雲伺服器突然掛了,這時候就算B、C、D沒掛,整個系統也不能用了,所以會有一些高可用方案。
這個keepalive和lvs目前只停留在理論階段,是否能夠整合以及怎麼整合,或者是否有其他更流行的方案,這裡只是列出大綱,以後實踐的時候再查閱資料並進行詳細描述。