天天看點

【小技巧解決大問題】使用 frp 突破阿裡雲主機無彈性公網 IP 不能用作 Web 伺服器的限制...

背景

【小技巧解決大問題】使用 frp 突破阿裡雲主機無彈性公網 IP 不能用作 Web 伺服器的限制...

今年 8 月份左右,打折價買了一個阿裡雲主機,比平常便宜了 2000 多塊。買了之後,本想作為一個部落格網站的,畢竟國内的伺服器通路肯定快一些。滿心歡喜的下單之後,卻發現 http 服務,外網怎麼也無法通路。各種搜,最終在文檔中,終于看見:必須要買彈性公網 IP,并且綁定到阿裡雲主機上,才可以用作web伺服器。而且要求,阿裡雲主機必須是未綁定過 IP 的。不過很不幸,我當時下單時,已經勾選了使用公網IP。本來想着解綁然後重新綁定下,應該就可以了。然而,已經綁定過公網IP的,是不允許再改綁彈性公網IP的。欲哭無淚,這個伺服器,也就閑置了幾個月。

【小技巧解決大問題】使用 frp 突破阿裡雲主機無彈性公網 IP 不能用作 Web 伺服器的限制...

最近接觸了些内網穿透的知識,我突然想到,是不是借助内網穿透,也可以把我的阿裡雲主機給暴露出來?畢竟内網穿透,使用的是 Linux 一些基礎知識,算不上很極客的技術,應該是具有通用性的。經驗證,竟然真的可行! 特記錄下來,獻給有同樣遭遇的有緣人。

使用 revel 搭建一個簡單的 Web 伺服器

需要先搭建一個 Web 伺服器,以供測試用。如果你選擇其他方式搭建 web 伺服器,可直接跳過這一節。

下載下傳最新版本 go

可以在 Go 下載下傳頁,檢視最新的穩定版本,來替換 go1.9.2.linux-amd64.tar.gz :

wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz 
tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz
           

如果已經安裝過 Go,可能需要先移除:

apt remove golang-go
           

在 ~/.profile 中,添加:

export PATH=$PATH:/usr/local/go/bin
           

在 ~/.bash_profile 中,添加:

export GOPATH=$HOME/go
           

$HOME/go 表示你想用作 $GOPATH 的檔案夾。

設定完後,最好重新開機下 shell 終端,以使資訊生效。

直接從 github 下載下傳 golang.org/x/sys 和 golang.org/x/net 源碼

golang.org下的包,直接安裝,在無法科學上網時,有極大機率會失敗。作為一種替代手段,我們可以直接從 github 下載下傳對應的源碼到 $GOPATH 對應路徑。

# 建立包存儲路徑
mkdir $GOPATH/src/golang.org/x

#安裝git
apt install git

#下載下傳 revel 依賴的包源碼。
git clone https://github.com/golang/net $GOPATH/src/golang.org/x/net
git clone https://github.com/golang/sys $GOPATH/src/golang.org/x/sys

# 安裝 revel
go get -u github.com/revel/cmd/revel

# revel 指令,需要在 $GOPATH 中執行
cd $GOPATH/src

# 建立并運作一個web應用
revel new hello-go-web
revel run hello-go-web
           
【小技巧解決大問題】使用 frp 突破阿裡雲主機無彈性公網 IP 不能用作 Web 伺服器的限制...

frp 配置

有關 frp 配置的細節,請參考 借助 frp 随時随地通路自己的樹莓派。此處隻貼出關鍵配置檔案。

在公網能通路的伺服器上配置 frps 伺服器端

[common]
bind_port = 7000
vhost_http_port =80
dashboard_port = dashboard_port_number
dashboard_user = dashboard_user_name
dashboard_pwd = dashboard_pwd_value
privilege_token = privilege_token_value
subdomain_host = example.com
           

注意: example.com 要換為自己的域名。

域名泛解析

【小技巧解決大問題】使用 frp 突破阿裡雲主機無彈性公網 IP 不能用作 Web 伺服器的限制...

将泛域名 *.example.com 解析到 frps 所在伺服器的 IP 位址。這樣,你不需要頻繁修改 DNS 配置了。此處我們是打算把某個子域名解析到我們的阿裡雲主機上。如果你想直接把根域名解析到伺服器上,參考:通過自定義域名通路部署于内網的 web 服務

在隻能内網通路的阿裡雲主機上配置 fprc 用戶端

[common]
server_addr = your_server_IP
server_port = 7000
privilege_token = privilege_token_value
login_fail_exit = false

[ssh-aliyun]
type = tcp
local_IP = 127.0.0.1
local_port = 22
remote_port = remote_port_number
use_encryption = true
use_compression = true

[web-show]
type = http
local_port = 9000
subdomain = show
           

注意:9000 表示web伺服器的本地端口,請根據需要替換;show,表示子域名,配置成功後,可以通過 show.example.com 通路自己的 web 網頁了。

使用 Systemd 實作自動啟動 revel

使用 Systemd 實作自動啟動 frp,可以直接看 借助 frp 随時随地通路自己的樹莓派 相關部分,不再贅述。此處着重說下 revel 自啟動的配置:

# 編寫 frp service 檔案,以 centos7 為例,适用于 debian
mkdir /usr/lib/systemd/system/
vim /usr/lib/systemd/system/revel-hello-go-web.service

# 内容如下

變更内容:
[Unit]
DescrIPtion=/revel-hello-go-web
After=network.target

[Service]
Environment=PATH=$PATH:/usr/local/go/bin
Environment=GOPATH=/root/go
TimeoutStartSec=30
ExecStart=/root/go/bin/revel run hello-go-web
ExecStop=/bin/kill $MAINPID
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

# 啟動 revel-hello-go-web 并設定開機啟動
systemctl enable revel-hello-go-web
systemctl start revel-hello-go-web
systemctl status revel-hello-go-web

# 部分伺服器上,可能需要加 .service 字尾來操作,即:
systemctl enable revel-hello-go-web.service
systemctl start revel-hello-go-web.service
systemctl status revel-hello-go-web.service

# 重新加載: 
systemctl daemon-reload
           

注意:

  • /root/go 要替換為自己電腦 $GOPATH 的真實路徑。
  • 此處的 sytemd 的配置中, Environment 環境變量,必須設定,否則報錯

參考文章

  • 借助 frp 随時随地通路自己的樹莓派
  • frp 中文文檔
  • proxy name [ssh] is already in use錯誤
  • A high productivity, full-stack web framework for the Go language.
  • 在centos7上使用systemd啟動supervisor
  • Using environment variables in systemd units

版權聲明:本文為CSDN部落客「weixin_34144450」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_34144450/article/details/91798506