用Knox做http代理

其實用Knox可以代理任何http服務或者web app,不僅僅侷限於代理hadoop的服務或者web應用/界面。
例如,你可以把tomcat裝在一臺機器上,然後把knox裝在另一臺機器上或者跟tomcat相同的機器上。knox就可以作爲代理,作爲通向tomcat的訪問點。
1.下載並安裝knox 0.6.0或者以上版本。
http://mirror.bit.edu.cn/apache/knox/0.6.0/knox-0.6.0.zip
解壓後,先運行knox/bin/knoxcli create-master 來創建密碼,再運行knox/bin/ldap start 啓動ldap,最後運行knox/bin/gateway來啓動knox服務器.
2.下載並安裝Tomcat,最新版本或者以前版本都可以.(需要注意的是tomcat9需要java8以上版本)
http://apache.fayea.com/tomcat/tomcat-9/v9.0.0.M1/bin/apache-tomcat-9.0.0.M1.zip
解壓後,到tomcat/bin目錄運行startup [Windows運行startup.bat ,Linux運行startup.sh]
tomcat默認端口號是8080,如果要修改可到tomcat/conf/server.xml中找到Connector port=”8080”這一行將8080改爲其他值.
3.創建一個tomcat.xml放於knox/conf/topologies目錄下,並具有以下內容(這樣一來tomcat將被視作一個集羣的名字,同理如果在knox/conf/topologies目錄下放置一個mycluster.xml,那麼mycluster也被看做是一個集羣的名字,會在knox/data/deployment生成其最新的war包)

<?xml version="1.0" ?>
<topology>
<gateway>
   <provider>
      <role>authentication</role>
      <name>ShiroProvider</name>
      <enabled>true</enabled>
      <param>
         <name>sessionTimeout</name>
         <value>30</value>
      </param>
     <param>
        <name>main.ldapRealm</name>
        <value>org.apache.hadoop.gateway.shirorealm.KnoxLdapRealm</value>
     </param>
      <param>
        <name>main.ldapRealm.userDnTemplate</name>
        <value>uid={0},ou=people,dc=hadoop,dc=apache,dc=org</value>
      </param>
      <param>
          <name>main.ldapRealm.contextFactory.url</name>
          <value>ldap://localhost:33389</value>
     </param>
     <param>
       <name>main.ldapRealm.contextFactory.authenticationMechanism</name>
       <value>simple</value>
    </param>
    <param>
       <name>urls./**</name>
       <value>authcBasic</value>
    </param>
</provider>
<provider>
   <role>identity-assertion</role>
   <name>Default</name>
   <enabled>true</enabled>
</provider>
</gateway>

  <service> 
     <role>TOMCAT</role> 
     <url>http://localhost:8080</url> 
 </service>
</topology>

4.創建一個tomcat/9.0目錄層級放於knox/data/services目錄下.
4.1 再創建一個service.xml具有以下內容,放於knox/data/services/tomcat/9.0目錄下

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<service role="TOMCAT" name="tomcat" version="9.0">
   <routes>
     <route path="/tomcatui/">
     </route>

     <route path="/tomcatui/**">
     </route>

     <route path="/tomcatui/**?**"> 
     </route>

   </routes>
</service>

4.2 再創建一個rewrite.xml具有以下內容,放於knox/data/services/tomcat/9.0目錄下
rewrite.xml:

<rules>
<!-- Inbound  rewrite rules   -->
<rule dir="IN" name="TOMCAT/root/inbound" pattern="*://*:*/**/tomcatui/">
   <rewrite template="{$serviceUrl[TOMCAT]}/"/>
</rule>

<rule dir="IN" name="TOMCAT/path/inbound" pattern="*://*:*/**/tomcatui/{**}">
    <rewrite template="{$serviceUrl[TOMCAT]}/{**}"/>
</rule>

<rule dir="IN" name="TOMCAT/full/inbound" pattern="*://*:*/**/tomcatui/{**}?{**}">
        <rewrite template="{$serviceUrl[TOMCAT]}/{**}?{**}"/>
</rule>
<rules>

5.重啓knox服務器(先運行knox/bin/gateway stop 再運行knox/bin/gateway start)
若更改service.xml 或rewrite.xml 則執行 ./knoxcli.sh redeploy –cluster tomcat
或刪除data/deployments裏所有內容,重啓knox服務器

6.訪問https://localhost:8443/gateway/tomcat/tomcatui
用瀏覽器訪問時(比如firefox),將網址添加到例外(表示這是個受信任的網站),要求用戶名和密碼時輸入guest和guest-password
可以看到它的內容, 等同於訪問http://localhost:8080/.
*注 https://{knox-host}:{knox-port}/gateway/tomcat/tomcatui中tomcat會被看做集羣名字,/tomcatui會被看做service.xml裏的根路徑。rewrite.xml中IN類型的rule中的pattern是針對呈獻給用戶的最終url比如https://{knox-host}:{knox-port}/gateway/tomcat/tomcatui

也可以利用curl用如下命令訪問,看到其結果: curl -i -k -u guest:guest-password -X GET https://localhost:8443/gateway/tomcat/tomcatui

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