因为服务器上还有其他WEB网站,用FRP直接开80和443会冲突,定义其他端口的话,访问时还要带端口号特别不爽。因为服务器上的Web服务是用Nginx支持的,所以可以把Frp在Nginx里做成反向代理。此配置主要难点在HTTPS服务反代HTTPS服务,经过测试可能是代理头有问题,经过一下午测试未解决,后来找到资料,解决了这个问题。
server
{
listen 80;
listen 443 ssl http2;
server_name *.yourdomain.com; #你的域名,记得确认已经将*的A记录解析到
charset utf-8;
if ($server_port !~ 443){ #http跳转到https
rewrite ^(/.*)$ https://$host$1 permanent;
}
ssl_certificate /etc/fullchain.pem; #这里写你ssl证书公钥(完整链)的位置,记得要给nginx访问这个文件的权限
ssl_certificate_key /etc/privkey.pem; #这里写你ssl证书私钥的位置,记得要给nginx访问这个文件的权限
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;location / {
resolver 8.8.8.8; #重要,依靠此行解析$host,也可更换其他DNS服务器
proxy_ssl_server_name on; #重要,反代后端https必要
proxy_set_header X-Real-IP $remote_addr; #将真实IP封在head中传递给后端
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
####################################################################################
#重要提示!!
#如果上一行这样写出现跳转到有端口号的网址,为后端跳转方式过于僵硬,建议修改后端网站程序
#若实在难以debug后端代码,则如此修改即可避免:proxy_set_header Host $host:$server_port;
####################################################################################
proxy_pass https://$host:5678; #5678为frps的https端口
error_page 502 http://$host:6666/$request_uri;
#遇到502错误(后端为http时)通过error_page跳转给下一个server处理
#6666端口定义为任意值,和下文对应初相等即可
}
}
server
{
listen 6666; #任意端口,用于接收上一个server502错误不能处理的请求
listen 7777 ssl http2; #任意端口但需要注意修改后下文的两个也需要修改
server_name _; #为避免server_name相同导致的错误,这里使用_接管其他配置文件未定义的host
charset utf-8;
if ($server_port !~ 7777){ #这里的7777要和上文保持一直
rewrite ^(/.*)$ https://$host:777$1 permanent; #这里的7777要和上文保持一致
}
ssl_certificate /etc/fullchain.pem; #这里写你ssl证书公钥(完整链)的位置,记得要给nginx访问这个文件的权限
ssl_certificate_key /etc/privkey.pem; #这里写你ssl证书私钥的位置,记得要给nginx访问这个文件的权限
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host:7777$request_uri;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://121.8.1.111:1234;
#注意,这里的121.8.1.111需要改成你frps服务器的IP,1234需改成你frps服务器的http监听端口
error_page 502 http://$host:1234$request_uri;
#如再次处理不了 则直接跳转给frps的http,1234需改成你frps服务器的http监听端口
}
}
参考资料:
https://www.v2ex.com/t/378393
https://blog.ray8.cc/archives/nginx-frp-https-wildcard.html
文章评论