框架图
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。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于