今天介绍下如何使用 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 服务,通过查看日志来确认代理服务是否搭建成功。
上面简单介绍了正向代理服务器的搭建,感兴趣的小伙伴可以进一步了解。