Nginx接口服务反向代理

1,327 阅读4分钟

首先聊聊正向代理和反向代理的区别

正向代理 先搭建一个属于自己的代理服务器

  • 用户发送请求到自己的代理服务器

  • 自己的代理服务器发送请求到服务器

  • 服务器将数据返回到自己的代理服务器

  • 自己的代理服务器再将数据返回给用户

  • 作用:正向代理隐藏了用户,用户的请求被代理服务器接收代替,到了服务器,服务器并不知道用户是谁。

  • 用途:当你用浏览器访问国外的网站时,被block(拒绝)时,你可以在国外搭建一个代理服务器,这样就可以正常访问了(只是举一个列子)

反向代理

  • 用户发送请求到服务器(访问的其实是反向代理服务器,但用户不知道)

  • 反向代理服务器发送请求到真正的服务器

  • 真正的服务器将数据返回给反向代理服务器

  • 反向代理服务器再将数据返回给用户

  • 作用:用户请求过多,服务器会有一个处理的极限。所以使用反向代理服务器接受请求,再用均衡负载将请求分布给多个真实的服务器。既能提高效率还有一定的安全性。

  • 用途:如果不采用代理,用户的IP、端口号直接暴露在Internet(尽管地址转换NAT),外部主机依然可以根据IP、端口号来开采主机安全漏洞,所以在企业网,一般都是采用代理服务器访问互联网。

原理

同源策略本质上是浏览器拦截了响应信息,也就是说即使跨域了,请求依旧能正常发出去,服务器也能正常作出响应,只是响应会被浏览器拦截,所以同源策略是在浏览器和服务器之间生效,而服务器和服务器之间则没有同源策略这一说

代理解决跨域问题的思路是:让发送出去的请求代理成是本域的

Nginx接口服务反向代理基本配置

server {
    listen 8443; # 监听的端口号
    server_name a.test.com; # 服务器名称
    client_max_body_size 100m;   # 定义读取客户端请求头的超时时间
    ssl on;
    ssl_certificate test.pem;
    ssl_certificate_key test.key;
    ssl_session_timeout 5m;
    ssl_protocols SSLv3 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
    ssl_prefer_server_ciphers on;
    location / {
        root /test-static-app; # 静态资源目录
        index index.html index.htm;
        try_files $uri $uri/ /index.html; # 动态解析目录,配合vue的history模式
    }
}

基本配置实现了页面及静态服务器的基本功能,并可以实现使用vue的history模式时的路由解析。进一步的,为了实现向接口服务器的统一转发,我们需要和后端开发人员规定接口名的前缀,比如所有接口的相对路径都以api开头,此时我们可以添加如下配置(和上一个location平级),

...
location /api {
   proxy_pass https://b.test.com; # 设置代理服务器的协议和地址
   proxy_cookie_domain b.test.com  a.test.com; # 修改cookie,针对request和response互相写入cookie
}       
...

其中主要依赖proxy_pass,实现将a.test.com下的/api/x接口转发到了b.test.com下面,这个过程大致如下

cookie的交互主要就是proxy_cookie_domain,加上下面这段

proxy_cookie_domain b.test.com  a.test.com; 

这个实现了,a.test.com和b.test.com域名之间cookie的传递与回写。

proxy_cookie_domain

官方解释:proxy_cookie_domain参数的作用是转换response的set-cookie header中的domain选项,由后端设置的域名domain转换成你的域名replacement,来保证cookie的顺利传递并写入到当前页面中,注意proxy_cookie_domain负责的只是处理response set-cookie头中的domain属性,仅此而已

  • 即: 如果响应的set-cookie没有domain内容,proxy_cookie_domain也就没有必要了,这也是为什么在部分项目中不配置proxy_cookie_domain依然正常的原因
  • 如果配置了domain则需要转换

Nginx反向代理的过程

  • Nginx让客户端请求同源目录下的资源,当然并不是直接写源服务器的url,而是一个临时路径的同源目录
  • 但是实际上并没有这个目录资源,所以就需要在Nginx配置这个目录文件
  • Nginx配置多个前缀转发请求道真实的服务器,这样这个Nginx服务器的url都是相同的域名协议和端口了
  • 对于浏览器来说,访问的就是同源服务器上的一个url
  • Nginx通过检测url前缀,把http请求转发道后面真实的服务器
  • 服务器上的Nginx是不受跨域限制的

关于我认为需不需要在服务器中配置CORS信息

我认为没必要,因为服务器本身就将域名作转换了,再配置cors信息显得多余,而且如果配置了cors信息的话何不直接在源服务器中配置,为何多此一举用一个代理服务器配置,当然如果说要负载均衡那就是另外一个话题了,这个话题仅仅是针对跨域办法。

参考文章 blog.csdn.net/qq_40112630… juejin.cn/post/684490…