框架图
nginx 缓存
因为服务器没有 ipv6,所以只能 frp 转发了。转发后,ip 就一直是 127.0.0.1 了(sad)。
nginx 的配置 proxy_cache 策略,分为静态资源缓存和动态资源缓存,(相对的缓存一些短时间变化少的 html)。
proxy_cache_path $cachePath/nginxCache/static levels=1:2 keys_zone=static_cache:100M inactive=30d max_size=10g; proxy_cache_path $cachePath/nginxCache/dynamic levels=1:2 keys_zone=dynamic_cache:50M inactive=1h max_size=1g;
使用正则表达式匹配为不同的资源设置不同的策略,对相应成功的状态码进行缓存,设置缓存 key,为了方便调试添加 X-Cache-Status 头部。
下面是常见的静态资源示例
# static location ~* (/preview)|(\.(svg|ico|gif|jpg|jpeg|png|mp3|woff2|pdf|doc|docx|xls|md))$ { proxy_pass https://$back-end; # cache proxy_cache static_cache; proxy_cache_valid 200 301 30d; proxy_cache_valid 206 302 15d; proxy_cache_key $host$uri$is_args$args; add_header X-Cache-Status $upstream_cache_status; expires 30d; } }
动态缓存示例 (对短时间内变化不大的 html)
# html location ~* \.(html|htm)$ { proxy_pass https://$host:10010; # cache proxy_cache static_cache; proxy_cache_valid 200 302 30m; proxy_cache_valid 206 301 10m; proxy_cache_key $server_name$uri$is_args$args; add_header X-Cache-Status $upstream_cache_status; add_header Cache-Control private; expires 1m; }
但是没有配置 cache_purge 清除缓存,目前还没想好如何防止别人使用了这个接口。不过配置了缓存的持续时间,问题不大。
frp 转发
本来想的是使用 ipv6 直接本地 host 域名结合 nginx 转发,但是可惜我的服务器没有 IPv6,只能选择 frp 了,自行配置 token 或者其他验证方式。
frpc.ini 配置如下
[common] server_addr = frpsHost server_port = frpsPort [https] type = https local_ip = 127.0.0.1 local_port = your_local_port custom_domains = xx.yy.cc
frps.ini 配置如下
[common] bind_addr = 0.0.0.0 bind_port = frpsPort vhost_https_port = $endPort
nginx 转发
服务器的 host 文件添加解析 xx.yy.cc
记录为本地 127.0.0.1,设置 dns 解析为本地的 127.0.0.53,也可以自行搭建 dns 服务器。
nginx 中配置转发,因为我在之前用了 proxy_protocol
。所以可以直接从 $proxy_protocol_addr
获取真实 ip。
转发的端口设置为 frps 中配置的 vhost_https_port = $endPort
,不能以 localhost 转发,不然会丢失 tls 的 sni 信息。
server_name xx.yy.cc; proxy_set_header X-Real-IP $proxy_protocol_addr; proxy_set_header X-Forwarded-For $proxy_protocol_addr; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_ssl_server_name on; resolver 127.0.0.53; location / { proxy_pass https://$host:$endPort; }
遇到的问题
一开始一直 502,代理服务器的日志不能看出任何的端倪。在内网服务器内抓包发现,tls 握手失败。
为了加速初次打开网页的体验,我在内网服务器配置的 TLS 协议只有 1.3 的选项。ssl_protocols TLSv1.3;
wireshark 的 tls 握手报文提示 fatal alert: protocol_version
。在内网服务器内添加 tls1.2 后,能正常访问了。
不太清楚为什么 nginx 作为代理服务器的可以接收 tls1.3 的报文,但是转发的时候缺不能发送 tls1.3。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于