本地如何使用nginx做反向代理,搭配域名请求本地不同应用

问题

大家都知道,工作中一般在项目中会有不同的应用模块,每个应用模块有自己的端口,这时候,通过IP+端口号访问,将会变的很麻烦,那么如何解决这个问题呢:

解决方案

使用反向代理,监听我们本地的80端口,将请求转发自各自的端口,常见的反向代理有nginx。IP我们这里也不使用了,比较麻烦,我们直接使用自定义的域名,本地配置host域名(推荐使用SwitchHosts管理本地hosts),浏览器(Chrome浏览器)我们推荐使用SwitchyOmega插件做浏览器拦截。

原理

在浏览器输入域名,然后SwitchyOmega识别到,此域名已经配置过,需要走本地hosts解析,获取到IP地址,将请求转发到这个IP地址,Nginx监听到内容,根据自己配置转发规则,进行端口转发,最终,将请求发散到我们的各大应用。

请求
请求
请求
请求
请求
浏览器
hosts
nginx
应用1
应用2
...........

具体实现

首先,我们启动两个项目,并且在浏览器直接访问
http://127.0.0.1:9001和http://127.0.0.1:9002

  1. 配置Host
     127.0.0.1 www.local.cn
    
  2. 配置nginx
      upstream apply1 {
        server 127.0.0.1:9001;
      }
    
      upstream apply2 {
        server 127.0.0.1:9002;
      }
      
      server {
        listen 80;
        server_name www.local.cn;
    
        location /a1/ {
          proxy_pass  http://apply1;
          proxy_redirect default;
        }
    
        location /a2/ { 
          proxy_pass  http://apply2;
          proxy_redirect default;
        }
      }
    

这样通过http://www.local.cn/a1访问的就是9001的应用,http://www.local.cn/a2访问的就是9002的应用,到此已经完成改造。

等下,好像有什么地方不对,有人说,你这样搞我每个应用岂不是必须在Controller层都要配置一个多余的/a1路径,用起来多麻烦,是有这个问题,所以我们引入一个工具:UrlRewrite,他的原理实际上是过滤器通过对Request中的Url进行改写,对源码有兴趣的朋友,可以自行百度究其根源。

那怎么用呢?简单介绍下SpringBoot项目如何集成。

SpringBoot集成UrlRewrite
  1. 编写UrlRewrite配置类
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.Resource;
    import org.tuckey.web.filters.urlrewrite.Conf;
    import org.tuckey.web.filters.urlrewrite.UrlRewriteFilter;
    
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import java.io.IOException;
    
    /**
     * @author sjp
     * @date 2019/1/19
     **/
    @Configuration
    public class UrlRewriteFilterConfig extends UrlRewriteFilter {
    
        @Value("classpath:/urlRewrite/urlRewrite.xml")
        private Resource resource;
    
        @Override
        protected void loadUrlRewriter(FilterConfig filterConfig) throws ServletException {
            try {
                Conf conf = new Conf(filterConfig.getServletContext(), resource.getInputStream(), resource.getFilename(),
                    "apply1");
                checkConf(conf);
            } catch (IOException ex) {
                throw new ServletException("Unable to load URL rewrite configuration file from classpath:/urlRewrite/urlRewrite.xml", ex);
            }
        }
    
    }
    
  2. 新建UrlRewrite配置文件
    	<urlrewrite>
    	
    	    
    	    <rule>
    	        <from>^/a1(.*)$from>
    	        <to>$1to>
    	    rule>
    	
    	urlrewrite>
    

好,到此已经完成接入,小伙伴们自行写一个Controller进行测试即可,另外如果项目中有使用拦截器、过滤器的并且和Url相关(例如Shiro,请注意执行顺序)。

你可能感兴趣的:(架构)