Table
前言
Nginx 是一個反向代理伺服器,就像是餐廳的櫃檯,接收所有客戶的需求後,分配給廚師處理。這樣的好處可以保護後方的 Web Server 被攻擊。同時,還可以提供負載平衡 (Load Balance)、快取以及 HTTPS 憑證等功能。
使用 Nginx 好處如下:
- 隱藏伺服器真實 IP
- 負載均衡
- 提高訪問速度:提供靜態內容和緩存服務
- 提供安全保障:更容易排查惡意軟體等
一. 安裝 Nginx
▍Mac 的朋友:透過 Homebrew 安裝 Nginx
1 |
$ brew install nginx |
▍Windows 的朋友:
透過Nginx 官方網站下載
▍Linux 的朋友:
1 |
$ sudo apt-get install nginx |
二. 基本 Nginx 介紹
1. 基本操作 Nginx 指令
1 2 3 4 5 6 7 8 |
// 啟動 Nginx $ nginx // 關閉 Nginx $ nginx -s stop // 重啟 Nginx $ nginx -s reload |
2. 查詢 Nginx 文件位置
1 2 3 4 |
$ nginx -t >>> nginx: the configuration file /etc/nginx/nginx.conf syntax is ok >>> nginx: configuration file /etc/nginx/nginx.conf test is successful |
3. Nginx 資料架構
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ cd /etc/nginx $ tree -L 1 ├── nginx.conf ├── conf.d ├── sites-available ├── sites-enabled ├── fastcgi.conf ├── fastcgi_params ├── koi-utf ├── koi-win ├── mime.types ├── modules-available ├── modules-enabled ├── proxy_params ├── scgi_params ├── snippets ├── uwsgi_params └── win-utf |
4. Nginx 變數介紹
在 Nginx 配置中,變數只能存放字串,並在變數名前面加上 $,如下我們設定了變數 a 並將 hello 賦值給他。
1 |
set $a hello; |
內建變數 $ arg_XXX,可以取得 url 上的參數
1 2 3 4 5 6 7 8 9 10 11 12 |
location /test { echo "name: $arg_name"; echo "class: $arg_class"; } $ curl 'http://localhost:8080/test' >>> name: >>> class: $ curl 'http://localhost:8080/test?name=Tom&class=3' >>> name: Tom >>> class: 3 |
關於更多的 Nginx 變數與執行順序介紹,可以參考此篇:agentzh 的 Nginx 教程(版本 2020.03.19)
三. 如何寫入新的 Nginx 配置
我們可以看到 /etc/nginx/nginx.conf
內最後面兩行,引入了 conf.d
和 sites-enabled
兩個資料夾內的配置,代表了如果要寫入新的參數,可以在以下這三個地方新增:
1. nginx.conf
2. conf.d 資料夾內
3. sites-enabled 資料夾內
1 2 3 4 5 6 7 8 |
http{ ... ... include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } |
而新增的配置要寫在 nginx.conf 裡面,還是在 conf.d 或 sites-available 哪個比較適合呢?
關於 conf.d 和 sites-available 和 sites-enabled 的差異,參考以下此篇所獲得的答案如下:
- conf.d : 適合放置 global server 的 config
- sites-available:適合放置 virtual host 的 config,如果要暫停只需要移到 sites-enabled 就可以了
- sites-enabled:存放暫時不被使用的 config,放在這個 config 不會被觸發,如有需要啟動則移到 sites-available 即可
四. Nginx 配置教學
首先了解一下 nginx.conf
的預設配置,大致上可以分成以下幾塊:
- 全域性區塊:主要是設定一些影響Nginx伺服器整體執行的配置指令
- events 區塊:主要是設定 Nginx 伺服器與使用者的網路連結
- http 區塊:是配置中重要的部分,包含代理、緩存、日誌等功能都在這設定,而 http 區塊中還會包含了 server 區塊 和 location 區塊,這部分接下來會細談
1 2 3 4 5 6 7 8 9 10 11 12 |
... # 全域性區塊 event{ # events 區塊 ... } http{ # http 區塊 server{ # server 區塊 location{ # location 區塊 ... } } } |
1. http 區塊的詳細配置
1 2 3 4 5 6 7 8 |
server{ listen 80; listen [::]80; server_name example.com www.example.com; location /{ proxy_pass http://127.0.0.1:8001; } } |
- listen 80; 代表監聽所有 ipv4 的位址
- listen [::]80; 代表監聽所有 ipv6 的位址
- server_name 是你的 Domain 名稱。由於 Nginx 可以用來開多個網站或反向代理多個服務,所以可以設定不同的 Domain
- location 中則是指定對不同路徑要怎麼處理,針對 location 的寫法可以參考如下
▍location
1 2 3 4 5 6 7 8 |
# 匹配所有目錄 location / # 匹配所有 /static 開頭的目錄 location /static # 只有 /index 會被代理,而 /index/test 不會被代理 location = /index |
2. 使用 Nginx 提供靜態內容
1 2 3 4 5 6 7 8 9 10 11 |
server { listen 80; server_name www.example.com; location / { proxy_pass http://localhost:8080; } location /images { root /home; # 注意 這裡是指定資料夾的上一層 } } |
關於 Nginx Serving Static Content 的更多介紹,可以參考此篇:NGINX static file server – 小萬同學的程式筆記 – Medium
3. 實作 Nginx 緩存機制 Cache
1 2 3 4 5 6 7 8 9 10 |
server { listen 80; server_name www.example.com; location ~* \.(jpg|jpeg|png|css|js)$ { expires 365d; proxy_pass http://loaclhost:8080; } } |
在 Nginx 配置 expires 等同於在 HTTP Response Header 裡面加上一個 Expires 的字段,裡面就是這個 Cache 到期的時間
關於 Nginx 實作 Cache 的更多介紹,可以參考以下幾篇:
* 循序漸進理解 HTTP Cache 機制
* DevOps Nginx 設定 Cache 機制
4. 實作 Nginx 虛擬主機 Virtual Host
在比較小型的專案中為了節省資源,會將多個網站部署在同一台主機上,藉由不同的 domain,透過 Nginx 做出 Virtual Host 來運行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# .org server { listen 80; server_name example.org www.example.org; } # .net server { listen 80; server_name example.net www.example.net; } # .com server { listen 80; server_name example.com www.example.com; } |
關於 Virtual Host 的更多介紹,可以參考此篇:Nginx Virtual Host 設定教學 – Soul & Shell Blog
5. 實作 Nginx 負載平衡 load balance
▍Nginx 提供了以下三種 load balancing 方法:
- round-robin:預設值,會將請留輪流平均分配到每台伺服器上
- lest-connected:會將請求分配到目前連接數最少的伺服器上
- ip-hash:利用 hash-function 來決定使用者要被分配到的伺服器,此方法可以達到同一個使用者 (IP address) 每次連結的伺服器都是相同的
如果要從默認值 round-robin 方法改成 lest-connected 或 ip-hash 的方法,只需要在第一行加上lest_conn;
或 ip_hash;
即可
1 2 3 4 5 6 7 8 9 10 11 12 |
upstream myapp { ip_hash; server srv1.example.com; server srv2.example.com; server srv3.example.com; } server { listen 80; location / { proxy_pass http://backend; } } |
▍分配權重 weight
weight 默認值為 1,以下的配置代表如果有 5 次新的請求,則會有 3 次被分配到 srv1 和分配各 1 次到 srv2 srv3 上
1 2 3 4 5 6 7 8 9 10 11 |
upstream myapp1 { server srv1.example.com weight=3; server srv2.example.com; server srv3.example.com; } server { listen 80; location / { proxy_pass http://backend; } } |
▍備份 backup
backup 代表,所有伺服器都掛掉之後,此伺服器才會生效
1 2 3 4 5 6 7 8 9 10 11 |
upstream backend { server srv1.example.com weight=3; server srv2.example.com; server srv3.example.com backup; } server { listen 80; location / { proxy_pass http://backend; } } |
關於 load balancer 的更多介紹,可以參考此篇:Using nginx as HTTP load balancer
最後~
▍回顧本篇我們介紹了的內容:
- 安裝 Nginx
- 基本 Nginx 介紹
- 基本操作 Nginx 指令
- Nginx 文件位置
- Nginx 資料架構
- Nginx 變數介紹
- 如何寫入新的 Nginx 配置
- Nginx 配置教學
- http 區塊的詳細配置
- 使用 Nginx 提供靜態內容
- 實作 Nginx 緩存機制 Cache
- 實作 Nginx 虛擬主機 Virtual Host
- 實作 Nginx 負載平衡 load balance
關於 Flask 教學的延伸閱讀:
▍關於 Flask教學系列目錄:
▍其他 Flask相關教學:
- 【Flask教學系列】Flask 為甚麼需要 WSGI 與 Nginx
- 【Flask教學系列】實作 Flask CORS
- 【Flask教學系列】實作 Flask CSRF Protection
- 【Flask教學系列】實作 Dockerfile + nginx + ssl + Flask 教學 (附GitHub完整程式)
那麼有關於 淺談 Nginx 基本配置、負載均衡、緩存和反向代理 的介紹就到這邊告一個段落囉!有任何問題可以在以下留言~