本地如何使用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>
    	
    	    <!-- 應用拆分,重寫url -->
    	    <rule>
    	        <from>^/a1(.*)$</from>
    	        <to>$1</to>
    	    </rule>
    	
    	</urlrewrite>
    

好,到此已經完成接入,小夥伴們自行寫一個Controller進行測試即可,另外如果項目中有使用攔截器、過濾器的並且和Url相關(例如Shiro,請注意執行順序)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章