用nginx正向代理https网站

目录

1. 缘起

最近碰到了一个麻烦事情,就是公司的centos测试服务器放在内网环境,而且不能直接上外网,导致无法通过yum安装软件,非常捉急。
幸好,内网还是有可以可以访问外网的机器,所以就想到应该可以利用nginx搭建一个代理服务器,然后centos通过这个nginx来访问外网。当然,如果只是代理http还是很简单的,而要代理https还是需要稍费周折,因为nginx本身不能部署被代理的网站的证书,不能部署成https终结点来,因此与被代理客户端之间不能用ssl协议通讯,因此需要通过http协议中的CONNECT请求打通和外网的连接,然后客户端到nginx走明文,nginx到外网走https协议。这里需要用到ngx_http_proxy_connect_module模块来实现CONNECT的代理功能。

2. 部署nginx

  • 步骤1: 从nginx官网下载nginx源码包

  • 步骤2: 因为nginx原生是不支持CONNECT请求的,需要安装一个扩展插件,即ngx_http_proxy_connect_module,从github下载ngx_http_proxy_connect_module,另外还要下载一个nginx内核补丁

  • 步骤3: 解压nginx源码包,进入nginx源码目录,创建modules目录(mkdir modules)。

  • 步骤4: 将ngx_http_proxy_connect_module源码目录放到modules目录中。

  • 步骤5: 将nginx内核补丁放到nginx源码目录,姑且名字叫p1.patch

  • 步骤6: 在nginx源码目录,执行以下命令给nginx内核打上补丁:

    patch -p 1 < p1.patch
    
  • 步骤7:编译nginx,这里假设nginx安装到/opt/nginx目录中(在编译前确认pcre、zlib、openssl的库是否已经正常安装),编译命令如下:

    ./configure --prefix=/opt/nginx --with-http_ssl_module -add-module=./modules/ngx_http_proxy_connect_module
    make & make install

  • 步骤8:配置nginx
    配置文件如下:

    #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;
    keepalive_timeout  65;
    

    server {
    # 代理端口
    listen 8080;
    server_name localhost;

        # 解析被代理网站域名的dns
### 配置 Nginx 实现正向代理支持 HTTPS 为了使 Nginx 能够实现正向代理并支持 HTTPS 请求,需要解决其默认不支持 `HTTP CONNECT` 方法的问题。这可以通过引入第三方模块 `ngx_http_proxy_connect_module` 来完成[^2]。 #### 安装与编译 要启用对 HTTPS 的支持,需先重新编译 Nginx 并加入 `ngx_http_proxy_connect_module` 模块。以下是具体操作: 1. **下载模块源码** 访问该模块的 GitHub 页面获取最新版本代码: ```bash git clone https://github.com/chobits/ngx_http_proxy_connect_module.git ``` 2. **准备环境** 下载对应版本的 Nginx 源码包,并解压到本地路径下。假设当前使用的 Nginx 版本为 1.20.1,则执行以下命令: ```bash wget http://nginx.org/download/nginx-1.20.1.tar.gz tar -zxvf nginx-1.20.1.tar.gz cd nginx-1.20.1/ ``` 3. **配置编译选项** 添加自定义模块至编译参数中: ```bash ./configure --add-module=/path/to/ngx_http_proxy_connect_module make && sudo make install ``` 替换 `/path/to/ngx_http_proxy_connect_module` 为你实际克隆下来的模块目录位置。 #### 配置文件调整 编辑 Nginx 主配置文件(通常位于 `/etc/nginx/nginx.conf` 或安装路径下的 conf 文件夹),增加如下设置以允许 HTTP 和 HTTPS 流量通过代理转发: ```nginx http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent"'; access_log logs/access.log main; server { listen 8080; # 设置监听端口用于接收客户端请求 resolver 8.8.8.8 ipv6=off valid=30s; # DNS解析器, 可选其他公共DNS服务如114.114.114.114 location / { proxy_pass_request_headers on; # 对于非CONNECT类型的普通GET/POST等请求直接传递给目标站点 if ($request_method !~ ^(CONNECT|OPTIONS)$){ proxy_pass http://$host$request_uri; break; } # 处理HTTPS流量中的CONNECT指令 proxy_set_header Host $host; proxy_set_header Proxy ""; proxy_buffering off; proxy_store off; tcp_nodelay on; tcp_nopush on; set $target_host $host; set $target_port $arg_PORT; set $target_scheme ""; if ($request ~* "^CONNECT (.*)[:]([0-9]+)[ \t]*") { set $target_host $1; set $target_port $2; set $target_scheme https; } proxy_pass $target_scheme://$target_host:$target_port; } } } ``` 此段脚本实现了两个主要功能:一是常规网页浏览时正常抓取远程资源;二是当遇到 SSL/TLS 加密连接建立阶段发送过来的 CONNECT 命令时能够正确响应握手过程[^4]。 最后重启 Nginx 生效更改即可测试效果。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值