Nginx反向代理技巧

Nginx反向代理技巧

跨域

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

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

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

webpack-dev-server反向代理

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

配置:

proxy: {
  '/api': {
    target: 'https://xxx.com'// 反向代理的目标服务
    changeOrigin: true,  // 开启后会虚拟一个请求头Origin
    cookieDomainRewrite: {
      '.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域名的接口,这对于前端来说应该是无感知的。

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

切换环境debug

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

  1. 首先切换分支
  2. 修改target的域名
  3. 重新启动

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

抽离代理层

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

  1. 安装Nginx
  2. 固定前端代理
proxy: {
  '/api': {
    target: '127.0.0.1:8080'// 固定IP
    changeOrigin: true,  // 开启后会虚拟一个请求头Origin
    cookieDomainRewrite: {
      '.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'// 固定IP
    changeOrigin: true,  // 开启后会虚拟一个请求头Origin
    cookieDomainRewrite: {
      '.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端口,请求转发到真实的后端服务!

全部评论

相关推荐

1.请简单介绍一下你最近做的项目,或者你认为最有挑战性的一个中型项目你在其中主要扮演的角色和解决的关键技术问题是什么?2.在你的项目中,你使用了哪个前端框架(Vue/React)?请谈谈你对该框架(例如:Vue3的Composition API或 React Hooks)核心思想和工作原理的理解。3.请详细解释一下虚拟 DOM(Virtual DOM)的工作原理从数据变更到最终渲染到屏幕,整个过程经历了哪几个关键步骤?鈎脬蕁翌嘗試涌伫跪嬪帐来的性能优势主要体现在哪里?4.JavaScript 中,var、let 和 const 在作用域、提升(Hoisting)和重复声明方面有什么本质区别?请说明一下暂存死区(Temporal Dead Zone)。5.请简述一下闭包(Closure)的原理和常见的应用场景。闭包可能带来什么副作用?如何避免?6.Promise 的原理是什么?请解释一下 Promise.all()和 Promise.race()的区别晥件以及它们是如何处理链式调用中的错误捕获的?7.解释一下 HTTP 状态码 304 的作用以及浏览器是如何判断资源是否需要发送 304 状态码的?请描述一下常见的缓存策略(强制缓存与协商缓存)。8.请解释一下 BFC (块级格式化上下文) 的原理及其常见应用场景。9.你如何理解前端工程化?10.请写出一段代码,实现一个简单的数组去重函数,要求不使用 Set,并说明其时间复杂度
查看10道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务