使用Nginx搭建HTTPS正向代理服务器指南
使用Nginx搭建HTTPS正向代理服务器指南
本文原始发布于2024年9月,内容主要介绍如何使用Nginx搭建HTTPS正向代理服务器。虽然文章发布已久,但其中的技术细节和配置方法仍然具有参考价值。
在企业开发环境中,局域网内的设备通常需要通过正向代理服务器访问互联网。正向代理服务器充当中介,帮助客户端请求外部资源并返回结果。局域网内也就是俗称的内网,局域网外的互联网就是外网,在一些特殊场景内,例如:医院。而局域网中的客户端要访问这些资源时,就需要通过代理服务器。这种通过代理服务器访问外部网络资源的方式,就是正向代理。正向代理不仅用于提升访问速度,还能提高网络安全性、管理访问权限和优化网络流量。
原生Nginx可以作为HTTP的正向代理服务器,但是不能用做HTTPS的正向代理服务器。因为HTTP正向代理使用的是GET请求,但是HTTPS使用的是CONNECT请求,而原生Nginx不支持CONNECT请求。所以需要第三方模块ngx_http_proxy_connect_module来支持HTTPS的正向代理,使用这个插件,意味着需要重新编译Nginx,在编译的过程中,将插件添加进去。本次编译以目前稳定版1.24.0为例。
ngx_http_proxy_connect_module 介绍
ngx_http_proxy_connect_module是Nginx的一个扩展模块,主要功能是允许Nginx作为代理服务器处理CONNECT方法。通过该模块,可以将Nginx作为HTTP/HTTPS代理服务器,甚至可以直接用作WebSocket服务器。
注:在HTTP协议中,CONNECT方法主要用于建立隧道(即建立到远程服务器的端到端的加密连接),通常在代理服务器后面的客户端需要通过代理服务器与目标服务器建立安全连接,比如WebSocket连接和HTTPS的中间人代理。
详细步骤
包准备
从Nginx官网下载Nginx源码包
注:也可以直接在Linux主机上下载:
wget http://nginx.org/download/nginx-1.24.0.tar.gz
从GitHub下载ngx_http_proxy_connect_module源码
从GitHub下载ngx_http_proxy_connect_module模块的Nginx内核补丁
注:
- 请严格按照下图安装和Nginx版本匹配的Nginx内核补丁,否则会导致HTTPS代理不生效。
- ngx_http_proxy_connect_module源码压缩包内(ngx_http_proxy_connect_module-master/patch/)可能已包含Nginx内核补丁,这种情况确认即可,无需再下载补丁。
Linux编译并安装Nginx
# 使用yum包管理工具安装相关编译环境及相关依赖
yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel openssl-libs pcre2
# 或使用dnf包管理工具安装
#dnf -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
# 将安装包放于/root目录,可自定义
cd /root
# 上传Nginx安装包并解压
tar -zxvf nginx-1.24.0.tar.gz
# 进入Nginx安装包解压目录并创建modules源码包存放目录
cd nginx-1.24.0
mkdir ./modules && cd ./modules
# 上传ngx_http_proxy_connect_module源码包并解压
unzip ngx_http_proxy_connect_module-master.zip
# 进入Nginx安装包解压目录根路径
cd /root/nginx-1.24.0
# 对Nginx内核打补丁
patch -p1 < modules/ngx_http_proxy_connect_module-master/patch/proxy_connect_rewrite_102101.patch
# 配置编译参数编译前确认pcre、zlib、openssl的库是否已经正常安装
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-stream \
--with-stream_ssl_module \
--add-module=/root/nginx-1.24.0/modules/ngx_http_proxy_connect_module-master
# --prefix :指定需要安装的目录,可自定义
# --add-module :ngx_http_proxy_connect_module-master模块源码路径,根据实际路径修改
# 编译并安装Nginx
make && make install
修改Nginx配置文件
编辑配置文件:
vi /usr/local/nginx/conf/nginx.conf
增加如下配置:
server {
# 对外服务端口
listen 80;
server_name localhost;
# 域名解析服务器并禁用ipv6
# 注:若不禁用ipv6,会由于当前互联网对IPv6支持不完整,导致在DNS解析时偶发超时问题(502)
resolver 114.114.114.114 valid=60s ipv6=off;
# 解析超时时间
resolver_timeout 30s;
# 开启porxy connect功能(代理)
proxy_connect;
# 设置允许代理的目标端口和范围的列表
proxy_connect_allow 80 443 563;
# 定义客户端与代理服务器建立连接的超时时间
proxy_connect_connect_timeout 20s;
# 定义客户端从代理服务器读取响应的超时时间
proxy_connect_read_timeout 20s;
# 设置客户端将请求传输到代理服务器的超时时间
proxy_connect_send_timeout 20s;
location / {
# 正向代理配置,根据请求地址自动解析出目标网站地址并进行代理
proxy_pass $scheme://$host$request_uri;
# 发送到被代理网站的请求需要添加Host请求头
proxy_set_header Host $host;
}
}
Nginx启动与测试
启动:
# 启动Nginx
/usr/local/nginx/sbin/nginx
# 重新加载Nginx配置
/usr/local/nginx/sbin/nginx -s reload
# 停止Nginx
/usr/local/nginx/sbin/nginx -s stop
测试Nginx代理功能:
curl https://www.baidu.com -v -x 127.0.0.1:80
拓展
设置Nginx开机自启动
创建开机自启脚本
vim /etc/systemd/system/nginx.service
脚本内容:
# 仅修改 /usr/local/nginx/sbin/nginx 这个路径即可(修改为实际的Nginx路径)
[Unit]
Description=Nginx service
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
设置文件权限
chmod 755 /etc/systemd/system/nginx.service
设置开机自启动
systemctl daemon-reload
systemctl enable nginx
验证
# Nginx启动
systemctl start nginx
# Nginx停止
systemctl stop nginx
# 直接重启服务器即可(Nginx就自动重启了)
reboot
常用命令
# 启动Nginx服务
systemctl start nginx
# 重新启动Nginx服务
systemctl restart nginx
# 查看Nginx服务当前状态
systemctl status nginx
# 停止开机自启动
systemctl disable nginx
本文原文来自CSDN