2010-01-14 15 views
6

मेरे पास एक एकल टोमकैट उदाहरण है जिसमें कई वेबपैप्स हैं, प्रत्येक इसके/संदर्भ के माध्यम से सुलभ हैं। टोमकैट httpd (वास्तव में डेबियन अपाचे 2) के पीछे है, जो प्रत्येक ऐप/संदर्भ की सेवा के लिए वर्चुअल होस्ट के साथ कॉन्फ़िगर किया गया है। टॉमकैट कनेक्टिविटी mod_jk के साथ है।वर्चुअल होस्ट (mod_jk, mod_rewrite) के लिए URL से टॉमकैट संदर्भ को हटा रहा है

यह ठीक काम करता है जब मुझे urls से संदर्भ को हटाने की परवाह नहीं है: जब किसी वर्चुअल डोमेन की रूट का अनुरोध किया जाता है, तो अनुरोध डोमेन.com/Context पर रीडायरेक्ट किया जाता है।

हालांकि एक ऐप के लिए मैं संदर्भ को हटाना चाहता हूं। मेरा मानना ​​है कि यह mod_rewrite का उपयोग करके किया जा सकता है, और सही टोमकैट संदर्भ पर जाने के लिए mod_jk को पुनः लिखित यूआरएल पास कर सकता है। तो मेरी डेबियन Apache2 साइटों से उपलब्ध फ़ाइल इस तरह दिखता है:

NameVirtualHost * 

<VirtualHost *> 
    ServerName domain.be 

    DocumentRoot /home/webapp/app/static/domain/ 

    RewriteEngine on 
    RewriteRule ^/(.*)$ /Context/$1 [L,PT] 
    RewriteLog "/var/log/apache2/domain-rewrite.log" 
    RewriteLogLevel 4 

    JkLogFile  /var/log/apache2/domain-mod_jk.log 
    JkLogLevel debug 
    JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " 
    JkMount /Context w1 
    JKMount /Context* w1 
    JkOptions +ForwardURICompat 

    ErrorLog /var/log/apache2/domain_error.log 
    CustomLog /var/log/apache2/domain_access.log combined 
    LogLevel warn 

</VirtualHost> 

डॉक्स, [पीटी] झंडा और + ForwardURICompat विकल्पों के अनुसार फिर से लिखा URL में परिणाम चाहिए jk_mod पर प्रदान किया गया। हालांकि ऐसा प्रतीत नहीं होता है।

यूआरएल फिर से लिखा जा रहा है, लेकिन ऐसा लगता है कि mod_jk इसे अनदेखा कर रहा है: उदाहरण के लिए domain.be/Context के लिए अनुरोध/संदर्भ/संदर्भ के रूप में पुनः लिखा गया है - लेकिन अभी भी mod_jk के रूप में/संदर्भ को सौंप दिया गया है।

कोई विचार? संयोग से, मैं फिलहाल mod_proxy का उपयोग नहीं कर सकता।

धन्यवाद

उत्तर

1

मैं बड़ी सफलता के साथ इस का उपयोग कर:

RewriteEngine On 
RewriteCond %{REQUEST_URI} !^/(Context/.*)$ 
RewriteRule ^/(.*)$ /Context/$1 [P,L] 

नोट्स अपनी स्थिति पर:

  • आप या mod_proxy काम कर पाने के लिए की आवश्यकता होगी [P] नजरअंदाज कर दिया जाएगा और अनुरोध प्रॉक्सी के बजाय अग्रेषित किया जाएगा। इसके अलावा कोई रास्ता नहीं है।
  • +ForwardURICompat mod_jk का हिस्सा है और पुनर्लेखन के बाद प्रभावी होगा।
  • mod_jk अनुरोध को अनदेखा कर रहा है क्योंकि यह कभी नहीं मिलता है। अनुरोध/संदर्भ को पुनः लिखने से रोकने के लिए आपको RewriteCond (ऊपर) की आवश्यकता है।

मैं वर्तमान में mod_rewrite के बिना ऐसा करने का तरीका ढूंढ रहा हूं और इसके बजाय, just mod_jk and Tomcat <Host>'s का उपयोग कर रहा हूं। लेकिन मुझे apache, mod_jk और टॉमकैट मेजबानों के साथ अच्छी तरह से खेलने के साथ परेशानी हो रही है। उपर्युक्त आपके लिए ठीक काम करना चाहिए।

4

@ जोश, मुझे लगता है कि यह समाधान काम नहीं करेगा अगर टोमकैट कोई रीडायरेक्ट करता है। यह एक सामान्य मामला है उदाहरण के लिए लॉगिन की मांग करने वाले एप्लिकेशन में। जब उपयोगकर्ता प्रमाणीकृत नहीं होता है तो ऐप कुछ लॉगिन/रीडायरेक्ट पर रीडायरेक्ट करेगा, हालांकि टॉमकैट मौजूदा संदर्भ को/संदर्भ/लॉगिन जैसे जोड़ देगा ताकि संदर्भ यूआरएल में दिखाया जा सके।

जैसा कि आपने अपने अन्य प्रश्न/प्रतिक्रिया में केवल मॉड-जेके प्लस टॉमकैट वर्चुअल होस्ट का उपयोग करके एक विकल्प दिया है, लेकिन वहां आपको अपने अनुप्रयोगों को ROOT.war के रूप में तैनात करने की आवश्यकता होगी जो कि सीधा नहीं हो सकता है। एक कामकाज है इसलिए आपका एप्लिकेशन सिर्फ टॉमकैट वेबपैप्स फ़ोल्डर में गिराया जा सकता है, लेकिन जैसा कि मैंने here का वर्णन किया है, सर्वर कम से कम दो बार ऐप को तैनात करेगा।

यह बहुत अच्छा होगा अगर रिवाइटरूले [पी] प्लस जेकेऑप्शन + फॉरवर्डुरिकॉमपेट काम कर सकता है लेकिन ऐसा नहीं होता है।बीटीडब्ल्यू मैंने इसका परीक्षण किया है और मुझे पता है कि mod_proxy काम करता है क्योंकि मैंने cnn.com पर अपनी साइट को प्रॉक्सी किया है और मुझे अपना पृष्ठ मेरी साइट यूआरएल के नीचे मिला है। नीचे दिए गए लॉग अनुरोध जहां आप एक प्रॉक्सी किया जा रहा है देख सकते हैं के लिए BTW हैं:

127.0.0.1 - - [15/Dec/2011:12:56:34 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (2) forcing proxy-throughput with http://localhost/nestorurquiza-app/ 
127.0.0.1 - - [15/Dec/2011:12:56:34 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (1) go-ahead with proxy request proxy:http://localhost/nestorurquiza-app/ [OK] 
127.0.0.1 - - [15/Dec/2011:12:56:49 --0500] [localhost/sid#1008ef278][rid#1009aaca8/initial] (2) forcing proxy-throughput with http://localhost/nestorurquiza-app/login 
127.0.0.1 - - [15/Dec/2011:12:56:49 --0500] [localhost/sid#1008ef278][rid#1009aaca8/initial] (1) go-ahead with proxy request proxy:http://localhost/nestorurquiza-app/login [OK] 
127.0.0.1 - - [15/Dec/2011:12:57:15 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (2) forcing proxy-throughput with http://localhost/nestorurquiza-app/j_spring_security_check 
127.0.0.1 - - [15/Dec/2011:12:57:15 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (1) go-ahead with proxy request proxy:http://localhost/nestorurquiza-app/j_spring_security_check [OK] 
127.0.0.1 - - [15/Dec/2011:13:08:41 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (2) forcing proxy-throughput with http://localhost/nestorurquiza-app/ 
127.0.0.1 - - [15/Dec/2011:13:08:41 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (1) go-ahead with proxy request proxy:http://localhost/nestorurquiza-app/ [OK] 
+1

आप सही हैं कि मेरा मूल समाधान सबसे अच्छा तरीका नहीं है और खतरे से भरा हुआ है। लेकिन पोस्ट करने के बाद से, मैंने टोमकैट वर्चुअलहोस्ट्स को बहुत सफलता के साथ उपयोग किया है। इसका उपयोग करने वाले लोगों के बारे में सुनने के बावजूद, यह निश्चित रूप से इस स्थिति में उपयोग करना चाहेगा और एक बनाने के बाद भी मुश्किल नहीं है। –

2

मैं अपने मूल जवाब ऊपर छोड़ देंगे, लेकिन यह गलत है। यह करने के लिए उचित तरीके से एक बिलाव VirtualHost साथ होगा:

http://tomcat.apache.org/tomcat-6.0-doc/virtual-hosting-howto.html

आधिकारिक माध्यम से गुजरने के ऊपर के लिंक में वास्तव में क्या मैं अब कई बार उपयोग किया है है। मैं इसे नीचे उबालने का प्रयास नहीं करूंगा।

अवधारणा अपाचे वोस्ट के समान ही है। वर्चुअल होस्ट बनाएं (उदाहरण के लिए something.yourtdomain.com) और उस वेबोस्ट के लिए ROOT एप्लिकेशन (/) पर अपना वेबपैप तैनात करें और आप सभी सेट हैं। इस तरह, यदि आपके पास पहले से ROOT वेबैप है, तो आप एक अलग डोमेन पर एक और हो सकते हैं और पूर्व अप्रभावित रहेगा।

जैसा कि नेस्टर ने उल्लेख किया है, एक अपाचे पुनर्लेखन नियम टैग लिब और फ्रेमवर्क जैसी चीजों को संभाल नहीं पाएगा जो संदर्भ रूट के आधार पर आपके लिए स्वचालित रूप से लिंक/फॉर्म क्रिया/आदि बनाते हैं। इस मामले में वे सही संदर्भ रूट (/) बनाएंगे।

+2

यदि आपको पता नहीं था, तो आप वास्तव में वेब एप्लिकेशन निर्देशिका में अपने एप्लिकेशन छोड़ सकते हैं और केवल ऐपबेस को एप्लिकेशन के पूर्ण पथ पर सेट कर सकते हैं। --- उदाहरण: <होस्ट नाम = "www.app1.com" ऐपबेस = "सी: \ प्रोग्राम फ़ाइलें \ अपाचे सॉफ्टवेयर फाउंडेशन \ टोमकैट 7.0 \ वेबएप \ एपी 1"> \t <संदर्भ पथ = "" docBase = "। " /> \t – skel625

-1

mod_proxy_ajp बजाय नीचे की तरह mod_jk उपयोग:

<VirtualHost *:80> 
    ServerName domain.be 

    DocumentRoot /home/webapp/app/static/domain/ 

    ... 

    ProxyPass /Context ajp://localhost:8009/Context 
    ProxyPass/ajp://localhost:8009/Context/ 

    ... 
</VirtualHost> 
+0

यदि टॉमकैट कोई रीडायरेक्ट करता है तो वह अभी भी काम नहीं करेगा। यह वास्तव में मौलिक समस्या को बिल्कुल नहीं बदलता है। कोई जवाब नहीं – EJP

0

नेस्टर Urquiza के जवाब द्वारा दिए गए संकेत के बाद, मैं क्योंकि जैसा कि कहा, j_security_check अनुरोध उत्तर दिया जाता है बिल्ला के server.xml में अतिरिक्त होस्ट को परिभाषित करते हुए इस मुद्दे को हल करने में कामयाब ब्राउज़र पर अग्रेषित निर्देश के साथ टोमकैट द्वारा, जिसमें अनिवार्य रूप से संदर्भ नाम शामिल है ताकि उपयोगकर्ता लॉगिन करने का प्रयास कर सकें 408 त्रुटियां प्राप्त करें। इसलिए, अपाचे वर्चुअलहोस्ट JkMount /* worker1 निर्देश के अंदर एक असली पासथ्रू इच्छित संदर्भ, ROOT एक बनाकर प्राप्त किया जा सकता है।

अपाचे httpd.conf [और/या एक शामिल * .conf] फ़ाइल:

<!-- the subdomain --> 

<VirtualHost *:80> 
    ServerName appWelcome.example.org 
    ServerAlias www.appWelcome.example.org 
    JKMount /* worker1 
</VirtualHost> 

<!-- with mod_jk set up --> 

LoadModule jk_module modules/mod_jk.so 
JWorkersFile /etc/apache2/workers.properties 
JkShmFile  /var/log/apache2/mod_jk.shm 

तो प्रभारी/appWelcome बिल्ला संदर्भ, appWelcome के लिए सीधे http://appWelcome.example.org/ के उप में किए गए सभी अनुरोध मैप करने के लिए संदर्भ http://appWelcome.example.org:8080/

के अनुरोध के साथ एड्रेसेबल होना चाहिए तो टॉमकैट server.xml फ़ाइल तब उस ऐप के लिए अलग Host पहनेंगी जिसे आप बेनकाब करने के लिए तैयार कर रहे हैं:।

<Server ...> 
    <Service> 
    <Engine defaultHost="localhost" ...> 

     <Host name="appWelcome.example.org" appBase="appWelcomeBase" ... > 
     <Valve ... /> 
     </Host> 

     <Host name="localhost" appBase="webapps" ...> 
     <!-- this Host is typically shipped with manager, host-manager, docs, 
      sample, examples and a default ROOT context that shows tomcat default home. --> 
     <Valve ... /> 
     </Host> 

    </Engine> 
    </Service> 
</Server> 

नोट अनुमतियाँ (और SELinux संदर्भ सक्षम होने पर) के रूप में इस डिफ़ॉल्ट Host लोगों की नकल करने के लिए समायोजित किया जाना है कि:

$CATALINA_HOME/conf/Catalina/app.example.org रूप $CATALINA_HOME/conf/Catalina/localhost

$CATALINA_HOME/appWelcomeBase$CATALINA_HOME/webapps

किस स्थान के रूप में यह सब कुछ करने के लिए किया जाता है जो नाम बदलता है और निर्मितमें ऑटो-तैनाती के लिए appWelcome.war वेब संग्रह को स्थानांतरित करता है($ CATALINA_HOME को इसके मूल्य के साथ बदलकर, उदा।/var/www/tomcat7):

# mv $CATALINA_HOME/webapps/appWelcome.war $CATALINA_HOME/appWelcomeBase/ROOT.war 

वोला!