跨域问题与nginx反向代理

nginx的代理机制分为两种正向和反向,我没有研究正向代理是怎么回事主要是在搞反向代理,这种方式解决的问题主要是跨域和最终配置的问题。

跨域

请求跨域

跨域问题在我们的应用环境之下分为两个情况,第一是对应的每一项请求都由一个域转到另一个域下了。比如说我们java写好了一个后端,对应java没有一个fastCGI程序所以没有什么办法可以直接让Nginx或者Apache来使用,只能使用tomcat进行webserver,这样一来如果直接使用tomcat就是指将所有的静态内容全部给到tomcat,但是各方评论都对tomcat的静态资源服务很不满意无论从性能还是稳定性上面都大大落后于nginx,所以常规的做法是使用nginx来对tomcat进行代理,比如tomcat监听8080端口进行webserver我们使用nginx监听80或者443端口进行对tomcat的转发,将主域名或者其下的一个一个二级地址给转到tomcat从而进行转发访问。这样一来部分静态资源可以使用nginx进行发送而对于的接口来说请求的地址即就是这个主域名下的一个地址,这样一来无论是发起请求的前端还是响应返回的后端都是在一个域之下这样的话就不会存在任何跨域的问题。一般来讲跨域主要影响有两个一个在开发上面必须要让服务端的接口返回全部带上允许跨域的标注,不知道php怎么处理java里面必须在控制层加入一个特殊的标注才行,同时返回的内容如果涉及到图片的话要不然前端解析时将图片转为base64才能显示,要不然服务端的返回就必须带上允许跨域展示的头。另一种影响就是安全上面的,一旦服务端允许跨域情况的话那么就会涉及到可接受的情况数量变大,只要是指向它的请求他都会去处理,这样安全就会大大降低。同时如果是https的情况与相应就必须要匹配到https一旦发送跨域的情况就必须保证跨的一个域都是https协议才能正常访问。这样的缺点很明显需要多个证书给到多个域名下才能够正常访问。

session跨域

接口的方式一旦发生了跨域的请求那么就意味着存在多组session,即便在同一个服务器上面都是一致的。比如说我有两个域名都解析到同一个服务器上面这样一来通过域名一得到服务端session与域名二不共用,结果就是session会变多,同一个用户在请求静态内容时与请求接口的session是完全分开且无法相互获取的。那么对于用户的登录信息与其他存在于session上的信息全部丢失。这种情况有一个复杂的解决方法那就是让用户在请求的时候带上cookies与之中sessionid,这样在域名一与域名二下的session都可以通过这个session追踪到这样算是一种解决方式但是是否的麻烦,而且在每一个请求中都必须要有这个id并且将这个id进行一次解析才行,java可以使用监听器进行对session的监听包括它的创建与销毁,这样可以形成一个全局的数组每一次请求遍历这个数组就可以对session进行跟踪了,难度不是很大但是非常麻烦缺点也十分明显。

解决方式

nginx可以完成反向代理意思就是将一个地址反向代理到nginx的地址上面去,反向的意思是从用户的角度来说的,用户访问的方向相反的方向。比如我们将一个域名解析到一个nginx的服务器上面去然后这个无论是http还是https都可以通过代理发送到另一地址上面去,我们的tomcat是在服务器上面的它监听8080端口没有域名,用户请求进入nginx之后的某一个地址上面去这样便可以让tomcat对应到这个域名的二级目录或者root目录之下。这样就很方便了,无论请求是怎么发送的都会固定到一个域名之下对于服务器来讲便是没有跨域的,对应用户来讲他会一直处于nginx解析的域上面更不会有什么影响。如果我们把思路放大一点的话我们可以将静态资源放到服务器A,API放到服务器B,让服务器C来进行nginx的代理到这两个服务器上面,根据内容的分布式部署大致就是这么一回事。

反向代理机制

反向代理其实并不是转发,而是让代理服务器接收到被代理服务器的内容然后再发送用户,本质过程使用的是缓存,我们的代理服务器的带宽会影响到用户整体访问速度,一些非常大的静态被放置到OSS等第三方对象存储中然后通过代理转发本质是将这些静态内容先传到代理服务器然后再发送到用户,其实这也就是为什么它可以解决跨域问题。

一开始我设计车保掌的时候是想用nginx来代理oss进行静态资源的存放是请求并发用处理但是这个想法还是错误了,最终的带宽与并发瓶颈依旧在代理服务器上面。但是问题也不是很大毕竟oss到服务器的带宽是5Gpbs所有基本上可以把它当做硬盘使用。同时代理的机制本质上还是缓存机制所以cdn加速还是起到作用的,但是这个方案的确定就是速度没有什么提升同时还要给钱用于CDN但是好处在于oss可以免费使用,比较所以产生的流量是从服务器抓取的这样一来oss就只有内网流量,免费。

反向代理的配置是很简单的,在nginx的配置文件之中加入

location /carplatform
{
    proxy_pass "http://47.94.230.30:8080/carplatform";
}
location /
{
    proxy_pass http://static.saylooks.com/;
}

location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
    proxy_pass http://static.saylooks.com;
}

其中proxy_pass就是代理,意思是指将某一个location带入到这个下,上面的配置是将/carplatfrom的内容代理到本机的tomcat上面的/carplatfrom上面去,第二的配置就是将/内容代理到http://static.saylooks.com/上面去,同时下面一项是指将静态内容也代理到这个地址下,这就是将静态内容与API代理到同一个域下,使用一个证书便可以全部访问

留下回复