框架图

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。