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

本贴最后更新于 1111 天前,其中的信息可能已经时异事殊

框架图

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。

  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖 • 2 关注
  • 网络
    138 引用 • 177 回帖 • 4 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 588 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...