文章目錄
4. Nginx-概述
4.1 介紹
4.2 下載下傳和安裝
4.3 目錄結構
5. Nginx-指令
5.1 常用指令
5.2 環境變量配置
6. Nginx-應用
6.1 配置檔案結構
6.2 部署靜态資源
6.3 反向代理
6.4 負載均衡
4. Nginx-概述
4.1 介紹

Nginx是一款輕量級的Web伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器。其特點是占有記憶體少,并發能力強,事實上nginx的并發能力在同類型的網頁伺服器中表現較好,中國大陸使用nginx的網站有:百度、京東、新浪、網易、騰訊、淘寶等。
Nginx是由伊戈爾·賽索耶夫為俄羅斯通路量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0釋出于2004年10月4日。
官網:nginx news
4.2 下載下傳和安裝
4.2.1 下載下傳
在Nginx的官網的下載下傳頁面中(nginx: download),就展示了目前Nginx版本,并提供了下載下傳的連接配接。 如下:
在本項目中,我們所學習的Nginx選擇的是穩定版本的1.16這個版本,我們可以直接從官網下載下傳,當然在我們的課程資料中也已經提供了該版本的安裝包。
4.2.2 安裝
1). 安裝依賴包
由于nginx是基于c語言開發的,是以需要安裝c語言的編譯環境,及正規表達式庫等第三方依賴庫。
<span style="background-color:#f8f8f8"><span style="color:#333333">yum -y install gcc pcre-devel zlib-devel openssl openssl-devel</span></span>
2). 下載下傳Nginx安裝包
<span style="background-color:#f8f8f8"><span style="color:#333333">yum install wget
wget https://nginx.org/download/nginx-1.16.1.tar.gz</span></span>
wget :
wget指令用來從指定的URL下載下傳檔案。wget非常穩定,它在帶寬很窄的情況下和不穩定網絡中有很強的适應性,如果是由于網絡的原因下載下傳失敗,wget會不斷的嘗試,直到整個檔案下載下傳完畢。如果是伺服器打斷下載下傳過程,它會再次聯到伺服器上從停止的地方繼續下載下傳。
執行完wget指令後,就會在目前所在目錄看到下載下傳下來的檔案。
3). 解壓nginx壓縮包
<span style="background-color:#f8f8f8"><span style="color:#333333">tar -zxvf nginx-1.16.1.tar.gz</span></span>
4). 配置Nginx編譯環境
<span style="background-color:#f8f8f8"><span style="color:#333333">cd nginx-1.16.1
./configure --prefix=/usr/local/nginx</span></span>
說明:
--prefix 指定的目錄,就是我們安裝Nginx的目錄。
5). 編譯&安裝
<span style="background-color:#f8f8f8"><span style="color:#333333">make & make install</span></span>
4.3 目錄結構
安裝完Nginx後,我們可以切換到Nginx的安裝目錄(/usr/local/nginx),先來熟悉一下Nginx的目錄結構,如下圖:
備注:
上述我們用到的一個指令 tree,該指令可以将我們指定的目錄以樹狀結構展示出來。如果沒有這個指令,可以通過以下指令進行安裝。
yum install tree
重點目錄和檔案如下:
目錄/檔案 | 說明 | 備注 |
conf | 配置檔案的存放目錄 | |
conf/nginx.conf | Nginx的核心配置檔案 | conf下有很多nginx的配置檔案,我們主要操作這個核心配置檔案 |
html | 存放靜态資源(html, css, ) | 部署到Nginx的靜态資源都可以放在html目錄中 |
logs | 存放nginx日志(通路日志、錯誤日志等) | |
sbin/nginx | 二進制檔案,用于啟動、停止Nginx服務 |
5. Nginx-指令
5.1 常用指令
Nginx中,我們的二進制可執行檔案(nginx)存放在sbin目錄下,雖然隻有一個可執行檔案,但是我們可以通過該指令配合不同的參數達到更加強大的功能。接下來,我們就示範一下Nginx常見指令, 在執行下面的指令時,都需要在/usr/local/nginx/sbin/目錄下執行。
1). 檢視版本
<span style="background-color:#f8f8f8"><span style="color:#333333">./nginx -v</span></span>
2). 檢查配置檔案
修改了nginx.conf核心配置檔案之後,在啟動Nginx服務之前,可以先檢查一下conf/nginx.conf檔案配置的是否有錯誤,指令如下:
<span style="background-color:#f8f8f8"><span style="color:#333333">./nginx -t</span></span>
3). 啟動
<span style="background-color:#f8f8f8"><span style="color:#333333">./nginx</span></span>
啟動之後,我們可以通過ps -ef指令來檢視nginx的程序是否存在。
注意: nginx服務啟動後,預設就會有兩個程序。
啟動之後,我們可以直接通路Nginx的80端口, http://192.168.200.200
注意:
要想正常通路Nginx,需要關閉防火牆或開放指定端口号,執行的指令如下:
A. 關閉防火牆
systemctl stop firewalld
B. 開放80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
4). 停止
<span style="background-color:#f8f8f8"><span style="color:#333333">./nginx -s stop</span></span>
停止之後,我們可以檢視nginx的程序:
<span style="background-color:#f8f8f8"><span style="color:#333333">ps -ef|grep nginx</span></span>
5). 重新加載
當修改了Nginx配置檔案後,需要重新加載才能生效,可以使用下面指令重新加載配置檔案:
<span style="background-color:#f8f8f8"><span style="color:#333333">./nginx -s reload</span></span>
5.2 環境變量配置
在上述我們在使用nginx指令在進行服務的啟動、停止、重新加載時,都需要用到一個指令nginx,而這個指令是在nginx/sbin目錄下的,我們每一次使用這個指令都需要切換到sbin目錄才可以,使用相對繁瑣。那麼我們能不能在任意目錄下都可以執行該指令來操作nginx呢?答案是可以的,配置nginx的環境變量即可。
通過vim編輯器,打開/etc/profile檔案, 在PATH環境變量中增加nginx的sbin目錄,如下:
修改完配置檔案之後,需要執行 source /etc/profile 使檔案生效。 接下來,我們就可以在任意目錄下執行nginx的指令了,如:
6. Nginx-應用
介紹了并安裝了Nginx之後,本章節将要講解的是Nginx的使用,我們主要從以下四個方面進行講解。
6.1 配置檔案結構
nginx的配置檔案(conf/nginx.conf)整體上分為三部分: 全局塊、events塊、http塊。這三塊的分别配置什麼樣的資訊呢,看下表:
區域 | 職責 |
全局塊 | 配置和nginx運作相關的全局配置 |
events塊 | 配置和網絡連接配接相關的配置 |
http塊 | 配置代理、緩存、日志記錄、虛拟主機等配置 |
具體結構圖如下:
在全局塊、events塊以及http塊中,我們經常配置的是http塊。
在http塊中可以包含多個server塊,每個server塊可以配置多個location塊。
6.2 部署靜态資源
6.2.1 介紹
Nginx可以作為靜态web伺服器來部署靜态資源。這裡所說的靜态資源是指在服務端真實存在,并且能夠直接展示的一些檔案,比如常見的html頁面、css檔案、js檔案、圖檔、視訊等資源。
相對于Tomcat,Nginx處理靜态資源的能力更加高效,是以在生産環境下,一般都會将靜态資源部署到Nginx中。
将靜态資源部署到Nginx非常簡單,隻需要将檔案複制到Nginx安裝目錄下的html目錄中即可。
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#0000ff">server {</span>
<span style="color:#0000ff"> listen 80; #監聽端口 </span>
<span style="color:#0000ff"> server_name localhost; #伺服器名稱</span>
<span style="color:#0000ff"> location / { #比對用戶端請求url</span>
<span style="color:#0000ff"> root html; #指定靜态資源根目錄</span>
<span style="color:#0000ff"> index index.html; #指定預設首頁</span>
<span style="color:#0000ff"> }</span>
<span style="color:#0000ff">}</span></span></span>
6.2.2 測試
在資料中,我們提供了一個靜态的html檔案,我們需要将這個檔案部署到nginx中,然後通過nginx通路html靜态資源。
1). 将靜态資源上傳到 /usr/local/nginx/html 目錄
2). 啟動nginx
3). 通路
http://192.168.200.200/hello.html
http://192.168.200.200 , 通路該位址,通路的是nginx的預設首頁
4). 配置首頁
如果我們需要将hello.html作為nginx的首頁,可以修改location的index指令,配置為hello.html,如下:
配置完畢後,我們可以通過指令,來檢查配置檔案是否配置正确: nginx -t
配置檔案修改了,我們需要重新加載一下,才可以生效:
<span style="background-color:#f8f8f8"><span style="color:#333333">nginx -s reload</span></span>
5). 通路
http://192.168.200.200
6.3 反向代理
6.3.1 概念介紹
1). 正向代理
正向代理伺服器是一個位于用戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得内容,用戶端向代理發送一個請求并指定目标(原始伺服器),然後代理向原始伺服器轉交請求并将獲得的内容傳回給用戶端。
正向代理的典型用途是為在防火牆内的區域網路用戶端提供通路Internet的途徑。
正向代理一般是在用戶端設定代理伺服器,通過代理伺服器轉發請求,最終通路到目标伺服器。
2). 反向代理
反向代理伺服器位于使用者與目标伺服器之間,但是對于使用者而言,反向代理伺服器就相當于目标伺服器,即使用者直接通路反向代理伺服器就可以獲得目标伺服器的資源,反向代理伺服器負責将請求轉發給目标伺服器。使用者不需要知道目标伺服器的位址,也無須在使用者端作任何設定,對于使用者來說,通路反向代理伺服器是完全無感覺的。
那麼在本小節,我們就是要使用nginx來作為反向代理伺服器使用。 在nginx中,我們可以在nginx.conf中配置反向代理:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#0000ff">server {</span>
<span style="color:#0000ff"> listen 82;</span>
<span style="color:#0000ff"> server_name localhost;</span>
<span style="color:#0000ff"> location / {</span>
<span style="color:#0000ff"> proxy_pass http</span>:<span style="color:#009900">//192.168.200.201</span>:<span style="color:#009900">8080; #反向代理配置,将請求轉發到指定服務</span>
<span style="color:#0000ff"> }</span>
<span style="color:#0000ff">}</span></span></span>
上述配置的含義為: 當我們通路nginx的82端口時,根據反向代理配置,會将請求轉發到 http://192.168.200.201:8080 對應的服務上。
6.3.2 測試
需求: 在192.168.200.201這台伺服器中部署了java應用,運作端口為8080,并提供了一個可通路的連結 /hello。現在我們需要在通路nginx的82端口時,通過nginx将請求轉發到192.168.200.201:8080的服務。
1). 在192.168.200.201部署服務并啟動
将資料中提供的 helloworld-1.0-SNAPSHOT.jar 上傳到伺服器端,并通過指令 java -jar helloworld-1.0-SNAPSHOT.jar 運作服務。
2). 在192.168.200.200中的nginx.conf中配置反向代理
進入nginx的安裝目錄,并編輯配置檔案nginx.conf:
<span style="background-color:#f8f8f8"><span style="color:#333333">cd /usr/local/nginx/conf/
vim nginx.conf</span></span>
在http塊中,再添加一個server塊虛拟主機的配置,監聽82端口,并配置反向代理proxy_pass:
<span style="background-color:#f8f8f8"><span style="color:#333333">server {
listen 82;
server_name localhost;
location / {
proxy_pass http://192.168.200.201:8080; #反向代理配置,将請求轉發到指定服務
}
}</span></span>
3). 檢查配置檔案,并重新加載
<span style="background-color:#f8f8f8"><span style="color:#333333">nginx -t</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">nginx -s reload</span></span>
4). 通路
==注意: 在通路82端口時,有可能通路不通,原因是以為防火牆中沒有開放端口号。我們可以通過兩種方式來解決該問題:==
==A. 關閉防火牆==
<span style="background-color:#f8f8f8"><span style="color:#333333">systemctl stop firewalld</span></span>
==B. 開發指定端口==
<span style="background-color:#f8f8f8"><span style="color:#333333">firewall-cmd --zone=public --add-port=82/tcp --permanent
firewall-cmd --reload</span></span>
6.4 負載均衡
6.4.1 概念介紹
早期的網站流量和業務功能都比較簡單,單台伺服器就可以滿足基本需求,但是随着網際網路的發展,業務流量越來越大并且業務邏輯也越來越複雜,單台伺服器的性能及單點故障問題就凸顯出來了,是以需要多台伺服器組成應用叢集,進行性能的水準擴充以及避免單點故障出現。
應用叢集:将同一應用部署到多台機器上,組成應用叢集,接收負載均衡器分發的請求,進行業務處理并傳回響應資料
負載均衡器:将使用者請求根據對應的負載均衡算法分發到應用叢集中的一台伺服器進行處理
此處的負載均衡器,我們将會使用Nginx來實作,而Nginx的負載均衡是基于反向代理的,隻不過此時所代理的伺服器不是一台,而是多台。
6.4.2 測試
1). 将資料中提供的兩個jar包,上傳到192.168.200.201伺服器上
jar | 運作端口 | 請求連結 | 響應資料 |
8080 | /hello | 8080 | |
8081 | /hello | 8081 |
我們在測試時,并沒有那麼多伺服器,我們可以在一台伺服器中啟動多個服務,運作在不同的端口号上進行測試。
2). 運作上傳上來的兩個jar包,運作端口分别是 8080 , 8081
由于我們執行 java -jar 指令會占用前台視窗,是以我們可以開啟兩個視窗進行測試。
3). 在nginx中配置負載均衡
打開nginx的配置檔案nginx.conf并增加如下配置:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">#upstream指令可以定義一組伺服器</span>
<span style="color:#0000ff">upstream targetserver{ </span>
<span style="color:#0000ff"> server 192.168.200.201</span>:<span style="color:#009900">8080;</span>
<span style="color:#0000ff"> server 192.168.200.201</span>:<span style="color:#009900">8081;</span>
<span style="color:#0000ff">}</span>
<span style="color:#0000ff">server {</span>
<span style="color:#0000ff"> listen 8080;</span>
<span style="color:#0000ff"> server_name localhost;</span>
<span style="color:#0000ff"> location / {</span>
<span style="color:#0000ff"> proxy_pass http</span>:<span style="color:#009900">//targetserver;</span>
<span style="color:#0000ff"> }</span>
<span style="color:#0000ff">}</span></span></span>
具體的配置位置如下:
4). 重新加載nginx配置檔案,通路
<span style="background-color:#f8f8f8"><span style="color:#333333">nginx <span style="color:#0000cc">-s</span> reload</span></span>
測試時,我們直接通路nginx的8080端口(http://192.168.200.200:8080), 此時nginx會根據負載均衡政策,将請求轉發到後面的兩台伺服器。
在上述的測試過程中,我們看到請求均衡的轉發到了8080和8081,因為模式的負載均衡政策是輪詢。
注意: 上述所有涉及到的端口号,都需要在對應的伺服器的防火牆中開放,或者徹底關閉防火牆
6.4.3 負載均衡政策
處理上述預設的輪詢政策以外,在Nginx中還提供了其他的負載均衡政策,如下:
名稱 | 說明 | 特點 |
輪詢 | 預設方式 | |
weight | 權重方式 | 根據權重分發請求,權重大的配置設定到請求的機率大 |
ip_hash | 依據ip配置設定方式 | 根據用戶端請求的IP位址計算hash值, 根據hash值來分發請求, 同一個IP發起的請求, 會發轉發到同一個伺服器上 |
least_conn | 依據最少連接配接方式 | 哪個伺服器目前處理的連接配接少, 請求優先轉發到這台伺服器 |
url_hash | 依據url配置設定方式 | 根據用戶端請求url的hash值,來分發請求, 同一個url請求, 會發轉發到同一個伺服器上 |
fair | 依據響應時間方式 |
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">#upstream指令可以定義一組伺服器</span>
<span style="color:#0000ff">upstream targetserver{ </span>
<span style="color:#0000ff"> server 192.168.200.201</span>:<span style="color:#009900">8080 weight</span>=<span style="color:#009900">10;</span>
<span style="color:#0000ff"> server 192.168.200.201</span>:<span style="color:#009900">8081 weight</span>=<span style="color:#009900">5;</span>
<span style="color:#0000ff">}</span></span></span>