0%

Nginx

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好處

  1. 隱藏伺服器真實IP
  2. 負載平衡
  3. 提高訪問速度
    • 可以使用動靜分離方式進行架構分離
    • 可使用緩存服務
      • 動手做做看

3. 名詞解釋

3.1. 代理

分為正向代理及反向代理

  • 正向代理:看不到client 是誰
  • 反向代理:看不到server 是誰

3.1.1. 正向代理

3.1.2. 反向代理

3.2. 負載平衡

這邊講的是應用系統的負載平衡,知識連結→什麼是負載平衡?

4. 基本指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 查詢版本
$ nginx -v

// 啟動 Nginx
$ nginx

// 關閉 Nginx
$ nginx -s stop

// 重啟 Nginx
$ nginx -s reload

// 查詢文件位置
$ nginx -t

// 資料架構
$ tree -L 1

// 查詢安裝路徑
$ whereis nginx

// 查看nginx進程
$ ps aux|grep nginx

5. 安裝

  1. 更新 apt-get 套件內容

    1
    sudo apt-get update
  2. 安裝 Nginx 套件

    1
    sudo apt-get install nginx
  3. 在 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
2
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

這次的實驗也是直接進去到sites-enabled/default檔案進行負載平衡等相關設定練習

補充:
裝了以下這個才能支持使用 tree -L 1,產生目錄文字結構

1
sudo apt install tree

6. 配置教學

nginx.conf 大概可以分成以下幾個區塊:

  1. 全域性區塊:主要是設定一些影響Nginx伺服器整體執行的配置指令
  2. events 區塊:主要是設定 Nginx 伺服器與使用者的網路連結
  3. http 區塊:是配置中重要的部分,包含代理、緩存、日誌等功能都在這設定,而 http 區塊中還會包含了 server 區塊 和 location 區塊

配置概觀

1
2
3
4
5
6
7
8
9
10
11
12
...                   # 全域性區塊

event{ # events 區塊
...
}
http{ # http 區塊
server{ # server 區塊
location{ # location 區塊
...
}
}
}

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 的寫法可以參考如下
    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
2
3
upstream [名稱]{

}

1
2
3
4
5
...
location /{
...
proxy_pass http://[名稱];
}

完整site-enabled/default

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...

upstream kite {
server 192.168.199.132;
server 192.168.199.133;
}
server{
...
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
index index.php index.html;
proxy_pass http://kite;
}
}

接下來的部份僅以異動的部分進行說明。

7.1.2. 加權輪詢

當server設備性能資源不同時,可透過weight屬性設定,進行比例的分配。weight越高代表此台server性能越好。

這樣設定代表
req 1 –> .132
req 2 –> .132
req 3 –> .132
req 4 –> .133

1
2
3
4
upstream kite {               
server 192.168.199.132 weight=3;//權重,預設為1
server 192.168.199.133;
}

7.1.3. ip-hash

利用 hash-function 來決定使用者要被分配到的伺服器,此方法可以達到同一個使用者 (IP address) 每次連結的伺服器都是相同的。此方法最簡單,不用解決共享session機制的問題

1
2
3
4
5
upstream kite {
ip_hash;#經由hash運算讓同一 clinet ip 轉發到同一台server
server 192.168.199.132;
server 192.168.199.133;
}

7.1.4. least-connected

會將請求分配到目前連接數最少的伺服器上

1
2
3
4
5
upstream kite {
least_conn;#會將請求分配到目前連接數最少的伺服器上
server 192.168.199.132;
server 192.168.199.133;
}

7.1.5. fair(第三方套件)

按後端服務器的響應時間來分配請求,響應時間短的優先分配

1
2
3
4
5
upstream kite {
fair;#動手做做看
server 192.168.199.132;
server 192.168.199.133;
}

7.1.6. url_hash(第三方套件)

按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,后端服務器有實踐緩存機制時,此方法才比較有效。

1
2
3
4
5
6
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
1
2
3
4
5
6
7
8
proxy_pass http://backserver/; 
upstream backserver{
ip_hash;
server 127.0.0.1:9090 down; (down 表示单前的server暂时不参与负载)
server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大)
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器)
}

7.2. 負載平衡-熱備份

熱備份有兩個層面Web ServerNginx

7.2.1. Web Server 熱備份

設定如下

1
2
3
4
upstream kite {	    
server 192.168.199.132;
server 192.168.199.133 backup;
}

.132 server 掛了,會自動啟用133。那如果.132恢復了呢??
結論是一樣會先由132進行服務

7.2.2. Nginx 熱備份

keepalive

動手作作看

7.3. 負載平衡-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 到期的時間
動手做做看

7.4. 動靜分離

軟體開發中,有些請求是需要後台處理的,有些請求是不需要經過後台處理的(如css、html、jpg、js等等文件),這些不需要經過後台處理的文件稱為靜態文件。動態網站裡的動態網頁根據一定規則把不變的資源與經常變的資源區分開離,動靜資源做好拆分之後,我們就可以根據靜態資源的特點將其做緩存操作,提高資源響應的速度。

7.4.1. 第一次實驗

1
2
3
location ~*\.(jpg|jpeg|bmp|png|ico|js|css)$ {						
root /var/www/html;#ok
}

實驗結果:可以將靜態資料掛在nginx上面

7.4.2. 第二次實驗

1
2
3
upstream img_server{
server 192.168.152.130:80;
}
1
2
3
4
location ~*\.(jpg|jpeg|bmp|png|ico|js|css)$ {			
proxy_pass http://img_server; #ok
}

實驗結果:可以將靜態資料掛在某台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
2
3
4
5
6
7
8
9
<?php
echo "ubuntu02"."<BR>";
echo $_SERVER['REMOTE_ADDR'];
echo "<pre>";
print_r($_SERVER);
echo "/<pre>";
?>
<p>
<img src="./images/1.jpg" style="width:250px;height:250px">

程式路徑

1
/var/www/html/images/index.php

圖片路徑

1
/var/www/html/images/1.jpg
7.4.4.3. ubuntu03(webserver)
1
2
3
4
5
6
<?php
echo "ubuntu03"."<BR>";
echo $_SERVER['REMOTE_ADDR'];
?>
<p>
<img src="images/1.jpg" style="width:250px;height:250px">

程式路徑

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
2
3
4
5
6
7
8
9
10
11
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
index index.php index.html;
proxy_pass http://kite;
proxy_set_header Host $host;#這三行
proxy_set_header X-Real-IP $remote_addr;#這三行
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#這三行

}

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. 參考連結

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測試