1. 什麼是Nginx?
1.1. wiki
是一個高性能的HTTP和反向代理WEB服務器,同時也提供了IMAP/POP3/SMTP服務。NGINX是由俄羅斯伊戈爾·賽索耶夫開發。Nginx在官方測試的結果中,能夠支援五萬個並列連接。2019年3月11日,Nginx公司被F5 Networks以6.7億美元收購。截至2018年1月,Nginx服務或者代理了全球30.46%的網站。在維基百科裡面講的相當全面。
1.2. 簡單說
Nginx 是一個反向代理伺服器,就像是餐廳的櫃檯,接收所有客戶的需求後,分配給廚師處理。這樣的好處可以保護後方的 Web Server 被攻擊。同時,還可以提供負載平衡 (Load Balance)、快取以及 HTTPS 憑證等功能。
2. 使用Nginx好處
- 隱藏伺服器真實IP
- 負載平衡
- 提高訪問速度
- 可以使用動靜分離方式進行架構分離
- 可使用緩存服務
- 動手做做看
3. 名詞解釋
3.1. 代理
分為正向代理及反向代理
- 正向代理:看不到client 是誰
- 反向代理:看不到server 是誰
3.1.1. 正向代理
3.1.2. 反向代理
3.2. 負載平衡
這邊講的是應用系統的負載平衡,知識連結→什麼是負載平衡?
4. 基本指令
1 | // 查詢版本 |
5. 安裝
更新 apt-get 套件內容
1
sudo apt-get update
安裝 Nginx 套件
1
sudo apt-get install nginx
在 server 上設定 nginx 套件
├── conf.d
├── fastcgi.conf
├── fastcgi_params
├── koi-utf
├── koi-win
├── mime.types
├──modules-available
├──modules-enabled
├──nginx.conf
├── proxy_params
├── scgi_params
├── sites-available
├── sites-enabled
├── snippets
├── uwsgi_params
└── win-utf
在這個版本nginx.conf include 其它檔案
1 | include /etc/nginx/conf.d/*.conf; |
這次的實驗也是直接進去到sites-enabled/default
檔案進行負載平衡等相關設定練習
補充:
裝了以下這個才能支持使用 tree -L 1
,產生目錄文字結構
1 | sudo apt install tree |
6. 配置教學
nginx.conf 大概可以分成以下幾個區塊:
- 全域性區塊:主要是設定一些影響Nginx伺服器整體執行的配置指令
- events 區塊:主要是設定 Nginx 伺服器與使用者的網路連結
- http 區塊:是配置中重要的部分,包含代理、緩存、日誌等功能都在這設定,而 http 區塊中還會包含了 server 區塊 和 location 區塊
配置概觀
1 | ... # 全域性區塊 |
http 配置說明
1 | server{ |
- listen 80; 代表監聽所有 ipv4 的位址
- listen [::]80; 代表監聽所有 ipv6 的位址
- server_name 是你的 Domain 名稱。由於 Nginx 可以用來開多個網站或反向代理多個服務,所以可以設定不同的 Domain
- location 中則是指定對不同路徑要怎麼處理,針對 location 的寫法可以參考如下
1
2
3
4
5
6
7
8
9
10
11# 匹配所有目錄
location /
# 匹配所有 /static 開頭的目錄
location /static
動手做做看
# 只有 /index 會被代理,而 /index/test 不會被代理
location = /index
動手做做看
7. 動手作實驗
我使用的是vmware進行實驗模擬
1台nginx 配 2台apache 伺服器
7.1. 負載平衡 load balance
負載平衡的方法輪詢
加權輪詢
ip-hash
least-connected
fair
url_hash
,中其中4個在nginx已經內鍵有了,後面2個需要安裝第三方套件。
7.1.1. round-robin(輪詢)
預設值,會將請求輪流平均分配到每台伺服器上,server設備性能資源相同時適用
負載平衡的設定有兩段要寫
1 | upstream [名稱]{ |
與
1 | ... |
完整site-enabled/default
檔
1 | ... |
接下來的部份僅以異動的部分進行說明。
7.1.2. 加權輪詢
當server設備性能資源不同時,可透過weight屬性設定,進行比例的分配。weight越高代表此台server性能越好。
這樣設定代表
req 1 –> .132
req 2 –> .132
req 3 –> .132
req 4 –> .133
1 | upstream kite { |
7.1.3. ip-hash
利用 hash-function 來決定使用者要被分配到的伺服器,此方法可以達到同一個使用者 (IP address) 每次連結的伺服器都是相同的。此方法最簡單,不用解決共享session機制的問題
1 | upstream kite { |
7.1.4. least-connected
會將請求分配到目前連接數最少的伺服器上
1 | upstream kite { |
7.1.5. fair(第三方套件)
按後端服務器的響應時間來分配請求,響應時間短的優先分配
1 | upstream kite { |
7.1.6. url_hash(第三方套件)
按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,后端服務器有實踐緩存機制時,此方法才比較有效。
1 | upstream backserver { |
1 | proxy_pass http://backserver/; |
7.2. 負載平衡-熱備份
熱備份有兩個層面Web Server
、Nginx
7.2.1. Web Server 熱備份
設定如下
1 | upstream kite { |
.132 server 掛了,會自動啟用133。那如果.132恢復了呢??
結論是一樣會先由132進行服務
7.2.2. Nginx 熱備份
keepalive
動手作作看
7.3. 負載平衡-Cache機制(緩存機制)
1 | server { |
在 Nginx 配置 expires 等同於在 HTTP Response Header 裡面加上一個 Expires 的字段,裡面就是這個 Cache 到期的時間
動手做做看
7.4. 動靜分離
軟體開發中,有些請求是需要後台處理的,有些請求是不需要經過後台處理的(如css、html、jpg、js等等文件),這些不需要經過後台處理的文件稱為靜態文件。動態網站裡的動態網頁根據一定規則把不變的資源與經常變的資源區分開離,動靜資源做好拆分之後,我們就可以根據靜態資源的特點將其做緩存操作,提高資源響應的速度。
7.4.1. 第一次實驗
1 | location ~*\.(jpg|jpeg|bmp|png|ico|js|css)$ { |
實驗結果:可以將靜態資料掛在nginx
上面
7.4.2. 第二次實驗
1 | upstream img_server{ |
1 | location ~*\.(jpg|jpeg|bmp|png|ico|js|css)$ { |
實驗結果:可以將靜態資料掛在某台web server
上面
7.4.3. 實驗影片
7.4.4. 實驗資訊
7.4.4.1. ubuntu01(nginx)
圖片路徑
1 | /var/www/html/images/1.jpg |
7.4.4.2. ubuntu02(webserver)
1 |
|
程式路徑
1 | /var/www/html/images/index.php |
圖片路徑
1 | /var/www/html/images/1.jpg |
7.4.4.3. ubuntu03(webserver)
1 |
|
程式路徑
1 | /var/www/html/images/index.php |
圖片路徑
1 | /var/www/html/images/1.jpg |
7.5. 取得Client IP
在Web Server那邊只會看到nginx的IP。實際上client 是先接觸nginx,所以client IP 資訊在nginx上面,因此要取得client ip 的話,要從nginx那邊設定將訊息轉發到web server,埋在request header裡,設定如下
1 | location / { |
8. 待實作記錄
- 實作 Nginx 虛擬主機 Virtual Host
- 錯誤檢測
- SSH
9. 安裝版本記錄
- nginx version: nginx/1.18.0 (Ubuntu)
- ubuntu-20.04.2.0-desktop-amd64
- VMware Workstation 16 Pro
10. 參考連結
-
- 看完囉
-
- 整理的很好,淺談的很完整
-
- 還沒看過, 跟echo 模塊有關
https://www.runoob.com/w3cnote/nginx-setup-intro.html
配置詳解,可以K一一下
https://www.nginx.cn/
詳儘內容,感覺上
https://www.bilibili.com/video/BV1F5411J7vK?p=1
重看一次
https://lq782655835.github.io/blogs/node/nginx.html
再K一下
環境架設說明
ab測試