---
# System prepended metadata

title: Nginx+Docker、Samba、Mail Server

---

# Nginx (續)
正向代理：固定的人要去不固定的地方

反向代理：不固定的人要去固定的地方

## 正向代理 (Forward Proxy)
* 位於客戶端和伺服器之間
* 客戶端透過代理伺服器向**外部伺服器發送請求**
* 節省流量
* (部分可以)隱藏客戶端

## 反向代理 (Reverse Proxy)
* 位於伺服器之前
* 代表後端伺服器接收客戶端的請求
* 隱藏後端伺服器
    * 外部用戶無法直接知道或連到你內部的後端伺服器真實 IP，所有存取都由 Nginx 領頭、轉發，這等於加了一道安全防護牆。
> ### ➡ 負載平衡 (Load Balance)
> 負載平衡是反向代理的一個重要功能，它可以將進入系統的流量或工作負載智慧地分配給多台伺服器，避免單一伺服器過載，確保系統平穩高效運作

```mermaid
flowchart TB
    subgraph "正向代理 (Forward Proxy)"
        Client1[👤 Client] --> Forward[🔄 Forward Proxy]
        Forward --> Internet1[🌐 Internet] --> Server1[🎯 Target Server]
    end
 
    subgraph "反向代理 (Reverse Proxy)"
        Client2[👤 Client] --> Reverse[🔄 Reverse Proxy]
        Reverse --> Backend1[🖥️ Backend 1]
        Reverse --> Backend2[🖥️ Backend 2]
        Backend1 --> Reverse
        Backend2 --> Reverse
    end
   
    classDef forwardClient fill:#e3f2fd
    classDef forwardProxy fill:#f3e5f5
    classDef reverseClient fill:#e8f5e8
    classDef reverseProxy fill:#fff3e0
    classDef backend fill:#fce4ec
   
    class Client1 forwardClient
    class Forward forwardProxy
    class Client2 reverseClient
    class Reverse reverseProxy
    class Backend1,Backend2 backend
```
### Nginx 反向代理
1. 建立反向代理設定檔
::: success
`sudo`:超級使用者，才有權限👍🏻
:::
把內容寫進編輯器，但要先進入編輯器
::: success
`sudo nano`: 進入編輯器📝
:::
```
sudo nano /etc/nginx/sites-available/reverse-proxy
```
```
server {
    listen 80;
    server_name proxy.lsa.moli;

    # 代理到服務 A
    location /service-a/ {
        proxy_pass http://s[學號].lsa.moli/;
        # proxy_set_header Host $host;
        # proxy_set_header X-Real-IP $remote_addr;
        # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # proxy_set_header X-Forwarded-Proto $scheme;
    }

    # 代理到服務 B
    location /service-b/ {
        proxy_pass http://regchien.lsa.moli/;
        # proxy_set_header Host $host;
        # proxy_set_header X-Real-IP $remote_addr;
        # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # proxy_set_header X-Forwarded-Proto $scheme;
    }
}
```
2. 建立軟連結
```
sudo ln -s /etc/nginx/sites-available/reverse-proxy /etc/nginx/sites-enabled/
```
3. 改 /etc/hosts，添加一行
```
127.0.0.1 proxy.lsa.moli
```
4. 測試語法、重載 nginx
```
sudo nginx -t
sudo systemctl reload nginx
```
5. 測試，存取網站 `http://proxy.example.com/service-a/` 及 `http://proxy.example.com/service-b/`


### Nginx 負載平衡
1. 建立負載平衡設定檔
```
sudo nano /etc/nginx/sites-available/load-balancer
```
```
# 定義後端伺服器群組
upstream backend_servers {
    # 預設使用 Round Robin 
    server example.com;
    server mirror.ossplanet.net;
    
    # 或使用其他演算法：
    # least_conn;  # 最少連線
    # ip_hash;     # IP Hash
}

server {
    listen 80;
    server_name lb.example.com;
    
    location / {
        proxy_pass http://backend_servers;
        #proxy_set_header Host $host;
        #proxy_set_header X-Real-IP $remote_addr;
        #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
    }
}
```

2. 建立軟連結
```
sudo ln -s /etc/nginx/sites-available/load-balancer /etc/nginx/sites-enabled/
```
3. 改 /etc/hosts，添加一行
```
127.0.0.1 lb.example.com
```
4. 測試語法、重載 nginx
```
sudo nginx -t
sudo systemctl reload nginx
```
5. 測試
```
curl lb.example.com
```

## Docker

