前言
常规情况下frps服务器端会占用80和443端口,为内网设备提供穿透,实现用户可以使用域名无端口访问内网设备.而在已经部署nginx的服务器上,由于nginx已经占用80和443端口,frps的HTTP和HTTPS需另外选择端口,可以通过nginx的反向代理配置让frps提供的穿透服务也能够使用80和443端口,实现nginx和frps共存.同时配置支持泛域名反向代理.
此方案适合个人用户搭建frps,国内服务器也可备案自己的域名,配置泛域名的反向代理及证书,可以方便快速的使用任何二级域名来穿透内网的各项服务.
此方案不适合公开提供服务的frps服务器,由于公开服务,用户使用的是自己的域名,无法为各用户分别配置反向代理.但如果你提供的frps支持subdomain泛域名,已经为用户提供了二级或三级域名使用,也可以使用本方案,但用户就无法使用自己的域名.所以此方案并不推荐用于公共frp服务.
本文为 Stille 原创文章.经实践,测试,整理发布.如需转载请联系作者获得授权,并注明转载地址.
方案介绍
常规frps提供80和443端口的穿透,当外网访问域名时,frps会将80和443端口穿透到内网设备,由内网设备来处理80和443端口的请求.例如HTTPS的强制跳转,伪静态,证书等请求都由内网设备来处理.一些成熟的服务,例如群晖DSM,Web Station以及各套件都能够很好的提供服务,而另外一些服务,例如某些docker容器,部分路由器管理端,可能仅仅提供了HTTP端口,想要使用HTTPS还得借助另外的反向代理服务,相对会更加麻烦.
内网设备及服务可无需HTTPS支持,frpc.ini也只需要配置HTTP穿透到服务器.当外网访问域名时,收到请求的Nginx会根据泛域名配置,强制跳转到HTTPS,同时Nginx会提供SSL安全证书支持,然后Nginx会反向代理到frps的HTTP端口,在由frps穿透回内网获取信息返回给外网用户.
经过一段时间的使用,两种方案各有利弊,还是需要根据实际使用场景来选择.例如群晖NAS官方的DSM,各套件和服务可以使用上文第一种独立frps方案,由群晖来处理Web前端和SSL证书.如果使用一些docker容器服务,本身仅只支持HTTP,那么可以选择nginx和frps共存的方案,让nginx反向代理来支持HTTPS和SSL证书.
方案配置
frps.ini配置
- 由于nginx占用80/443端口,frps.ini中的
vhost_http_port
和
vhost_https_port
请更换为其他端口.
-
subdomain_host
根据需求可选配置泛域名,或者注释删除此参数使用自定义域名.
frpc.ini配置
如果
frps.ini
配置了
subdomain_host
泛域名,那么
frpc.ini
中域名参数需使用
subdomain = xx
仅填写二级域名主机头即可,
不要
填写完整域名.
如果
frps.ini
没有配置
subdomain_host
泛域名,那么
frpc.ini
中域名参数需使用
custom_domains = xx.xxx.com
需填写完整的域名.
nginx配置
-
proxy_pass http://127.0.0.1:1234;
中的
HTTP
,
请勿
写成
HTTPS
.
-
proxy_pass http://127.0.0.1:1234;
中
1234
端口为
frps
的
HTTP
端口.
-
proxy_set_header Host $host:80;
注意
需加上80端口
,否则会无限循环301跳转,导致网页打不开提示
重定向次数过多ERR_TOO_MANY_REDIRECTS
.
server { listen 80; server_name *.yourdomain.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name *.yourdomain.com; ssl_certificate /usr/local/nginx/conf/ssl/yourdomain.com.crt; ssl_certificate_key /usr/local/nginx/conf/ssl/yourdomain.com.key; client_max_body_size 50m; client_body_buffer_size 256k; client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m; proxy_connect_timeout 300s; proxy_read_timeout 300s; proxy_send_timeout 300s; proxy_buffer_size 64k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_ignore_client_abort on; location / { proxy_pass http://127.0.0.1:1234; proxy_redirect off; proxy_set_header Host $host:80; proxy_ssl_server_name on; 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; } }宝塔用户注意
有网友留言回复在宝塔里使用时,在配置 ssl 后会有重定向问题,添加了以下配置解决了 css 和 js 问题,
此情况博主暂没有环境实际测试,如果遇到此问题可以自行尝试.
location ~ .*/.(js|css)?$ { expires 12h; error_log /dev/null; access_log /dev/null; }
结语
更多FRP内网穿透相关技巧,教程及信息,请持续关注本站FRP内网穿透专栏:
本站提供免费和付费的技术支持.你可以通过留言,邮件,TG群的方式来技术交流和免费咨询.同时也可以付费支持的方式获得相关的技术支持,项目部署配置等服务.具体相关详情请点击查看 技术支持页面
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END