0%

使用三种方式搭建正向代理服务器

今天介绍下如何使用 nginx、apache 和 squid 搭建正向代理服务器。下面的操作都是在 centos8.1 上完成的。

nginx

使用 nginx 正向代理时,需要先把 ngx_http_proxy_connect_module 模块编译进 nginx 中,编译方式可参考上一篇文章。

这里我搭建了一个 RSSHub 服务用于发起请求,RSSHub 服务器上的代理环境变量配置如下:

1
2
3
export PROXY_PROTOCOL=http
export PROXY_HOST=****
export PROXY_PORT=8090

nginx正向代理搭建成功后,在本机请求 RSSHub 服务时,会通过代理向目标网址发送请求。

nginx 配置正向代理时,将下面的配置加到 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
52
53
54
55
56
57
58
59
60
61
62
63
64
#user  nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

server {
listen 8090; #监听端口
resolver 8.8.8.8; #dns解析地址
server_name _;
proxy_connect;
proxy_connect_allow 443 563;
# proxy_connect_connect_timeout 10s;
# proxy_connect_read_timeout 10s;
# proxy_connect_send_timeout 10s;

location / {
proxy_pass $scheme://$host$request_uri;
proxy_set_header HOST $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
#proxy_next_upstream error timeout invalid_header http_502;
#root html;
# #index index.html index.htm;
}


error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

}
}

上面的 location 块中,还有很多其他的命令,感兴趣的小伙伴可以查阅相关文档。

ngx_http_proxy_connect_module 模块的 github 地址为:

1
http://www.github.com/chobits/ngx_http_proxy_connect_module

apache

安装

1
2
3
4
5
6
7
安装:
yum install -y httpd

启动:
systemctl enable httpd
systemctl start httpd
systemctl restart httpd

配置

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
修改文件 /etc/httpd/conf.modules.d/00-proxy.conf,最终内容如下:
# This file configures all the proxy modules:
LoadModule proxy_module modules/mod_proxy.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so

ProxyRequests On
ProxyVia On


<Proxy "*">
</Proxy>

配置完成后,可以执行 systemctl start httpd 命令启动 apache 服务。

可能遇到的问题

1
[Sun Apr 19 02:20:38.711238 2020] [proxy:error] [pid 23913:tid 140212453746432] (13)Permission denied: [client 113.104.182.232:38242] AH00939: CONNECT: attempt to connect to 47.89.66.201:443 (www.jianshu.com) failed

启动 apache 服务后,发起请求时,若代理服务器出现上面的错误,则可能与 centos 的 SELinux 有关,可以执行如下命令:

1
setsebool -P httpd_can_network_connect=1

squid

squid是一个高性能的代理缓存服务器,squid支持FTP、gopher、HTTPS和HTTP协议。我们也可以使用它来搭建代理服务器。

搭建步骤如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
安装squid:
yum install squid -y

配置:
修改文件 /etc/squid/squid.conf ,添加以下内容:
acl local src 192.168.5.0/24 //允许192.168.5.0/24网段内所有客户机访问代理服务器
http_access allow local

启动:驱动squid的服务
systemctl start squid

查看日志:
tail -f /var/log/squid/access.log
tail -f /var/log/squid/error.log

上面的代理服务搭建完成并启动后,可以在本地访问 RSSHub 服务,通过查看日志来确认代理服务是否搭建成功。

上面简单介绍了正向代理服务器的搭建,感兴趣的小伙伴可以进一步了解。