您当前的位置: 首页 >  nginx

一一哥Sun

暂无认证

  • 2浏览

    0关注

    622博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Day02_11_Nginx教程之动静分离的简单实现

一一哥Sun 发布时间:2019-05-23 14:09:01 ,浏览量:2

Nginx动静分离的简单实现 一. 动静分离简介

Nginx的静态处理能力很强,但是动态处理能力稍有不足.因此,在企业开发中常用动静分离技术.

动静分离技术其实是采用代理的方式,在nginx.conf配置文件的server{}代码段中加入带正则匹配的location来指定匹配项针对Java的动静分离-->静态页面交给Nginx处理,动态页面交给Apache Tomcat处理.在Nginx的配置中,是通过location配置段配合正则表达式匹配实现静态与动态页面的不同处理方式.

动静分离简单架构示例

二. 动静分离优点

动静分离主要用于一些较大型的站点架构,这样做一定程度上可以有效减轻后端节点压力.也就是说,有时候你在前端url中看到的一个目录,其后端对应的很可能就是一个集群.

另外,这样会使网站更加静态化,利于缓存,可显著提高网站访问速度,有效实现前后端解耦.但这样无疑会加大开发的繁琐程度,前后端只能通过各种接口进行通信.

三. 动静分离实现

本教程中,我们采用一台Nginx服务器,端口号为8083,2台tomcat服务器,端口号分别为8180和8280.我们将静态资源和动态资源分别存放在8180和8280tomcat服务器上.然后配置 Nginx,当请求的是 jpg等静态资源时,就访问8180服务器上的静态资源目录,当用户提出动态资源的请求时,则将请求转发到后端的8280服务器上,交由 Tomcat 处理,再由 Nginx 将结果返回给请求端.

1. 本教程动静分离示意图如下:

2. 动静分离优点

看到上面的结构图,你可能会有疑问,动态请求要先访问 A ,A 转发访问 B,再由 B 返回结果给 A,A 最后又将结果返回给客户端,这是不是有点多余?

初看的确多余,但是这样做至少有 2 点好处. 1️⃣.为负载均衡做准备,因为随着系统的发展壮大,只用一台 B 来处理动态请求显然是是不够的,要有 B1,B2 等等才行.那么基于图 2 的结构,就可以直接扩展 B1,B2,再修改 Nginx 的配置就可以实现 B1 和 B2 的负载均衡.

2️⃣.对于程序开发而言,这种结构的程序撰写和单台主机没有区别.我们假设只用一台 Tomcat 作为服务器,那么凡是静态资源,如图片、CSS 代码,就需要编写类似这样的访问代码:,当静态资源过多,需要扩展出其他的服务器来安放静态资源时,访问这些资源就可能要编写这样的代码:.可以看到,当服务器进行变更或扩展时,代码也要随之做出修改,对于程序开发和维护来说非常困难.而基于上面的结构,程序都只 要 ,无需关心具体放置资源的服务器地址,因为具体的地址 Nginx 为帮您绑定和选择.

2. 本教程动静分离服务器结构示意图

在8180服务器的/webapps目录下创建staticTest文件夹,里面存放一个logo.jpg文件.

在8280服务器的/webapps目录下创建dynamicTest文件夹,里面存放一个test.jsp文件.

3. 测试目的

访问jpg文件的时候,会转发到192.168.87.108:8180上面; 访问jsp等其他文件会转发到192.168.87.108:8280上面.

注:nginx的安装配置详见前面的博客.

4. nginx的动静分离配置如下.

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

      #动静分离配置
       upstream static_pools {
           server 192.168.87.108:8180;
       }

       upstream dynamic_pools {
           server 192.168.87.108:8280;
       }

       server {
           listen   8083;

           location / {
               root   html;
               index  index.html index.htm;
               proxy_pass http://dynamic_pools;
           }

           #如果请求包含这些后缀,请求被转发到静态池,否则转发到动态池
           location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
               proxy_pass http://static_pools;
           }
        }
}

5. 重新加载配置文件

service nginx reload
四. 测试 1. 访问jpg文件

因为jpg文件只在tomcat1上面有,所以可以看到静态请求被转发给了8180的机器上.

2. 访问jsp文件

因为dynamicTest的目录只在tomcat2上面有,所以动态资源的请求被转发到了8280上面.

有时候有可能工程没有做成动静分离,但是通过nginx的配置可以做静态的请求转发给一些服务器,动态的请求转发给另外一些服务器.

 

关注
打赏
1665624836
查看更多评论
立即登录/注册

微信扫码登录

0.0403s