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

ops/2024/10/31 1:26:24/

需求

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

什么是正向代理?

正向代理就是客户端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/ops/129381.html

相关文章

redis修改配置文件配置密码开启远程访问后台运行

编辑 Redis 配置文件 编辑 /etc/redis/redis.conf,设置必要的参数。 sudo vim /etc/redis/redis.conf设置后台运行: 找到以下行,将 no 改为 yes: daemonize yes设置密码: 找到以下行,取消注释并设置密码为…

回顾复习1:

1. Json——API: json grpjson; //json.[key]val; grpjson["id"] group.getId(); grpjson["groupname"] group.getName(); grpjson["groupdesc"] group.getDesc();vector<string> userV; grpjson["users"] userV; //序列化…

Oracle 第5章:表与数据操作

在Oracle数据库中&#xff0c;创建表、插入数据、更新数据以及删除数据是基本的数据管理任务。下面我将逐一介绍这些操作&#xff0c;并提供相应的SQL语句示例。 创建表 创建一个表需要使用CREATE TABLE语句来定义表的结构&#xff0c;包括列名、数据类型等。以下是一个创建名…

Python实现图像(边缘)锐化:梯度锐化、Roberts 算子、Laplace算子、Sobel算子的详细方法

目录 Python实现图像&#xff08;边缘&#xff09;锐化&#xff1a;梯度锐化、Roberts算子、Laplace算子、Sobel算子的详细方法引言一、图像锐化的基本原理1.1 什么是图像锐化&#xff1f;1.2 边缘检测的基本概念 二、常用的图像锐化算法2.1 梯度锐化2.1.1 实现步骤 2.2 Robert…

用STM32硬件思维学JAVA--23种设计模式

系列文章目录 1.【软考之软件设计师】PPT课件 2.【软考之软件设计师】学习笔记 3.【软考之软件设计师】上午题—信管网(每天更新) 4.【软考之软件设计师】上午题—希赛网(每天更新) 5.【软件设计师真题】下午题第一大题—数据流图设计

Python实现全国岗位招聘信息可视化分析(源码+论文+部署讲解)

项目源码&数据源获取 利用Python实现全国岗位招聘信息可视化分析 项目背景&#xff1a; 1.为企业招聘决策提供科学的依据和参考&#xff0c;可以帮助人力资源部门、招聘机构和求职者了解当前的就业形势、行业趋势和人才需求&#xff0c;从而做出更明智的招聘和求职决策。…

整合全文检索引擎 Lucene 添加站内搜索子模块

整合全文检索引擎 Lucene: 添加站内搜索子模块 1. 什么是 Lucene ? 有啥优势&#xff1f; Lucene 是一个开源的全文检索引擎库&#xff0c;由 Apache 基金会维护&#xff0c;官网地址&#xff1a;https://lucene.apache.org/ 。它提供了丰富的文本处理和搜索功能&#xff0c…

一文掌握Kubernates核心组件,构建智能容器管理集群

1.Kubernates简要概述 Kubernates&#xff08;常称为K8s&#xff0c;因省略了“ubernate”中的8个字符&#xff09;是Google开源的容器编排平台&#xff0c;专为简化和自动化应用服务的部署、扩展和管理而设计。它将应用与底层的服务器抽象开来&#xff0c;提供了自动化的机制…