iT邦幫忙

2025 iThome 鐵人賽

DAY 29
1
Modern Web

從零打造網頁系統:非資訊人也能完成的全端專題實作系列 第 29

Day 29: Nginx反向代理(reverse proxy) & Ngrok對外公開網址

  • 分享至 

  • xImage
  •  

在前面Docker於正式部署時,有稍微提到Nginx服務,因此想針對Nginx進行簡單介紹。Nginx是一個高速輕量化的網頁伺服器,架設在網站入口,主要任務是將網路流量分配到不同地方。根據網頁使用者所請求的是靜態檔案,如HTML、CSS、JavaScript或圖片等,或是請求後端API應用,如Django等,而轉送到不同位址處理。

Nginx因為效能高,佔用資源少,且可靈活配置,再加上他是開源服務,受到廣泛使用。

所使用基本的虛擬伺服器,組態設定,參考如下:

# prod.conf
# server區塊
server {
    listen 80;
    server_name localhost;

    root /usr/share/nginx/html;
    index index.html;
	
	# location區塊
    location / {
        try_files $uri $uri/ /index.html;
    }

		location /api/ {
		    proxy_pass http://backend:8000/api/;
		    proxy_set_header Host $host;
		    proxy_set_header X-Real-IP $remote_addr;
		}

}
  • 其中listen 80 將伺服器設置在port 80,server_name localhost ,伺服器名稱命名為本機伺服器。
  • root乃指定靜態檔案的根目錄,並且index,指定預設的首頁檔案。
  • location區塊中,提供兩個位址
    • /,並採用try_files指令,當找不到檔案時,就回轉至index.html,也就是交給前端路由處理。
    • /api/,此位址因路徑較長,將優先於/被匹配,且接著以proxy_pass指令,將請求轉發到後端伺服器。
    • proxy_set_header則是補充傳遞HTTP標頭,確保後端可以知道原始Host與訪客IP

在這份組態設定,有運用到Nginx的反向代理服務。所謂的反向代理(reverse proxy),就是協助將請求轉送到後端伺服器,拿到回應後再回傳給前端。

所謂的反向,指的是在這個過程中,前端只知道是向Nginx請求,但看不到後端伺服器,因此可以做到把不同的服務,都整合在同一個網域,統一管理,而前面所設定的location /api/就是在進行反向代理,即將所有的請求都集中交給/api/位址處理,並由Nginx統一派發。

location /api/ {
    proxy_pass http://backend:8000/api/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}
  • 這邊的proxy_pass就是經由/api/位址,發送到後端伺服器,取得回應後再回傳,以完成反向代理服務。
  • 這邊要注意的是,Nginx的斜線規則,當locationproxy_pass皆有尾斜線/,代表會將前綴/api/去掉,因此當發送請求為localhost/api/employee,實際上請求的路徑會是localhost/employee

最後,當網頁正式部屬後,若僅想要進行展示,即需要將網站位址公開到外網,此時可嘗試Ngrok服務。Ngrok可以做到把內部服務安全地公開到外網,尤其若僅是想要短暫地測試或展示,是相當方便的工具。

  • 針對Windows用戶,可以直接到Ngrok下載應用程式:ngrok Download,經過註冊後,即可在CMD介面輸入以下指令

    ngrok http 80
    
  • 之後Ngrok會提供一個臨時的對外公開網址,展示時直接連接該臨時網址,即可開始網頁展示。

  • http 80,就是前面Nginx虛擬伺服器所設定的port,因此Ngrok對外公開的服務,就是位於自己本機所架設的Nginx網頁伺服器的位址,如此即可完成將內部服務安全地公開到外網的任務。


上一篇
Day 28: Docker區分開發及正式環境的部署設定
系列文
從零打造網頁系統:非資訊人也能完成的全端專題實作29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言