Nginx反向代理技巧

跨域

作为一个前端开发者来说不可避免的问题就是跨域,那什么是跨域呢?

跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。浏览器的同源策略是指协议,域名,端口都要相同,其中有一个不同都会产生跨域

那如何解决跨域问题呢。跟后端商量一下也是可以通过CORS解决跨域问题的。但是一生要强的前端崽儿也是可以自己解决的。

webpack-dev-server反向代理

webpack-dev-server帮我们解决了这个痛点,它基于Node代理中间件http-proxy-middleware实现。

配置:

proxy: {'/api': {target: 'https://xxx.com', // 反向代理的目标服务changeOrigin: true,  // 开启后会虚拟一个请求头OrigincookieDomainRewrite: {'.xxx.com': 'localhost',},  // 修改响应头中 cookie 中的域名}
}

什么是反向代理

简单的说就是A需要向C发送请求,但是C不认识A自然是不愿意的,但是A认识B,A向B发送请求,可是B也不会返回什么东西但是他认识可以返回请求C,那么B再次向C发送请求,C看在B的面子上给B返回请求了,B再给A返回请求。。。。

具体到开发中就是,前端需要向https://xxx.com这个域名调用接口,但是前端开发环境启动项目是https://localhost:8080服务,直接调用接口会跨域。

所以前端需要做一层代理。从https://localhost:8080直接请求到https://xxx.com域名的接口,这对于前端来说应该是无感知的。

2c863b4d2165cc038a8ba3720c9d4664.jpeg

反向代理隐藏了真实的服务端;

切换环境debug

问题来了,如果我们正在开发新需求,但是此时有线上bug,那我们怎么办呐?

  1. 首先切换分支

  2. 修改target的域名

  3. 重新启动

每次到了第二步的时候我还得问问可以在哪个环境复现,这套流程下来虽然也不复杂但是如果可以省略是不是想想就更开心了。

抽离代理层

如果可以,前端不再需要把前端编译过程和服务代理目标捆绑在一起。不妨使用Nginx试试呢。

  1. 安装Nginx

  2. 固定前端代理

proxy: {'/api': {target: '127.0.0.1:8080', // 固定IPchangeOrigin: true,  // 开启后会虚拟一个请求头OrigincookieDomainRewrite: {'.xxx.com': 'localhost',},  // 修改响应头中 cookie 中的域名}
}
  1. Nginx代理

server {listen       8080;   // 这里是我们想要默认访问的端口server_name  127.0.0.1;   //  这里是想在浏览器里访问的地址#charset koi8-r;#access_log  logs/host.access.log  main;location / {proxy_pass http://xxx.com;  //  这里是你在本地启动的时候的链接,例如localhost:4043,换个端口号就行了autoindex on;}
}

有了以上的配置,我们就可以将前端代理层和Nginx代理层解耦,前端固定通过本地127.0.0.1:8080访问后端接口,而具体接口是代理到开发环境、测试环境或是生产环境,由Nginx决定,只需要修改nginx.conf后重启即可。而Nginx热重启是非常快的,一条命令即可实现,几乎零等待时间。

// windows下是这个命令
nginx.exe -s reload
// linux是这样的
nginx -s reload

固定端口

如果端口被占用怎么办呢?

最简单的办法是换个端口,但是换端口修改Nginx配置文件比修改代理更复杂些,所以只能另辟蹊径。那有没有什么方法可以再次转一下ip或者端口呢。答案是修改hosts文件

127.0.0.1 www.jia.com

当用户访问www.jia.com时给解析到127.0.0.1这个IP。所以修改Nginx配置监听127.0.0.180端口

server {listen       80;   // 这里是我们想要默认访问的端口server_name  127.0.0.1;   //  这里是想在浏览器里访问的地址#charset koi8-r;#access_log  logs/host.access.log  main;location / {proxy_pass http://xxx.com;  //  这里是你在本地启动的时候的链接,例如localhost:4043,换个端口号就行了autoindex on;}
}

然后修改本地代理配置

proxy: {'/api': {target: 'www.jia.com', // 固定IPchangeOrigin: true,  // 开启后会虚拟一个请求头OrigincookieDomainRewrite: {'.xxx.com': 'localhost',},  // 修改响应头中 cookie 中的域名}
}

这样前端去访问接口域名https://xxx.com会被代理到https://www.jia.com,而https://www.jia.com被本地hosts解析到127.0.0.1,然后Nginx监听了127.0.0.180端口,请求转发到真实的后端服务!

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

972c1fbc907f45d29f33e6b30a6739f8.png

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

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

相关文章

2011-2021年数字普惠金融指数Bartik工具变量法(含原始数据和Bartik工具变量法代码)

2011-2021年数字普惠金融指数Bartik工具变量法(含原始数据和Bartik工具变量法代码) 1、时间:2011-2020(省级、城市),2014-2020(区县) 2、原始数据来源:北大金融研究中心…

VS2019生成的DLL,给QT(MinGW版本)使用的小结

VS2019端: a 基于生成一个DLL的工程(要注意生成是x86,还是x64的,需要和后面的QT的App工程对应),这里不多解释了,网上多的是; b 在cpp实现文件里,假如要导出一个这样的…

Git如何上传文件到github

Git下载网址: https://git-scm.com/downloads 1. 新建一个空文件夹,用来上传文件,第一次需创建,以后无需创建 2. 点进去空文件夹,鼠标右键,使用Git Bash Here 打开 3. 克隆远程仓库:git cl…

深入理解JVM——垃圾回收与内存分配机制详细讲解

所谓垃圾回收,也就是要回收已经“死了”的对象。 那我们如何判断哪些对象“存活”,哪些已经“死去”呢? 一、判断对象已死 1、引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加一&…

解决git reset --soft HEAD^撤销commit时报错

今天在使用git回退功能的时候,遇到以下错误: 解决git reset --soft HEAD^撤销commit时报错 问题: 在进行完commit后,想要撤销该commit,于是使用了git reset --soft HEAD^命令,但是出现如下报错&#xff1…

【学习心得】安装cuda/cudann和pytorch

一、查看驱动信息 # 进入CMD输入命令 nvidia-smi 也可以右下角图标打开NVIDIA 设置进行查看 二、下载安装CUDA 1、下载 下载地址 https://developer.nvidia.com/ 2、安装 推荐自定义安装。建议只勾选Cuda,只安装这一个就好,以免报错安装失败。 3、验证…

移动端直播相关技术总结

一、直播APP原理 二、直播APP架构 三、直播APP实现流程 四、流媒体开发 流媒体模块架构 流媒体相关基础知识 帧:每一帧代表一幅静止的图像 GOP:Group of Pictures,画面组,一个GOP就是一组连续的画面,很多帧的集合 码率…

BC136 KiKi去重整数并排序

给定一个整数序列,KiKi想把其中的重复的整数去掉,并将去重后的序列从小到大排序输出。 输入描述 第一行,输入一个整数n,表示序列有n个整数。 第二行输入n个整数(每个整数大于等于1,小于等于1000&#xf…

拉丁方设计资料的方差分析(SPSS版+SAS版)

拉丁方设计(Latin square design):实验研究中涉及一个处理因素和两个控制因素,每个因素的类别数或水平数相等,此时可采用拉丁方设计,将两个控制因素分别安排在拉丁方设计的行和列上。该设计类型仍为单因素方…

中电金信通过KCSP认证 云原生能力获权威认可

中电金信通过KCSP(Kubernetes Certified Service Provider)认证,正式成为CNCF(云原生计算基金会)官方认证的 Kubernetes 服务提供商。 Kubernetes是容器管理编排引擎,底层实现为容器技术,是云原…

ABAP 新语法--Data Processing

1. String Template 新语法引入了字符串模板,用于处理字符串连接以及格式转换 字符串模板在 | … | 之间定义,主要分为两部分,固定文本和变量 其中,变量只能在 { … } 内使用,大括号之外的所有字符均作为固定文本使用…

【Swagger】只需要三步,就可以让你的项目实现Swagger在线文档,实时浏览,修改展示

目录 1. pom.xml文件中添加Swagger的jar包 2. 配置Swagger 3. 项目启动中加入Swagger注解的开关,启动Swagger功能 4. 启动项目,查看效果 Swagger 的功能这里就不多说明了,相信大家都懂的,好奇多问一句,大家有知道其…

zookeeper安装配置采坑流程

安装 wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.2/apache-zookeeper-3.8.2-bin.tar.gz解压: tar -zxvf apache-zookeeper-3.8.2-bin.tar.gz如下 bin目录下文件是可执行文件 conf目录文件是配置文件 修改zoo.cfg(复制zoo_sample&#x…

从0搭建ECG深度学习网络

本篇博客介绍使用Python语言的深度学习网络,从零搭建一个ECG深度学习网络。 任务 本次入门的任务是,筛选出MIT-BIH数据集中注释为[‘N’, ‘A’, ‘V’, ‘L’, ‘R’]的数据作为本次数据集,然后按照8:2的比例划分为训练集&…

什么是DNS服务器的层次化和分布式?

DNS (Domain Name System) 的结构是层次化的,意味着它是由多个级别的服务器组成,每个级别负责不同的部分。以下是 DNS 结构的层次: 根域服务器(Root Servers): 这是 DNS 层次结构的最高级别。全球有13组根域…

【云原生】Docker 详解(二):Docker 架构及工作原理

Docker 详解(二):Docker 架构及工作原理 Docker 在运行时分为 Docker 引擎(服务端守护进程) 和 客户端工具,我们日常使用各种 docker 命令,其实就是在使用 客户端工具 与 Docker 引擎 进行交互。…

[oneAPI] 手写数字识别-LSTM

[oneAPI] 手写数字识别-LSTM 手写数字识别参数与包加载数据模型训练过程结果 oneAPI 比赛:https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517 Intel DevCloud for oneAPI:https://devcloud.intel.com/oneapi/get_started/aiAnalyticsToolk…

Curson 编辑器

Curson 汉化与vacode一样 Curson 自带chat功能 1、快捷键ctrlk(代码中编辑) 2、快捷键ctrll 右侧打开窗口

小程序项目组件的基本应用

宿主环境:程序运行必须依赖的环境 小程序的宿主环境 ---->手机微信(定位、扫码、支付等) 小程序的通信模型: 渲染层和逻辑层之间的通信(微信客户端转发)逻辑层和第三方服务器之间的通信(微信客户端转发) 小程序的运行机制: 启动&#xff1…

vue基础知识五:请描述下你对vue生命周期的理解?在created和mounted这两个生命周期中请求数据有什么区别呢?

一、生命周期是什么 生命周期(Life Cycle)的概念应用很广泛,特别是在政治、经济、环境、技术、社会等诸多领域经常出现,其基本涵义可以通俗地理解为“从摇篮到坟墓”(Cradle-to-Grave)的整个过程在Vue中实…