1. 程式人生 > >nginx在linux安裝和介紹

nginx在linux安裝和介紹

Nginx安裝和使用

版本:

nginx 1.10

第一節 nginx簡介

1.1 nginx是什麼
Nginx (engine x) 是一個高效能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0釋出於2004年10月4日。
其將原始碼以類BSD許可證的形式釋出,因它的穩定性、豐富的功能集、示例配置檔案和低系統資源的消耗而聞名。2011年6月1日,nginx 1.0.4釋出。
Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,並在一個BSD-like 協議下發行。其特點是佔有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站使用者有:百度、京東、新浪、網易、騰訊、淘寶等
Nginx 解決了伺服器的C10K(就是在一秒之內連線客戶端的數目為10k即1萬)問題。它的設計不像傳統的伺服器那樣使用執行緒處理請求,而是一個更加高階的機制—事件驅動機制,是一種非同步事件驅動結構

自由門:正向代理伺服器

vpn

nginx:反向代理

1.2 c10k

什麼是 10K 問題?

在 1999 年,Dan Kegel 向網路伺服器提出了一個駭人聽聞的難題:
是時候讓網路伺服器去同時應對 10000 個客戶端了,你覺得呢?畢竟網路已經變得很普及了。
這就是著名的 C10K 問題。 通過改善作業系統核心和從像 Apache 那樣的執行緒伺服器遷移到像 Nginx, Node 這樣的事件驅動伺服器,工程師們解決了這個 C10K 問題。
但現在我們面臨著一個更大的挑戰,如果同時應對一千萬個連線呢?要解決這個難題,需要些更變革的技術

p4

那麼需要怎樣才可以令一個系統管理員就可以管理一千萬臺伺服器呢?
誰會知道?當然是谷歌公司了。
James Hamilon說,計算伺服器的數量是困難的,微軟說,他們有一百萬臺伺服器,然後,谷歌的伺服器預計會達到一千萬臺,所以我們離單個系統管理員管理千萬臺伺服器的日子還有些遠;

但是,當這種情況發生時,下面所列就是這些系統的基礎:

把資料中心當成單獨一臺計算機那樣對待
然後,在資料中心內部,在計算機群上部署可複用的多維度多重作業,以便提高機器利用率和節約金錢
但這僅僅是一個數據中心,這並不是把你從 十 帶到 百萬 臺伺服器。對於千萬臺的伺服器,你必須利用好這些資料中心,所以,你要建一個 Spanner 那樣的可以管理百萬臺機器、幾百個資料中心和數萬億個資料項的系統;
當然,你還需要建造一個巨型網路系統,把這些資料中心連線在一起;
最後,當你真的面臨一個系統管理員管理千萬臺的伺服器,你很可能需要付出巨大的精力去做深入的挖掘,使得之前的工作變得有意義。
在高層面來說,單個伺服器同時應對千萬個連線和單個系統管理員同時管理千萬臺機器是一樣的:可擴充套件性就是一切。

但在低層面,他們是完全不一樣的。處理千萬個連線是關於扁平化處理資料,減少層面,單獨自己的事情;而管理千萬臺伺服器是關於把智慧灌輸到更加智慧的層面;這就很像人類身體內部萬億個個體通過自己的小系統共同協作,然後被平衡化和去中心化的大腦所處理。
1.3 nginx的特點
跨平臺:可以在大多數Unix like 系統編譯執行。而且也有Windows的移植版本。

配置異常簡單:非常的簡單,易上手。 

非阻塞、高併發連線:資料複製時,磁碟I/O的第一階段是非阻塞的。官方測試能支援5萬併發連線,實際生產中能跑2~3萬併發連線數(得益於Nginx採用了最新的epoll事件處理模型(訊息佇列)。 

Nginx代理和後端Web伺服器間無需長連線; 

Nginx接收使用者請求是非同步的,即先將使用者請求全部接收下來,再一次性發送到後端Web伺服器,極大減輕後端Web伺服器的壓力。 

傳送響應報文時,是邊接收來自後端Web伺服器的資料,邊傳送給客戶端。 

網路依賴性低,理論上只要能夠ping通就可以實施負載均衡,而且可以有效區分內網、外網流量。 

支援內建伺服器檢測。Nginx能夠根據應用伺服器處理頁面返回的狀態碼、超時資訊等檢測伺服器是否出現故障,並及時返回錯誤的請求重新提交到其它節點上。 

採用Master/worker多程序工作模式 

記憶體消耗小、成本低廉(比F5硬體負載均衡器廉價太多)、節省頻寬、穩定性高等特點。
1.4 nginx基本功能
Nginx的功能包括基本HTTP功能和擴充套件功能。和Apache伺服器一樣,Nginx伺服器為了提供更多的功能並且能夠有效地擴充套件這些功能。每一個模組都提供了一個功能,通過編譯這些功能模組來實現功能的擴充套件
a)提供靜態檔案和index檔案,處理靜態檔案,索引檔案以及自動索引,開啟檔案描述符快取;
b)使用快取加速反向代理,反向代理加速(無快取),簡單的負載均衡和容錯;
c)使用快取機制加速遠端FastCGI,簡單的負載均衡和容錯;
d)模組化的結構。過濾器包括gzipping,byte ranges,chunked responses,以及 SSI-filter。在SSI過濾器中,到同一個 proxy 或者 FastCGI 的多個子請求併發處理;
e)支援SSL 和 TLS SNI 支援;
f)IMAP/POP3代理服務功能;
g)使用外部 HTTP 認證伺服器重定向使用者到 IMAP/POP3 後端;
h)使用外部 HTTP 認證伺服器認證使用者後連線重定向到內部的 SMTP 後端;
a)基於名稱和基於IP的虛擬伺服器;
b)支援Keep-alive和管道連線;
c)靈活的配置和重新配置、線上升級的時候不用中斷客戶訪問的處理;
d)訪問日誌的格式,快取日誌寫入和快速日誌輪循;
e)3xx-5xx錯誤程式碼重定向;
f)速度限制

反向代理,負載均衡

靜態資源伺服器

圖片伺服器

下圖是Nginx的內部程序模型:

p7

1.5 正向代理和反向代理
代理伺服器一般指區域網內部的機器通過代理伺服器傳送請求到網際網路上的伺服器,代理伺服器一般作用在客戶端。例如:GoAgent翻牆軟體。我們的客戶端在進行翻牆操作的時候,我們使用的正是正向代理,通過正向代理的方式,在我們的客戶端執行一個軟體,將我們的HTTP請求轉發到其他不同的伺服器端,實現請求的分發

vpn
正向代理:客戶端

p5

反向代理伺服器作用在伺服器端,它在伺服器端接收客戶端的請求,然後將請求分發給具體的伺服器進行處理,然後再將伺服器的相應結果反饋給客戶端。Nginx就是一個反向代理伺服器軟體

p6

從上圖可以看出:客戶端必須設定正向代理伺服器,當然前提是要知道正向代理伺服器的IP地址,還有代理程式的埠。 
反向代理正好與正向代理相反,對於客戶端而言代理伺服器就像是原始伺服器,並且客戶端不需要進行任何特別的設定。客戶端向反向代理的名稱空間(name-space)中的內容傳送普通請求,接著反向代理將判斷向何處(原始伺服器)轉交請求,並將獲得的內容返回給客戶端。
1.6 負載均衡
通過Nginx的反向代理實現負載均衡,就是通過多臺伺服器分壓

p8

1.7 伺服器的型別
1、Web伺服器:提供Http的訪問,例如Nginx、Apache、IIS等,雖然Tomcat也能夠實現,但這並不是他的主要功能,而且效能也遠不如專門的Web伺服器; 
2、應用程式伺服器:能夠用於應用程式的執行; 
3、代理伺服器:代理伺服器通常是客戶端訪問的一種行為,在整個客戶端訪問伺服器的過程中有著重要的作用; 
4、反向代理 
5、後臺伺服器 
6、CDN快取伺服器:它是快取伺服器的角色,而且是反向代理的應用,在網站部署的時候,他算是一種策略,對於遠距離訪問的解決方案。
1.8 代理伺服器
1.8.1 什麼是代理伺服器
代理伺服器,客戶機在傳送請求時,不會直接傳送給目的主機,而是先發送給代理伺服器,代理服務接受客戶機請求之後,再向主機發出,並接收目的主機返回的資料,存放在代理伺服器的硬碟中,再發送給客戶機。 

p11

1.8.2 為什麼要使用代理伺服器
1)提高訪問速度 
由於目標主機返回的資料會存放在代理伺服器的硬碟中,因此下一次客戶再訪問相同的站點資料時,會直接從代理伺服器的硬碟中讀取,起到了快取的作用,尤其對於熱門站點能明顯提高請求速度
2)防火牆作用 
由於所有的客戶機請求都必須通過代理伺服器訪問遠端站點,因此可在代理伺服器上設限,過濾某些不安全資訊。 
3)通過代理伺服器訪問不能訪問的目標站點 
網際網路上有許多開發的代理伺服器,客戶機在訪問受限時,可通過不受限的代理伺服器訪問目標站點,通俗說,我們使用的翻牆瀏覽器就是利用了代理伺服器,雖然不能出國,但也可直接訪問外網。 

第二節 nginx下載和安裝

2.1 下載Nginx原始檔

nginx 原始檔可以直接下載,可以下在別的地方上傳

進入nginx官網下載nginx的穩定版本

nginx官網點選訪問

下載:在什麼目錄下執行下面的命令則下載到什麼目錄

cd /opt/install   切換到指定目錄中
wget http://nginx.org/download/nginx-1.10.0.tar.gz  下載nginx
注意:如果提示wget不是內部密命令,則使用:yum install wget 下載。
tar -zxvf nginx-1.10.0.tar.gz   解壓
2.2 安裝依賴項
 yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel   安裝依賴項
2.3 配置Nginx安裝選項
這裡只配置安裝到/opt/work目錄下,其它選項可執行./configuration –help檢視
cd /opt/install/nginx-1.10.0   	跳轉到解壓後的目錄
./configure --prefix=/usr/local/nginx

## --sbin-path=/usr/bin/nginx    配置安裝屬性  
2.4 編譯並安裝
make && make install

#####2.6 啟動、停止、重啟
在nginx/sbin目錄下 :
命令:
./nginx 啟動nginx
ps -ef | grep nginx 可通過ps -ef | grep nginx檢視nginx是否已啟動成功
nginx -s reload 重新啟動 從新載入配置檔案
nginx -s stop 停止nginx
p2

2.7 訪問
啟動nginx之後,直接在瀏覽器進行訪問:
http://10.11.55.188/
預設nginx的訪問埠是80 
firewall-cmd --query-port=80/tcp
開放80埠
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload

p3

第三節 linux搭建nginx負載均衡叢集

負載均衡通過 nginx 配置反向代理實現,這樣我們只需要訪問 nginx 即可,由 nginx 決定在內部轉發到哪個伺服器

此叢集是採用一臺Centos6.8進行設定的,這裡以2個Tomcat伺服器進行設定

3.1 準備2個Tomcat
新建2個目錄,分別叫tomcat1、tomcat2
選擇之前解壓的Tomcat,複製到當前目錄的 tomcat1
再次選擇之前解壓的Tomcat,複製到當前目錄的 tomcat2

p12

3.2 分別修改埠號
需要將tomcat1的conf/server.xml中的埠號分別進行修改
主要是8005、8080、8009
修改為8105、8180、8109
命令:
vim tomcat1/conf/server.xml 
需要將tomcat2的conf/server.xml中的埠號分別進行修改
主要是8005、8080、8009
修改為8205、8280、8209
命令:
vim tomcat2/conf/server.xml 
其實埠號可以任意只要不衝突即可
測試剛剛改變的埠號是否能用
分別啟動剛剛配置的2個Tomcat,再瀏覽器中訪問
/opt/work/tomcat1/bin/startup.sh
/opt/work/tomcat2/bin/startup.sh
3.3 配置nginx的負載均衡

找到Nginx的安裝目錄,找到nginx.conf檔案

#使用下面的命令編輯nginx的配置檔案
vim /opt/work/nginx/conf/nginx.conf
#在http標籤內部,配置需要進行負載均衡的N臺伺服器,新增:
upstream server_list{
			server 10.211.55.12:8180;
			server 10.211.55.12:8280;
}
#其中 server_list代表是別名,內部指向多臺伺服器
#然後在server標籤修改新增:
#location 代表訪問的路徑,當前代表訪問 ngnix 的根路徑
#proxy_pass代表轉發到什麼地址,後面填寫 別名 就可以,它會自動從別名的伺服器列表中選擇一個地址進行訪問
location / {
            proxy_pass   http://server_list;
        }   
# 如果只做一臺機器的反向代理,則不需要配置別名,只需要將proxy_pass 的值設定為具體的訪問地址即可
 

p13

重新啟動nginx即可,命令:
nginx -s reload
瀏覽器進行訪問:
http://10.211.55.12/

p14

第四節 session共享問題

在進行負載均衡的時候,難免會遇到多臺伺服器之間的HttpSession共享的問題,常用的解決方案有一下幾種:

第一種:

web伺服器解決(廣播機制),注意:tomcat下效能低
修改兩個地方:
	1.修改tomcat的server.xml 支援共享
		將引擎標籤下的
					<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>註釋去掉
	2.修改專案的配置檔案 web.xml中新增一個節點
				<distributable/>

第二種:使用ip_hash解決

保證一個ip地址永遠的訪問一臺web伺服器,就不存在session共享問題了,在linux
		在nginx的配置檔案中
			upstream中新增 ip_hash;

第三種:(最常用)

使用redis來代替session

第四種

使用訊息佇列(MQ),有資料需要儲存到session中,就以釋出-訂閱模式發訊息,其他伺服器在接收訊息,把資料儲存本地session

第五節 靜態資源伺服器的搭建

​ 第一步:

​ 在linux虛擬機器中確定靜態資源的位置,如:/home/jack/

​ 第二步:

​ 確定資源資原始檔位置的許可權,輸入ll 檢視是否具有可讀許可權。

​ 可以使用chmod修改許可權

​ 第三步:

​ 修改nginx的配置檔案

​ vi nginx.conf

http {
include       mime.types;
default_type  application/octet-stream;
sendfile        on;
 keepalive_timeout  65;
server {
    listen       80;
    server_name  localhost;
       location / {
         root /home/jack;
    }


則,訪問靜態資源的路徑是:http://192.168.82.188:80/資源的路徑
例如:http://192.168.82.188:80/aaa.jpg
	如果靜態資源在 虛擬路徑的 下的資料夾下,則訪問時要加上資料夾名;
比如:圖片在/home/jack/images下
則訪問路徑是:
	 http://192.168.82.188:80/images/aaa.jpg
	 http://192.168.82.188:80/html/index.html

第六節 Nginx upstream的5種權重分配方式

1.輪詢(預設)

每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。

2.weight

指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。

upstream backend {
server 192.168.0.14:8080 weight=4; # 128g記憶體的伺服器
server 192.168.0.15:8080 weight=1; # 32g伺服器
3.ip_hash

每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。

upstream backend { 
ip_hash; 
server   172.16.125.76:8066 weight=10;  
server   172.16.125.76:8077 down;  
server   172.16.0.18:8066 max_fails=3 fail_timeout=30s;  
server   172.16.0.18:8077 backup;  }

根據伺服器的本身的效能差別及職能,可以設定不同的引數控制。

down 表示負載過重或者不參與負載

weight 權重過大代表承擔的負載就越大

backup 其它伺服器down時才會請求backup伺服器

max_fails 失敗超過指定次數會暫停或請求轉往其它伺服器

fail_timeout 失敗超過指定次數後暫停時間

4.fair(第三方)

按後端伺服器的響應時間來分配請求,響應時間短的優先分配

5.url_hash(第三方)

按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效