文章目錄
前言
Nginx 是一個反向代理伺服器,就像是餐廳的櫃檯,接收所有客戶的需求後,分配給廚師處理。這樣的好處可以保護後方的 Web Server 被攻擊。同時,還可以提供負載平衡 (Load Balance)、快取以及 HTTPS 憑證等功能。
使用 Nginx 好處如下:
- 隱藏伺服器真實 IP
- 負載均衡
- 提高訪問速度:提供靜態內容和緩存服務
- 提供安全保障:更容易排查惡意軟體等
一. 安裝 Nginx
▍Mac 的朋友:透過 Homebrew 安裝 Nginx
$ brew install nginx
▍Windows 的朋友:
透過Nginx 官方網站下載
▍Linux 的朋友:
$ sudo apt-get install nginx
二. 基本 Nginx 介紹
1. 基本操作 Nginx 指令
// 啟動 Nginx
$ nginx
// 關閉 Nginx
$ nginx -s stop
// 重啟 Nginx
$ nginx -s reload
2. 查詢 Nginx 文件位置
$ 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 資料架構
$ 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 賦值給他。
set $a hello;
內建變數 $ arg_XXX,可以取得 url 上的參數
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 資料夾內
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 區塊,這部分接下來會細談
... # 全域性區塊
event{ # events 區塊
...
}
http{ # http 區塊
server{ # server 區塊
location{ # location 區塊
...
}
}
}
1. http 區塊的詳細配置
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
# 匹配所有目錄
location /
# 匹配所有 /static 開頭的目錄
location /static
# 只有 /index 會被代理,而 /index/test 不會被代理
location = /index
2. 使用 Nginx 提供靜態內容
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
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 來運行。
# .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;
即可
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 上
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 代表,所有伺服器都掛掉之後,此伺服器才會生效
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 基本配置、負載均衡、緩存和反向代理 的介紹就到這邊告一個段落囉!有任何問題可以在以下留言~