server{
listen 9999;
resolver 8.8.8.8 114.114.114.114 223.5.5.5;
proxy_connect;
proxy_ignore_client_abort on;
proxy_connect_allow 443 563;
proxy_connect_connect_timeout 10s;
proxy_connect_read_timeout 10s;
proxy_connect_send_timeout 10s;
location / {
proxy_pass http://$host;
proxy_set_header Host $host;
#proxy_pass $scheme://$host$request_uri;
}
access_log /www/wwwlogs/access-proxy.log;
}
基于nginx正向代理访问外网
前言
正向代理服务器的作用是将客户端请求转发给其他服务器,并将响应返回给客户端。使用正向代理服务器可以隐藏客户端的真实IP地址,提高访问速度和安全性。
以下是使用Nginx作为正向代理服务器的配置示例。
配置nginx正向代理
前提是你已经安装的nginx
,如果没有安装请自行Google或百度。
http {
# 定义代理服务器列表
upstream backend {
server 10.0.0.1:80;
server 10.0.0.2:80;
}
# 定义代理服务器
server {
listen 80;
# 定义代理服务器名称
server_name proxy.example.com;
# 定义日志文件
access_log /var/log/nginx/proxy_access.log;
error_log /var/log/nginx/proxy_error.log;
# 定义代理配置
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}复制代码
测试代理服务器
保存配置文件并重新加载Nginx:
sudo systemctl reload nginx复制代码
接下来,可以使用curl命令测试代理服务器。例如:
curl --proxy http://proxy.example.com:80 http://www.example.com
# 示例:
curl -x http://proxy.example.com:80 http://www.baidu.com复制代码
其中,--proxy
参数指定代理服务器的地址和端口号,后面跟随需要代理的URL地址。在上面的示例中,代理服务器名称为proxy.example.com
,端口号为80。--proxy
可简写为-x
如果一切正常,应该能够看到来自代理服务器的响应。但是如果你去请求https://www.baidu.com
可能不行。因为nginx默认不支持https的代理。ngx_http_proxy_connect_module 模块可以实现隧道SSL请求的代理服务器
让nginx支持https
nginx安装ngx_http_proxy_connect_module模块,目前该模块截止2023-04-14
插件支持的版本
我的nginx为nginx/1.20.1
,因此下载 proxy_connect_rewrite_1018.patch
为补丁包
[root@web root] wget https://d.frps.cn/file/tools/nginx/model/ngx_http_proxy_connect_module.tar.gz
[root@web root] tar xf ngx_http_proxy_connect_module.tar.gz #解压复制代码
安装patch
命令
yum install -y patch复制代码
进入nginx
源码目录,修改编译参数
[root@web nginx-1.20.1]# patch -p1 < /root/ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_1018.patch
patching file src/http/ngx_http_core_module.c
patching file src/http/ngx_http_parse.c
patching file src/http/ngx_http_request.c
patching file src/http/ngx_http_request.h
patching file src/http/ngx_http_variables.c复制代码
如果没有安装nginx
,请使用下面的命令进行编译安装:
./configure --prefix=/opt/nginx-1.20 --with-openssl=/usr/local/src/openssl-1.1.1t --with-pcre=/usr/local/src/pcre-8.45 --with-zlib=/usr/local/src/zlib-1.2.13 --with-http_ssl_module --with-http_stub_status_module --with-stream --with-http_stub_status_module --with-http_gzip_static_module --add-module=/root/ngx_http_proxy_connect_module
#编译安装
make && make install
#--add-module=/root/ngx_http_proxy_connect_module 模块目录(注意指定目录!)复制代码
如果安装的nginx
,请参考这篇文章:Nginx 装好后,追加模块
创建验证文件
http {
# 定义代理服务器列表
upstream backend {
server 10.0.0.1:80;
server 10.0.0.2:80;
}
# 定义代理服务器
server {
listen 80;
listen 443;
# 定义代理服务器名称
server_name proxy.example.com;
proxy_connect; #启用 CONNECT HTTP方法
proxy_connect_allow 443 80; #指定代理CONNECT方法可以连接的端口号或范围的列表
proxy_connect_connect_timeout 20s; #定义客户端与代理服务器建立连接的超时时间
proxy_connect_read_timeout 20s; #定义客户端从代理服务器读取响应的超时时间
proxy_connect_send_timeout 20s; #设置客户端将请求传输到代理服务器的超时时间
# 定义日志文件
access_log /var/log/nginx/proxy_access.log;
error_log /var/log/nginx/proxy_error.log;
# 定义代理配置
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}复制代码
如果一切正常的话,应该支持https
了,测试结果如下:
如果还不正常,欢迎讨论。
参考
本文为作者原创文章,转载无需和我联系,但请注明转载链接。 【前端黑猫】