zoukankan      html  css  js  c++  java
  • nginx+tomcat集群配置(4)--rewrite规则和多应用根目录设定思路

    前言:
      nginx中有一块很重要的概念, 就是rewrite规则. 它会对URL进行修改, 然后进行内部的重定向. rewrite授予了nginx更多的自由, 使得后级服务的接入更加地方便.
      本文将简单讲述nginx的rewrite规则和原理, 同时讲解下如何借助rewrite实现单tomcat实例/多Web App服务 对应的多域名根目录访问.

    案列目标:
      首先来谈一下之前对于多Web App服务对应多域名根目录访问的方案.
      
      注: 一个域名对应一个tomcat实例, 一个tomcat实例只包含一个webapp.
      具体可见博文: "nginx+tomcat集群配置(1)---根目录设定和多后端分发配置" .
      这种架构模式也是大公司推崇的方式, 毕竟大公司并不缺机器资源, 而且其有一个理直气壮的理由: 隔离和互不影响.
      对于小公司/创业公司而言, 机器资源并不丰富, 倘若一个tomcat实例只部署一个web app, 多少有些浪费. 部署多个web app, 域名的映射关系又出了波澜, 因为tomcat中, webapp访问的uri需要添加应用名称. 这又不符合根目录访问的设定.
      当然nginx强大的rewrite规则, 可以帮助我们解决该问题, 其最终达成效果的架构如下:
      

    rewrite规则简述:
      nginx的rewrite规则用于url的重写, 它和perl的正则表达一致.
      rewrite的规则如下:

    rewrite regexp replacement [flag]

      flag标记取值如下:

    last :相当于Apache里德(L)标记,表示完成rewrite;
    break;本条规则匹配完成后,终止匹配,不再匹配后面的规则
    redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址
    permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

      注: last和break用来实现URL重写,浏览器地址栏URL地址不变
      简单规则:

    rewrite ^/search/(.*)$ /search.php?q=$1;

      输入前的uri为:

    http://website.com/search/some-search-keywords

      则重写后的uri为:

    http://website.com/search.php?q=some-search-keywords

      具体可参考博客: "Nginx Rewrite规则初探". 这边不再具体阐述了.

    location规则:
      location语法:

    syntax: location [=|~|~*|^~|@] /uri/ { … }

      location涉及普通匹配和正规匹配两大块, 我们先来区分下
      • 普通匹配

    = 精确匹配
    ^~ 前缀匹配

      注: 对于'^~', 和缺省的前缀匹配相比, 其一旦匹配, 则立即执行, 不会被后续的正则匹配所覆盖. 对于普通匹配, 则按最大前缀为准.
      • 正则匹配

    ~ 区分大小写的正则匹配
    ~* 不区分大小写的正则匹配

      注: 正则匹配之前, 按编辑顺序来排定.
      可具体参考博客: Nginx之location 匹配规则详解  .
      着重里面的一句名言: 正则 location 匹配让步普通 location 的严格精确匹配结果;但覆盖普通 location 的最大前缀匹配结果

    实验部署:
    比如你创建一个web app, 将其部署于tomcat(多应用)中去, 由于默认的规则, 需要在uri中, 添加工程名的前缀才能访问.
    比如, 我们假定工程名为shopping, 给予其单独的域名: shopping.website.com.
    那么默认的url需要shopping.website.com/shopping才能OK, 现在需要设定为shopping.website.com即可.
    如何通过nginx的配置, 来达到我们的目的呢?
    在nginx.conf配置中, 添加rewrite规则:
        if ( $uri !~ /shopping/ ) {
            rewrite ^(.*)$ /shopping/$1 last;
        }
    
        location /shopping/ {
            proxypass <<tomcat server>>
        }
        注意: rewrite可能会导致递归(nginx阻止了无限递归, 上限为10次).
    简单的通过这个修改, 就实现了我们预定的目标.
    额外的好处:
    大家知道, ROOT工程是tomcat的后台管理服务, 按之前的做法, 会牺牲关闭该服务. 如果引入rewrite, 则可以保留该服务.

    后记:
    一直对nginx学得不够全面和系统, 今日借该实验来强化一下. 权当笔记, 与君共勉.

    公众号&游戏站点:
      个人微信公众号: 木目的H5游戏世界

      

      个人游戏作品集站点(尚在建设中...): www.mmxfgame.com,  也可直接ip访问http://120.26.221.54/.
  • 相关阅读:
    LeetCode 264. Ugly Number II
    LeetCode 231. Power of Two
    LeetCode 263. Ugly Number
    LeetCode 136. Single Number
    LeetCode 69. Sqrt(x)
    LeetCode 66. Plus One
    LeetCode 70. Climbing Stairs
    LeetCode 628. Maximum Product of Three Numbers
    Leetcode 13. Roman to Integer
    大二暑假周进度报告03
  • 原文地址:https://www.cnblogs.com/mumuxinfei/p/5196968.html
Copyright © 2011-2022 走看看