Nginx反向代理技巧

news/2024/10/23 9:25:25/

跨域

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

跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对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.ppmy.cn/news/1038662.html

相关文章

​亚马逊推出新运输服务,配送时效最长达5天!

亚马逊2023假日高峰期配送费用出炉! 亚马逊美国站发布公告称亚马逊配送(FBA)的年度假日高峰配送费将于2023年10月15日至2024年1月14日期间适用,亚马逊的平均配送费仍然比其他主要第三方物流提供商的较慢标准运输方式便宜30%,以下是公告内容&…

Oracle/PL/SQL奇技淫巧之Json转表

在Oracle中,有些时候我们需要在一个json文档中查数据 这个时候我们可以通过JSON_TABLE函数来把 json文档 提取成一张可以执行正常查询操作的表 先看JSON_TABLE函数的基础用法: JSON_TABLE(json_data, $.json_path COLUMNS (column_definitions))其中&a…

打造专属照片分享平台:快速上手Piwigo网页搭建

文章目录 通过cpolar分享本地电脑上有趣的照片:部署piwigo网页前言1.Piwigo2. 使用phpstudy网页运行3. 创建网站4. 开始安装Piwogo 总结 🍀小结🍀 🎉博客主页:小智_x0___0x_ 🎉欢迎关注:&#x…

学习Vue:组件生命周期

在Vue.js中,组件的生命周期是指组件从创建到销毁的整个过程,而生命周期钩子函数则是在不同阶段执行的函数,允许您在特定时间点添加自定义逻辑。本文将详细介绍组件的生命周期以及常用的生命周期钩子函数。 组件的生命周期 组件的生命周期可以…

安装nodejs

1.下载nodejs的压缩包 https://nodejs.org/download/release/latest-v16.x/ 这个是v16版本的,可以根据自己需求下载对应的版本: https://nodejs.org/download/release/ 2.解压,将nodejs放到固定的路径下 注意:不要包含中文路径 3.…

【Apollo】Apollo 8.0系统下载指南

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

HTML基础 知识点总结

从这篇笔记开始总结看过的《从0到1 HTMLCSSJavaScript》书籍笔记,记录HTML以及CSS的相关知识点,为之后从事相关工作打好基础 简单介绍 基本标签文本列表表格 一.简单介绍 HTML:超文本标记语言,HTML是一门描述性的标记语言CSS&a…

Redis缓存!

一些基础芝士 将MySQL的热点数据存储在Redis中,通常业务都满足二八原则,80%的流量在20%的热点数据之上,所以缓存是可以很大程度提升系统的吞吐量。 一般而言, 缓存分为服务器端缓存,和客户端缓存 服务器端缓存即服务…