小站流量服务优化,增加Webdav服务

一、流量优化

为应对运营商QoS,决定把小站的流量都集中到443端口。

所有服务共用端口,需要用nginx的stream分流或者proxy反向代理。

但是proxy找不到支持https的方案,某服务又需要https,pass了。

简单的stream分流有个问题是接收后续流量的服务,得不到原客户端的真实ip。虽然可以通proxy_protocol添加数据包记录来解决,但是某服务无法识别这个包。

首先是在github上找到了一个不错的方案:

stream {
    log_format basic '$remote_addr - $remote_user [$time_local] '
                     '$protocol $status $bytes_sent $bytes_received '
                     '$session_time';
    map $ssl_preread_server_name $backend {
        trojan6.domain.com unix:/run/nginx-trojan-stream.sock;
        trojan.domain.com unix:/run/nginx-trojan-stream.sock;
        default 127.0.0.1:443;
    }
    server {
        listen unix:/run/nginx-trojan-stream.sock proxy_protocol;
        proxy_pass 127.0.0.1:8443;
    }
    server {
        listen 0.0.0.0:443;
        listen [::]:443;
        proxy_pass $backend;
        ssl_preread on;
        proxy_protocol on;
    }
}

http {
    log_format combined '$proxy_protocol_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent"';
    server {
        listen 127.0.0.1:80 proxy_protocol;
        listen [::1]:443 ssl proxy_protocol;
        ...
    }
}

但是stream里的$remote_user字段总是报错。虽然我也是和方案里用的官方apt源里的nginx,总感觉少了什么。

尝试过安装nginx-full和nginx-extras,都不奏效。

开始使用源码编译nginx,编译的配置如下:

./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --with-http_v2_module --with-http_dav_module --add-module=/usr/src/Nginx//nginx-dav-ext-module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_sub_module --with-compat --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-stream_ssl_preread_module --with-stream_realip_module --with-stream  --with-stream_ssl_module

这里添加了不少模块,而且是1.20.1版本。但是依旧无法识别$remote_user字段。于是还是使用官方apt源的nginx-full。

这个肯定是在别的文件里定义的,但是google无法找到解决办法。搞了两天都没好,实在无奈。

最后在这个网站找到了使用的解决办法,稳定能用了,服务分流加上真实ip输送。

二、增加WebDav服务

WebDav服务主要是将小站后台变做一个网盘,准备结合Zotero文献工具同步使用。

一开始觉得麻烦,使用docker找了个WebDav镜像来用。但是有两个问题,一个是端口不是443,又要被QoS,第二个是外国人写的镜像,不支持utf-8编码,中文文件名乱码。

尝试了多种代码,最后找到一个很合适的,贴一下:

server{
        listen /本地端口 ssl http2 reuseport proxy_protocol;
        server_name domain.name;
        charset utf-8;
        #下面三行给反代的 DoH 服务器传递了客户端 IP
        set_real_ip_from 127.0.0.1;
        real_ip_recursive on;
        real_ip_header proxy_protocol;

        ssl_certificate      /data/keys/cert.pem;
        ssl_certificate_key  /data/keys/key.pem;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        error_log /var/log/nginx/webdav_error.log;
        access_log /var/log/nginx/webdav_access.log;

       
        root /data/webdav;
        autoindex on;
        autoindex_exact_size off;
        auth_basic "restricted";
        auth_basic_user_file /data/webdav.pwd;
        # dav 允许的操作
        dav_methods     PUT DELETE MKCOL COPY MOVE;
        dav_ext_methods PROPFIND OPTIONS;
        # 创建文件的默认权限
        dav_access      user:rw group:rw all:r;

        # 临时文件位置
        client_body_temp_path   /tmp;
        
        # 最大上传文件限制, 0表示无限制
        client_max_body_size    0;
        
        # 允许自动创建文件夹(如果有需要的话)
        create_full_put_path    on;
        location /dns-query {
                proxy_pass       http://127.0.0.1:8053/dns-query;
                proxy_set_header Host      $host;
                proxy_set_header X-Real-IP $remote_addr; #我要,真实的,IP!
        }
}

这里已经是经过stream分流后的配置文件,密码文件由htpasswd生成MD5形式的。

先用浏览器访问一下,登录后可以看到文件,还能点开pdf来了看,可以。

然后是配置Zotero,也很方便,具体不描述了,网络上很多可用的答案。最后测试可同步pdf。

小站后台还有16个G,应该很够用了吧,只同步pdf的话。

三、80端口跳转问题

强迫症为了使得网站完美,添加80端口跳转443端口的代码。但是原来的return代码无法使用了,原因未知。

于是直接像原来的动态桌面一样,搞个静态网页来跳转,nginx代码为:

server{
        listen 80;
        server_name  misakaxie.space;
        root /data/html;
        index index.html;
}

其中的index.html为:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="refresh" content="0;url= https://misakaxie.space">
    <title>misakaxie</title>
</head>

<body>
    <p>Please wait!</p>
</body>

</html>

哈哈,现在80端口也能跳转小站,完美了。其实也能架设其他网站在80端口,有空再玩玩。

四、其他细节

目前用的nignx是apt源的1.18.0版本的nginx-full,才支持高级的WebDav。

首先nginx.conf中要加载两个模组:

load_module /usr/lib/nginx/modules/ngx_http_dav_ext_module.so;
load_module /usr/lib/nginx/modules/ngx_stream_module.so;

我用acme.sh申请的证书同时认证4个域名,挺方便的。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇