浏览代码

编译脚本不放在安装脚本里,放在 docs/compile.md 文档

zjcqoo 6 年之前
父节点
当前提交
1d314d2f8e
共有 4 个文件被更改,包括 158 次插入100 次删除
  1. 32 0
      changelogs/README.md
  2. 34 0
      changelogs/v0.0.1.md
  3. 81 13
      docs/compile.md
  4. 11 87
      i.sh

+ 32 - 0
changelogs/README.md

@@ -0,0 +1,32 @@
+# 完整更新日志
+
+## 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 反馈。以后有时间补充测试案例。。。)

+ 34 - 0
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,只能普通模式访问。
+
+
+# 提供一个首页
+
+虽然依旧简陋,但比之前好。提供了线路切换、预加载的功能。

+ 81 - 13
docs/compile.md

@@ -1,29 +1,97 @@
-# 简介
+# 手动安装
 
-默认的安装方式,是直接下载编译后的 nginx 程序。目前只提供 Linux x64 系统的文件,其他系统暂不支持,需要从源码编译。
+## 创建用户
 
-此外,对于没有 root 权限的系统,也需通过源码编译,从而改变 nginx 的安装位置。(nginx 程序路径是在编译时通过 `--prefix` 参数指定的,安装后移动程序位置会导致某些链接库无法加载。如果有好的解决方案多指教~)
+新建一个名为 `jsproxy` 用户(`nobody` 组),并切换:
 
+```bash
+groupadd nobody
+useradd jsproxy -g nobody --create-home
+
+su - jsproxy
+```
+
+非 Linux 系统,或者无 root 权限的设备,可忽略。
+
+
+## 安装 nginx
+
+下载、编译、安装 nginx。本项目使用 [OpenResty](https://openresty.org/en/)。
+
+```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
+```
 
-需要安装 make、gcc 等,参考 nginx 的编译。
 
-无需安装 pcre、zlib、openssl 开发库,安装脚本会自动下载源码。
+## 安装代理程序
 
+下载本项目。其本质就是一堆 nginx 配置:
+
+```bash
+git clone --depth=1 https://github.com/EtherDream/jsproxy.git server
+```
 
-# 脚本
+开启代理服务:
 
 ```bash
-curl -O https://raw.githubusercontent.com/EtherDream/jsproxy/master/i.sh
-bash i.sh compile
+cd server
+./run.sh
 ```
 
-nginx 最终安装在 `$HOME/openresty` 目录下。代理服务安装在当前 `server` 目录下。
+更新使用 git 即可。
+
+
+## 编译问题
+
+编译前需要安装 make、gcc 等工具,具体可参考 nginx 编译。
+
+无需安装 pcre-devel、openssl-devel、zlib-devel 依赖,已使用源码编译。
+
+
+## 用户问题
+
+为什么要创建一个 `jsproxy` 用户运行该服务?
 
+因为该服务无需 root,所以更低的权限可以减少风险。另外在防 SSRF 脚本 `setup-ipset.sh` 中,是通过 iptalbes 的 `uid-owner` 策略阻止 `jsprxoy` 这个特定用户访问内网的。
 
-# 支持
 
-目前测试过的系统:
+## 支持系统
 
-* OSX
+目前测试了 OSX 系统,其他还在测试中。。。

+ 11 - 87
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
+if [[ "$1" == "install" ]]; then
+  install
+else
+  main
+fi