什么,NGINX无法正向代理HTTPS?

news/2024/10/29 18:51:05/

需求

内网的机器无法访问互联网,但是有些业务服务必须要上网,这个时候就需要一个正向代理,将正向代理部署在一台可以上网的机器,业务应用通过正向代理去访问互联网,同时使用正向代理控制上网策略和权限。

什么是正向代理?

正向代理就是客户端client知道服务器server的地址,也知道proxy的地址,但是client通过proxy,并且告诉proxy,我要访问server的地址,proxy将请求直接转发到server。正向代理最常见的应用是VPN,用来突破client到server的网络限制。

与之对应的就是反向代理,反向代理是client不知道server的地址,但知道proxy的地址,client请求proxy,proxy根据配置的规则转发给server,这里client是不知道具体server的地址,都是通过proxy里的规则进行转发。反向代理最常见的工具就是Nginx。

我现在需要在linux服务器上做正向代理,查了下可以用的工具Squid,Nginx。作为研发来说,Squid比较陌生,nginx那是经常打交道,那就用nginx来搭建了。(nginx是反向代理的代表,其实也可以用来做正向代理)

nginx_12">nginx搭建正向代理

简单介绍下nginx做正向代理的原理,在nginx的配置中加上 resolver 8.8.8.8,其他配置通用,就可以做正向代理了,而这个配置的作用是:指定固定的DNS服务器,而8.8.8.8是Google提供的全球DNS服务器。这样就可以把请求直接转到Google的DNS服务器,然后DNS直接转发出去。完整配置如下:

worker_processes  3;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 $request_body "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for" "$request_time"';access_log  /etc/nginx/logs/access.log  main;sendfile        on;server {listen 10080; # 代理监听的端口proxy_connect;server_name *.com;proxy_max_temp_file_size 0; resolver 8.8.8.8; # DNS 解析器,使用 Google 的公共 DNS# 处理所有 HTTP 请求location / {proxy_pass http://$http_host;proxy_set_header Host $http_host;proxy_ssl_server_name on;proxy_ssl_session_reuse off;proxy_next_upstream error timeout invalid_header http_502;proxy_buffer_size 4k; # 调整缓冲区大小proxy_buffers 4 8k;proxy_busy_buffers_size 16k;}   }
}

nginx运行起来之后,可以直接用curl进行测试代理是否正常,脚本如下:

curl --proxy "http://xx.xx.xx.xx:xx" 'http://www.baidu.com'

如无意外的情况下,可以得到正常返回了。但是我把http改成https之后,立马就返回400 bad request了。这时候可能以为是配置出问题了,其实是nginx代理并不支持https的正向代理转发,搞了半天,不支持https,有点扎心,那么nginx能否支持https的正向代理呢?答案是可以的。

github上有个大神,写了个ngx_http_proxy_connect_module(https://github.com/chobits/ngx_http_proxy_connect_module),用来解决nginx代理无法转发https的问题。可以参照文档内容将模块编译到nginx中。当然如果你觉得这样比较麻烦的话,有更简单的方法。我现在运维部署一些开源软件时,基本都是用docker去部署的,使用docker部署的好处我就不在这里赘述了。那现在我就介绍一下使用docker部署nginx的方式。

首先我们就是找一个已经编译了ngx_http_proxy_connect_module的nginx打包好的镜像,我用的是这个:https://github.com/reiz/nginx_proxy。部署就简单了,docker-compose文件如下

version: '2'
services:nginx:image: reiz/nginx_proxy:0.0.5container_name: proxy_nginxrestart: alwaysports:- '10080:10080'environment:- TZ=Asia/Shanghaivolumes:- ./nginx.conf:/usr/local/nginx/conf/nginx.conf- ./logs:/etc/nginx/logs

接下来是nginx.conf:

daemon off;
worker_processes  auto;events {worker_connections  1024;
}http {server_names_hash_bucket_size 128;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent $request_body "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for" "$request_time"';access_log  /etc/nginx/logs/access.log;error_log   /etc/nginx/logs/error.log;sendfile        on;keepalive_timeout 65;server {listen       10080;#server_name  *.com;proxy_connect;resolver 8.8.8.8 ipv6=off;location / {proxy_pass http://$http_host;proxy_set_header Host $http_host;}}
}

nginx.conf可以配置访问的地址和禁止访问的地址,及其他的配置,可以看作者的使用文档。

问题

Cannot assign requested address

在连续请求的时候,有一半的请求会报无法分配地址,这个问题还挺棘手,最后发现是ipv6的问题,要关闭ipv6才行,resolver 8.8.8.8 ipv6=off; 关闭了之后就没有出现这个问题。


http://www.ppmy.cn/news/1542895.html

相关文章

手写数据库连接池---C++11(上)

总览 项目背景 为了提高MySQL数据库(基于C/S设计)的访问瓶颈,除了在服务器端增加缓存服务器缓存常用的数据之外(例如redis),还可以增加连接池,来提高MySQL Server的访问效率,在高并…

字节青训-查找热点数据问题

问题描述 给你一个整数数组 nums 和一个整数 k&#xff0c;请你返回其中出现频率前 k 高的元素。请按升序排列。 1 < nums.length < 10^5k 的取值范围是 [1, 数组中不相同的元素的个数]题目数据保证答案唯一&#xff0c;换句话说&#xff0c;数组中前 k 个高频元素的集合…

高级java每日一道面试题-2024年10月22日-JVM篇-JVM堆栈概念,何时销毁对象?

如果有遗漏,评论区告诉我进行补充 面试官: JVM堆栈概念,何时销毁对象? 我回答: JVM堆栈概念 栈&#xff08;Stack&#xff09;&#xff1a; 定义&#xff1a;栈是Java虚拟机为每个线程分配的内存区域&#xff0c;用于存储线程执行时的局部变量、操作数栈、动态链接和方法返…

Uefi Application小游戏开发之猜箱子

小游戏之猜箱子 选择箱子个数 &#xff0c;交换次数 &#xff0c;交换速度等&#xff0c;将球丢入到一个箱子中&#xff0c;然后开始随机交换箱子&#xff0c;猜出球的位置 源代码如下&#xff1a; #include <Uefi.h> #include <Library/UefiLib.h> #include &…

pip 和 pipx 的主要区别?

特性pippipx用途用于安装Python库或命令行应用程序&#xff0c;可以安装带entry points的库专门用于安装和管理Python命令行工具&#xff0c;每个工具都在隔离的虚拟环境中运行虚拟环境不自动创建虚拟环境&#xff0c;需要手动使用 venv 或 virtualenv 创建自动为每个安装的工具…

PHP免杀详细讲解PHP免杀详细讲解

基础学习 可变参数 $_GET $_POST $_COOKIE $_REQUEST $_SERVER 其中的某些参数可控,如REQUESTMETHOD,QUERYSTRING,HTTPUSERAGENT等 session_id() 这个比较特殊,但是依然可以利用 $_FILE $GLOBALS getallheaders() get_defined_vars() get_defined_functions() fil…

无人机动态窗口路径规划算法!

一、算法原理 DWA算法将局部路径规划问题描述为速度矢量空间上的约束优化问题。它根据无人机的当前状态&#xff08;如位置、速度、加速度等&#xff09;和环境信息&#xff08;如障碍物位置、目标点位置等&#xff09;&#xff0c;在速度空间内采样多组线速度和角速度&#x…

MongoDB-Plus

MongoDB-Plus是一款功能强大的数据库工具&#xff0c;它基于MongoDB&#xff0c;提供了更丰富的功能和更便捷的操作方式。以下是一篇关于MongoDB-Plus轻松上手的详细指南&#xff0c;旨在帮助初学者快速掌握其安装、配置和基础操作。 一、MongoDB-Plus概述 MongoDB是一款由C编…