---
# System prepended metadata

title: '[Video Note] [Web Server] [Nginx]  freeCodeCamp.org - NGINX Tutorial for Beginners'
tags: [Nginx, Web Server, Video Note]

---

Github：[freeCodeCamp.org-NGINXTutorialforBeginners](https://github.com/RainBowT0506/freeCodeCamp.org-NGINXTutorialforBeginners)

# What is NGINX

## NGINX 簡介

- NGINX 是一個開源的網頁伺服器軟體，常用於反向代理、負載平衡和快取。
- 對後端開發者來說，了解 NGINX 是非常重要的。

## NGINX 的運作方式

- 當你訪問 Airbnb.ca 時，瀏覽器會收到大量的內容，如圖片和文本，這些內容是通過網路請求從伺服器獲取的。
- 可以通過檢查瀏覽器的網路標籤來查看這些請求。
![CleanShot 2024-07-29 at 20.11.29](https://hackmd.io/_uploads/rJP-vbrKA.png)

## NGINX 的角色
![CleanShot 2024-07-29 at 20.11.57](https://hackmd.io/_uploads/HyjMw-BFA.png)

- 瀏覽器向伺服器發送請求，伺服器回應並提供網頁內容。
- 在此過程中，NGINX 充當反向代理，瀏覽器的請求先到達 NGINX，再由 NGINX 轉發給 Airbnb 伺服器，最後再由 NGINX 將回應傳回瀏覽器。
![CleanShot 2024-07-29 at 20.12.41](https://hackmd.io/_uploads/SkaBD-HY0.png)

- 這種結構稱為反向代理（Reverse Proxy）。

## 使用 NGINX 的好處

### 負載平衡
![CleanShot 2024-07-29 at 20.13.36](https://hackmd.io/_uploads/SJkYPWHK0.png)

- 當網站流量很大時，NGINX 可以將請求分配給多個伺服器，以減少單一伺服器的負載。
- NGINX 作為負載平衡器，能夠提高應用程式的擴展性和效率。

### 加密
![CleanShot 2024-07-29 at 20.14.20](https://hackmd.io/_uploads/r1uiv-HFC.png)

- 如果網站使用 HTTPS，表示伺服器加密和解密數據。
- NGINX 可以集中處理這些加密和解密過程，避免每個伺服器都需要單獨設置。
![CleanShot 2024-07-29 at 20.14.41](https://hackmd.io/_uploads/r1epwbSK0.png)

# NGINX Installation

## 安裝步驟

1. 打開終端機，執行 `brew install nginx`（需要先安裝 Homebrew）。
2. 安裝完成後，檢查 `cd /usr/local/etc/nginx` 目錄下的文件和資料夾。
* 可以使用 which nginx 命令來查看 Nginx 的安裝路徑。
```
which nginx
/opt/homebrew/bin/nginx
```
* Nginx 配置文件通常位於 /opt/homebrew/etc/nginx。
3. 你可以使用 ls 命令來列出目錄中的文件，確保存在 nginx.conf 配置文件。
```
fastcgi.conf		mime.types		servers
fastcgi.conf.default	mime.types.default	uwsgi_params
fastcgi_params		nginx.conf		uwsgi_params.default
fastcgi_params.default	nginx.conf.default	win-utf
koi-utf			scgi_params
koi-win			scgi_params.default
```

疑問：[為什麼安裝路徑 /opt/homebrew/bin/nginx 卻是使用 cd /opt/homebrew/etc/nginx？](https://hackmd.io/tqmS-QWjRfaY_rn9ilxIoQ#%E7%96%91%E5%95%8F)
## 配置 NGINX
- 使用 code . 命令後，VS Code 打開當前目錄
```
code .
zsh: command not found: code
```
- 設定 code 命令行工具
    * 打開 Visual Studio Code。
    * 按 Cmd+Shift+P 打開命令面板。
    * 輸入 `Shell Command: Install 'code' command in PATH`，並選擇該命令。
- 使用 VS Code 打開 NGINX 配置文件 `nginx.conf`。
- 這個文件是用來配置 NGINX 反向代理的核心文件。

## 啟動 NGINX

- 在終端機中執行 `nginx` 命令來啟動 NGINX。
- 打開瀏覽器並訪問 `localhost:8080`，你會看到 NGINX 已經啟動並在提供網頁內容。
![CleanShot 2024-07-29 at 20.30.53](https://hackmd.io/_uploads/HyJ5j-SFR.png)
![CleanShot 2024-07-29 at 20.32.06](https://hackmd.io/_uploads/rkrJhbrK0.png)

# NGINX Terminology
## 簡介
- 安裝並運行 NGINX
- 開始返回應用程式所需的文件和文件夾及圖像

## nginx.conf 文件
- 主要包含兩個部分：指令 (directives) 和上下文 (context)

## 指令 (Directives)
- 以鍵值對形式出現
- 例如：`worker_processes 1;` 和 `include mime.types;`

## 上下文 (Context)
- 以大括號包圍的代碼塊
- 例如：`events` 和 `http` 上下文
- 在上下文中包含特定的指令

## HTTP 上下文
- 定義 HTTP 服務器
- 包含配置服務器的指令

# Serving Static Content
## 步驟
1. 創建目錄並在 VS Code 中打開
2. 創建 `index.html` 文件，寫入簡單的 HTML 內容
3. 配置 NGINX 以服務該文件
3. 使用 `ngix -s reload` 重新加載 Server
![CleanShot 2024-07-30 at 10.41.33](https://hackmd.io/_uploads/ryj1X0rY0.png)
## 配置 NGINX
- 在 `nginx.conf` 文件中添加 HTTP 和 events 上下文
- 定義 server 上下文，並添加相關指令
  - `listen` 指令設定端口
  - `root` 指令設定文件路徑
- 重載 NGINX 配置使更改生效

# Mime Types
## 簡介
- 添加 CSS 文件，並在 HTML 中引用
- 遇到樣式未應用的問題，需配置 mime types
![CleanShot 2024-07-30 at 11.46.06](https://hackmd.io/_uploads/SkpzfJ8K0.png)

## 解決方案
- 檢查文件的 content type
- 配置 HTTP 上下文中的 mime types
  - 為不同的文件類型設置對應的 mime types

## 使用 NGINX 默認 mime types
- 使用 include 指令引入默認的 mime types 配置
- 重載 NGINX 配置使更改生效

# Location Context
## 簡介
- 介紹 location block 或 location context 的重要性
- 允許我們指定特定的端點和頁面

## 設置範例
1. 創建一個 fruits 目錄並在其中放置一個 index.html 文件
2. 配置 NGINX 以服務這個文件

## 配置 NGINX
- 在 server 上下文中使用 location 指令
  - `location /fruits` 設定路徑
  - 指定 root 目錄以服務文件
```
http {

    include mime.types;

    server {
        listen 8080;
        root /Users/userName/Desktop/mysite;

        location /fruits {
            root /Users/userName/Desktop/mysite;
        }
    }
}

events {}

```
- 重新加載 NGINX 配置
* http://localhost:8080/fruits/
## Alias 使用
- 當需要服務不同路徑但不希望附加原始路徑時使用 alias
```
http {

    include mime.types;

    server {
        location /carbs {
            alias /Users/userName/Desktop/mysite/fruits;
        }
    }
}

events {}
```
- 範例：`location /carbs` 使用 alias 指向 fruits 目錄
- 重新加載 NGINX 配置
* http://localhost:8080/carbs/
## 處理不同文件名
- 創建 vegetables 目錄並放置 veggies.html 文件
- 使用 try_files 指令指定不同的文件名
  - 順序嘗試指定的文件，若不存在則返回 404
```
2024/07/30 14:25:31 [error] 6622#0: *39 directory index of "/Users/userName/Desktop/mysite/vegetables/" is forbidden, client: 127.0.0.1, server: , request: "GET /vegetables/ HTTP/1.1", host: "localhost:8080"
```

```
http {

    include mime.types;

    server {
        location /vegetables{
            root /Users/rainbowt/Desktop/mysite;
            try_files /vegetables/veggies.html /index.html =404;
        }
    }
}

events {}

```
## 正則表達式匹配
- 在 location 中使用正則表達式
  - 例如：匹配 `/count/數字` 路徑
  - 使用 `try_files` 指定匹配的文件或返回 404
```
http {

    include mime.types;

    server {
        listen 8080;
        root /Users/rainbowt/Desktop/mysite;

        location ~* /count/[0-9] {
            root /Users/rainbowt/Desktop/mysite;
            try_files /index.html =404;
        }
    }
}

events {}
```
## 總結
- 使用 location 和 alias 指令靈活配置不同路徑和文件服務
- 使用 try_files 指令處理不同的文件名和返回狀態

# Rewires and Redirect

## 介紹

* 本次討論的主題是 nginx 中的重定向（redirect）和重寫（rewrite）。
* 透過範例說明這些概念的使用方式。

## 重新載入設定並測試重定向

* 設定 nginx 時可以使用 location 區塊來處理不同的 URL 路徑。
* 在範例中，當訪問 `/count/5` 或 `/count/2` 時，會被重定向到其他頁面，這是透過正規表達式來完成的。

## 重定向（Redirect）

* 重定向是一個簡單的概念，首先在 nginx 設定檔中新增一個 location 區塊。
* 例如，訪問 `/crops` 時，想要重定向到 `/fruits`，可以使用以下設定：
  ```nginx
  location /crops {
      return 307 /fruits;
  }
  ```
* 重新載入 nginx 設定後，訪問 `/crops` 會自動重定向到 `/fruits`，並在瀏覽器的 URL 欄位中顯示 `/fruits`。

## 重寫（Rewrite）

* 重寫與重定向不同，它不會改變瀏覽器的 URL，只會在伺服器端改變路徑處理。
* 範例中，訪問 `/number/3` 時，希望 URL 保持不變但實際處理的路徑變為 `/count/3`：
  ```nginx
  rewrite ^/number/(\w+)$ /count/$1;
  ```
* 這樣設定後，訪問 `/number/3` 時，URL 保持不變，但伺服器實際會處理 `/count/3` 的內容。

## 總結

* 重定向（redirect）用於將用戶導向另一個 URL，並在瀏覽器顯示新的 URL。
* 重寫（rewrite）則是改變伺服器處理的路徑，但保持瀏覽器顯示的 URL 不變。
* 理解和靈活運用這些功能對於 nginx 的配置和使用非常重要。


# NGINX as a Load Balancer

## 介紹

* 當應用程式開始有大量使用者時，我們需要擴展應用程式。
* 最佳的擴展方式是建立多個伺服器。
* 問題在於用戶該如何選擇伺服器進行請求，這是 NGINX 所解決的問題。
* NGINX 位於用戶與伺服器之間，負責將請求轉發至特定伺服器。

## 負載平衡（Load Balancer）的概念

* 常見的算法是輪循算法（Round Robin），將請求依次分配給不同的伺服器。
* 需要配置多個伺服器，最佳方式是使用 Docker 建立隔離的伺服器容器。

## 建立 Docker 容器

1. **建立伺服器應用程式**
    * 建立新目錄並在其中創建 `index.js`。
    * 使用 Express 建立簡單的 Node.js 應用程式：
      ```javascript
      const express = require('express');
      const app = express();

      app.get('/', (req, res) => {
          res.send('I am an endpoint');
      });

      app.listen(7777, () => {
          console.log('Listening on port 7777');
      });
      ```
    * 初始化 Node 應用程式並安裝 Express：
      ```bash
      npm init -y
      npm install express
      ```

2. **建立 Dockerfile**

* 建立 Dockerfile，內容如下：
Nodejs Docker WebApp（失效）：https://nodejs.org/docs/guides/nodejs-docker-webapp/
![CleanShot 2024-07-30 at 15.02.51](https://hackmd.io/_uploads/By27gMUKR.png)
```
FROM node:16

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

# Bundle app source
COPY . .

EXPOSE 8080
CMD ["node", "server.js"]
```
3. **建立 Docker 映像**
    * 在伺服器目錄中執行命令建立映像：
      ```bash
      docker build -t myserver
      ```

4. **運行 Docker 容器**
    * 運行多個容器，映射到不同的本機端口：
      ```bash
      docker run -d -p 1111:7777 myserver
      docker run -d -p 2222:7777 myserver
      docker run -d -p 3333:7777 myserver
      docker run -d -p 4444:7777 myserver
      ```

## 配置 NGINX 負載平衡

1. **修改 NGINX 設定檔**
    * 打開並編輯 NGINX 設定檔：
      ```nginx
      upstream backendservers {
          server 127.0.0.1:1111;
          server 127.0.0.1:2222;
          server 127.0.0.1:3333;
          server 127.0.0.1:4444;
      }

      server {
          listen 8080;

          location / {
              proxy_pass http://backendservers;
          }
      }
      ```

2. **重新載入 NGINX 設定**
    * 執行命令重新載入 NGINX 設定：
      ```bash
      sudo nginx -s reload
      ```

3. **測試負載平衡**
    * 訪問 `localhost:8080`，應用程式將在多個伺服器之間進行輪循。

## 總結

* NGINX 作為負載平衡器，能有效分配請求至多個伺服器。
* 使用 Docker 建立多個伺服器容器，有助於快速擴展應用程式。
* 輪循算法是實現負載平衡的常用方法之一。

# 指令
## 測試 Nginx 配置
在重新加載 Nginx 配置之前，先測試配置文件是否有誤
```
sudo nginx -t
```

output:
```
nginx: the configuration file /opt/homebrew/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /opt/homebrew/etc/nginx/nginx.conf test is successful
```
## 重新加載 Nginx 配置
重新加載 Nginx 配置以應用更改
```
sudo nginx -s reload
```

## 查看 Homebrew 安裝的 Nginx 錯誤日誌
```
sudo tail -f /opt/homebrew/var/log/nginx/error.log
```

## 清除錯誤日誌文件
```
sudo truncate -s 0 /opt/homebrew/var/log/nginx/error.log
```

## Hard reload
Cmd + Shift + R

# 疑問
## NGINX Installation
Q：
為什麼安裝路徑 /opt/homebrew/bin/nginx
卻是使用 cd /opt/homebrew/etc/nginx

A：
這是因為不同的安裝路徑分別有不同的用途：

1. **執行檔路徑**：
   - `/opt/homebrew/bin/nginx` 是 Nginx 的執行檔路徑。這裡存放的是 Nginx 的可執行文件，也就是你啟動 Nginx 服務時所使用的程式。

2. **配置檔案路徑**：
   - `/opt/homebrew/etc/nginx` 是 Nginx 的配置檔案所在路徑。這裡存放的是 Nginx 的配置文件，如 `nginx.conf`，以及其他相關的設定文件。這些文件控制 Nginx 的運行方式和行為。

總結來說，執行檔和配置檔案通常會分開存放在不同的目錄中：

- **執行檔**：`/opt/homebrew/bin/`
- **配置檔案**：`/opt/homebrew/etc/`

這樣的設置有助於清晰地管理應用程式的各個部分，並且遵循了 Unix 系統中的標準慣例。如果你需要啟動、停止或重啟 Nginx 服務，你會使用執行檔，而如果你需要修改 Nginx 的行為，你會編輯配置檔案。
## Nginx 命令
```
nginx % nginx -s reload
nginx: [alert] kill(25599, 1) failed (3: No such process)
```

### nginx -s reload 沒反應
nginx -s reload 沒反應，Content-Type:
text/plain 沒有改成 text/css
可以開無痕或新 user 網頁來做三角驗證。
使用清除快取解決問題。

## 403 Forbidden
查看 Nginx 錯誤日誌
```
sudo tail -f /opt/homebrew/var/log/nginx/error.log

2024/07/30 11:06:22 [notice] 4047#0: signal process started
2024/07/30 11:06:36 [error] 4048#0: *19 "/Users/userName/Desktop/mysite/index.html" is forbidden (13: Permission denied), client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "localhost:8080"
```

我重開機後正常，我懷疑沒有重新加載 .zshrc 文件 


# 關鍵字
- **NGINX**：一個開源的網頁伺服器軟體，用於反向代理、負載均衡和緩存。
- **反向代理（Reverse Proxy）**：NGINX作為中間伺服器，接收客戶端的請求，然後將請求轉發給後端伺服器，接收後端伺服器的響應後再傳回給客戶端。
- **負載均衡（Load Balancing）**：當有多個後端伺服器時，NGINX將請求分配給不同的伺服器以均衡負載，提升效能和可靠性。
- **HTTP/HTTPS**：HTTP是網頁數據傳輸的協議，HTTPS是其安全版本，通過加密來保護數據傳輸安全。
- **AWS（Amazon Web Services）**：提供雲計算服務的平臺，許多公司使用其來託管伺服器。
- **伺服器瓶頸（Server Bottleneck）**：當伺服器無法處理所有傳入請求時會出現的效能問題，通常導致延遲增加。
- **加密和解密（Encryption and Decryption）**：保護數據傳輸安全的過程，加密將數據轉換為不可讀的形式，解密將其轉換回原始形式。
- **Homebrew**：Mac上的包管理器，用於安裝和管理軟體包。
- **配置文件（Configuration File）**：如nginx.conf，用於設置NGINX的各種功能和參數。
- **本地伺服器（localhost）**：指向本機的伺服器，用於測試和開發。
- **網絡請求（Network Request）**：客戶端向伺服器發送的請求，用於獲取網頁內容。
- **網絡標籤（Network Tab）**：瀏覽器開發者工具中的一個標籤，用於檢查網絡請求和響應。
- **瀏覽器（Browser）**：用於訪問網頁的應用程序，如Chrome、Firefox等。
- **內容（Content）**：網頁上的文本、圖片、視頻等資源。
- **映像（Image）**：網頁上的圖片資源。
- **檢查（Inspect）**：使用瀏覽器開發者工具查看和調試網頁。
- **HTTP狀態碼（HTTP Status Code）**：伺服器返回的響應碼，用於表示請求的結果。
- **雲伺服器（Cloud Server）**：託管在雲計算平臺上的伺服器，如AWS上的伺服器。
- **請求處理（Request Handling）**：伺服器接收和處理客戶端請求的過程。
- **用戶端（Client）**：發送請求並接收響應的設備或應用程序，如用戶的電腦或手機。 
- **指令（Directive）**：NGINX配置文件中的鍵值對，如`worker_processes 1;`表示工作進程數量為1。
- **上下文（Context）**：定義配置範圍的代碼塊，用大括號包圍，如`events`上下文和`http`上下文。
- **HTTP上下文（HTTP Context）**：定義HTTP伺服器配置的上下文，其中包含許多指令。
- **事件上下文（Events Context）**：管理NGINX事件處理的上下文。
- **伺服器上下文（Server Context）**：在HTTP上下文內部，用於定義單個伺服器配置的上下文。
- **靜態內容（Static Content）**：指不需要動態生成的文件，如HTML、CSS和圖片文件。
- **端口（Port）**：網絡伺服器監聽請求的通訊端口，如`listen 8080;`表示監聽8080端口。
- **根目錄（Root Directive）**：指定伺服器要提供的文件所在的根目錄，如`root /path/to/site;`。
- **配置重載（Configuration Reload）**：重新加載NGINX配置文件的命令，如`nginx -s reload`。
- **MIME類型（Mime Types）**：定義不同文件類型的標識方法，如`text/css`表示CSS文件。
- **文檔類型（DOCTYPE）**：HTML文件的文檔類型宣告，如`<!DOCTYPE html>`。
- **字符集（Charset）**：指定HTML文件的字符編碼，如`<meta charset="UTF-8">`。
- **標題（Head）**：HTML文件的頭部區域，用於包含元數據和鏈接外部資源。
- **超文本標記語言（HTML）**：用於構建網頁結構的標記語言。
- **連結（Link）**：HTML標籤，用於連接外部CSS文件，如`<link rel="stylesheet" href="styles.css">`。
- **背景顏色（Background Color）**：CSS屬性，用於設置元素的背景顏色。
- **顏色（Color）**：CSS屬性，用於設置元素的文本顏色。
- **硬重載（Hard Reload）**：強制重新加載網頁並清除緩存的操作，通常使用命令`Command+Shift+R`。
- **緩存（Caching）**：在客戶端或伺服器端保存已加載的資源，以提高後續請求的加載速度。 
- **位置上下文（Location Context）**：NGINX配置中的一個重要概念，用於指定特定的端點或頁面，以服務不同類型的HTML元素。
- **目錄（Directory）**：在網站中，用於組織和管理不同類型的內容。例如，`fruits`目錄包含水果相關的HTML文件。
- **無序列表（UL）**：HTML標籤，用於創建無序列表。
- **列表項（LI）**：HTML標籤，用於創建列表中的單個項目。
- **位置塊（Location Block）**：用於在NGINX配置文件中定義特定路徑的配置。例如，`location /fruits`定義了當訪問`/fruits`時的行為。
- **根目錄（Root）**：指示伺服器從哪個目錄服務文件。例如，`root /path/to/site`。
- **別名（Alias）**：在NGINX配置中，用於指定一個路徑別名，與`root`不同，它不會將請求的路徑附加到別名路徑的末尾。
- **重載（Reload）**：重新加載NGINX配置文件以應用更改。
- **403 Forbidden**：HTTP狀態碼，表示伺服器拒絕提供請求的資源。
- **404 Not Found**：HTTP狀態碼，表示伺服器無法找到請求的資源。
- **嘗試文件（Try Files）**：NGINX指令，用於指定當請求的文件不存在時要嘗試的其他文件。例如，`try_files /path/to/file /index.html =404`。
- **正則表達式（Regular Expression）**：用於在NGINX位置上下文中匹配特定的URL模式。
- **Tilde符號（~）**：在NGINX配置中，用於指示正則表達式匹配。
- **星號（*）**：在正則表達式中，用於匹配零個或多個字符。
- **重定向（Redirect）**：將一個URL重定向到另一個URL。例如，將所有`/count/`路徑重定向到根目錄。
- **靜態內容（Static Content）**：指不需要動態生成的文件，如HTML、CSS和圖片文件。
- **標題（Header）**：HTTP響應的一部分，用於提供有關響應的元數據。
- **內容類型（Content Type）**：HTTP標頭，用於指示資源的媒體類型。例如，`text/html`表示HTML文件。
- **樣式表（Stylesheet）**：CSS文件，用於定義網頁的樣式和佈局。
- **鏈接標籤（Link Tag）**：HTML標籤，用於在HTML文件中引入外部CSS文件。 
- **重定向（Redirect）**：將一個URL重定向到另一個URL，使用HTTP狀態碼如307來進行跳轉。例如，當訪問`/crops`時，重定向到`/fruits`。
- **重寫（Rewrite）**：改變請求的URL路徑，但保持瀏覽器中的URL不變。例如，將`/number/{number}`重寫為`/count/{number}`，但URL仍然顯示為`/number/{number}`。
- **307重定向（307 Redirect）**：HTTP狀態碼，表示臨時重定向，請求方法和主體在重定向後保持不變。
- **變量（Variable）**：在重寫規則中使用的佔位符，如`$1`表示匹配的第一個分組。
- **正則表達式（Regular Expression）**：用於匹配URL模式的語法，例如`\w+`表示匹配一個或多個字母或數字。
- **位置塊（Location Block）**：在NGINX配置中定義特定路徑的配置。例如，`location /crops`定義了當訪問`/crops`時的行為。
- **返回指令（Return Directive）**：在NGINX配置中用於立即返回特定狀態碼和URL的指令。例如，`return 307 /fruits;`表示返回307重定向到`/fruits`。
- **重寫指令（Rewrite Directive）**：在NGINX配置中用於改變請求URL的指令。例如，`rewrite ^/number/(\w+)$ /count/$1;`表示將`/number/{number}`重寫為`/count/{number}`。
- **NGINX重載（NGINX Reload）**：重新加載NGINX配置文件以應用更改，通常使用命令`nginx -s reload`。
- **URL模式（URL Pattern）**：用於匹配特定URL結構的模式，例如`/number/{number}`。
- **動態端點（Dynamic Endpoint）**：具有可變部分的URL端點，例如`/number/{number}`中的`{number}`部分。
- **靜態端點（Static Endpoint）**：固定不變的URL端點，例如`/crops`或`/fruits`。
- **HTML元素（HTML Elements）**：網頁中的基本組成部分，如標籤和文本。
- **內容轉發（Content Forwarding）**：將請求轉發到不同的路徑，但保持原始URL不變。
- **伺服器上下文（Server Context）**：在NGINX配置文件中的一個部分，用於定義伺服器相關的配置。
- **根目錄（Root Directive）**：指示伺服器從哪個目錄服務文件，例如`root /path/to/site;`。
- **別名（Alias）**：在NGINX配置中，用於指定一個路徑別名，與`root`不同，它不會將請求的路徑附加到別名路徑的末尾。
- **返回指令（Return Directive）**：在NGINX配置中用於立即返回特定狀態碼和URL的指令。例如，`return 307 /fruits;`表示返回307重定向到`/fruits`。
- **重寫指令（Rewrite Directive）**：在NGINX配置中用於改變請求URL的指令，例如`rewrite ^/number/(\w+)$ /count/$1;`表示將`/number/{number}`重寫為`/count/{number}`。
- **負載均衡（Load Balancing）**：NGINX的高級功能，用於將請求分配給多個伺服器以均衡負載，提高效能和可靠性。 
- **負載均衡（Load Balancing）**：將請求分配給多個伺服器以均衡負載，提高效能和可靠性。
- **Docker**：一個用於創建和管理容器化應用程序的工具，容器是隔離的執行環境。
- **Docker容器（Docker Container）**：輕量級、可移植的軟體包，包含應用程序及其所有依賴。
- **Docker映像（Docker Image）**：用於創建容器的靜態快照，包含運行應用程序所需的所有內容。
- **Dockerfile**：一個文本文件，包含構建Docker映像的指令。
- **端口映射（Port Mapping）**：將主機的端口映射到容器內部的端口，以便外部訪問容器中的應用程序。
- **round robin算法**：一種將請求依次分配給每個伺服器的負載均衡算法。
- **上游伺服器（Upstream Server）**：NGINX配置中的一組伺服器，用於負載均衡。
- **反向代理（Reverse Proxy）**：NGINX作為中間伺服器，接收客戶端的請求並將其轉發給後端伺服器，然後將響應返回給客戶端。
- **代理轉發（Proxy Pass）**：NGINX指令，用於將請求轉發給上游伺服器。
- **指令（Directive）**：NGINX配置文件中的鍵值對，用於設置各種功能。
- **上下文（Context）**：定義配置範圍的代碼塊，用大括號包圍。
- **HTTP上下文（HTTP Context）**：定義HTTP伺服器配置的上下文。
- **伺服器上下文（Server Context）**：定義單個伺服器配置的上下文。
- **位置塊（Location Block）**：定義特定路徑的配置。
- **npm**：Node.js的包管理器，用於安裝和管理JavaScript庫和工具。
- **Express**：Node.js的Web應用框架，用於構建伺服器端應用程序。
- **GET請求（GET Request）**：一種HTTP請求方法，用於從伺服器獲取數據。
- **控制台日誌（Console Log）**：在控制台中輸出消息，用於調試和信息顯示。
- **npm腳本（npm Script）**：在package.json文件中定義的命令，可通過`npm run`運行。 