目录

十月末-solo博客

talk less,code more.

X

服务器配置nignx缓存+frp转发内网服务

框架图

vpsframewokr.png

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。


标题:服务器配置nignx缓存+frp转发内网服务
作者:bingoct
地址:https://blog.bingoct.top/articles/2021/12/05/1638673536024.html
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.