04 Python Flask 教學10 所有文章

淺談 Nginx 基本配置、負載均衡、緩存和反向代理

nginx配置_均衡負載_緩存_Max行銷誌

前言

Nginx 是一個反向代理伺服器,就像是餐廳的櫃檯,接收所有客戶的需求後,分配給廚師處理。這樣的好處可以保護後方的 Web Server 被攻擊。同時,還可以提供負載平衡 (Load Balance)、快取以及 HTTPS 憑證等功能。

使用 Nginx 好處如下:

  1. 隱藏伺服器真實 IP
  2. 負載均衡
  3. 提高訪問速度:提供靜態內容和緩存服務
  4. 提供安全保障:更容易排查惡意軟體等

一. 安裝 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.dsites-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 的差異,參考以下此篇所獲得的答案如下:

  1. conf.d : 適合放置 global server 的 config
  2. sites-available:適合放置 virtual host 的 config,如果要暫停只需要移到 sites-enabled 就可以了
  3. sites-enabled:存放暫時不被使用的 config,放在這個 config 不會被觸發,如有需要啟動則移到 sites-available 即可

四. Nginx 配置教學

首先了解一下 nginx.conf 的預設配置,大致上可以分成以下幾塊:

  1. 全域性區塊:主要是設定一些影響Nginx伺服器整體執行的配置指令
  2. events 區塊:主要是設定 Nginx 伺服器與使用者的網路連結
  3. 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 方法:

  1. round-robin:預設值,會將請留輪流平均分配到每台伺服器上
  2. lest-connected:會將請求分配到目前連接數最少的伺服器上
  3. 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相關教學:

那麼有關於 淺談 Nginx 基本配置、負載均衡、緩存和反向代理 的介紹就到這邊告一個段落囉!有任何問題可以在以下留言~

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *