使用 Nginx 為你的網站加入 SSL 憑證

2023/07/31 Web

前言

在現代網絡世界中,保障用戶數據的安全性和隱私已經變得至關重要。網站的 SSL 憑證是實現這一目標的關鍵元素之一。在本文中,我們將探討如何使用 Nginx 這個廣泛應用的 Web 伺服器來為你的網站加入 SSL 憑證。

尚未安裝 Nginx 可以參考 反向代理 Nginx 伺服器架設

Nginx 監聽 443 ssl

我們可以監聽443PORT也就是網址輸入的https就能轉址到8002PORT。實際上使用者在瀏覽器輸入 https://example.com 自動會連線到 https://127.0.0.1:8002 的 API 服務。

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate     /path/to/ssl_certificate.cer;
    ssl_certificate_key /path/to/ssl_certificate.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    location / {
        proxy_pass https://127.0.0.1:8002;
        proxy_set_header Host $host;
    }
}

8002 PORT 的 API 必須先掛上憑證。

假設我使用 Python 架設一個 FastAPI,可以使用 gunicorn 或是 uvicorn 來啟動。並同時加上 ssl 憑證

gunicorn -w 2 -b 0.0.0.0:8001 run:app -k uvicorn.workers.UvicornWorker -t 0 --keyfile=/etc/ssl/example.com.key --certfile=/etc/ssl/example.com.crt --daemon
uvicorn run:app --reload --host 0.0.0.0 --port 8001 --ssl-keyfile=/etc/ssl/example.com.key --ssl-certfile=/etc/ssl/example.com.crt

Nginx 監聽 8001 ssl

以下設定一個情境題。首先撰寫一個 API 並且佔用 8002 PORT。接著我們可以透過 8001 Nginx 監聽並掛上 ssl 憑證,並且透過 proxy_pass 反向代理,將請求轉發到 8002 PORT。實際上使用者在瀏覽器輸入 https://example.com:8001 自動會連線到 127.0.0.1:8002 的 API 服務。

server {
    listen 8001 ssl;
    server_name example.com;

    ssl_certificate /path/to/ssl_certificate.cer;
    ssl_certificate_key /path/to/ssl_certificate.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://127.0.0.1:8002;
        proxy_set_header Host $host;
    }
}

某個 PORT 轉址到其他網站

在這個設定中,Nginx 會監聽8002端口,並將請求路由到對應的服務器。這個設定的目的是將所有請求重新導向到 https://tw.yahoo.com 這個網址。

首先,listen 指令指定 Nginx 監聽的端口為8002。這意味著當用戶通過訪問這個伺服器的IP地址或域名的8002端口時,Nginx 會處理這些請求。接下來,server_name 指令定義了這個虛擬主機的名稱。在這個例子中,它指定了兩個值:”192.168.xx.xx”和”example.com”。這意味著當請求到達伺服器時,如果域名或IP地址與這些值之一匹配,Nginx 將使用這個設定來處理請求。最後,location / 塊定義了對根路徑的處理方式。在這個設定中,它使用了 return 301 指令,將所有到這個虛擬主機的請求都重定向到”https://tw.yahoo.com”。這意味著無論用戶訪問這個伺服器的哪個URL,Nginx 都會返回 301 Moved Permanently 狀態碼並將客戶端重定向到 Yahoo 首頁。

server{
        listen 8002;
        server_name 192.168.xx.xx example.com;
        location / {
              return 301 https://tw.yahoo.com;
        }
}
server{
        listen 8002 ssl;
        ssl_certificate     /etc/ssl/example.com.cer;
        ssl_certificate_key /etc/ssl/example.com.key;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers         HIGH:!aNULL:!MD5;
        server_name example.com;
        location / {
              return 301 https://tw.yahoo.com;
        }
}

上述範例中 location 可以使用 proxy_pass 或 return,然而兩者使用時機不同。

  • proxy_pass:這個指令用於反向代理,將請求轉發到指定的目標服務器。
  • return:這個指令用於處理 HTTP 回應。可用於重定向客戶端到另一個 URL,或返回特定的 HTTP 狀態碼和內容。

此外在使用 return 時候格式如下:

  • 301 Redirect
    • 使用時機:想要“永久”將舊網址轉移至新網址
    • 不僅是網址的跳轉,其中還包括網站排名、PageRank(頁面權重)、流量
  • 302 Redirect
    • 使用時機:活動頁面跳轉
    • 不會將 A 網域的所有權重全數移轉給 B 網域
    • 302 重定向只會轉移「流量」
    • 保留舊網站的 PageRank 與網站排名

Reference

鼓勵持續創作,支持化讚為賞!透過下方的 Like 拍手👏,讓創作者獲得額外收入~
版主10在2020年首次開設YouTube頻道,嘗試拍攝程式教學。想要了解更多的朋友歡迎關注我的頻道,您的訂閱就是最大的支持~如果想學其他什麼內容也歡迎許願XD
https://www.youtube.com/channel/UCSNPCGvMYEV-yIXAVt3FA5A

Search

    Table of Contents