通过nginx将https协议反向代理到http协议请求上

通过nginx将https协议反向代理到http协议请求上

  • 1、问题背景
  • 2、介绍nginx的反向代理功能及配置https协议
  • 3、具体实现
    • 3.1 后端服务支持方式
    • 3.2 nginx重定向方式
  • 3.3、nginx的反向代理方式
  • 4、关于nginx常用模块和指令

1、问题背景

目前一个系统仅支持https协议访问,因后端服务基于ssl协议,前端在请求是也需要支持ssl协议的https请求来访问。目前的代理服务器是nginx,现在想要通过http访问系统,需通过nginx的反向代理或者重定向方式将https请求代理为http请求。可实现的做法有如下几种:

1、使后端开放两种端口,一个端口支持https协议访问,一个端口支持http协议访问,之后前端请求通过nginx代理,同时nginx也开放两个端口(比如80端口作为http访问,443端口作为https访问系统)。使不同协议走不同的后端服务

2、使用nginx的重定向功能,每次http请求过来后重定向为https请求

3、使用nginx的反向代理功能,将将https协议反向代理到http协议请求上

2、介绍nginx的反向代理功能及配置https协议

反向代理是一种服务器架构,它接收来自客户端的请求,然后将这些请求转发到一个或多个后端服务器,并将后端服务器的响应返回给客户端。
与正向代理的区别:

正向代理是客户端与代理服务器之间的一种代理模式。在正向代理中,客户端请求首先发送到代理服务器,然后由代理服务器转发请求给目标服务器。代理服务器代表客户端发送请求,目标服务器并不知道实际发出请求的客户端身份
反向代理是服务器与后端服务器之间的一种代理模式。在反向代理中,客户端请求首先发送到反向代理服务器,然后由反向代理服务器根据配置将请求转发给后端的一个或多个服务器。后端服务器的响应再由反向代理服务器返回给客户端。客户端不需要知道后端服务器的实际存在
反向代理就像商店的售货员,当你去商店购物时,你与售货员打交道,但实际上商品是从后面的仓库取出来的。售货员帮你获取商品,然后交给你。在这个比喻中,售货员就是反向代理,仓库就是后端服务器,你则是客户端。

nginx配置https请求,主要是如下方式,且通过location指令将请求代理都后端的https接口上

server {listen 443 ssl;server_name example.com www.example.com;ssl_certificate /path/to/ssl/certificate.crt;ssl_certificate_key /path/to/ssl/private.key;location / {# 处理HTTPS请求的配置proxy_pass https://backend_server;}
}

3、具体实现

3.1 后端服务支持方式

springboot应用中,可以通过配置文件方式配置开启端口,但是协议只能指定一个,如下:通过application.yml的server属性可以配置一个https协议访问的应用端口
在这里插入图片描述
如果想要再次打开一个端口支持http请求,需要根据使用的后端服务器编写配置类,当前项目使用的是Jeety服务器,配置类代码如下:

import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class HttpConfig {@Beanpublic WebServerFactoryCustomizer<JettyServletWebServerFactory> servletContainer() {return server -> {server.setPort(8081); // 这里配置 HTTP 端口为 8081,也可以通过加配置文件方式获取};}
}

这时候启动项目,会同时开放两个端口,之后通过nginx代理即可。

3.2 nginx重定向方式

配置 Nginx 以监听 HTTP(80)和 HTTPS(443)端口: 在 Nginx 配置中创建一个服务器块,分别监听 HTTP 和 HTTPS 端口。
配置如下:

server {listen 80;server_name yourdomain.com www.yourdomain.com;location / {return 301 https://$host$request_uri;  # 将 HTTP 请求重定向到 HTTPS}
}server {listen 443 ssl;server_name yourdomain.com www.yourdomain.com;ssl_certificate /path/to/ssl/certificate.crt;ssl_certificate_key /path/to/ssl/private.key;# 这里可以添加其他 HTTPS 相关的配置
}

return: 这是 Nginx 的一个指令,用于生成 HTTP 响应。
301: 这是 HTTP 状态码,表示永久重定向。当浏览器或客户端收到这个状态码时,它会知道请求的 URL 已永久性地移动到新的位置,因此应该更新书签或缓存。
https://$ host $ request_uri: 这是重定向的目标 URL。$ host 是 Nginx 内置变量,代表用户请求的主机名。$request_uri 也是一个内置变量,代表用户请求的 URI(包括查询参数)。这部分指定了用户将被重定向到的 HTTPS 版本的 URL,包括相同的主机名和请求路径。

之后通过重新加载 Nginx 配置: 保存配置文件并重新加载 Nginx,以使更改生效。命令如下:

sudo ./nginx -s reload

遇到问题:通过这种方式,真正请求还是会发到https协议下,而且浏览器访问http时候会被重定向为https。也就是只能做到http访问后被转换为https协议,无法真正使用http请求访问。
在这里插入图片描述
真实结果是被301重定向:
在这里插入图片描述

3.3、nginx的反向代理方式

将 HTTP 请求代理到 HTTPS,而不执行重定向,可以在 HTTP 的服务器块中使用代理,这个配置将 HTTP 请求代理到 HTTPS,而不执行重定向。这意味着浏览器仍然发送 HTTP 请求,但 Nginx 将它们代理到相同域名的 HTTPS 端口,然后将响应返回给浏览器。并且仍然会在内部使用 HTTPS 连接,因此数据仍然会通过加密传输。如下所示:

# 配置 HTTP 服务器块,监听 HTTP 请求并代理到 HTTPS
server {listen 80;server_name yourfrontenddomain.com;  # 指定前端域名location / {proxy_pass https://yourdomain.com;  # 将 HTTP 请求代理到 HTTPSadd_header 'Access-Control-Allow-Origin' 'http://yourfrontenddomain.com';  # 允许跨域请求来自指定域名add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';  # 允许的 HTTP 方法add_header 'Access-Control-Allow-Headers' 'Authorization, Origin, X-Requested-With, Content-Type, Accept';  # 允许的请求头#代理后保证cookie传递proxy_cookie_path / /;# 启用WebSocket支持proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}
}# 配置 HTTPS 服务器块,用于 HTTPS 请求
server {listen 443 ssl;server_name yourdomain.com www.yourdomain.com;  # 指定后端域名和可能的 www 子域名ssl_certificate /path/to/ssl/certificate.crt;  # 指定 SSL 证书的路径ssl_certificate_key /path/to/ssl/private.key;  # 指定 SSL 私钥的路径# 这里可以添加其他 HTTPS 相关的配置,如 SSL 版本、密码套件等
}

通过nginx的http代理https请求中,如果发生了cookie无法传递,或者其他跨域错误,可能还需要具体分析问题,但是目前这样是可行的。
http访问结果如下:
在这里插入图片描述
https访问结果如下:
在这里插入图片描述
且后边的静态资源、后端接口通过http和https两种协议访问都正常。

4、关于nginx常用模块和指令

Core 模块:
http: 定义 HTTP 协议相关配置。
events: 配置事件驱动模型,如 epoll 和 kqueue。
server: 配置虚拟主机和服务器块。
location: 配置请求的位置和 URI 匹配规则。

Http 模块:
access: 控制请求的访问权限。
gzip: 启用 Gzip 压缩以减小传输数据的大小。
ssl: 配置 SSL/TLS 相关设置,用于启用 HTTPS。
rewrite: 重写 URL,可以用于 URL 重定向和重写。
Upstream 模块:

Security 模块:
http_auth_basic: 启用 HTTP 基本认证。
http_limit_req: 限制请求速率,用于防止 DDoS 攻击。
http_limit_conn: 限制并发连接数,保护服务器免受连接过载攻击。

Logging 模块:
access_log: 配置访问日志的格式和路径。
error_log: 配置错误日志的格式和路径。

Mail 模块:
mail: 支持邮件代理服务器功能,可用于配置电子邮件服务器。
imap: 支持 IMAP 协议。
smtp: 支持 SMTP 协议。

Third-party 模块:
ngx_http_geoip_module: 提供地理位置信息,可用于区域限制和定位用户。
ngx_pagespeed: 自动优化 Web 页面,提高性能。
ngx_lua: 提供 Lua 脚本支持,可用于高级定制和扩展功能。
ngx_cache_purge: 提供缓存清除功能,用于手动清除代理缓存。

Stream 模块:用于 TCP 和 UDP 代理,支持负载均衡。
stream: 配置 TCP/UDP 代理服务器。
upstream: 配置后端服务器池。
proxy: 配置反向代理设置。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/122285.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux安装java环境】超简单,以jdk8为例

文章目录 前言详细步骤总结 前言 一些小伙伴在到手一台虚拟机后&#xff0c;发现需要配置java环境&#xff0c;看了文章后会发现超级简单&#xff0c;以下内容以安装jdk1.8为例。 详细步骤 查看是否存在java环境java -version若弹出找不到java命令&#xff0c;执行下一步。官…

linux并发服务器 —— IO多路复用(八)

半关闭、端口复用 半关闭只能实现数据单方向的传输&#xff1b;当TCP 接中A向 B 发送 FIN 请求关闭&#xff0c;另一端 B 回应ACK 之后 (A 端进入 FIN_WAIT_2 状态)&#xff0c;并没有立即发送 FIN 给 A&#xff0c;A 方处于半连接状态 (半开关)&#xff0c;此时 A 可以接收 B…

Java逻辑控制

目录 一、顺序结构 二、分支结构 1、if语句 &#xff08;1&#xff09; 语法格式1​编辑 &#xff08;2&#xff09;语法格式2​编辑 &#xff08;3&#xff09;语法格式3 2、switch 语句 三、循环结构 1、while循环 2、break 3、continue 4、for 循环 5、do whil…

实训笔记9.1

实训笔记9.1 9.1笔记一、项目开发流程一共分为七个阶段1.1 数据产生阶段1.2 数据采集存储阶段1.3 数据清洗预处理阶段1.4 数据统计分析阶段1.5 数据迁移导出阶段1.6 数据可视化阶段 二、项目的数据产生阶段三、项目的数据采集存储阶段四、项目数据清洗预处理的实现4.1 清洗预处…

MongoDB基础知识点

MongoDB基础知识点 1.MongoDB简介1.1基本信息1.2作用1.3下载 2.MongoDB安装1.Ubuntu22.042.Windows(非msi) 3.MongoDB基本操作1.基本概念2.MongoDB文件增删改查(CURD)1.插入数据2.查询数据3.修改数据4.删除数据5.删除字段 4.MongoDB实战管理系统数据库设计1.设计数据库2.Mongod…

企业架构LNMP学习笔记13

上线商城项目&#xff1a; 1&#xff09;上传项目文件到数据库&#xff1a; 入口文件位置的设计是为了让应用部署更安全&#xff0c;public目录为web可访问目录&#xff0c;其他的文件都可以放到非web访问目录下面。 nginx 默认访问index.html。没有index.html&#xff0c;就会…

宠物电商Chewy第二季度销售额28亿美元,同比增长14.3%

美国宠物电商Chewy公布2023年第二季度财报。报告显示&#xff0c;其Q2季度销售额同比增长14.3%至28亿美元&#xff0c;超出市场预期。 以下为Chewy期内业绩概要&#xff1a; 1.毛利率28.3%&#xff0c;同比增长20个基点 2.净利润有所收窄&#xff0c;同比下降15.2%至1890万美…

【深入解析spring cloud gateway】06 gateway源码简要分析

上一节做了一个很简单的示例&#xff0c;微服务通过注册到eureka上&#xff0c;然后网关通过服务发现访问到对应的微服务。本节将简单地对整个gateway请求转发过程做一个简单的分析。 一、核心流程 主要流程&#xff1a; Gateway Client向 Spring Cloud Gateway 发送请求请求…

客服部门都应该建立一个自有的在线FAQ系统

问答系统是目前应用最广泛的问答系统。这种问答系统的结构框架明了、实现简单、容易理解&#xff0c;非常适合作为问答系统入门学习时的观察对象。所以越来越多的企业需要建立一个自有的在线FAQ系统&#xff0c;这对对于客服部门来说是非常有益的。 企业需要搭建自己FAQ系统的理…

【Linux】Ubuntu20.04版本配置pytorch环境2023.09.05【教程】

【Linux】Ubuntu20.04版本配置pytorch环境2023.09.05【教程】 文章目录 【Linux】Ubuntu20.04版本配置pytorch环境2023.09.05【教程】一、安装Anaconda虚拟环境管理器二、创建虚拟环境并激活三、安装Pytorch四、测试pytorchReference 一、安装Anaconda虚拟环境管理器 首先进入…

LeetCode(力扣)216. 组合总和 IIIPython

LeetCode216. 组合总和 III 题目链接代码 题目链接 https://leetcode.cn/problems/combination-sum-iii/ 代码 class Solution:def combinationSum3(self, k: int, n: int) -> List[List[int]]:result[]self.backtracking(n, k, 0, 1, [], result)return resultdef back…

多个pdf怎么合并在一起?跟着我的步骤一起合并

多个pdf怎么合并在一起&#xff1f;利用PDF文档合并功能可以帮助您更有效地管理文件&#xff0c;将多个相关文件整合成一个文件&#xff0c;避免分散在多个文件中。此外&#xff0c;合并后的文件更便于共享和传输&#xff0c;因为只需共享一个文件而不是多个文件。虽然合并文件…

900. RLE 迭代器

900. RLE 迭代器 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 900. RLE 迭代器 https://leetcode.cn/problems/rle-iterator/description/ 完成情况&#xff1a; 解题思路&#xff1a; //int next(int n) 以这…

git: ‘lfs‘ is not a git command unclear

首先可以尝试 git lfs install 是否可以&#xff0c;不可以后就看这个连接&#xff1a;https://stackoverflow.com/questions/48734119/git-lfs-is-not-a-git-command-unclear。 我的是ubuntu&#xff0c;所以&#xff1a; git-lfs requires git version 1.8.3.1 or later. Yo…

webpack打包

文章目录 一、什么是webpack二、使用步骤1.创建一个新的文件夹,并将其初始化2.在当前目录下安装webpack以及webpack-cli3.配置webpack自定义命令,使之生效4.运行自定义命令,打包webpack5.打包成功之后会将内容打包到dist文件夹下6.配置webpack1)修改webpack打包入口和出口2)配置…

pip install mysqlclient报错

安装mysqlclient时报错 先查看安装的python版本 python -V 根据版本下载下载对应的 mysqlclient 文件 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclienthttps://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient 我的是3.7版本的 就下载3.7版本&#xff0c;64位系…

自然语言处理(八):预训练BERT

来自Transformers的双向编码器表示&#xff08;BERT&#xff09; BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种预训练的自然语言处理模型&#xff0c;由Google于2018年提出。它是基于Transformer模型架构的深度双向&#xff0…

CSS中如何实现文字跑马灯效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 跑马灯⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋…

Cocos独立游戏开发框架中的日志模块:Bug无所遁形

引言 本系列是《8年主程手把手打造Cocos独立游戏开发框架》&#xff0c;欢迎大家关注分享收藏订阅。 在Cocos独立游戏开发框架中&#xff0c;一个强大的日志模块是不可或缺的组成部分。日志不仅仅是记录应用程序的运行状态&#xff0c;还可以用于故障排除、性能监测和安全审计…

Golang-GJSON 快速而简单的方法来从 json 文档获取值

GJSON 是一个 Go 包&#xff0c;它提供了一种快速而简单的方法来从 json 文档获取值。它具有单行搜索、点符号路径、迭代和解析 json 行等功能。 GJSON 也可用于Python和Rust 入门 安装中 要开始使用GJSON 请安装 Go 并运行 go get &#xff1a; $ go get -u github.com/ti…