在實際應用中,我們常常遇到這樣的需求:
-
家里的NAS服務器、開發環境、測試服務,需要暴露到公網訪問
-
企業內部系統,僅允許在特定域名或端口暴露,但沒有公網IP
-
多個內網應用,希望通過一個統一的外網入口訪問
傳統方法(如端口映射、VPN)存在種種局限。 這時候,輕量、高效、開源的?frp(Fast Reverse Proxy)?成為了解決方案的首選。
本文將以 frp 0.68為例,結合Docker容器化部署,并通過Nginx反向代理優化訪問體驗,完整講解一套生產級實踐方案。
1?? frp適用場景概覽
frp?是一款高性能的反向代理應用,主要應用于:
-
內網穿透:將內網服務(如SSH、Web)暴露到公網
-
遠程辦公:安全地訪問公司內部資源
-
異地數據同步:建立點對點連接
-
微服務通信:跨網段通信
-
個人項目發布:將家里的開發環境一鍵發布到公網展示
相較于傳統VPN,frp部署簡單、資源占用小,支持多種協議(TCP、UDP、HTTP、HTTPS、STCP、SUDP),尤其適合快速搭建和靈活擴展。
2?? 快速部署教程(基于 micrograils/frp 鏡像)
假設我們有一臺云服務器,公網域名為:www.sample.com
。 目標是將家中一臺機器的本地Web服務(localhost:8080)安全暴露到公網。
2.1 服務端(frps)部署
① 配置 frps.toml
創建?frps.toml
?文件:
bindAddr = "0.0.0.0"
bindPort = 7000vhostHttpPort = 8080auth.method = "token"
auth.token = "strong_token_here"transport.tls.force = true[webServer]
addr = "0.0.0.0"
port = 7500
user = "admin"
password = "admin"
說明:
-
監聽?
7000
?端口接受客戶端連接 -
監聽?
8080
?端口作為 HTTP 虛擬主機端口 -
開啟?
token認證
?和?TLS強制加密
-
管理后臺開放7500端口
② 啟動 frps 容器
docker run -d \--name frps \-p 7000:7000 \-p 8080:8080 \-p 127.0.0.1:7500:7500 \-v $(pwd)/frps.toml:/etc/frp/frps.toml \-e FRP_MODE=server \micrograils/frp:latest
Tips:
-
管理后臺7500端口只綁定127.0.0.1,避免暴露到公網
-
容器內讀取本地掛載的配置文件
2.2 客戶端(frpc)部署
在本地機器(比如家庭服務器)創建?frpc.toml
:
serverAddr = "你的服務器公網IP或域名"
serverPort = 7000transport.tls.enable = trueauth.method = "token"
auth.token = "strong_token_here"[webServer]
addr = "0.0.0.0"
port = 7400
user = "admin"
password = "admin"[[proxies]]
name = "home-web"
type = "http"
localIP = "127.0.0.1"
localPort = 8080
customDomains = ["www.sample.com"]
③ 啟動 frpc 容器(使用host網絡)
docker run -d \--name frpc \--network host \-v $(pwd)/frpc.toml:/etc/frp/frpc.toml \-e FRP_MODE=client \micrograils/frp:latest
說明:
-
使用?
--network host
,frpc容器直接訪問本機服務 -
將本地8080端口通過frp注冊到服務器
-
綁定域名?
www.sample.com
3?? 優化:Server端引入前置Nginx,隱藏8080端口
frp默認的 HTTP服務使用?vhostHttpPort
(比如8080), 如果直接訪問,需要帶端口號,如:
http://www.sample.com:8080
體驗極差!
標準解決方法:在服務器上用Nginx反向代理,將80端口請求轉發到8080端口。
① 安裝Nginx
Ubuntu/Debian系統:
sudo apt update
sudo apt install nginx
② 配置Nginx反向代理
編輯?/etc/nginx/sites-available/default
?或創建新conf:
server {listen 80;server_name www.sample.com;location / {proxy_pass http://127.0.0.1:8080;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}
③ 重啟Nginx
sudo systemctl restart nginx
④ 測試訪問
現在可以直接通過:
http://www.sample.com
優雅訪問你本地服務器的Web服務啦!
(無須攜帶8080端口,體驗更好,SEO友好)
4?? 完善實踐建議
在實際生產部署中,還推薦做如下優化:
項目 | 建議 |
---|---|
HTTPS加密 | 給Nginx配置 Let's Encrypt 免費SSL證書(推薦用certbot自動續期) |
防火墻加固 | 只允許必要端口開放,如7000/80/443,管理端口7500僅內網可訪問 |
frp限速 | 根據需求在frps中配置帶寬控制(bandwidth.limit) |
多域名管理 | 支持多個customDomains,在frp配置中擴展 |
容災備份 | 保留 frps 和 frpc 的配置文件快照 |
5?? 小結
通過 frp + Docker + Nginx 的組合方案,我們可以:
-
快速、安全地將內網服務暴露到公網
-
保持訪問體驗優雅(無端口號訪問)
-
實現靈活的多域名、多服務映射
-
保證通信過程加密認證,提高安全性
對于中小企業辦公、遠程訪問、個人項目展示,這是一套成本低、擴展性強的內網穿透實戰方案。
如果你的應用場景中,需要更多定制(比如雙向認證、動態注冊等),frp也提供了豐富的擴展功能,值得深入挖掘!
📢 最后提示
-
本文所有部署基于?frp 0.68版,不同版本請注意配置項差異
-
示例用鏡像?
micrograils/frp
,推薦搭配Docker統一管理,簡潔高效 -
Nginx反向代理不僅提升體驗,也是未來統一接入網關建設的基礎