使用内网穿透给本地项目部署域名跟 https
内网穿透可以把一台非公网 IP 的机子暴露给外网,实现外网在任何地方都能访问到这台机子部署的 web。
一般用于开发期还没部署到服务器或者需要频繁修改,又想给客户测试时临时使用。
# 目标实现
在任意网络输入 https://dev.frp.xxx.com 来访问运行在本地 5000 端口的 web 项目。
# 所需工具
- 一台有公网 IP 的 VPS (Ubuntu)
 - 域名一个
 - SSL 证书 (opens new window)
 - frp (opens new window)
 - supervisor
 - nginx
 
# 步骤(VPS 端)
# 安装 frp
查看系统内核版本,然后在 frp 仓库的releases (opens new window)下载对应的版本
uname -a
 这里是 64 位,就下载 frp_0.29.0_linux_amd64.tar.gz
PS:如果权限不够,请自行加
sudo
# 把软件放在/opt 目录下
cd /opt/
wget https://github.com/fatedier/frp/releases/download/v0.29.0/frp_0.29.0_linux_amd64.tar.gz
# 解压
tar -zvxf frp_0.29.0_linux_amd64.tar.gz
# 重命名,方便找到
mv frp_0.29.0_linux_amd64 ./frp
 2
3
4
5
6
7
8
9
修改配置文件 frps.ini
PS:没有
vim的需要先安装apt-get install vim
在/opt/frp/目录下编辑 frps.ini
cd /opt/frp/
vim frps.ini
 2
# frps.ini
[common]
server_addr = 127.0.0.1
server_port = 8000
vhost_http_port = 8080
subdomain_host = frp.xxx.com
 2
3
4
5
6
7
subdomain_host是你的域名,这里在域名加 frp 是为了避免污染你的二级域名,之后会申请 frp.xxx.com 的泛域名证书(因为一级域名似乎没法免费申请泛域名证书),方便在 PC 端可以直接配置多个 xxx.frp.xxx.com 这种三级域名的 https。
# 安装 supervisor
使用 supervisor 来让 frp 开机自启
apt-get install supervisor
 创建 supervisor frps 配置文件 在 /etc/supervisor/conf.d 创建 frp.conf
# frp.conf
[program:frp]
command = /opt/frp/frps -c /opt/frp/frps.ini
autostart = true
 2
3
4
5
重启 supervisor,查看状态
# 重启 supervisor
sudo systemctl restart supervisor
# 查看 supervisor 运行状态
sudo supervisorctl status
 2
3
4
如果显示 frp RUNNING 就是正常运行了
# 安装 Nginx
apt-get install nginx
 # 申请免费的 SSL 证书
- 到这网站申请泛域名证书freessl.cn (opens new window);
 - 在输入框输入你刚刚配置的域名,比如: 
*.frp.xxx.com,选择 Let's Encrypt V2; - 按照提示流程申请,申请后需要校验域名的解析,才会核发,需要在域名供应商那里按提示添加 
TXT解析即可,同时也要将*.frp.xxx.com泛解析到你的 vps 上; - 申请成功之后,在 KeyManager 软件工具那里导出 nginx 版本的证书。
 
将导出来的的证书放在 nginx 的目录下,分别是:
/etc/nginx/ssl/*.frp.xxx.com/*.frp.xxx.com_chain.crt
/etc/nginx/ssl/*.frp.xxx.com/*.frp.xxx.com_key.key
# 配置 Nginx
在/etc/nginx/conf.d 目录下添加 frp.conf 文件:
cd /etc/nginx/conf.d
vim frp.conf
 2
# frp.conf
server {
  listen        80;
  server_name   *.frp.xxx.com;
  location / {
    proxy_pass          http://127.0.0.1:8080;
    proxy_set_header    Host            $host:80;
    proxy_set_header    X-Real-IP       $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_hide_header   X-Powered-By;
  }
}
server {
  listen                     443;
  server_name                *.frp.xxx.com;
  ssl                        on;
  root                       html;
  index                      index.html index.htm;
  ssl_certificate            ssl/*.frp.xxx.com/*.frp.xxx.com_chain.crt;
  ssl_certificate_key        ssl/*.frp.xxx.com/*.frp.xxx.com_key.key;
  ssl_session_timeout        5m;
  ssl_protocols              TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers                ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  ssl_prefer_server_ciphers  on;
  location / {
    proxy_pass          http://127.0.0.1:8080;
    proxy_set_header    Host            $host:80;
    proxy_set_header    X-Real-IP       $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_hide_header   X-Powered-By;
  }
}
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
保存后重启 nginx
nginx -s reload
 如果没有报错,则配置是正确的
这个配置主要用于添加泛域名证书,顺便把 8080 端口反向代理 80。
不反向代理访问 web 会是这样的:https://xxx.frp.xxx.com:8080
而反向代理访问 web 会是这样的:https://xxx.frp.xxx.com
到此,vps 端就全部配置好了
# 本地 PC 端配置
本地也需要下载对应的 frp 客户端软件,在 release 下载 windows 版本的即可。
下载解压后,修改里面的 frpc.ini 的配置:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 8000
[web001]
type = http
local_ip = 127.0.0.1
local_port = 5000
subdomain = dev
[web002]
type = http
local_ip = 127.0.0.1
local_port = 5050
subdomain = test
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server_addr是你的服务器 ipserver_port是对应服务器端配置的端口subdomain是三级域名,即dev.frp.xxx.comtype虽然可以设置为https,但是证书需要放在本地,通用性不强,换了其他电脑,还需要重新拷一份 ssl 证书。
保存后,启动 cmd 或者 PowerShell 在软件目录直接运行:
PS D:\Softwares\frp> .\frpc.exe
 如果显示 start proxy success,则表示连接成功,已经实现内网穿透了,可以通过外网输入 https://dev.frp.xxx.com 或者 https://test.frp.xxx.com 来访问运行在本地 5000 或者 5050 端口的 web。