-
Notifications
You must be signed in to change notification settings - Fork 46
/
gh-proxy.conf
152 lines (126 loc) · 5.8 KB
/
gh-proxy.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
############## 本机真实代下载后端 #################
# 理论上,即便是 Caddy 或者 Apache 也可以加入子节点
# 或者自行编写兼容的程序也是可以的
# 由于我仅会使用Nginx,所以示例配置是 Nginx 做代理
# PS: 从来没见人使用 Nginx 代下的,我用这个代下也研究了好一段时间才找到了方法
# 实际上你可以看到有一个 /gethost/ 请求,去解析 host,这是没有办法的办法
limit_req_zone $binary_remote_addr zone=forcetwo:2m rate=5r/s;
server{
# listen 80;
# 我的示例程序中使用了 https,如果你的公益节点没有https,则使用上面的一行
listen 80; listen 443 ssl http2;
# 如果要加入公益下载节点,只需要修改这个 server_name 即可
# 其余地方都不要改动。当然,如果你会编写 Nginx,可以修改部分配置
# 如果你会申请证书,也可以将子节点升级为 https
server_name real-proxy.zwc365.com;
# 这是主节点地址,不要轻易修改,除非你自己部署了主节点
set $base_url "https://pd.zwc365.com";
set $base_url_host "pd.zwc365.com";
# 这里五行是 https 配置,如果你没有证书,删掉这五行
ssl_session_cache shared:SSL:5m;
ssl_session_timeout 30m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_certificate /etc/nginx/ssl/zwc365.com/cert.pem;
ssl_certificate_key /etc/nginx/ssl/zwc365.com/key.pem;
# 下载节点支持跨域访问,这样将支持嵌入 url 到任意网页中
add_header Access-Control-Allow-Methods *;
add_header Access-Control-Max-Age 3600;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Origin $http_origin;
add_header Access-Control-Allow-Headers $http_access_control_request_headers;
resolver 8.8.8.8;
recursive_error_pages on;
proxy_intercept_errors on;
proxy_redirect off;
# 对于某些 https 会出现报错
# 部分第三方https网站必须设置此项才可代理访问
proxy_ssl_server_name on;
# 这里限制单个文件大小 2048M
client_max_body_size 2048M;
# 设定编码格式
charset utf-8;
location = /favicon.ico {return 404;}
location = /robots.txt {return 200 "User-agent: *\nDisallow: /\n";}
location / {
default_type "text/html";
set $base_url "${scheme}://pd.zwc365.com";
return 404 '<html>
<head><title>文件加速下载服务</title></head>
<style>body{text-align:center;}</style>
<body bgcolor="white">
<h1>链接无法访问</h1>
<hr><br/><a href="$base_url">点击前往主页</a>
</body></html>';
}
# 主站会对子节点进行可用性检查,必须返回 200 状态码,否则会被移除
# 节点检查目前30分钟一次,移除后如果检测可用会被自动重新加入
# 如果要永久移除节点,必须手动移除主站配置文件
# 节点支持设置权重,1-5 ,默认权重3,如果带宽较大,可以增大权重
location = /geturl/ {
add_header X-Weight "3";
return 200 "success";
}
location ~ /geturl/ {
limit_req zone=forcetwo burst=100 nodelay;
# 从主站取到一个下载地址,然后代理 302 下载页
# 必须从主站取地址,校验这个任务的合法性
# 如果任务不合法,主站会返回 404
proxy_pass $base_url;
proxy_set_header Host $base_url_host;
proxy_set_header X-Forwarded-For $remote_addr;
# 子节点支持自定义路径,但是必须在这里声明,默认是 /geturl/
add_header X-First-Url "/geturl/";
error_page 302 = @download_302;
error_page 502 504 = @error_502;
error_page 503 = @error_503;
}
# 只有这个任务是合法的,主站才会返回 302,此时子节点代理下载
location @download_302 {
# 注意:必须使用 set ,将 upstream 的变量保存到一个值
set $saved_x_real_host '$upstream_http_x_real_host';
set $next_req_host '$upstream_http_location';
set $down_id '$upstream_http_x_download_id';
set $x_referer '$upstream_http_x_referer';
if ($down_id = ''){return 302 $next_req_host;}
proxy_pass $next_req_host;
proxy_set_header Host $saved_x_real_host;
proxy_set_header Referer $x_referer;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
error_page 301 302 303 307 308 = @host_302;
error_page 502 504 = @error_502;
error_page 503 = @error_503;
}
# 这是用来拦截内容 302 的
# 某些下载资源会 302 或者 301 重定向,必须拦截
# 否则会出现无法代下的情况
location @host_302 {
set $next_req_host '$upstream_http_location';
if ($down_id = ''){return 302 $base_url/cfworker/$next_req_host;}
error_page 502 504 = @error_502;
error_page 503 = @error_503;
return 302 /geturl/$down_id/$next_req_host;
}
location @error_502 {
default_type "text/html";
set $base_url "${scheme}://pd.zwc365.com";
return 502 '<html>
<head><title>文件加速下载服务</title></head>
<style>body{text-align:center;}</style>
<body bgcolor="white">
<h1>502 Bad Gateway</h1>
<hr><br/>你可以 <a href="$base_url/error_502">点这里</a> 查看错误原因
</body></html>';
}
location @error_503 {
default_type "text/html";
set $base_url "${scheme}://pd.zwc365.com";
return 503 '<html>
<head><title>文件加速下载服务</title></head>
<style>body{text-align:center;}</style>
<body bgcolor="white">
<h1>503 Service Temporarily Unavailable</h1>
<hr><br/>你可以 <a href="$base_url/error_503">点这里</a> 查看错误原因
</body></html>';
}
}