一、问题引入

本地开发遇到线上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. 虚拟机redis无法连接

    1.cp redis.conf /etc/ 2.vi /etc/redis.conf 3.设置 Redis 可以后台运行 daemonize yes 4.关闭 redis 保护模式,使得可以远程连接 ...

  2. RabbitMQ管理界面使用之手动送数据

    目录 1. 找到相应的队列, 点击进入详情 2. 找到Publish Message项,填写自定义数据 3. 发送数据 4. 发送成功 5. 接收 1. 找到相应的队列, 点击进入详情 2. 找到Pu ...

  3. 设置NTP校时

    设置NTP校时-作为客户端 @echo off rem 以管理员身份执行文件 rem 适用于域控PDC主机,对于未加域的计算机可直接使用Internet时间同步 rem 获取管理员权限 %1 msht ...

  4. my tools in windows

    Q-Dir the Quad Explorerhttp://www.q-dir.com/ NetSpeed Monitor - Network Speed Monitor for Windows 10 ...

  5. java使用MVC编程模型实现1+到100图形界面

    MVC概念 MVC编程模型是可以说从提出到现在经久不败,是一种先进的设计结构.能很好的体现个人分工,从而实现前后端分离. M(Model):模型:存储数据的对象.后端操作数据库的. V(View):视 ...

  6. 解决: 无法打开明确指定的数据库“SSISDB”, 用户 'NT Service\SSISScaleOutMaster150' 登录失败.

    环境: WindowsServer2019Datacenter  SQL Server2019  SSMSv18 事情: SQL安装完成后, 发现系统日志中有如下报错:   解决: 无法打开明确指定的 ...

  7. zerotier的planet服务器(根服务器)-搭建教程

    应用场景介绍: 利用阿里云服务器,搭建根服务器,把不同局域网打通,实现内网穿透,远程控制. 准备工具:  1.服务端:云服务器(有公网IP)Centos 7.6 2.客户端:   工控机(或者家里电脑 ...

  8. springboot配置文件中的基本配置

    #应用启动端口设置server.port=9088#=================================微信相关====================================# ...

  9. Win10家庭版安装docker desktop

    1.开启Hyper-V在桌面新建hyperv.cmd文件,内容如下: pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*H ...

  10. ResponseUtil 请求返回

    package com.infosec.sso.common; import java.io.IOException; import java.util.HashMap; import java.ut ...