一、问题引入

本地开发遇到线上bug,debug得stash代码切换分支,同时需切换开发环境与生产环境服务,npm run serve 或 npm start 费时

二、webpack-dev-server反向代理

webpack-dev-server 可以解决跨域,它基于Node代理中间件 http-proxy-middleware

配置如下

proxy: {
// 需要代理的url规则
"/api": {
target: "https://dev.xxx.tech", // 反向代理的目标服务
changeOrigin: true, // 开启后会虚拟一个请求头Origin
pathRewrite: {
"^/api": "" // 重写url,一般都用得到
}
}
}

补充:反向代理隐藏了真实的服务端;相反地,正向代理隐藏了真实的客户端

三、Nginx代理

1.下载Nginx

下载Nginx,选择Windows稳定版即可。

2.固定前端代理

为了避免在debug线上问题时需要切换 proxy target 而重新运行 npm start,我们在前端层把 proxy target 固定下来。比如我固定访问 127.0.0.1:8090(当然,实际上访问哪个端口可以视个人情况调整)。

proxy: {
"/api": {
target: "127.0.0.1:8090", // 固定代理目标
changeOrigin: true,
pathRewrite: {
"^/api": ""
}
}
}

3.Nginx代理

由于前端的接口访问已经固定为 127.0.0.1:8090,我们只要在 Nginx 中监听本地 8090 端口,把请求统统转发给目标服务器即可,配置如下

server {
listen 8090;
server_name 127.0.0.1; location / {
proxy_pass https://dev.xxx.tech;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

可以看到,在配置中注释了X-Real-IP,而在生产环境下配置 Nginx 时,一般会保留这几项Host,X-Real-IP,X-Forwarded-For,用以保留请求的服务器域名,原始客户端和代理服务器的IP等信息。

如果不注释X-Real-IP,前端访问入口的真实IP是 127.0.0.1 或 localhost,Nginx不认可这样的本地ip,直接返回404,客户端请求不予代理到其他远程服务器(这里没找到原因)。

有了以上的配置,我们就可以将前端代理层和Nginx代理层解耦,前端固定通过本地 127.0.0.1:8090 访问后端接口,而具体接口是代理到开发环境、测试环境或是生产环境,由Nginx决定,只需要修改 nginx.conf 后重启即可。

而Nginx热重启是非常快的,一条命令即可实现,几乎零等待时间。

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

四、本地域名

杜绝 ip 被占用这种情况,可以引入本地域名。

域名是通过解析后才能得到真实的服务IP。而域名解析过程中也有这么一些关键节点。

  • 浏览器缓存
  • 操作系统hosts文件
  • Local DNS
  • Root DNS
  • gTLD Server

借用网上一张图说明下大致流程(侵删)

首先,我们找到 C:\Windows\System32\drivers\etc\hosts 这个文件,打开后在最后新增一条解析记录

127.0.0.1 www.devtest.com

然后保存这个文件,保存hosts文件时需要administrator权限。

这就相当于告诉本地操作系统,如果用户访问 www.devtest.com,我就给他解析到 127.0.0.1 这个ip

所以,我们在Nginx只要监听 127.0.0.1 的 80 端口即可,配置如下

server {
listen 80;
server_name 127.0.0.1; location / {
proxy_pass https://dev.xxx.tech;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

最后,我们只要在前端工程中把代理目标设置为 www.devtest.com即可。

proxy: {
"/api": {
target: "http://www.devtest.com", // 固定代理目标
changeOrigin: true,
pathRewrite: {
"^/api": ""
}
}
}

这样前端访问的某接口 http://localhost:8080/api/user/login 就会被代理到 http://www.devtest.com/user/login,而 www.devtest.com 被本地 hosts 文件解析到127.0.0.1,接着Nginx监听了127.0.0.1 的 80 端口,将请求转发到真实的后端服务。

前端本地 Nginx 反向代理的更多相关文章

  1. 前端通过Nginx反向代理解决跨域问题

    在前面写的一篇文章SpringMVC 跨域,我们探讨了什么是跨域问题以及SpringMVC怎么解决跨域问题,解决方式主要有如下三种方式: JSONP CORS WebSocket 可是这几种方式都是基 ...

  2. 前端使用 Nginx 反向代理彻底解决跨域问题

    引入网址https://blog.csdn.net/larger5/article/details/81286324 1.请求后端数据失败 代码: <!DOCTYPE html> < ...

  3. nginx反向代理-解决前端跨域问题

    1.定义 跨域是指a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源.注意:跨域限制访 ...

  4. 项目部署问题:xftp无法连接服务器、Nginx403 Forbidden解决、nginx反向代理解决前端跨域问题

    一.xftp无法连接服务器 在xftp中配置正确的ip,用户名和密码后,居然无法连接 解决方案:将协议里面的FTP换成SFTP,注意换成SFTP后端口就默认换成22,要还是原来的21就还是连不上的哈 ...

  5. 前端解决跨域问题的终极武器——Nginx反向代理

    提到代理,分为:正向代理和反向代理. 正向代理:就是你访问不了Google,但是国外有个VPN可以访问Google,你访问VPN后叫它访问Google,然后把数据传给你. 正向代理隐藏了真实的客户端. ...

  6. 谁说前端不需要懂-Nginx反向代理与负载均衡

    转:https://juejin.im/post/5b01336af265da0b8a67e5c9 学到老活到老 前端圈一直很新,一直要不停的学习,而且在进入大厂的路上,还要求熟悉一门后台语言等等.用 ...

  7. 前端跨域实现的几种方式?及使用Nginx反向代理配置。

    早期为了防止CSRF(跨域请求伪造)的攻击,浏览器引入了同源策略(SOP)来提高安全性.而所谓"同源策略",即同域名(domain或ip).同端口.同协议的才能互相获取资源,而不能 ...

  8. 利用 Nginx 反向代理搭建本地 yum 服务器

    在政府,医院等单位有网络安全要求,对内外网进行物理隔离,然而内网主机无法访问互联网下载安装包,通过Nginx 反向代理搭建本地yum服务器实现内网主机安装包下载. Centos 8.2 部署 Ngin ...

  9. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

  10. Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

随机推荐

  1. andriod升级保错问题归类

    https://developer.aliyun.com/article/1116339 https://www.jianshu.com/p/5d9c790ab958 https://blog.51c ...

  2. (03-14) synopsys中工具介绍,VCS,DC,PT等

    https://blog.csdn.net/fangxiangeng/article/details/80981536 (1)Nlint 检查,spyglass (2)PT 静态时序检查 (3)Icc ...

  3. 工作频率运行在3.0 ~ 4.5 GHz的高效率GaAs HBT MMIC驱动放大器-CBG9326

    国内使用UWB高精度室内定位的行业应用产品,工作频段大部分都在3.5Ghz-6GHz低频段(Channel 2(特定场景如管隧矿)和Channel 5)范围,因此只能应用于煤矿.监狱等封闭的小众市场. ...

  4. Springboot打包部署的步骤

    1.配置pom.xml 引入插件 <groupId>com.bostech</groupId> <artifactId>dcs</artifactId> ...

  5. ncnn 加载 bin文件时,出错 报异常 0xC0000094:Integer division by zero。

    这次转yolov8.pt 到 onnx 到 ncnn,调用ncnn,加载bin文件时出错报异常 0xC0000094:Integer division by zero. 解决方式: 导出onnx时,加 ...

  6. 生成19位long型唯一数字id

    /** * 生成19位long型唯一数字id * @return */ public static long GetLong19UUID() { // String nanoRandom = Syst ...

  7. 央行DR007在哪里查看

    1.中国外汇交易中心,点击官网进入 https://www.chinamoney.com.cn/chinese/ 2.点击数据选项,接着选择货币市场行情 3.点击质押式回购

  8. GraalVM, Native Image, Java on Truffle, LLVM runtime, WebAssembly, JavaScript and Node.js关系是什么

    GraalVM, Java on Truffle, LLVM runtime, WebAssembly, JavaScript and Node.js关系是什么 GraalVM是一个JDK发行版,支持 ...

  9. ERA-Interim 的变量TCW和VIWV可降水量

    可降水量(Precipitable water) 气象上有一个名词"可降水量"(Precipitable water),可以用来衡量大气的水含量. 其公式为 \(W=\frac{1 ...

  10. bladex 通用日志不入库,日志无法使用

    公司最近要记录操作日志,然后用的是bladex脚手架.想起来刚好有自带的日志管理功能,然后就很happy的将日志功能授权给了管理员. 也就是那几个通用日志.接口日志.错误日志. 结果人傻了,根本不会记 ...