这里试过反代 ifile share,cloudreve,metube 等都出现这个问题,主页面可以显示,表示反代是没有问题的,但是所有 css,js 文件都是 404,界面显示不完全,很奇怪,你说都是静态文件,但 favicon.ico 那些没问题。
原本反代代码,css/js 404 出错:
location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; proxy_pass http://127.0.0.1:808; add_header X-Cache $upstream_cache_status; add_header Cache-Control no-cache; }
添加以下代码,则正常:
location ~* \.(gif|png|jpg|css|js|woff|woff2)$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; proxy_pass http://127.0.0.1:808; expires 12h; }
这里有个问题,如果反代不是在 / 下,而是子目录下,比如 /metube,按照上面的写法就会影响到 / 下主站,导致主站找不到一些资源文件,我这里就出现修改后主站找不到 favicon.png 的问题,所以我就只添加 css|js 添加子目录匹配:
location /metube/ { proxy_pass http://127.0.0.1:8081; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; } location ~ ^/metube/.*\.(css|js)$ { proxy_pass http://127.0.0.1:8081; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; }
主站 PHP 脚本都是远程调用 CDN 的 css|js,没有本地的,所以没出问题。至少这样暂时能用。
没找到问题的根本!
SNI 分流后获取客户端 IP 一般通过 proxy_protocol 来实现,但分流后的某些程序不能识别 proxy_protocol 怎么办?比如我的 DoH 服务器要 IP 地址,但某木头马并不支持,我开启 proxy_protocol 这马就死了。
我们看代码片段,注意注释。
nginx.conf 主配置文件片段:
stream { # 这里就是 SNI 识别,将域名映射成一个配置名 map $ssl_preread_server_name $backend_name { 我的域名.坑 web; 马.我的域名.坑 马; # 域名都不匹配情况下的默认值 default web; } # 转发到 web 服务器 upstream web { server 127.0.0.1:444; } # 转发到 马 前置服务器 upstream 马 { server 127.0.0.1:446; } # 为 马 去除 proxy_protocol server { #nginx server 443 开启 proxy_protocol 后,分流后的所有服务也必须开启 proxy_protocol,否则会报错 listen 127.0.0.1:446 proxy_protocol so_keepalive=on; proxy_protocol off; #然而,我们在这儿把 proxy_protocol 关闭掉,因为 马 不支持!这是关键 proxy_connect_timeout 300s; proxy_timeout 300s; proxy_pass 127.0.0.1:445; #这就是 马 实际吃草的地方 } # 监听 443 并开启 ssl_preread server { listen 443 reuseport; listen [::]:443 reuseport; proxy_pass $backend_name; ssl_preread on; #开启了分流 proxy_protocol on; #开启了 proxy_protocol } }
虚拟站点配置文件代码块,大致如下:
server { #nginx server 443 开启 proxy_protocol 后,分流后的所有服务也必须开启 proxy_protocol,否则会报错 listen 127.0.0.1:444 ssl http2 reuseport proxy_protocol; #下面三行给反代的 DoH 服务器传递了客户端 IP set_real_ip_from 127.0.0.1; real_ip_recursive on; real_ip_header proxy_protocol; server_name 三达不溜.我的域名.坑 我的域名.坑; index index.html index.htm index.php default.html default.htm default.php; root /home/wwwroot/我的域名.坑; ssl_certificate /usr/local/nginx/conf/ssl/fullchain.cer; ssl_certificate_key /usr/local/nginx/conf/ssl/我的域名.坑_ssl.key; #反代 DoH 服务器 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! }
差不多这样。
来自 https://github.com/trojan-gfw/trojan/issues/433#issuecomment-692878138 的方法更加精妙:
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; ... } }
http 的 log_format 中,原来的将原来的 $remote_addr 替换成 $proxy_protocol_addr 就成了。
stream 中的第一个 server 就是为了接收带 proxy_protocol 的 stream,然后发出不带 proxy_protocol 的 stream 给 trojan。
另外,我用的是在 Ubuntu 20.04上 的 Nginx v.1.18.0,来自官方 apt 源的。
winXray:
https://github.com/winXray/winXray
ProxyPool:
https://github.com/zu1k/proxypool
https://github.com/yourp112/proxypool
https://github.com/sansui233/proxypool
Free Proxies:
https://proxypool.ga/
别问怎么用,懂得一看就知道了。winXray 是我用过最轻量最好用的各种 xx 协议 Windows 客户端;免费站自动抓取各种 xx 服务器,直接丢到 winXray 自动测速自动切换。
别问安全性那些问题,我不懂,可以不用的。
Windows 下最好的透明代理软件,能让那些本身无法设置代理的软件通过 socks/https 连接出去,包括命令行程序。
V4 新的网络引擎基于 Windows 过滤平台 (WFP) 技术。这是在 Windows 平台上处理流量的最新方法。它提供了许多独特的功能,包括以下功能:
1. 能够处理所有连接,包括 Windows 商店应用程序(UWP,Universal Windows Platform),Windows 子系统的 Linux (WSL) ,和 Windows 共享文件夹
2. 在高负载情况下提高性能
3. 显著减少了与第三方软件(如防病毒软件)的冲突
代理规则现在可以绑定到网络接口。当您需要选择通过特定接口(以太网、 Wi-Fi、 VPN 等)连接的目标和应用程序时,这允许 Proxifier 在全新的场景中工作。这实际上允许你:
1. 同时使用和管理多个 VPN 连接和代理服务器
2. 根据不同接口的可用性对流量进行优先级排序
新版也有专门的界面安装成服务了,无需登录也可以执行代理工作。
其它与 V3 大同小异的我就不累述了,懂的自然懂,不懂的官方有详细 PDF 说明书。
BTW:
1. 便携版不能代理命令行程序。
2. 新版需要卸载重装,请提前备份 profile 安装完后导入。