2012-01-11 21 views
50

Hiện nay tôi có 2 ứng dụng web app1 và app2 chạy trên Tomcat 6:Làm thế nào để chạy các ứng dụng khác nhau trên cá thể Tomcat đơn lẻ sau các cổng khác nhau?

Tôi muốn cấu hình Tomcat để họ chạy trong bối cảnh gốc đằng sau các cổng riêng biệt:

Cần phải làm gì?

+0

Tôi không nghĩ rằng có thể trừ khi bạn có một trường hợp khác, tôi đã upvoted, hãy để chúng tôi xem có bất kỳ suy nghĩ nào khác không. – kosa

+0

Tôi thực sự muốn chỉ sử dụng một cá thể tomcat. Nhóm của chúng tôi đang cố gắng sử dụng một ví dụ đơn lẻ trong tương lai. Có một cái gì đó trong server.xml mà cần phải thay đổi tôi nghe nhưng không chắc chắn phải làm gì ở đó. – DeeStackOverflow

Trả lời

43

Tôi nghĩ bạn có thể định cấu hình điều đó trong máy chủ .xml tệp và đặt 2 dịch vụ:

<Service name="app1"> 
    <Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol" 
      connectionTimeout="20000" 
      redirectPort="8443" /> 
    <Engine name="Catalina" defaultHost="localhost"> 
     <Host name="localhost" appBase="app1" 
     unpackWARs="true" autoDeploy="true"> 
     </Host> 
    </Engine> 
</Service> 
<Service name="app2"> 
    <Connector port="8082" protocol="org.apache.coyote.http11.Http11NioProtocol" 
      connectionTimeout="20000" 
      redirectPort="8443" /> 
    <Engine name="Catalina" defaultHost="localhost"> 
     <Host name="localhost" appBase="app2" 
     unpackWARs="true" autoDeploy="true"> 
     </Host> 
    </Engine> 
</Service> 
+0

Ở trên dường như cho kết quả tốt hơn với nhật ký nhưng vẫn có lỗi này: Ngày 11 tháng 1 năm 2012 12:58:13 PM org.apache.catalina.core.StandardContext resourcesStart SEVERE: Lỗi bắt đầu Tài nguyên tĩnh java.lang.IllegalArgumentException: Cơ sở tài liệu C: \ Program Files \ Tomcat6 \ app1 \ host-manager không tồn tại hoặc không phải là thư mục có thể đọc được \t tại org.apache.naming.resources.FileDirContext.setDocBase (FileDirContext. java: 142) – DeeStackOverflow

+0

Tôi sẽ đánh dấu đây là câu trả lời được chấp nhận; mặc dù tôi không thể nhận được thông báo lỗi để biến mất, ít nhất tôi cũng có thể bắt Tomcat khởi động. Nếu ai có thời gian để tìm hiểu điều này, hãy cho chúng tôi biết kết quả của bạn. Các tùy chọn khác của khóa học, là có 2 trường hợp của Tomcat chạy như được chỉ ra bởi những người khác trong chủ đề này. – DeeStackOverflow

+1

Tài liệu đang nói rằng mỗi công cụ bên trong máy chủ cụ thể phải có tên duy nhất (http://tomcat.apache.org/tomcat-7.0-doc/config/engine.html) vì vậy tôi bỏ phiếu cho @speeves answer – Kangur

0

Sử dụng hai phiên bản Tomcat khác nhau.

EDIT:

Hoặc cấu hình Tomcat như được giải thích trong câu trả lời của câu hỏi này: Tomcat configuration help: multiple ports not responding

+0

Tôi đã thử đề xuất trong liên kết (về cơ bản, thêm một Dịch vụ mới và một đầu nối bên trong). Đã không làm việc. Ứng dụng của tôi không phải là C: \ somepath - ứng dụng được triển khai trong ứng dụng web. Vậy appBase sẽ là gì? – DeeStackOverflow

+0

Bạn muốn có hai ứng dụng có cùng tên (ROOT) trong cùng một thư mục như thế nào? Bạn cần phải tách các thư mục được sử dụng bởi hai dịch vụ tomcat. Xem tài liệu tomcat để biết chi tiết. –

+0

Tôi có thư mục cho từng ứng dụng được triển khai như sau: [tomcathome]/webapps/app1 và [tomcathome]/webapps/app2. Server.xml mặc định cho phép tôi gọi chúng là localhost: 8080/app1 và localhost: 8080/app2. Tôi đã sao chép appconfig.xml dưới dạng app1.xml vào [tomcathome]/conf/Catalina/localhost. – DeeStackOverflow

0

Tomcat chạy trên các cảng quy định tại:

$CATALINA_HOME/conf/server.xml 

Như JB Nizet viết, thiết lập hai khác nhau các cá thể của tomcat và cấu hình giá trị cổng server.xml một cách thích hợp.

$ CATALINA_HOME/tomcat-8081/conf/server.xml:

<?xml version='1.0' encoding='utf-8'?> 
<Server port="8081" ... > 
    ... 
</Server> 

$ CATALINA_HOME/tomcat-8082/conf/server.xml:

<?xml version='1.0' encoding='utf-8'?> 
<Server port="8082" ... > 
    ... 
</Server> 
+0

Tôi có thể sửa đổi server.xml để thêm 2 cổng mới và trỏ chúng vào từng ứng dụng trong ứng dụng web không? – DeeStackOverflow

+0

Chúng tôi không muốn tạo 2 trường hợp tomcat. Mọi người ở đây đang chạy hai ứng dụng khác nhau trong cùng một thể hiện của thư viện tomcat và chia sẻ. Tôi chỉ muốn mở rộng hơn nữa bằng cách gán số cổng. – DeeStackOverflow

2

Bên cạnh việc chạy hai trường hợp Tomcat và sử dụng ứng dụng ROOT (đã được nói và là một giải pháp không hiệu quả và kém hiệu quả), bạn có thể đạt được nó bằng cách sử dụng Apache + Tomcat. Cấu hình apache để lắng nghe cả hai cổng và chuyển tiếp bằng IP: Port đến các ứng dụng Tomcat khác nhau. Nhưng bạn cần một cổng tomcat khác! cấu hình

Apache

listen 8080,8081 
... 
<VirtualHost *:8080> 
    ServerName localhost 
    ProxyPass/http://localhost:8888/app1 
    ProxyPassReverse/http://localhost:8080/app1 
</VirtualHost> 

<VirtualHost *:8081> 
    ServerName localhost 
    ProxyPass/http://localhost:8888/app2 
    ProxyPassReverse/http://localhost:8080/app2 
</VirtualHost> 

hoặc

listen 80,81 
... 
<VirtualHost *:80> 
    ServerName localhost 
    ProxyPass/http://localhost:8080/app1 
    ProxyPassReverse/http://localhost:8080/app1 
</VirtualHost> 

<VirtualHost *:81> 
    ServerName localhost 
    ProxyPass/http://localhost:8080/app2 
    ProxyPassReverse/http://localhost:8080/app2 
</VirtualHost> 
+0

Vấn đề là, tôi không có apache cài đặt và không có kế hoạch trong nhóm của chúng tôi để làm như vậy. – DeeStackOverflow

+0

Trong một vị trí cũ, chúng tôi chạy các F5s Big-Ip trực tiếp vào tomcat để loại bỏ một điểm thất bại. Tôi _do_ yêu Apache nhiều thứ mặc dù :) – speeves

+1

Đây là lý thuyết có thể, nhưng ánh xạ giữa "/" và "/ app1" khiến bạn phát điên. Thông thường, "mod_proxy_html" là cần thiết cho cấu hình như vậy, và nó khá tinh vi cho cả cài đặt và cấu hình. Ngay cả khi bạn đang sử dụng Apache, việc sử dụng hai dịch vụ trong cấu hình tomcat vẫn là cách thuận tiện hơn. – 30thh

8

Một ví dụ về kết nối thêm:

<Service name="reciver"> 
    <Connector port="8080" maxHttpHeaderSize="8192" maxThreads="10" 
       enableLookups="false" acceptCount="100" 
       connectionTimeout="10000" disableUploadTimeout="true" 
       useBodyEncodingForURI="true"/> 
    <Engine name="reciver" defaultHost="localhost" jvmRoute="host1"> 
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 
        resourceName="UserDatabase" /> 
      <Host name="localhost" appBase="webapps" unpackWARs="true" 
        autoDeploy="false" xmlValidation="false" 
        xmlNamespaceAware="false"> 
        <Context docBase="browser" path="/browser" reloadable="false"/> 
      </Host> 
    </Engine> 
</Service> 
<Service name="reciver2"> 
    <Connector port="8081" maxHttpHeaderSize="8192" maxThreads="10" 
       enableLookups="false" acceptCount="1" 
       connectionTimeout="10000" disableUploadTimeout="true" 
       useBodyEncodingForURI="true" proxyName="example.pt" proxyPort="80"/> 
    <Engine name="reciver2" defaultHost="example_app" jvmRoute="host2"> 
      <Host name="example_app" appBase="test_app/example_app" unpackWARs="true" 
        autoDeploy="false" xmlValidation="false" 
        xmlNamespaceAware="false"> 
        <Context docBase="example_app" path="/example_app" reloadable="false"/> 
      </Host> 
    </Engine> 
</Service> 
(...Repeted 2 more times.) 

Trích từ: http://www.coderanch.com/t/84172/Tomcat/listen-multiple-ports

tôi r ecommend đọc toàn bộ chuỗi, vì nó nói về các lần truy cập hiệu suất với cấu hình này và các điều kiện chủng tộc có thể có.

+0

Điều này đã giúp tôi. Rất đẹp :) – rocksteady

+1

Câu trả lời này phù hợp nhất với tôi vì tôi muốn có một bộ nhật ký riêng biệt, các bối cảnh riêng biệt của Catalina/localhost/*. Xml, appBase riêng biệt. Tôi dded một để có được các bản ghi riêng biệt – djb

Các vấn đề liên quan