frp

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力。类似的还有:ngrok、lanproxy等(frp和ngrok都是用go实现,lanproxy是用java实现)。利用内网穿透,我们可以实现微信调试,将内网的应用对外展示等。
搭建分服务器端和客户端。

特性

  • 支持 80 端口转发
  • 快速开发,不用推到线上测试,比如开发微信公众号,授权。支付之类的。
  • 部署本地网站
  • 放置视频至本地,减少公网服务器的存储空间
  • 其他一些特性(至 frp官网 查看

要求

需有一台公网服务器

安装

下载软件

下载软件:FRP Releases
支持多平台,需根据服务器系统和CPU架构选择下载。下载的包是同时包含服务器端和客户端软件的。下载速度可能会比较慢,请耐心等会。

mac 下载 darwin_amd64.tar.gz 后缀的,linux amd 64 位的下载 linux_amd64.tar.gz 后缀的

**## 下载**
wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_amd64.tar.gz
**## 解压**
tar zxvf frp_0.36.2_linux_amd64.tar.gz
**## 移至安装目录**
mv frp_0.36.2_linux_amd64 /usr/local/frp

服务端配置

frps.ini是服务端的配置文件。
完整的配置说明可以参考:frps配置
例如我的配置如下:

[common]
# 服务端监听端口
bind_port = 7000
# 搭建http web服务,监听的端口(例如:80,但由于80端口留给nginx,此处改为其它端口)
vhost_http_port = 8080
# 配置服务器管理看板
# 限定访问ip,如果不限制访问请设置为:0.0.0.0。
# 监听端口,管理员的登录名和密码
dashboard_addr = 0.0.0.0
dashboard_port = 7001
dashboard_user = username
dashboard_pwd = password

# 设置记录日志的文件
# 日志级别:trace, debug, info, warn, error,从低到高
# 日志最多保留的天数
log_file = /usr/local/frp/log/stdout.log
log_level = info
log_max_days = 3

# 认证token
token = token
# 子域名
subdomain_host = frp.iw3c.com

subdomain_host是你的域名,这里在域名加 frp 是为了避免污染你的二级域名,把*.frp解析到你的服务器IP,方便在 PC 端可以直接配置多个 xxx.frp.iw3c.com 这种三级域名

保存 ,运行
./frps -c ./frps.ini

注册为服务:

vim /etc/systemd/system/frps.service
# 内容为
[Unit]
# 单元描述
Description=frps
# 在什么服务启动之后再执行本程序
After=network.target

[Service]
Type=simple
# 程序执行的目录
WorkingDirectory=/usr/local/frp/
# 启动的脚本命令
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini
# 重启条件
Restart=always
# 几秒后重启
RestartSec=5

[Install]
WantedBy=multi-user.target

重载服务
systemctl daemon-reload
注册为开机启动
systemctl enable frps
启动服务
systemctl start frps
查看状态
systemctl status frps

客户端运行

将 frpc 放置在本机

[common]
server_addr = xxx.xxx.xxx.xxx # 服务器ip
server_port = 7000

[web]
type = http
local_ip = 127.0.0.1
local_port = 18181 # 本地web服务监听的端口
# 远程端口不用设置,只能沿用frps下vhost_http_port
# 映射域名为 http://dev.frp.iw3c.com
subdomain = dev
# 或者直接指定全域名(你只需要将域名解析到服务器上)
# custom_domains = frp.iw3c.com

保存 ,运行
./frpc -c ./frpc.ini

这样就可以用域名http://dev.frp.iw3c.com:8080访问你本机的服务了

FRP与Nginx共用80端口
在nginx的配置文件目录,添加frp.iw3c.com.conf配置文件,然后配置nginx反向代理。
配置内容如下:

# 代理http web
server {
    listen       80; 
    server_name  *.frp.iw3c.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;
    }   
}