frp实现内网穿透 frp+nginx共用80端口
frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力。类似的还有:ngrok、lanproxy等(frp和ngrok都是用go实现,lanproxy是用java实现)。利用内网穿透,我们可以实现微信调试,将内网的应用对外展示等。
搭建分服务器端和客户端。
服务器端搭建
下载软件
下载软件:FRP Releases
支持多平台,需根据服务器系统和CPU架构选择下载。下载的包是同时包含服务器端和客户端软件的。下载速度可能会比较慢,请耐心等会。
## 存放下载文件目录
cd /data/source
## 下载
wget https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_linux_386.tar.gz
## 解压
tar zxf frp_0.27.0_linux_386.tar.gz
## 移至安装目录
mv frp_0.27.0_linux_386 /data/soft/frp
服务端配置
frps.ini
是服务端的配置文件。
完整的配置说明可以参考:frps配置
例如我的配置如下:
[common]
# 服务端监听端口
bind_port = 7000
# 搭建http web服务,监听的端口(例如:80,但由于80端口留给nginx,此处改为其它端口)
vhost_http_port = 7080
# 配置服务器管理看板
# 限定访问ip,如果不限制访问请设置为:0.0.0.0。
# 监听端口,管理员的登录名和密码
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = username
dashboard_pwd = password
# 设置记录日志的文件
# 日志级别:trace, debug, info, warn, error,从低到高
# 日志最多保留的天数
log_file = /data/soft/frp/log/stdout.log
log_level = info
log_max_days = 3
# 认证token
token = token
# 如果设置subdomain_host,可以在客户端frpc中为http或https设置子域名,比如:test,这可以通过test.frp.abc.com访问客户端。
subdomain_host = frp.abc.com
配置好后,就可以通过命令:./frps -c ./frps.ini
启动frps服务了。
当然我们可以将命令放置在脚本,通过脚本来启动:
启动脚本
创建文件:
touch /data/soft/scripts/frps_start.sh
vim /data/soft/scripts/frps_start.sh
脚本内容:
#!/bin/bash
/data/soft/frp/frps -c /data/soft/frp/frps.ini &
echo $! > /data/soft/frp/log/frps.pid
停止脚本
创建文件:
touch /data/soft/scripts/frps_stop.sh
vim /data/soft/scripts/frps_stop.sh
脚本内容:
#!/bin/bash
pkill -F /data/soft/frp/log/frps.pid
rm -f /data/soft/frp/log/frps.pid
最后给脚本添加可执行权限:
chmod +x frps_start.sh frps_stop.sh
这样就可以通过/data/soft/scripts/frps_start.sh
启动frps
服务,通过/data/soft/scripts/frps_stop.sh
停止frps
服务。
如果系统随系统自启动,可以将命令/data/soft/scripts/frps_start.sh
添加至/etc/rc.local
中。
FRP与Nginx共用80端口
在nginx的配置文件目录,添加frp.abc.com.conf
配置文件,然后配置nginx反向代理。
配置内容如下:
# 服务器端管理后台
server {
listen 80;
server_name frp.abc.com;
location / {
proxy_pass http://127.0.0.1:7500;
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;
}
}
# 代理http web
server {
listen 80;
server_name *.frp.abc.com;
location / {
proxy_pass http://127.0.0.1:7080;
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;
}
}
# 如果启用SSL
server {
listen 443 ssl;
server_name *.frp.abc.com;
# ssl on;
ssl_certificate /etc/letsencrypt/live/frp.abc.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/frp.abc.com/privkey.pem;
ssl_prefer_server_ciphers on;
ssl_session_timeout 60m;
location / {
proxy_pass http://127.0.0.1:7080;
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;
}
}
客户端配置
frpc.ini
是客户端的配置文件。
完整的配置说明可以参考:frpc配置。
例如我的配置内容:
[common]
server_addr = {服务端ip}
server_port = 7000
token = {服务端设置的token}
# 配置日志文件
# 日志级别:trace, debug, info, warn, error
log_file = ./frpc.log
log_level = info
log_max_days = 3
# 客户端管理配置
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin
[ssh_a]
type = tcp
local_ip = 127.0.0.1
local_port = 39888
remote_port = 6000
[web_a]
type = http
local_ip = 127.0.0.1
local_port = 80
subdomain = suba
[web_b]
type = http
local_ip = 127.0.0.1
local_port = 8080
subdomain = subb
[web_c]
type = http
local_ip = 127.0.0.1
local_port = 8083
subdomain = subc
配置好后,就可以通过如下命令启动客户端:
- Linux:
./frpc -c ./frpc.ini
- Windows:
frpc.exe -c frpc.ini
按照您的教程,https的配置会出现502呢
是我搞错了,根本就不用配置frps的https。大雾
是的,frps不需要配置https,直接通过nginx代理https。
内网的frpc中不支持https服务的内外网穿透,会出现502
我这个方案是通过nginx进行反代Https的,只要http能成功的话,https应该也没有问题的。
# 如果启用SSL
server {
listen 443 ssl;
server_name *.frp.abc.com;
# ssl on;
ssl_certificate /etc/letsencrypt/live/frp.abc.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/frp.abc.com/privkey.pem;
ssl_prefer_server_ciphers on;
ssl_session_timeout 60m;
location / {
proxy_pass http://127.0.0.1:7080;
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;
}
}