## 概述 Nginx 是一個高性能的 HTTP 和反向代理伺服器,特點是占用記憶體少,併發能力強 #### 1. 正向代理 如果把區域網外的 Internet 想象成一個巨大的資源庫,則區域網中的客戶端要訪問 Internet,需要通過代理伺服器來訪問,這種訪問就稱為正向代理 ![](https:/ ...
概述
Nginx 是一個高性能的 HTTP 和反向代理伺服器,特點是占用記憶體少,併發能力強
1. 正向代理
如果把區域網外的 Internet 想象成一個巨大的資源庫,則區域網中的客戶端要訪問 Internet,需要通過代理伺服器來訪問,這種訪問就稱為正向代理
2. 反向代理
客戶端對代理是無感知的,因為客戶端不需要任何配置就可以訪問,我們只需要將請求發送到反向代理伺服器,由反向代理伺服器去選擇目標伺服器獲取數據後,再返回給客戶端,此時反向代理伺服器和目標伺服器對外就是一個伺服器,暴露的是代理伺服器地址,隱藏了真實伺服器 IP 地址
3. 負載均衡
增加伺服器的數量,然後將請求分發到各個伺服器上,將原先請求集中到單個伺服器上的情況改為將請求分發到多個伺服器上,將負載分發到不同的伺服器
4. 動靜分離
簡單來說就是把動態請求跟靜態請求分開,不能單純地理解為動態頁面和靜態頁面分類。一般使用 Nginx 處理靜態頁面,Tomcat 處理動態頁面
動靜分離有兩種實現:
- 把靜態文件獨立成單獨的功能變數名稱,放在獨立的伺服器
- 靜態文件和動態文件混在一起發佈,通過 nginx 分開
Nginx 操作命令
# 必須先進入 nginx 目錄
cd /usr/local/nginx/sbin
# 查看 nginx 版本號
./nginx -v
# 啟動 nginx
./nginx -s start
# 關閉 nginx
./nginx -s stop
# 重新載入 nginx(修改了配置文件)
./nginx -s reload
Nginx 配置文件
Linux 下 Nginx 配置文件路徑一般如下:
/usr/local/nginx/conf/nginx.conf
組成部分:
# 全局塊
...
# events 塊
events {
...
}
# http 塊
http {
# http 全局塊
...
# server 塊
server {
# 全局 server 塊
...
# location 塊
location /uri-string {
...
}
}
...
}
- 全局塊:從配置文件到 events 塊之間的內容,主要會設置一些影響 nginx 伺服器整體運行的配置指令,主要包括配置運行 Nginx 伺服器的用戶(組)、允許生成的 worker process 數,進程 PID 存放路徑、日誌存放路徑和類型以及配置文件的引入等
- events 塊:主要影響 Nginx 伺服器與用戶之間的網路連接,常用的設置包括是否開啟對多 work process 下的網路連接進行序列化,是否允許同時接收多個網路連接,選取哪種事件驅動模型來處理連接請求,每個 word process 可以同時支持的最大連接數等
- http 塊:配置最頻繁的部分,代理、緩存和日誌定義等絕大多數和第三方模塊配置都在這裡,http 塊也包括 http 全局塊和 server 塊
- http 全局塊:配置指令包括文件引入、MINE-TYPE 定義、日誌自定義、連接超時時間、單鏈接請求數上限等
- server 塊:和虛擬主機密切相關,虛擬主機從用戶角度看,和一臺獨立的硬體主機是完全一樣的,該技術的產生是為了節省互聯網伺服器硬體成本。每個 http 塊可以包括多個 server 塊,而每個 server 塊就相當於一個虛擬主機。每個 server 塊也分為全局 server 塊,以及可以同時包含多個 location 塊
- 全局 server 塊:最常見的配置是本虛擬機主機的監聽配置和本虛擬主機的名稱或 IP 配置
- location 塊:一個 server 塊可以配置多個 location 塊,這塊的主要作用是基於 Nginx 伺服器接收到的請求字元串(例如 server_name/uri-string),對虛擬主機名稱(也可以是 IP 別名)之外的字元串(例如前面的 /uri-string)進行匹配,對特定的請求進行處理、地址定向、數據緩存和應答控制等功能,還有許多第三方模塊也在這裡配置
Nginx 配置實例
1. 反向代理
啟動 Tomcat 並開發對外埠,配置 nginx.conf
server {
...
server_name [IP地址]
...
location / {
...
proxy_pass http://127.0.0.1:8080
...
}
}
啟動兩個 Tomcat 並分發不同的對外埠,根據訪問路徑跳轉到不同埠的服務
server {
listen 9001 # 監聽埠
server_name [IP地址]
location ~/edu/ { # 正則表達式寫法,匹配符合條件的路徑
...
proxy_pass http://127.0.0.1:8080
...
}
location ~/vod/ { # 正則表達式寫法,匹配符合條件的路徑
...
proxy_pass http://127.0.0.1:8081
...
}
}
2. 負載均衡
啟動兩個 Tomcat 並分發不同的對外埠,配置 nginx.conf
http {
...
upstream myserver {
# ip_hash
# fair
server 192.168.17.219:8080 # 第一個ip:port
# server 192.168.17.219:8080 weight=1 # 分配權重
server 192.168.17.219:8081 # 第二個ip:port
}
...
server {
listen 80 # 監聽埠
server_name 192.168.17.219 # IP地址
location / {
...
proxy_pass http://myserver
...
}
}
}
分配方式:
- 輪詢(預設):每個請求按時間順序逐一分配到不同的後端伺服器,能自動剔除宕機的伺服器
- weight:代表權重,預設為 1,權重越高被分配的客戶端越多
- ip_hash:每個請求按照 ip 的 hash 結果分配,這樣每個 ip 固定訪問一個後端伺服器,可以解決 session 問題
- fair:按後端伺服器的響應時間來分配請求,響應時間短的優先分配
3. 分配方式
配置 nginx.conf
server {
listen 80 # 監聽埠
server_name 192.168.17.219 # IP地址
location /www/ { # 正則表達式
...
root /data/; # 靜態資源路徑
index index.htm index.html
...
}
location /image/ {
root /data/;
autoindex on # 返迴文件目錄內容
}
}
Nginx 原理解析
1. master-workers
每個 worker 都是獨立的進程,不需要加鎖,不會影響其他 worker。每個 worker 都可以把 cpu 的性能發揮到極致,因此 worker 數量最好與 cpu 數相同
可以熱部署,正在工作的 worker 完成工作後再載入,其他 worker 立即重新載入
2. 連接數 worker-connection
一個請求占用 worker 兩個(一去一回)或四個連接數(需要訪問 Tomcat)。每個 worker 支持最大的連接數是 1024,支持的最大併發數是 4*1024/2 或者 4*1024/4