起因
项目中需要接入音视频功能,web端需要通过WebRTC与音视频厂商进行通信,而使用WebRTC又有些限制:本地localhost调试没问题,但是其他环境访问必须要走https协议,并且项目中也涉及到websocket的通信。所以为了便于测试,使用FRP实现了https的内网穿透访问。
过程探索
1. frp 配置https
这一步没有问题,直接按照官方的配置来就行了
2. frp 配置websocket
配置的时候采用tcp的协议,也可以是想websocket的内网穿透,但是当与https结合的时候,wss始终连接不上,下面是我的一个配置,我估计连不上是是因为https证书的问题,证书绑定到了https对应的1443,而websocket是另一个端口,尝试使用了1443端口发现有问题。
最后想了下,既然nginx可以转发websocket,那frp索性就只管https的内网穿透,其他的都交给nginx就可以了。
最终方案(frp + nginx)
对frp还不了解的可以看这篇文章:
客户端frpc配置文件如下:
serverAddr = "serverIP"
serverPort = port
[[proxies]]
name = "test_htts2http"
type = "https"
customDomains = ["customdomain.com"]
[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:80"
# HTTPS 证书相关的配置
crtPath = "/usr/local/frp_0.59.0_linux_amd64/server.pem"
keyPath = "/usr/local/frp_0.59.0_linux_amd64/server.key"
hostHeaderRewrite = "127.0.0.1"
requestHeaders.set.x-from-where = "frp"
nginx配置文件如下:
http {
...
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
...
server {
...
location /wspath/ {
proxy_pass http://ip:port/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
...
}
}
也可以参考这篇 如何在Nginx中配置websocket的转发-CSDN博客