การปรับใช้แอปพลิเคชันของฉันที่รูทใน Tomcat


134

ฉันมีไฟล์สงครามของแอปพลิเคชันของฉัน ฉันต้องการปรับใช้สิ่งนี้ในระดับราก URL ปัจจุบันคือhttp://localhost:8080/war_name/application_name.


1
คุณช่วยระบุได้ไหมว่าปัญหาของคุณคืออะไร? เมื่อคุณปรับใช้ไฟล์ war ใน tomcat แอปพลิเคชันจะเข้าถึงได้โดยใช้ URL: localhost: 8080 / war_nameโดยไม่มีนามสกุล. war
ashishjmeshram

1
ใช่คุณพูดถูกฉันต้องการเข้าถึงแอพของฉัน " localhost / application_name " สิ่งนี้ฉันสามารถบรรลุได้เมื่อฉันเปลี่ยนชื่อไฟล์ war ของฉันเป็น "ROOT.war" แต่มันไม่มีข้อยกเว้นหน่วยความจำเนื่องจากขนาดไฟล์สงครามของฉันอยู่ที่ประมาณ 120MB
iamjustcoder

1
@ user661660 - ดูเหมือนว่าคุณมีปัญหาอื่น - การเปลี่ยนชื่อเป็นROOT.warควรใช้งานได้ ฉันขอแนะนำให้ถามคำถามอื่นเกี่ยวกับของคุณOutOfMemoryExceptionโดยระบุการติดตามสแต็กและรายละเอียด คุณสามารถแก้ไขได้โดยกำหนดค่า-Xmxสำหรับ JVM
Rob Hruska

.lang.OutOfMemoryError: PermGen space 16 มี.ค. 2554 9:52:52 น. com.ebay.kernel.logger บันทึกล็อกเกอร์ SEVERE: ข้อผิดพลาดในเธรด Perfmon java.lang.OutOfMemoryError: PermGen เว้นวรรคข้อยกเว้นในเธรด "CalClient: NotifyThreadDestroyThread-0 "java.lang.OutOfMemor yError: PermGen space Exception ในเธรด" MetricsSnapshotScheduler "java.lang.OutOfMemoryError: PermG en space 16 มี.ค. 2554 9:53:36 น. com.ebay.kernel.logger.Logger บันทึก SEVERE: ข้อผิดพลาดใน Perfmon เธรด java.lang.OutOfMemoryError: PermGen space Exception ในเธรด "CalClient: NotifyThreadDestroyThread-0" java.lang.OutOfMemor yError: PermGen space
iamjustcoder

1
@ user661660 - บางทีคำตอบสำหรับคำถามนี้อาจช่วยคุณได้
Rob Hruska

คำตอบ:


222

คุณมีสองตัวเลือก:

  1. ลบROOT/ไดเร็กทอรีนอกกรอบออกจาก tomcat และเปลี่ยนชื่อไฟล์ war ของคุณROOT.warก่อนที่จะปรับใช้

  2. ปรับใช้สงครามของคุณเป็น (จากตัวอย่างของคุณ) war_name.warและกำหนดค่าroot บริบทในconf/server.xmlการใช้แฟ้มสงครามของคุณ:

    <Context path="" docBase="war_name" debug="0" reloadable="true"></Context>
    

อันแรกง่ายกว่า แต่กากกว่านิดหน่อย วิธีที่สองน่าจะเป็นวิธีที่หรูหรากว่าที่จะทำ


3
หากตั้งค่า Tomcat ให้ใช้งานได้โดยอัตโนมัติคุณไม่ต้องกังวลเกี่ยวกับตัวเลือกที่ 2
Buhake Sindi

4
@ เดเจล - ไม่มีเทคนิคอะไร ฉันทำมันมาแล้วพอสมควร มันทำให้งานเสร็จ แค่รู้สึกว้าวุ่นเล็กน้อยที่ต้องเปลี่ยนชื่อไฟล์สงครามของคุณเองเป็นสิ่งที่เป็นรายละเอียดการใช้งานของคอนเทนเนอร์
Rob Hruska

4
ตามลิงค์ที่คุณระบุไม่แนะนำให้วางองค์ประกอบ <Context> ลงในไฟล์ server.xml โดยตรง
Nilesh

6
คำตอบนี้แนะนำเทคนิคที่กล่าวถึงอย่างชัดเจนในเอกสารว่าเป็นรูปแบบที่ไม่ถูกต้อง ดูรายละเอียดเทคนิคที่เหมาะสมได้ที่นี่: stackoverflow.com/questions/41263245/…
Christopher Schultz

5
+1 สำหรับการเรียกมันว่า ROOT.war ตามเอกสารของ Tomcat คุณต้องระมัดระวังอย่างมากเมื่อระบุ "เส้นทาง" เพื่อหลีกเลี่ยงการปรับใช้สองครั้ง: "แม้ว่าจะกำหนดบริบทใน server.xml แบบคงที่ แต่ต้องไม่ตั้งค่าแอตทริบิวต์นี้เว้นแต่ว่า docBase จะไม่ได้อยู่ภายใต้โฮสต์ appBase หรือทั้งสองอย่าง deployOnStartup และ autoDeploy เป็นเท็จหากไม่ปฏิบัติตามกฎนี้การปรับใช้สองครั้งน่าจะเป็นผล " - จากtomcat.apache.org/tomcat-8.0-doc/config/context.html
Anthony Hayward

32

บน tomcat v.7 (การติดตั้งวานิลลา)

ใน conf / server.xml ของคุณให้เพิ่มบิตต่อไปนี้ที่ส่วนท้ายของไฟล์ก่อน</Host>แท็กปิด:

<Context path="" docBase="app_name">
    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

โปรดสังเกตว่าแอตทริบิวต์docBase มันเป็นบิตที่สำคัญ คุณต้องแน่ใจว่าคุณได้ปรับใช้ app_name ก่อนที่คุณจะเปลี่ยนแอปเว็บรูทของคุณหรือเพียงแค่คัดลอกเว็บแอป (app_name) ที่ยังไม่ได้แพ็คลงในโฟลเดอร์ webapps ของ tomcat เริ่มต้นไปที่รูทดู app_name ของคุณที่นั่น!


13

ใน tomcat 7 ที่มีการเปลี่ยนแปลงเหล่านี้ฉันสามารถเข้าถึง myAPP ที่ / และ ROOT ที่ / ROOT

<Context path="" docBase="myAPP">
     <!-- Default set of monitored resources -->
     <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="ROOT" docBase="ROOT">
     <!-- Default set of monitored resources -->
     <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

เพิ่มด้านบนใน<Host>ส่วนใน server.xml


3
เส้นทางบริบทต้องเป็นสตริงว่างหรือขึ้นต้นด้วย "/" เส้นทาง [ROOT] ไม่ตรงตามเกณฑ์เหล่านี้และถูกเปลี่ยนเป็น [/ ROOT]
Nikita Bosik

11

ฉันรู้ว่าคำตอบของฉันซ้อนทับกับคำตอบอื่น ๆ แต่นี่เป็นคำตอบที่สมบูรณ์ซึ่งมีข้อดีอยู่บ้าง สิ่งนี้ใช้ได้กับ Tomcat 8:

  1. แอปพลิเคชันหลักให้บริการจากราก
  2. การปรับใช้ไฟล์สงครามผ่านเว็บอินเตอร์เฟสจะได้รับการบำรุงรักษา
  3. แอปพลิเคชันหลักจะทำงานบนพอร์ต 80 ในขณะที่มีเพียงผู้ดูแลระบบเท่านั้นที่สามารถเข้าถึงโฟลเดอร์การจัดการได้ (ฉันตระหนักดีว่าระบบ * nix ต้องการ superuser สำหรับการผูกกับ 80 แต่บน windows นี่ไม่ใช่ปัญหา)

ซึ่งหมายความว่าคุณต้องรีสตาร์ทเครื่อง tomcat เพียงครั้งเดียวและหลังจากอัปเดตไฟล์ war แล้วจะสามารถใช้งานได้โดยไม่มีปัญหา

ขั้นตอนที่ 1: ในไฟล์ server.xml ค้นหารายการตัวเชื่อมต่อและแทนที่ด้วย:

<Connector 
    port="8080"
    protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

<Connector
    port="80"
    protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

ขั้นตอนที่ 2: กำหนดบริบทภายใน<Host ...>แท็ก:

<Context path="/" docBase="CAS">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/ROOT" docBase="ROOT">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/manager" docBase="manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/host-manager" docBase="host-manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

โปรดทราบว่าฉันระบุแอปทั้งหมดในโฟลเดอร์ webapp ขั้นแรกสลับรูทและแอพหลักจากตำแหน่งได้อย่างมีประสิทธิภาพ รากอยู่ในขณะนี้และการประยุกต์ใช้หลักอยู่ที่http://example.com/ROOT http://example.com/เว็บแอพที่ได้รับการป้องกันด้วยรหัสผ่านต้องการprivileged="true"แอตทริบิวต์

เมื่อคุณปรับใช้ไฟล์ CAS.war ที่ตรงกับรูท ( <Context path="/" docBase="CAS">คุณต้องโหลดไฟล์นั้นใหม่ในแผงผู้ดูแลระบบเนื่องจากไม่รีเฟรชด้วยการปรับใช้

อย่ารวมไว้<Context path="/CAS" docBase="CAS">ในบริบทของคุณเนื่องจากปิดใช้งานตัวเลือกผู้จัดการเพื่อปรับใช้ไฟล์สงคราม ซึ่งหมายความว่าคุณสามารถเข้าถึงแอปได้สองวิธี: http://example.com/และhttp://example.com/APP/

ขั้นตอนที่ 3: เพื่อป้องกันการเข้าถึงรูทและโฟลเดอร์ผู้จัดการโดยไม่ต้องการให้เพิ่มvalveแท็กบริบทเหล่านี้:

<Context path="/manager" docBase="manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
        addConnectorPort="true"
        allow="143\.21\.2\.\d+;8080|127\.0\.0\.1;8080|::1;8080|0:0:0:0:0:0:0:1;8080"/>
</Context>

โดยพื้นฐานแล้วสิ่งนี้จะ จำกัด การเข้าถึงโฟลเดอร์ admin ของเว็บแอปให้กับบุคคลจากโดเมนของฉันเอง (ที่อยู่ IP ปลอม) และ localhost เมื่อพวกเขาใช้พอร์ตเริ่มต้น 8080 และรักษาความสามารถในการปรับใช้ไฟล์สงครามแบบไดนามิกผ่านเว็บอินเตอร์เฟส

หากคุณต้องการใช้สิ่งนี้กับแอพหลายตัวที่ใช้ที่อยู่ IP ต่างกันคุณสามารถเพิ่มที่อยู่ IP ลงในตัวเชื่อมต่อ ( address="143.21.2.1")

หากคุณต้องการเรียกใช้เว็บแอปหลายรายการจากรากที่คุณสามารถทำซ้ำแท็กบริการ (ใช้ชื่อที่แตกต่างกันสำหรับสอง) และเปลี่ยน docbase ของการยกตัวอย่างเช่น<Context path="/" docBase="CAS"><Context path="/" docBase="ICR">


6

วิธีที่เร็วที่สุด

  1. ตรวจสอบให้แน่ใจว่าคุณไม่ได้ติดตั้งแอป ROOT ยกเลิกการปรับใช้หากคุณมี

  2. เปลี่ยนชื่อสงครามของคุณเป็น ROOT.war ปรับใช้นั่นคือทั้งหมดไม่จำเป็นต้องเปลี่ยนแปลงการกำหนดค่า


6

$CATALINA_HOME/webapps/ROOTลบ อัปเดต$CATALINA_HOME/conf/server.xmlตรวจสอบให้แน่ใจว่าองค์ประกอบโฮสต์มีลักษณะเหมือนข้อความต่อไปนี้:

<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="false" deployOnStartup="false">
  <Context path="" docBase="myApp"></Context>

ทำงานร่วมกับ Tomcat 8. autoDeploy และ deployOnStartup จำเป็นต้องตั้งค่าเป็น false เพื่อป้องกันไม่ให้ tomcat ปรับใช้myAppสองครั้ง


ฉันพยายามอัปโหลด WAR แต่มันไม่สามารถใช้งานได้ นี่เป็นเพียงสงครามระเบิดเท่านั้นหรือ
logixplayer

ฉันพยายามอัปโหลด WAR แต่มันล้มเหลวในการทำงานตามตัวอย่างของ @ Jingguo นี่เป็นเพียงสงครามระเบิดเท่านั้นหรือ แก้ไข: มันเป็นเพียงสำหรับสงครามที่ระเบิดเท่านั้น ทำไมถึงเป็นแบบนี้? ฉันไม่สามารถอัปโหลด WAR และหลีกเลี่ยงขั้นตอนที่สองนี้ได้หรือไม่? ฉันจะทำให้มันทำงานได้อย่างไร?
logixplayer

@logixplayer. โซลูชันของฉันใช้ได้กับ WAR ฉันไม่ได้ระเบิดมัน ฉันลืมพูดถึงสิ่งที่$CATALINA_HOME/webapps/ROOTต้องลบออก โปรดลบออกและลองอีกครั้ง
Jingguo Yao

ฉันถอดรูทออกตามที่คุณบอก ฉันปรับใช้ WAR ของฉัน (ไม่ใช่ไดเร็กทอรีระเบิด) ฉันสังเกตเห็นไดเร็กทอรี ROOT ใหม่ถูกสร้างขึ้นโดยมีเนื้อหาของฉันอยู่ในนั้นเช่น WEB-INF ไซต์กำลังทำงาน วิธีนี้ควรจะได้ผลหรือไม่?
logixplayer

ฉันลองวิธีนี้ด้วยและทั้งหมดเมื่อฉันพยายามเปิดหน้าในเบราว์เซอร์มันก็รอเซิร์ฟเวอร์ต่อไป catalina.out บอกเพียงว่าเซิร์ฟเวอร์เริ่มทำงานแล้ว
อาสุ

1

การเพิ่มในโซลของ @Rob Hruska การตั้งค่านี้ใน server.xml ภายในส่วนใช้งานได้:

<Context path="" docBase="gateway" reloadable="true" override="true"> </Context>

หมายเหตุ: override = "true" อาจจำเป็นในบางกรณี


คุณไม่ได้ระบุว่าจะนำสิ่งนี้ไปไว้ที่ใด คำตอบ @Sudheer Palyam มีประโยชน์
Kannan Ramamoorthy

1

การเพิ่มคำตอบของ@Dimaหากคุณใช้mavenสร้างแพ็คเกจคุณสามารถบอกให้ตั้งชื่อไฟล์ WAR ของคุณเป็นROOTในpom.xml:

<build>
    <finalName>ROOT</finalName>
</build>

ตามค่าเริ่มต้นtomcatจะปรับใช้ROOT.warwebapp ในบริบทรูท ( /)


0

open tomact manager url: - http: // localhost: 8080 / manager / html /
จากนั้นในแอปพลิเคชันที่คุณเห็นแอปพลิเคชันที่มีเส้นทางเป็น "/" ถูกปรับใช้
เพียงแค่เลิกใช้งานสิ่งนี้ เปลี่ยนชื่อไฟล์สงครามของแอปพลิเคชันของคุณเป็นROOT.warและวางที่พา ธ : - เริ่ม Tomcat ของคุณไม่จำเป็นต้องกำหนดค่าเพิ่มเติม ตอนนี้เราสามารถดูหน้าแรกของแอปพลิเคชันหรือ URL ที่กำหนดค่าได้ที่http: // localhost: 8080
ป้อนคำอธิบายภาพที่นี่
C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps


-1

ในเซิร์ฟเวอร์ของฉันฉันใช้สิ่งนี้และการปรับใช้อัตโนมัติรูททำงานได้ดี:

   <Host name="mysite" autoDeploy="true" appBase="webapps" unpackWARs="true" deployOnStartup="true">
        <Alias>www.mysite.com</Alias>
        <Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="X-Forwarded-Proto"/>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="mysite_access_log." suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b"/>
        <Context path="/mysite" docBase="mysite" reloadable="true"/>
    </Host>

สิ่งนี้จะไม่ปรับใช้กับ / but to / mysite
tine2k
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.