快速克隆一个网站

前段时间克隆搭建一个好了一个Google 站,今天突发奇想克隆任意站,特此搜寻资料,写此文章.利用的是nginx反向代理技术,发现nginx博大精深,许多好用的第三模块真是很前强大.官方扩展模块地址:
http://nginx.org/en/docs/

搭建环境

所需模块:

ngx_http_sub_module (http://nginx.org/en/docs/http/ngx_http_sub_module.html)

substitutions4nginx模块 (https://github.com/yaoweibin/ngx_http_substitutions_filter_module)

下载编译之

1
2
3
./configure --prefix=/usr/local/nginx_test --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-file-aio --with-http_realip_module --with-http_sub_module  --add-module=../ngx_http_substitutions_filter_module

sudo make && sudo make install

substitutions说明

这是一个内容替换模块(apache的 mod_substitute模块一样),类似的模块应该还有,这里就不说了

实例:

1
2
3
4
5
location / {
subs_filter_types text/html text/css text/xml;
subs_filter st(\d*).example.com $1.example.com ir;
subs_filter a.example.com s.example.com;
}

Nginx反向代理并替换内容涉及指令:

  • subs_filter_types

  • subs_filter

subs_filter_types 语法: subs_filter_types mime-type [mime-types]

默认: subs_filter_types text/html

内容: http, server, location

subs_filter_types 是用来指定替换文件类型的 默认仅仅替换text/html类型的文件。

*如果您反代的网站出现登录跳转源站之类的问题,请检查这个项目。

proxy_set_header Accept-Encoding “”;

subs_filter 语法: subs_filter source_str destination_str [gior]

默认: none

内容: http, server, location

subs_filter 是用来替换文本的,可以使用正则

  • g(默认):替换匹配项。

  • i:区分大小写的匹配

  • o: 只匹配发现的第一个。

  • r: 正则。

缓存设置

nginx.conf的http层

1
2
3
4
5
6
7
8
9
10
11
proxy_connect_timeout    5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_temp_path /home/cache/temp;
#临时文件目录
proxy_cache_path /home/cache/path levels=1:2 keys_zone=cache_one:5m inactive=7d max_size=1g;
#5m为内存占用,1g为最大硬盘占用,cache_one为缓存区名字,如果修改则下文的配置亦要相应修改。

创建缓存目录:

1
2
3
mkdir -p /home/cache/path 
mkdir /home/cache/temp
chmod 777 -R /home/cache

nginx.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
##########################################################

proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_temp_path /home/cache/temp;
#临时文件目录
proxy_cache_path /home/cache/path levels=1:2 keys_zone=cache_one:5m inactive=7d max_size=1g;


server{

listen 80;
server_name sui1.sadprincess.com;
index index.php index.html index.htm;
access_log off; #off 关闭日志

location / {

if ($http_user_agent ~* (baiduspider|360spider|haosouspider|googlebot|soso|bing|sogou|yahoo|sohu-search|yodao|YoudaoBot|robozilla|msnbot|MJ12bot|NHN|Twiceler)) {return 403;}

proxy_cache_key "$scheme://$host$request_uri"; #缓存key规则,用于自动清除缓存。

proxy_cache cache_one; #缓存区名称,与前面定义的相同

proxy_cache_valid 200 304 3h;
proxy_cache_valid 301 3d;
proxy_cache_valid any 10s;
#200 304状态缓存3小时 301状态缓存3天 其他状态缓存(如502 404)10秒

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #向后端传递访客ip

proxy_set_header Referer http://www.verybeaut.com; #强制定义Referer,程序验证判断会用到

# proxy_set_header Host $host; # 定义主机头 如果服务器上有许多域名,设置具体的域名
proxy_set_header Host www.verybeaut.com;

proxy_pass http://www.verybeaut.com; #指定后端ip,可以加端口,多域名主机设置具体的域名

#proxy_cache_use_stale invalid_header error timeout http_502; #当后端出现错误、超时、502状态时启用过期缓存,慎用。
add_header Nginx-Cache "$upstream_cache_status"; # 增加头信息,观察客户端respoce是否命中
# proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;# 出现502-504或错误,会跳过此台服务器访问下一台服务器
}
}

##########################################################

内容替换

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
http{
# ............

##########################################################

proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_temp_path /home/cache/temp;
proxy_cache_path /home/cache/one levels=1:2 keys_zone=cache_one:3m inactive=7d max_size=1g;

server {
listen 80;
server_name sui1.sadprincess.com;
index index.php index.html index.htm; #默认首页

location / {
# 在响应报文中添加缓存首部字段
add_header X-Cache "$upstream_cache_status from $server_addr";
# subs_filter_types text/html text/css text/xml;
subs_filter www.verybeaut.com sui1.sadprincess.com gi; #替换模块。

proxy_cache_key "$scheme://$host$request_uri"; #缓存key规则,用于自动清除缓存。

proxy_cache cache_one; #缓存区名称,必须与前面定义的相同

proxy_cache_valid 200 304 3h;
proxy_cache_valid 301 3d;
proxy_cache_valid any 10s;
#200 304状态缓存3小时
#301状态缓存3天
#其他状态缓存(如502 404)10秒

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #向后端传递访客ip

proxy_set_header Referer http://www.verybeaut.com; #强制定义Referer,程序验证判断会用到

proxy_set_header Host www.verybeaut.com; #定义主机头

proxy_pass http://www.verybeaut.com; #指定后端ip

proxy_set_header Accept-Encoding ""; #清除编码

proxy_cache_use_stale invalid_header error timeout http_502;#当后端出现错误、超时、502状态时启用过期缓存
}
}
##########################################################

}

nuster/haproxy

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
global
nuster cache on data-size 200m

defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
timeout connect 5000
timeout client 10000
timeout server 10000

#####################监控页面#############
stats enable
stats uri /haproxy?stats
stats auth admin:password
stats show-node
###########################################

frontend fe
mode http
maxconn 51200
bind :80
#bind *:9999
default_backend be


backend be
mode http
nuster cache on
nuster rule all
http-request set-header Host www.verybeaut.com
server s1 www.verybeaut.com:80
纵有疾风起,人生不言弃!