From 4007ede78f07a11320f4641802e8acef83562755 Mon Sep 17 00:00:00 2001 From: zjcqoo Date: Tue, 21 May 2019 18:15:01 +0800 Subject: [PATCH 1/5] update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c249bca..1976e35 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ https://zjcqoo.github.io/-----https://www.google.com -(由于访问量较大,目前限制 Referer 只允许从 GitHub 访问) +(目前仍在更新中,如有问题尝试用隐身模式访问) # 安装 From 174c0e4b6385cc4254c10f2e59778570665d58fc Mon Sep 17 00:00:00 2001 From: zjcqoo Date: Tue, 21 May 2019 20:08:05 +0800 Subject: [PATCH 2/5] update README --- README.md | 75 +++++++------------------------------------- changelogs/README.md | 34 ++++++++++++++++++++ changelogs/v0.0.1.md | 34 ++++++++++++++++++++ 3 files changed, 79 insertions(+), 64 deletions(-) create mode 100644 changelogs/README.md create mode 100644 changelogs/v0.0.1.md diff --git a/README.md b/README.md index 1976e35..482272d 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,17 @@ https://zjcqoo.github.io/-----https://www.google.com (目前仍在更新中,如有问题尝试用隐身模式访问) +# 最近更新 + +* 2019-05-21 首页静态资源从 CDN 加载 + +* 2019-05-20 安装脚本更新 + +* 2019-05-17 常用网站静态资源从 CDN 加载 + +[查看更多](changelogs) + + # 安装 ```bash @@ -121,70 +132,6 @@ https://myhost.github.io 'my'; 对于有些无法重写的 API,例如 `location`,本代理会将代码中字面出现的 `location` 替换成 `__location`,从而将操作转移到自定义对象上。当然对于非字面的情况(例如 `this['lo' + 'cation']`),目前还无法处理。 -### 界面和接口分离 - -参见下文 - - -# CHANGELOG - -## v0.0.1 - -虽然目前仍为概念演示状态,但相比[最初版本](https://github.com/EtherDream/jsproxy/tree/first-ver),有了很大变化: - -### 不再使用子域名 - -使用子域名编码目标域名(例如 gg.jsproxy.tk),存在太多缺陷。例如 HTTPS 证书问题,DNS 性能和安全问题等。因此目前不再使用子域名,只用固定的域名,目标 URL 放在路径里。例如: - -https://zjcqoo.github.io/-----https://www.google.com - -当然这也会产生很多新问题,例如无法支持 Cookie、页面之间没有同源策略限制等。 - -对于 Cookie,目前通过 JS 来维护,而不用浏览器原生(当然还有不少细节没实现)。这样的好处是前后端可以分离,前端页面可以放在第三方 Web 服务器上(例如 CDN、GitHub Pages),我们的服务器只提供代理接口。 - -这样一个页面可使用多个服务器的代理接口,并能实现线路切换、负载均衡等效果。 - -同源策略方面的限制目前暂未实现,因此不要进行登陆等操作,避免隐私泄露。 - - -### 服务端优化 - -安全改进:由于 Web 页面托管在第三方站点上,自己的服务器无需开启 443 端口,因此也无需 root 运行。同时支持 IP 黑名单功能,防止 SSRF 攻击。 - -代码改进:接口代理使用固定的 URL(参见 `api.conf`),不再使用任意路径,代码干净了很多。 - - -## 支持更多浏览器 - -相比之前版本只支持 Chrome,现在还支持最新的 Safari 和 FireFox。 - -注意:FireFox 隐身模式下不支持 Service Worker,只能普通模式访问。 - - -### 提供一个首页 - -虽然依旧简陋,但比之前好。提供了线路切换、预加载的功能。 - - -# 当前开发中的功能... - -## 增加节点切换 - -目前尝试将服务器分为两种:高级(延时低、带宽小、费用高),低级(延时高、带宽大、费用低)。 - -浏览器首先访问高级服务器,如果返回的是静态资源且体积较大,服务器只返回资源属性(大小、修改时间、首块哈希等),浏览器随后通过低级服务器获取完整资源;如果获取到的属性和之前不一致(例如 IP 变化导致),再从高级服务器获取完整内容。 - -这样设计,是为了降低高级服务器的带宽和流量成本,同时充分利用廉价服务器的资源。 - -目前演示中的低级服务使用的是 ClodeFlare Worker,其费用为 100 万次请求 / $0.5,没有带宽和流量限制,但延时较大,适合于体积较大的资源代理;高级服务为阿里轻量云,延时相对较小,上行带宽和流量有限,但下行流量免费且带宽较大,因此合适较小资源的代理,及其较大资源的属性获取。 - -使用这种方案,理想情况下可以支撑上百人同时观看高清视频。(当然现实中不少视频网站会关联用户 IP,导致节点切换失败,最终仍走高级服务器,难以达到这个数值) - -未来会尝试进一步细分请求的优先级。例如同样是获取视频的请求,不同的片段范围,其优先级是不同的。当首次打开或者拖动进度时,用户希望能尽快看到内容,这就需要更高的优先级;当视频缓冲足够时,这时延时和稳定性已不再重要,因此可以走更廉价的节点。 - -当然具体的实现细节目前仍在探索和优化中,本质意义自然是物尽其用。这是一个很有意思的话题,有兴趣的可以交流讨论。 - - # 类似项目 目前找到的都是传统后端替换 URL 的方案。当然后端替换也有不少优点,例如浏览器兼容性高,甚至低版本的 IE 都可以使用。 diff --git a/changelogs/README.md b/changelogs/README.md new file mode 100644 index 0000000..2dee993 --- /dev/null +++ b/changelogs/README.md @@ -0,0 +1,34 @@ +# 完整更新日志 + +## v0.0.1 + +全选的 URL 模型,取代 [之前版本](https://github.com/EtherDream/jsproxy/tree/first-ver)。 + +[查看详细](v0.0.1.md) + + +## 开发中... + +最新临时的测试,没分版本号 + +### 节点切换功能(服务端) + +服务端对于体积较大的资源不返回内容,只返回长度、修改时间、首块 hash 等信息。浏览器从廉价带宽获取完整内容,如果返回信息不一致,再从原服务器获取。 + +目前体积阈值为 400KB。廉价带宽使用 Cloudflare Worker,源码参考 `cf-worker` 目录。虽然 Cloudflare Worker 延时较高,但带宽和流量无限制,且费用较低(1000 万次请求 5 美元),非常适合大文件代理。 + + +### 静态资源加速(前端) + +通过自动化工具分析 TOP 10 网站的资源,将缓存时间久的静态资源,预先下载到 CDN 上(包括一个 URL Hash 列表)。前端遇到这些资源时直接从 CDN 获取,大幅减少下载时间,以及代理服务器的带宽占用和流量消耗。 + +目前 CDN 暂使用 jsdelivr。未来尝试将资源上传到贴吧等支持 CORS 的免费图床~ + +另外演示首页的静态资源也使用 CDN。 + + +### 安装工具更新 + +增加一键安装脚本,Linux x64 系统可自动安装。 + +(没仔细测。有问题 issure 反馈。以后有时间补充测试案例。。。) diff --git a/changelogs/v0.0.1.md b/changelogs/v0.0.1.md new file mode 100644 index 0000000..fc97a16 --- /dev/null +++ b/changelogs/v0.0.1.md @@ -0,0 +1,34 @@ +虽然该版本仍为概念演示状态,但相比[最初版本](https://github.com/EtherDream/jsproxy/tree/first-ver),有了很大变化: + +# 不再使用子域名 + +使用子域名编码目标域名(例如 gg.jsproxy.tk),存在太多缺陷。例如 HTTPS 证书问题,DNS 性能和安全问题等。因此目前不再使用子域名,只用固定的域名,目标 URL 放在路径里。例如: + +https://zjcqoo.github.io/-----https://www.google.com + +当然这也会产生很多新问题,例如无法支持 Cookie、页面之间没有同源策略限制等。 + +对于 Cookie,目前通过 JS 来维护,而不用浏览器原生(当然还有不少细节没实现)。这样的好处是前后端可以分离,前端页面可以放在第三方 Web 服务器上(例如 CDN、GitHub Pages),我们的服务器只提供代理接口。 + +这样一个页面可使用多个服务器的代理接口,并能实现线路切换、负载均衡等效果。 + +同源策略方面的限制目前暂未实现,因此不要进行登陆等操作,避免隐私泄露。 + + +# 服务端优化 + +安全改进:由于 Web 页面托管在第三方站点上,自己的服务器无需开启 443 端口,因此也无需 root 运行。同时支持 IP 黑名单功能,防止 SSRF 攻击。 + +代码改进:接口代理使用固定的 URL(参见 `api.conf`),不再使用任意路径,代码干净了很多。 + + +# 支持更多浏览器 + +相比之前版本只支持 Chrome,现在还支持最新的 Safari 和 FireFox。 + +注意:FireFox 隐身模式下不支持 Service Worker,只能普通模式访问。 + + +# 提供一个首页 + +虽然依旧简陋,但比之前好。提供了线路切换、预加载的功能。 \ No newline at end of file From f762b21b13fb754b37e643aa1dac48915a4f818b Mon Sep 17 00:00:00 2001 From: zjcqoo Date: Tue, 21 May 2019 20:11:06 +0800 Subject: [PATCH 3/5] update README --- README.md | 2 +- changelogs/README.md | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 482272d..5f802e7 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ https://zjcqoo.github.io/-----https://www.google.com * 2019-05-21 首页静态资源从 CDN 加载 -* 2019-05-20 安装脚本更新 +* 2019-05-20 安装脚本更新 * 2019-05-17 常用网站静态资源从 CDN 加载 diff --git a/changelogs/README.md b/changelogs/README.md index 2dee993..e32c9cd 100644 --- a/changelogs/README.md +++ b/changelogs/README.md @@ -1,10 +1,8 @@ # 完整更新日志 -## v0.0.1 +## v0.0.1 -全选的 URL 模型,取代 [之前版本](https://github.com/EtherDream/jsproxy/tree/first-ver)。 - -[查看详细](v0.0.1.md) +全选的 URL 模型,取代 [之前版本](https://github.com/EtherDream/jsproxy/tree/first-ver)。[查看详细](v0.0.1.md) ## 开发中... From 999edf253e40741edb1a2276f4781231889a4991 Mon Sep 17 00:00:00 2001 From: zjcqoo Date: Wed, 22 May 2019 14:11:10 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E7=BC=96=E8=AF=91=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E4=B8=8D=E6=94=BE=E5=9C=A8=E5=AE=89=E8=A3=85=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E9=87=8C=EF=BC=8C=E6=94=BE=E5=9C=A8=20docs/compile.md=20?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- docs/compile.md | 106 +++++++++++++++++++++++++++++++++++++++--------- i.sh | 98 +++++--------------------------------------- 3 files changed, 99 insertions(+), 107 deletions(-) diff --git a/README.md b/README.md index 5f802e7..1a63e99 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ https://zjcqoo.github.io/-----https://www.google.com curl -O https://raw.githubusercontent.com/EtherDream/jsproxy/master/i.sh && bash i.sh ``` -如果安装失败,尝试[源码编译安装](docs/compile.md)。 +如果安装失败,尝试[手动安装](docs/compile.md)。 # 测试 diff --git a/docs/compile.md b/docs/compile.md index 9ba11b8..e80a693 100644 --- a/docs/compile.md +++ b/docs/compile.md @@ -1,29 +1,97 @@ -# 简介 +# 手动安装 -默认的安装方式,是直接下载编译后的 nginx 程序。目前只提供 Linux x64 系统的文件,其他系统暂不支持,需要从源码编译。 +## 创建用户 -此外,对于没有 root 权限的系统,也需通过源码编译,从而改变 nginx 的安装位置。(nginx 程序路径是在编译时通过 `--prefix` 参数指定的,安装后移动程序位置会导致某些链接库无法加载。如果有好的解决方案多指教~) - - -# 依赖 - -需要安装 make、gcc 等,参考 nginx 的编译。 - -无需安装 pcre、zlib、openssl 开发库,安装脚本会自动下载源码。 - - -# 脚本 +新建一个名为 `jsproxy` 用户(`nobody` 组),并切换: ```bash -curl -O https://raw.githubusercontent.com/EtherDream/jsproxy/master/i.sh -bash i.sh compile +groupadd nobody +useradd jsproxy -g nobody --create-home + +su - jsproxy ``` -nginx 最终安装在 `$HOME/openresty` 目录下。代理服务安装在当前 `server` 目录下。 +非 Linux 系统,或者无 root 权限的设备,可忽略。 -# 支持 +## 安装 nginx -目前测试过的系统: +下载、编译、安装 nginx。本项目使用 [OpenResty](https://openresty.org/en/)。 -* OSX \ No newline at end of file +```bash +cd $(mktemp -d) + +curl -O https://www.openssl.org/source/openssl-1.1.1b.tar.gz +tar zxf openssl-* + +curl -O https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz +tar zxf pcre-* + +curl -O https://zlib.net/zlib-1.2.11.tar.gz +tar zxf zlib-* + +curl -O https://openresty.org/download/openresty-1.15.8.1.tar.gz +tar zxf openresty-* +cd openresty-* + +export PATH=$PATH:/sbin + +./configure \ + --with-openssl=../openssl-1.1.1b \ + --with-pcre=../pcre-8.43 \ + --with-zlib=../zlib-1.2.11 \ + --with-http_v2_module \ + --with-http_ssl_module \ + --with-pcre-jit \ + --prefix=$HOME/openresty + +make +make install +``` + +其中 `configure` 的参数 `--prefix` 指定 nginx 安装路径,这里为方便设为用户主目录。 + +> 注意编译后的 nginx 程序不能改变位置,否则会启动失败 + +测试能否执行: + +```bash +$HOME/openresty/nginx/sbin/nginx -h +``` + + +## 安装代理程序 + +下载本项目。其本质就是一堆 nginx 配置: + +```bash +git clone --depth=1 https://github.com/EtherDream/jsproxy.git server +``` + +开启代理服务: + +```bash +cd server +./run.sh +``` + +更新使用 git 即可。 + + +## 编译问题 + +编译前需要安装 make、gcc 等工具,具体可参考 nginx 编译。 + +无需安装 pcre-devel、openssl-devel、zlib-devel 依赖,已使用源码编译。 + + +## 用户问题 + +为什么要创建一个 `jsproxy` 用户运行该服务? + +因为该服务无需 root,所以更低的权限可以减少风险。另外在防 SSRF 脚本 `setup-ipset.sh` 中,是通过 iptalbes 的 `uid-owner` 策略阻止 `jsprxoy` 这个特定用户访问内网的。 + + +## 支持系统 + +目前测试了 OSX 系统,其他还在测试中。。。 \ No newline at end of file diff --git a/i.sh b/i.sh index ecfec26..2fa56b2 100755 --- a/i.sh +++ b/i.sh @@ -3,9 +3,6 @@ CDN=https://cdn.jsdelivr.net/gh/etherdream/jsproxy-bin@master JSPROXY_VER=0.0.9 -PCRE_VER=8.43 -ZLIB_VER=1.2.11 -OPENSSL_VER=1.1.1b OPENRESTY_VER=1.15.8.1 SUPPORTED_OS="Linux-x86_64" @@ -35,7 +32,12 @@ err() { output $COLOR_RED $1 } -check_nginx() { +install() { + log "下载 nginx 程序 ..." + curl -O $CDN/$OS/openresty-$OPENRESTY_VER.tar.gz + tar zxf openresty-$OPENRESTY_VER.tar.gz + rm -f openresty-$OPENRESTY_VER.tar.gz + local ngx_exe="$NGX_DIR/nginx/sbin/nginx" local ngx_ver=$($ngx_exe -v 2>&1) @@ -45,9 +47,7 @@ check_nginx() { fi log "$ngx_ver" log "nginx path: $NGX_DIR" -} -install_jsproxy() { log "下载代理服务 ..." curl -s -O $CDN/server-$JSPROXY_VER.tar.gz @@ -72,75 +72,6 @@ install_jsproxy() { log "服务已开启。后续维护参考 https://github.com/EtherDream/jsproxy" } -compile() { - local tmp_dir="$PWD/__tmp__" - - mkdir -p $tmp_dir - cd $tmp_dir - - log "下载 pcre 源码 ..." - curl -O https://ftp.pcre.org/pub/pcre/pcre-$PCRE_VER.tar.gz - tar zxf pcre-$PCRE_VER.tar.gz - - log "下载 zlib 源码 ..." - curl -O https://zlib.net/zlib-$ZLIB_VER.tar.gz - tar zxf zlib-$ZLIB_VER.tar.gz - - log "下载 openssl 源码 ..." - curl -O https://www.openssl.org/source/openssl-$OPENSSL_VER.tar.gz - tar zxf openssl-$OPENSSL_VER.tar.gz - - log "下载 nginx 源码 ..." - curl -O https://openresty.org/download/openresty-$OPENRESTY_VER.tar.gz - tar zxf openresty-$OPENRESTY_VER.tar.gz - - cd openresty-$OPENRESTY_VER - - export PATH=$PATH:/sbin - - log "配置中 ..." - ./configure \ - --with-openssl=../openssl-$OPENSSL_VER \ - --with-pcre=../pcre-$PCRE_VER \ - --with-zlib=../zlib-$ZLIB_VER \ - --with-http_v2_module \ - --with-http_ssl_module \ - --with-pcre-jit \ - --prefix=$NGX_DIR - - log "编译中 ..." - make - make install - - log "编译完成" - rm -rf $tmp_dir - - check_nginx - install_jsproxy -} - -install() { - log "下载 nginx 程序 ..." - curl -O $CDN/$OS/openresty-$OPENRESTY_VER.tar.gz - tar zxf openresty-$OPENRESTY_VER.tar.gz - rm -f openresty-$OPENRESTY_VER.tar.gz - - check_nginx - install_jsproxy -} - -update() { - install_jsproxy -} - -pack() { - log "压缩 openresty ..." - GZIP=-9 - tar cvzf openresty.tar.gz openresty - log "done" - ls -la -} - main() { if [[ "$SUPPORTED_OS" != *"$OS"* ]]; then err "当前系统 $OS 不支持自动安装。尝试编译安装" @@ -170,15 +101,8 @@ main() { } -case "$1" in -"install") install - exit;; -"compile") compile - exit;; -"update") update - exit;; -"pack") pack - exit;; -*) main - exit;; -esac \ No newline at end of file +if [[ "$1" == "install" ]]; then + install +else + main +fi \ No newline at end of file From 6dab4555a22ff257963e64b941727550de23748f Mon Sep 17 00:00:00 2001 From: EtherDream Date: Wed, 22 May 2019 14:36:52 +0800 Subject: [PATCH 5/5] Create LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..55d5ce6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 EtherDream + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.