2026年10月13日 星期二

Ubuntu 新增第二 IP 與 web server

一、原由

    原本放在資中的 VM 的個人網頁與教材範例因 storage 掛掉而整套系統毀損,無奈在自身研究室中使用另一台已使用的主機做個人網頁。

二、增加 IP 方法

    使用的主機為 Uubuntu 20.04 實體機,已有 IP 與 DN 做 AI Agent 與 RAG 之用,因此要在現有設備上增加原 VM 用 IP 並使用 virtual host 功能增加一網站,此外需要用 https 與憑證。

1. 先查使用網卡的代號

    用 ifconfig -a 或 ip addr show 都可以,前者需先安裝 net-tools

2. 使用 ls /etc/netplan 查看這目錄下的設定檔名稱, 你會看到類似 01-network-manager-all.yaml  這檔名


3. 將查到的網卡代號寫到 上述的檔案中

network:

  version: 2

  renderer: NetworkManager

  ethernets:

    enp6s0: # 請改為你主機實際的網卡名稱

      addresses:

        - 192.168.1.79/24

        - 192.168.1.80/24

      gateway4: 192.168.1.254 # 保持你原本的預設網關

      nameservers:

        addresses:

          - 1.1.1.1


4. 執行 netplan apply 使其生效
5. 用 ip addr show 查看是否在網路下同時出現 192.168.1.79 與 192.168.1.80 兩 IP

三、增加 Nginx virtual host  方法
   在 Nginx 中,你可以針對不同的 IP、Domain Name 或 Port 設定獨立的 server 區塊。

1. 建立新網站的 nginx 設定檔
 
   sudo nano /etc/nginx/sites-available/macgyver

2. 內容寫下

# HTTP 轉 HTTPS (建議)

server {

    listen 192.168.1.80:80;

    server_name macgyver.xxx.xxx;

    location /.well-known/acme-challenge/ {

        default_type "text/plain";

        allow all;

        root /var/www/html;

    }

    return 301 https://$host$request_uri;

}

# HTTPS 服務設定

server {

    listen 192.168.1.80:443 ssl;

    server_name macgyver.xxx.xxx;

    # 網站根目錄設定 (如果是靜態網頁或 PHP)

    root /var/www/macgyver;

    index index.html index.php;

    # SSL 憑證路徑 (請替換為 macgyver 的憑證)

    ssl_certificate /etc/letsencrypt/live/macgyver.xxx.xxx/fullchain.pem;

    ssl_certificate_key /etc/letsencrypt/live/macgyver.xxx.xxx/privkey.pem;

    include /etc/letsencrypt/options-ssl-nginx.conf;

    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {

        try_files $uri $uri/ =404;

    }

}

3. 為避免原本的服務誤攔 192.168.1.80 的流量 , 所以原來 AI RAG 的 nginx 檔案要明確指定IP.

    sudo nano /etc/nginx/sites-available/skydragon

# HTTP 自動轉 HTTPS (針對 .79)

server {

    listen 192.168.1.79:80;

    server_name skydragon.xxx.xxx;

    return 301 https://$host$request_uri;

}

# HTTPS 服務 (針對 .79)

server {

    listen 192.168.1.79:443 ssl;

    server_name skydragon.xxx.xxx;

    client_max_body_size 20m;

    # skydragon 的 SSL 憑證路徑

    ssl_certificate /etc/letsencrypt/live/skydragon.xxx.xxx/fullchain.pem;

    ssl_certificate_key /etc/letsencrypt/live/skydragon.xxx.xxx/privkey.pem;

    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    root /var/www/skydragon; # 或你的 RAG 助教專案目錄/Proxy 設定

    index index.html;

    location / {

        try_files $uri $uri/ =404;

        # 若是 run 在背景的服務 (例如 Port 8000),請用 proxy_pass:

        # proxy_pass http://127.0.0.1:8000;

        # 關鍵:啟用 WebSocket 轉發(修復 400 錯誤)

        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection "Upgrade";

        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;

        # 防止長連線/RAG 思考逾時斷線

        proxy_read_timeout 86400s;

        proxy_send_timeout 86400s;

    }

}

4. 原來 AI Agent 走 80 port 也要修改 nginx 檔案鎖住

server {

    # 只監聽 .79 的 80 Port (OpenClaw 助理)

    listen 192.168.1.79:80;

    allow 192.168.1.0/24; # 限制只能由指定IP範圍連

    deny all;

    root /var/www/html;

    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {

        try_files $uri $uri/ =404;

    }

}

5.  啟用設定並重啟 Nginx, 做 soft link 以啟用新站台:

sudo ln -s /etc/nginx/sites-available/macgyver /etc/nginx/sites-enabled/

6. 檢查 nginx 語法是否正確

sudo nginx -t

7.  重啟 nginx

sudo systemctl restart nginx

四、增加免費憑證方法

1.  執行 sudo certbot certonly --webroot -w /var/www/macgyver -d macgyver.xxx.xxx

2. 成功拿到憑證後執行 nginx -t 看語法是否正確

3. 重新載入 Nginx 套用設定, 執行 systemctl reload nginx

4. 測試憑證是否會定期更新

sudo certbot renew --dry-run

若結果有下列字串

Congratulations, all simulated renewals succeeded: /etc/letsencrypt/live/macgyver.xxx.xxx/fullchain.pem (success) /etc/letsencrypt/live/skydragon.xxx.xxx/fullchain.pem (success)

則表示成功.

5. 確認 systemd timer 自動定時任務, 執行 systemctl status certbot.timer

狀態欄位應顯示 active (waiting),且會標示下次預計執行的時間(Next: ...)。

6.  確認自動重載 Nginx hook

     憑證更新後,Nginx 需要自動 reload 才能載入新憑證。請檢查 Certbot 的排程設定或 hooks,檢查 /etc/letsencrypt/cli.ini 或排程設定檔中是否有重載指令:

執行 grep -rn "deploy-hook" /etc/letsencrypt/