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

This commit is contained in:
zjcqoo 2019-05-22 14:40:21 +08:00
commit 1d314d2f8e
4 changed files with 164 additions and 106 deletions

32
changelogs/README.md Normal file
View File

@ -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
changelogs/v0.0.1.md Normal file
View File

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

View File

@ -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
```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 系统,其他还在测试中。。。

98
i.sh
View File

@ -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