https://www.nginx.cn/doc/ Nginx中文問檔案
https://www.nginx.cn/nginx-how-to Nginx 中文手冊
https://blog.csdn.net/qq_29677867/article/details/90112120 Nginx 入門參考
Nginx是C語言開發的一款輕量級的Web服務器、反向代理服務器以及電子郵件(IMAP/POP3)代理服務器,
特點:占用記憶體少,資源消耗低,并發能力強,(官方測驗nginx能夠支撐5萬并發鏈接)
為什么使用Nginx?(實作負載均衡)
互聯網飛速發展的今天,大用戶量高并發已經成為互聯網的主體,怎樣能讓一個網站能夠承載幾萬個或幾十萬個用戶的持續訪問呢?這是一些中小網站急需解決的問題,用單機tomcat搭建的網站,在比較理想的狀態下能夠承受的并發訪問量在150到200左右,對于一個為全國范圍提供服務的網站顯然是不夠用的,為了解決這個問題引入了負載均衡方法,負載均衡就是一個web服務器解決不了的問題可以通過多個web服務器來平均分擔壓力來解決,并發過來的請求被平均分配到多個后臺web服務器來處理,這樣壓力就被分解開來,
負載均衡服務器分為兩種:
一種是通過硬體實作的負載均衡服務器,簡稱硬負載,例如:f5,
另一種是通過軟體來實作的負載均衡,簡稱軟負載,例如:apache和nginx,
硬負載和軟負載相比,前者作用的網路層次比較多,可以作用到socket介面的資料鏈路層對發出的請求進行分組轉發,但是價格成本比較貴;而軟負載作用的層次在http協議層之上可以對http請求進行分組轉發,并且因為是開源的所以幾乎是零成本,并且占用記憶體少,資源消耗低,并發能力強,
一、代理概述
1.1 正向代理(Forward Proxy)
一般情況下,如果沒有特別說明,代理技術默認說的是正向代理技術,
客戶端必須要進行一些特別的設定才能使用正向代理,當然前提是要知道正向代理服務器的IP地址,還有代理程式的埠,
- 關于正向代理的概念如下:正向代理(forward)是一個位于客戶端【用戶A】和原始服務器(origin server)【服務器B】之間的服務器【代理服務器Z】,為了從原始服務器取得內容,用戶A向代理服務器Z發送一個請求并指定目標(服務器B),然后代理服務器Z向服務器B轉交請求并將獲得的內容回傳給客戶端,簡單點說,正向代理就是代理服務器Z替代用戶A去訪問服務器B,

那為什么要用代理服務器去代替訪問方【用戶A】去訪問服務器B呢?這就要從代理服務器使用的作用說起,
1. 訪問本無法訪問的服務器B

我們拋除復雜的網路路由情節來看上圖,假設圖中路由器從左到右命名為R1,R2,假設最初用戶A要訪問服務器B需要經過R1和R2路由器這樣一個路由節點,如果路由器R1或者路由器R2發生故障,那么就無法訪問服務器B了,但是如果用戶A讓代理服務器Z去代替自己訪問服務器B,由于代理服務器Z沒有在路由器R1或R2節點中,而是通過其它的路由節點訪問服務器B,那么用戶A就可以得到服務器B的資料,
現實中的例子就是“FQ”,不過自從VPN技術被廣泛應用,“FQ”不但使用了傳統的正向代理技術,有的還使用了VPN技術,
2. 加速訪問服務器B
這種說法目前不像以前那么流行了,主要是帶寬流量的飛速發展,早期的正向代理中,很多人使用正向代理就是提速,
還是如上圖 假設用戶A到服務器B,經過R1路由器和R2路由器,而R1到R2路由器的鏈路是一個低帶寬鏈路,而用戶A到代理服務器Z,從代理服務器Z到服務器B都是高帶寬鏈路,那么很顯然從代理服務器Z的訪問方式就可以加速訪問服務器B了,
3. Cache(快取)作用
Cache(快取)技術和代理服務技術是緊密聯系的(不光是正向代理,反向代理也使用了Cache(快取)技術,
還如上圖所示,如果在用戶A訪問服務器B某資料J之前,已經有人通過代理服務器Z訪問過服務器B上得資料J,那么代理服務器Z會把資料J保存一段時間,如果有人正好取該資料J,那么代理服務器Z不再訪問服務器B,而把快取的資料J直接發給用戶A,這一技術在Cache中術語就叫Cache命中,如果有更多的像用戶A的用戶來訪問代理服務器Z,那么這些用戶都可以直接從代理服務器Z中取得資料J,而不用千里迢迢的去服務器B獲取資料了,
4. 客戶端訪問授權

這方面的內容現今使用的還是比較多的,例如一些公司采用ISA SERVER做為正向代理服務器來授權用戶是否有權限訪問互聯網,
上圖防火墻作為網關,用來過濾外網對其的訪問,
假設用戶A和用戶B都設定了代理服務器,用戶A允許訪問互聯網,而用戶B不允許訪問互聯網(這個在代理服務器Z上做限制),這樣用戶A因為授權,可以通過代理服務器Z訪問到服務器B,而用戶B因為沒有被代理服務器Z授權,所以訪問服務器B時,資料包會被直接丟棄,
5. 隱藏訪問者的行蹤

如圖,我們可以看出服務器B并不知道訪問自己的實際是用戶A,因為代理服務器Z代替用戶A去直接與服務器B進行互動,如果代理服務器Z被用戶A完全控制(或不完全控制),會慣以“肉雞”術語稱呼,
1.2 反向代理(reverse proxy)
反向代理正好與正向代理相反,對于客戶端而言,代理服務器就像是原始服務器,并且客戶端不需要進行任何特別的設定,
- 客戶端向反向代理的命名空間(name-space)中的內容發送普通請求,接著反向代理將判斷向何處(原始服務器)轉交請求,并將獲得的內容回傳給客戶端,
使用反向代理服務器的作用:
1. 保護和隱藏原始資源服務器

用戶A始終認為它訪問的是原始服務器B而不是代理服務器Z,但實用際上反向代理服務器接受用戶A的應答,從原始資源服務器B中取得用戶A的需求資源,然后發送給用戶A,
由于防火墻的作用,只允許代理服務器Z訪問原始資源服務器B,盡管在這個虛擬的環境下,防火墻和反向代理的共同作用保護了原始資源服務器B,但用戶A并不知情,
2. 負載均衡

當反向代理服務器不止一個的時候,我們甚至可以把它們做成集群,當更多的用戶訪問資源服務器B的時候,讓不同的代理服務器Z(x)去應答不同的用戶,然后發送不同用戶需要的資源,
當然反向代理服務器像正向代理服務器一樣擁有Cache(快取)的作用,它可以快取原始資源服務器B的資源,而不是每次都要向原始資源服務器B請求資料,特別是一些靜態的資料,比如圖片和檔案,
如果這些反向代理服務器能夠做到和用戶X來自同一個網路,那么用戶X訪問反向代理服務器X,就會得到很高質量的速度,這正是CDN技術的核心,(了解)
綜上:
基本上,網上做正反向代理的程式很多,能做正向代理的軟體大部分也可以做反向代理,
開源軟體中最流行的就是squid,既可以做正向代理,也有很多人用來做反向代理的前端服務器,
另外MS ISA也可以用來在WINDOWS平臺下做正向代理,反向代理中最主要的實踐就是WEB服務,近些年來最火的就是Nginx了,網上有人說NGINX不能做正向代理,其實是不對的,NGINX也可以做正向代理,不過用的人比較少了,
1.3 透明代理
如果把正向代理、反向代理和透明代理按照人類血緣關系來劃分的話,那么正向代理和透明代理是很明顯堂親關系,而正向代理和反向代理就是表親關系了 ,
透明代理的意思是客戶端根本不需要知道有代理服務器的存在,它改編你的request fields(報文),并會傳送真實IP,
注意,加密的透明代理則是屬于匿名代理,意思是不用設定使用代理了,透明代理實踐的例子就是時下很多公司使用的行為管理軟體,

用戶A和用戶B并不知道行為管理設備充當透明代理行為,當用戶A或用戶B向服務器A或服務器B提交請求的時候,透明代理設備根據自身策略攔截并修改用戶A或B的報文,并作為實際的請求方,向服務器A或B發送請求,當接收資訊回傳,透明代理再根據自身的設定把允許的報文發回至用戶A或B,如上圖,如果透明代理設定不允許訪問服務器B,那么用戶A或者用戶B就不會得到服務器B的資料,
二、下載Nginx安裝包
官方網站:http://nginx.org/
有兩個版本windows版本和linux版本,生產環境都是使用linux版本,

三、Nginx的安裝與部署
3.1 在Windows上安裝部署
3.1.1 解壓安裝
將安裝包解壓到某個盤符下,比如:D:\nginx
目錄結構:

3.1.2 啟動運行
雙擊 nginx.exe 即可運行,登陸 http://localhost:80(默認埠80,輸入網址時80可省略)訪問,顯示如下界面表示安裝成功,

小貼士:此頁面其實就是安裝包下html檔案夾中的index.html,等同于根路徑下的初始化界面,后續我們可以通過nginx.conf檔案修改它的默認首頁等配置資訊,
3.1.3 關閉停止
-
- 手動關閉:結束 nginx 的行程;
- 命令列關閉:nginx -s stop
3.1.4 重新加載組態檔
-
- 命令列加載:nginx -s reload // 可以在不關閉 nginx 的情況下進行更新
3.2 在Linux上安裝部署
3.2.1 安裝
1)安裝環境
-
- gcc
安裝nginx需要先將官網下載的原始碼進行編譯,編譯依賴gcc環境,如果沒有gcc環境,需要安裝gcc,
* yum install gcc-c++
-
-
PCRE
-
PCRE(Perl Compatible Regular Expressions)是一個Perl庫,包括perl兼容的正則運算式庫,nginx的http模塊使用pcre來決議正則運算式,所以需要在linux上安裝pcre庫,
* yum install -y pcre pcre-devel
注:pcre-devel是使用pcre開發的一個二次開發庫,nginx也需要此庫,
-
-
zlib
-
zlib庫提供了很多種壓縮和解壓縮的方式,nginx使用zlib對http包的內容進行gzip,所以需要在linux上安裝zlib庫,
* yum install -y zlib zlib-devel
-
-
openssl
-
OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼演算法、常用的密鑰和證書封裝管理功能及SSL協議,并提供豐富的應用程式供測驗或其它目的使用,
nginx不僅支持http協議,還支持https(即在ssl協議上傳輸http),所以需要在linux安裝openssl庫,
* yum install -y openssl openssl-devel
2)編譯與安裝
① 把nginx的原始碼包上傳至linux服務器
② 解壓原始碼包, 如:tar -zxf nginx-1.8.0.tar.gz
③ 進入nginx-1.8.0檔案夾,使用configure命令創建makefile
④ 引數設定如下:(可根據實際情況進行修改,也可不修改)
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
注意:上邊將臨時檔案目錄指定為/var/temp/nginx,需要在/var下創建temp及nginx目錄
⑤ make
⑥ make install
3.2.2 啟動與關閉
在nginx目錄下有一個sbin目錄,sbin目錄下有一個nginx可執行程式,
命令列啟動:./nginx
命令列關閉:./nginx -s stop
命令列退出:./nginx -s quit // 等程式執行完畢后關閉,建議使用此命令,
3.2.3 重新加載組態檔
命令列加載:./nginx -s reload // 可以在不關閉 nginx 的情況下進行更新
四、Nginx搭建Tomcat集群
4.1 tomcat集群配置
- 首先安裝部署多個tomcat服務器,在沒有條件的情況下,可以在本地安裝多個tomcat后,分別對tomcat重命名并修改組態檔server.xml中的埠號(為了避免埠沖突);

- 再將專案分別發布到相應的tomcat中,
設定Linux的防火墻:(在linux上搭建集群)
* /sbin/iptables -I INPUT -p tcp --dport 埠號 -j ACCEPT
* /etc/rc.d/init.d/iptables save (永久保存上面修改后的設定)
4.2 Nginx負載均衡配置
- 修改安裝目錄下conf檔案夾下的nginx.conf組態檔 (nginx/conf/nginx.conf)

- 重新加載組態檔
// 可以在不關閉 nginx 的情況下進行更新
windows命令列加載:nginx -s reload
liunx命令列加載:./nginx -s reload
4.3 Tomcat集群的session共享
在上述的配置中,我們可以通過http://localhost:801訪問到不同的tomcat來分擔服務端的壓力,
需要注意的是,請求負載程序中的會話資訊不能丟失,那么就需要在多個tomcat中進行session的共享,
- 配置tomcat的session共享問題可以有三種解決方案
- ① 以負載均衡器本身提供的session共享策略,在Nginx的nginx.conf組態檔中配置ip_hash,讓一個用戶的請求只在一個tomcat服務器上進行操作,

- ② 利用web容器本身的session共享策略來配置共享,針對于weblogic這種方式還是靠普的,但是針對于tomcat這種方式存在很大的缺陷,主要因為是依靠廣播機制來實作的session復制,互相復制會浪費很多帶寬導致整個網路反映緩慢,官網也建議這種方式最好不要超過4臺tomcat,(不推薦)
* 使用tomcat的廣播機制完成session的共享,
步驟:
- 修改tomcat組態檔server.xml,只需要將引擎節點中注釋掉的下面這句取消注釋即可:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
使用這樣方法配置的集群會將Session同步到所在網段上的所有配置了集群屬性的實體上(此處講所在網段可能不準確,是使用Membership 的address和port來區分的,tomcat集群的實體如果在Membership配置中有相同的address和port值的tomcat被分到同一個集群里邊,他們的session是相互共享的,同一個session的集群被稱為一個cluster,可以配置多個cluster,但是cluster和cluster之間的session是不共享的),也就是說如果該廣播地址下的所有Tomcat實體都會共享Session,那么假如有幾個互不相關的集群,就可能造成Session復制浪費,所以為了避免浪費就需要對節點多做點設定了,如下:
Xml代碼:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
</Channel>
</Cluster>
加了一個Channel,里面包了個Membership,咱們要關注的就是membership的port屬性和address屬性,不同的集群設定不同的port值或address值,從目前的使用來看,基本上是隔離開了,
- 修改專案的web.xml檔案,只需要在web-app節點中添加這個節點<distributable/>就可以了,
- 重啟服務器
- ③ 使用redis服務器的方式完成session的共享,(推薦)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289803.html
標籤:其他


