##背景 自己内网应用一直在使用,平时外出时通过域名+端口方式访问,添加端口着实丑,本着折腾的心态要让自己舒服。当然,白嫖是少不了的 ##准备工作 > * 域名(国内备案,国外无需),只能花钱买 > * 有公网ip且80,443端口均可使用的轻量服务器(国内备案,国外无需),白嫖亚马逊(但是目前发现高峰期访问速度慢的要死) > * 一双勤劳的手和一个清醒的头脑 ##服务端配置 ###1. frps #### 参照[frp官方文档](https://gofrp.org/docs/) ```ini [common] bind_port = 7000 #服务端开放端口 dashboard_port = 7500 #监控页面端口 token = 123456 #客户端接入token dashboard_user = admin #监控页面登录用户名 dashboard_pwd = admin #监控页面登录密码 vhost_http_port = 10080 #http开放端口 vhost_https_port = 10443 #https开放端口 log_file = ./frps.log #日志保存位置 log_max_days = 7 #日志保留最大天数 ``` ###2. nginx ```conf server{ listen 80; server_name wx.xciel.us; location / { proxy_pass http://127.0.0.1:10080; #对应服务器frps的http开放端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; } } server{ listen 443 ssl; server_name blog.xciel.us nas.xciel.us; #对应内网应用的泛域名,自定义,有几个写几个,空格隔开 ssl_certificate /etc/nginx/ssl/hh.crt; #泛域名证书,位置自定义 ssl_certificate_key /etc/nginx/ssl/hh.key; #泛域名证书key,位置自定义 ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; resolver 8.8.8.8; location / { proxy_ssl_server_name on; proxy_pass https://$host:10443; #对应服务器frps的https开放端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_buffer_size 128k; proxy_buffers 32 32k; proxy_busy_buffers_size 256k; client_max_body_size 20m; client_body_buffer_size 256k; proxy_connect_timeout 180; proxy_send_timeout 180; proxy_read_timeout 180; proxy_temp_file_write_size 128k; } } ``` ###3. 域名解析 #####因为内网部分应用有速度要求,所以我并没有将A记录设置为*.xciel.us通配符泛域名的形式,而是将所有需要的二级域名直接指定A记录为服务器公网ip,私有服务器做了内网的[动态公网ip绑定](https://blog.xciel.us/archives/9.html),速度毕竟内网有10MB/s左右的上传速度 ####以godaddy为例  ##客户端配置 ###1. frpc #### 参照[frp官方文档](https://gofrp.org/docs/) ```ini [common] server_addr = xciel.us #与服务端公网ip一致,此处我做了域名指定ip解析所以填域名 server_port = 7000 #与服务端通用配置区的开放端口一致 token = 123456 #与服务端token一致 [web1] #web名称随意,方便区分应用就行 type = http local_ip = 127.0.0.1 #frpc与web1应用在同一服务器时填写本地址 local_port = 8081 #web1应用本地端口 custom_domains = wx.xciel.us #web1应用绑定的子域名 [web2] type = https local_ip = 192.168.1.251 #frpc与web2应用在同一网段不同服务器时填写web2服务器内网地址 local_port = 443 #web2应用本地端口 custom_domains = blog.xciel.us #web2应用绑定的子域名 ``` ###2. nginx 根据应用默认配置即可 ##过程中问题处理 > * 80可访问443无法访问问题 检查各端防火墙是否限制,检查服务器安全组是否放行 > * 443使用泛域名证书问题 使用[acme.sh](https://github.com/acmesh-official/acme.sh) 全自动申请、安装Let's Encrypt证书最为方便,之前手动在阿里申请,不是泛域名,仅支持一级域名ssl,二级域名就报错,很不方便 > * https内网穿透成功后502问题 502问题一定要看nginx的错误日志,可能是以下几种问题: * nginx缓存太小 * 网络握手时间短 * 后端应用处理过快服务端未及时响应后再次访问后端,此时后端返回重置 * 后端应用返回header过大 以上参照下列代码添加在.conf中的location段,调试解决: ```conf proxy_buffer_size 128k; proxy_buffers 32 32k; proxy_busy_buffers_size 256k; client_max_body_size 20m; client_body_buffer_size 256k; proxy_connect_timeout 180; proxy_send_timeout 180; proxy_read_timeout 180; proxy_temp_file_write_size 128k; ``` * 反向代理配置错误,比如这种低级错误:前后端均为https,但是在反代服务器nginx配置中将```proxy_pass```指向的是http > * 反向代理后typecho无法登陆问题 查看header检查问题,如果在内网本地服务器可以正常登录的话,一般是由于referer返回的值不一致,反向代理配置错误,比如本来是域名,返回ip,或者域名后有端口 检查nginx中的$host、$server_port、$server_ip参数是否被设置 Last modification:October 29, 2021 © Reprint prohibited Support Appreciate the author AliPayWeChat Like 0 If you think my article is useful to you, please feel free to appreciate
2 comments
建议增加田野调查素材,提升真实性。
这是一篇佳作,无论是从内容、语言还是结构上,都堪称完美。