1. 程式人生 > 實用技巧 >Nginx深入學習(一篇搞定)

Nginx深入學習(一篇搞定)

我們的口號是:人生不設限!


一、nginx簡介

1、什麼是nginx

Nginx(engine x) 是一個高效能的HTTP和反向代理伺服器,特點是佔有記憶體少,併發能力強,事實上nginx的併發能力確實在同型別的網頁伺服器中表現較好。
Nginx專為效能優化而發,效能是其最重要的考量,實現上非常注重效率,能經受高負載的考驗,有報告表名能支援高達50,000個併發連線數。

2、反向代理

()正向代理
  如果我們把google想象成為一個資源庫,則大陸區域網的客戶端要訪問這個資源庫,就需要通過代理伺服器來訪問,這種代理服務就叫做正向代理。
簡單說就是:在客戶端(瀏覽器)配置代理伺服器,通過代理伺服器進行網際網路訪問。
  

(2)反向代理

    反向代理,其實客戶端對代理是無感知的,因為客戶端不需要任何配置就可以訪問,我們只需要將請求傳送到反向代理伺服器,反向代理伺服器去選擇目標伺服器獲取資料後,再返回給客戶端,此時反向代理伺服器和目標伺服器對外就是一個伺服器,暴露的是代理伺服器地址,隱藏了真實伺服器IP地址。

3、負載均衡

  當請求變多,單體應用不能滿足,我們增加伺服器的數量,然後將請求分發到不同伺服器上解決高併發,就是負載均衡。

4、動靜分離

為了加快網站的解析速度,可以把動態頁面和靜態頁面由不同的伺服器來解析,加快解析速度。降低原來單個伺服器的壓力。


二、nginx在linux系統安裝

(1)安裝 pcre 依賴

#1、自行下載pcre依賴包(https://sourceforge.net/projects/pcre/files/pcre/8.37/) [[email protected] src]# ll
total
drwxr-xr-x. root root Apr debug
drwxr-xr-x. root root Apr kernels
-rw-r--r-- root root Jun : pcre-8.37.tar.gz #2、解壓依賴包

[[email protected] src]# tar -xvf pcre-8.37.tar.gz

#3、進入檢查

[[email protected] src]# cd pcre-8.37

[[email protected] pcre-8.37]# ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p

...

#注意:檢查過程中,有些小夥伴的伺服器可能會報錯(缺少c++環境)

configure: error: You need a C++ compiler for C++ support.

#4、如果報錯執行(不報錯直接略過本步驟)

[[email protected] pcre-8.37]# yum -y install gcc-c++

#5、安裝

[[email protected] pcre-8.37]# make && make install
rm -f pcre_chartables.c
ln -s ./pcre_chartables.c.dist pcre_chartables.c
make all-am
make[1]: Entering directory `/usr/src/pcre-8.37'
CC libpcre_la-pcre_byte_order.lo
CC libpcre_la-pcre_compile.lo
CC libpcre_la-pcre_config.lo
CC libpcre_la-pcre_dfa_exec.lo
CC libpcre_la-pcre_exec.lo
CC libpcre_la-pcre_fullinfo.lo
CC libpcre_la-pcre_get.lo

...

make[3]: Leaving directory `/usr/src/pcre-8.37'
make[2]: Leaving directory `/usr/src/pcre-8.37'
make[1]: Leaving directory `/usr/src/pcre-8.37'
[[email protected] pcre-8.37]#

#檢視版本

[[email protected] pcre-8.37]# pcre-config --version
8.37
[[email protected] pcre-8.37]#

(2)安裝 openssl、zlib 依賴

[[email protected] pcre-8.37]# yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Package 1:make-3.82-24.el7.x86_64 already installed and latest version
Package zlib-1.2.7-18.el7.x86_64 already installed and latest version
Package gcc-c++-4.8.5-39.el7.x86_64 already installed and latest version
Package 1:openssl-1.0.2k-19.el7.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package libtool.x86_64 0:2.4.2-22.el7_3 will be installed

...

Dependency Updated:
e2fsprogs.x86_64 0:1.42.9-17.el7 e2fsprogs-libs.x86_64 0:1.42.9-17.el7 krb5-libs.x86_64 0:1.15.1-46.el7
libcom_err.x86_64 0:1.42.9-17.el7 libselinux.x86_64 0:2.5-15.el7 libselinux-python.x86_64 0:2.5-15.el7
libselinux-utils.x86_64 0:2.5-15.el7 libss.x86_64 0:1.42.9-17.el7

Complete!
[[email protected] pcre-8.37]#

(3)安裝Nginx

#下載nginx:https://nginx.org/download/#解壓壓縮包

[[email protected] nginx]# tar -xvf nginx-1.12.2.tar.gz

#檢查配置

[[email protected] nginx]# ./configure

#安裝

[[email protected] nginx]# make && make install

#啟動測試

[[email protected] /]# cd /usr/local/nginx/sbin/
[[email protected] sbin]# ./nginx

[[email protected] sbin]# ps -ef|grep nginx
root 11280 1 0 23:07 ? 00:00:00 nginx: master process ./nginx
nobody 11281 11280 0 23:07 ? 00:00:00 nginx: worker process
root 11283 3063 0 23:08 pts/0 00:00:00 grep --color=auto nginx
[[email protected] sbin]#


#注意:如果有的小夥伴不能訪問,可能是伺服器埠沒開啟

  阿里雲伺服器參考:https://blog.csdn.net/Abaneo/article/details/72853513

一般就是:
    1、檢視開放埠:firewall-cmd --list-all
    2、設定開放埠好:firewall-cmd --add-port=80/tcp --perman
    3、重啟防火牆:firewall-cmd --reload

三、nginx常用的命令

1、使用Nginx操作命令前提條件:必須進入Nginx的目錄

[[email protected] sbin]# pwd
/usr/local/nginx/sbin
[[email protected] sbin]#

2、檢視Ngin版本號

[[email protected] sbin]# ./nginx -v
nginx version: nginx/1.12.

3、啟動Nginx

[[email protected] sbin]# ./nginx 

4、關閉Nginx

[[email protected] sbin]# ./nginx -s stop
[[email protected] sbin]# ps -ef|grep nginx
root : pts/ :: grep --color=auto nginx
[[email protected] sbin]#

5、重新載入Nginx

[[email protected] sbin]# ./nginx -s reload
[[email protected] sbin]#

四、nginx的配置檔案

1、配置檔案位置:

2、配置檔案組成

分別對各個部分做詳細解釋:

(1)全域性塊

  從配置檔案開始到events 塊之間的內容,主要會設定一些影響nginx 伺服器整體執行的配置指令,

比如 worker_process 1;worker_process 值越大,可以支援的併發處理也越多。

(2)events塊

  events 塊涉及的指令主要影響 Nginx伺服器與使用者的網路連線,常用的設定包括開啟對多 work process 下的網路連線進行序列化,是否允許同時接收多個網路連線,選取哪種事件驅動模型來處理連線請求,每個 work process 可以同時支援最大連線數等。

比如:worker_connections 1024; 標識支援最大連線數為 1024。

這部分的配置對Nginx效能影響較大,在實際應用中靈活配置。

(3)http塊

  這部分是Nginx伺服器配置中配置修改最頻繁的部分,代理、快取、日誌定義等絕大多數功能和第三方模組的配置都在這裡。

  http塊又分為:http全域性塊和server塊。

  ① http 全域性塊:

    http 全域性快配置的指令包括檔案引入。MIME-TYPE 定義、日誌自定義、連線超時時間、單連結請求數上限等。

  ② server塊

    這塊和虛擬主機有密切關係,虛擬主機從使用者角度看,和一臺獨立的硬體主機完全一樣,該技術的產生就是為了節省網際網路硬體成本。

    每個 http塊 可以有多個server塊,每個server塊就相當於一個虛擬機器器。

    而每個 server塊 也分為全域性 server塊 ,以及可以同時包含多個 location 塊。

      1、全域性 server 塊:最常見的配置是本虛擬機器器主機的監聽配置和本虛擬機器器主機的名稱或IP配置。

      2、location 塊:一個server 塊可以配置多個 location 塊。這塊的主要作用是基於Nginx 伺服器接收到的請求字串,對虛擬機器器主機名稱之外的字串進行匹配符,對特定的請求進行處理。地址定向、資料快取和應答控制等功能,還有許多第三方模組的配置也在這裡。


五、nginx配置例項(反向代理)

例項1:

1、實現效果:

(1)開啟瀏覽器,在瀏覽器地址輸入伺服器nginx地址:xxx.xxx.xxx.xxx,跳轉linux系統tomcat主頁面。

2、準備工作

(1)在linux系統中安裝tomcat,使用預設埠號8080啟動,如下圖訪問所示

3、訪問過程

4、具體配置

在nginx進行請求轉發配置:

修改前:

修改後:

訪問:xxx.xxx.xxx.xxx 發現直接跳轉到了tomcat頁面,配置成功。

例項二:

1、效果:訪問路徑中包含edu ,跳轉8001埠的tomcat,路徑中包含vod ,跳轉8002埠的tomcat

2、具體配置:

  這裡關於tomcat的配置不再贅述,主要是準備兩個不同埠的tomcat,webapps下放置不同的區分頁面。

  配置nginx:

3、訪問測試:xxxx.xxx.xxx:9001/edu or /vod 分別跳轉到不同的頁面。

4、 location指令說明:

  該指令用於匹配 URL

  語法如下:

location [ = | ~ | ~* ] uri {

}

解釋:

  1、=:用於不含正則表示式的uri前,要求請求字串與uri 嚴格匹配,如果匹配成功,就繼續向下搜尋並立即處理該請求。


  2、~:用於表示 uri 包含正則表示式,並區分大小寫。


  3、~*:用於表示 uri 包含正則表示式,不區分大小寫。




六、nginx配置例項(負載均衡)

1、實現效果 :瀏覽器訪問伺服器地址xxx.xxx.xxx.xxx/edu/a.html ,負載均衡效果,平均到8080 和8081埠中。

2、準備工作:

  ①兩臺 tomcat 伺服器 ,一臺8080,一臺 8081

  ②在兩臺tomcat webapps 目錄下,建立 edu 資料夾,裡面建立 a.html 頁面,分別顯示不同的內容用於區分測試。

3、在nginx 的配置檔案中 進行負載均衡配置

配置一版最簡單的負載均衡,重啟nginx ,訪問 xxxx.xxx.xxx.xxx/edu/a.html 發現會跳轉到不同的頁面:

4、nginx提供了幾種分配方式

(1)輪訓(預設)

(2)weight

  weight 代表權重,預設為1 ,權重越高被分配的機會越多

(3)ip_hash

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

(4)fair(第三方)

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


七、nginx配置例項(動靜分離)

1、什麼是動靜分離?

  Nginx動靜分離簡單來說就是把動態請求跟靜態請求分開,可以理解使用Nginx 處理靜態頁面,Tomcat 處理動態頁面。動靜分離從目前實現角度來大致分類兩種:

一種是純粹把靜態檔案獨立成單獨的域名,放在獨立的伺服器上,也是目前比較推崇的方案。

一種 是動態跟靜態檔案混合在一起釋出,通過nginx 來分開。

 

 通過location指定不同的字尾名實現不同的請求轉發。通過expires引數設定,可以使 瀏覽器快取過期時間,減少與伺服器之前的請求和流量。具體Expires定義:是給一個資 源設定一個過期時間,也就是說無需去服務端驗證,直接通過瀏覽器自身確認是否過期即可, 所以不會產生額外的流量。此種方法非常適合不經常變動的資源。(如果經常更新的檔案, 不建議使用Expires來快取),我這裡設定3d,表示在這3天之內訪問這個 URL,傳送 一個請求,比對伺服器該檔案最後更新時間沒有變化,則不會從伺服器抓取,返回狀態碼 304,如果有修改,則直接從伺服器重新下載,返回狀態碼200。

測試效果:

訪問圖片地址

訪問靜態網頁:


八、nginx配置高可用叢集

1、為什麼要位置叢集:上面的配置方式都是一個nginx 提供請求的轉發,如果這唯一一個nginx 宕機,name就沒有然後了,這裡我們需要哦誒之nginx叢集,防止 單個宕機的情況。

2、準備工作

  (1)需要配置兩臺伺服器 192.168.17.129 和192.168.17.131

  (2)在兩臺伺服器安裝 Nginxkeepalived

    安裝Nginx 參考上面的步驟;

    安裝keepalived 直接執行命令安裝:yum install keepalived -y

  (3)安裝完keepalived ,在etc 目錄下 生成了目錄 keepalived,有檔案 keepalived.conf,後面會配置這個檔案。

  (4)完成主從配置

修改 keepalived.conf 配置檔案:

在 /usr/local/src 新增檢測指令碼

(5)兩臺伺服器:重啟nginx 和 keepalived

3 、訪問測試

  效果描述:

  1、訪問 虛擬IP,可以正常訪問 nginx 服務,這是是訪問的主伺服器

  2、當停掉主伺服器的nginx 和 keepalived ,虛擬 ip依然可以訪問到副伺服器提供的nginx服務。

    主:我們可以通過 ipconfig 在兩個伺服器上 看到 繫結的虛擬ip 判斷驗證。

4、配置檔案詳解

keepalived.conf 檔案詳解:

第一部分 全域性的:

第二部分 指令碼的:

第三部分 虛擬ip部分:


九、nginx原理分析

1、master & worker 工作模式

在伺服器上我們可以看到這兩個程式:

2、worker 如何工作

  總的來說,是一種 爭搶 的模式,當 Master 有了請求,就會有數個worker 來爭搶,誰先搶到,誰去處理這個請求。

3、mastenorkers的機制的好處:

  首先,對於每個worker程式來說,獨立的程式,不需要加鎖,所以省掉了鎖帶來的開銷, 同時在程式設計以及問題查詢時,也會方便很多。

  其次,採用獨立的程式,可以讓互相之間不會 影響, 一 個程式退出後,其它程式還在工作,服務不會中斷,master程式貝!很快啟動新的 worker程式。當然,worker程式的異常退出,肯定是程式有bug 了,異常退出,會導致當 前worker上的所有請求失敗,不過不會影響到所有請求,所以降低了風險。

  另外可以簡單的實現熱載入的啟動 nginx -s reload,執行完之後只加載沒工作的worker,正在工作的worker 完成工作之後再重新載入。