2011-06-21 24 views
8

Có thể ánh xạ nhiều contextPath vào một tệp WAR trong Jetty không? Ví dụ:Làm cách nào để có thể ánh xạ nhiều ngữ cảnh vào cùng một tệp chiến tranh trong Jetty?

${jetty.home}/webapp/bookstore.war 

Và sau đó tôi muốn có hai ngữ cảnh khác nhau hướng đến cuộc chiến này. Lý do là một số khác biệt về cấu hình tùy thuộc vào URL nào.

<Configure class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="contextPath">/magazines</Set> 
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set> 
</Configure> 

<Configure class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="contextPath">/books</Set> 
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set> 
</Configure> 
+0

Giả sử bạn có thể triển khai một tệp chiến tranh duy nhất cho nhiều ngữ cảnh, bạn sẽ tải các cấu hình khác nhau như thế nào? Dựa trên đường dẫn? Điều gì xảy ra nếu người dùng nhập url như http: // myhost/magazine /../ books/...? – mrk

+1

Dường như bạn có thể cố gắng xử lý sự khác biệt thông qua giao diện người dùng Apache, sử dụng các đầu nối tomcat để định tuyến lưu lượng truy cập đến Jetty. – Griff

Trả lời

0

Bạn chỉ cần sao chép tệp chiến tranh và đổi tên nó.

3

Đây là cách tôi đã làm và tôi cũng đã thiết lập các chứng chỉ SSL khác nhau cho mỗi trang web (không được hiển thị). Tôi không yêu cầu để hiểu tất cả những gì tôi biết nhưng điều này đang làm việc cho tôi trong một số cài đặt. Bạn cần tệp "jetty.xml" và tệp "contexts.xml" cho mỗi trường hợp.

Giả cầu cảng đã được cài đặt trong/opt/Jetty ...

Launch hai trường hợp của máy chủ tham khảo hai phiên bản của jetty.xml (điều này có thể được thực hiện trong một kịch bản duy nhất, như thể hiện, hoặc trong hai riêng biệt ra mắt kịch bản)

start.sh ...

cd /opt/Jetty 
java -jar start.jar etc/jetty.xml etc/jetty2.xml 

Nếu bạn có một máy chủ với của nhiều ip bạn có thể sử dụng các tập tin context.xml chỉ định của ip khác nhau hoặc tên máy chủ trong phần kết nối của mỗi cầu cảng. tệp xml. Nếu bạn chỉ có một ip, thì bạn sẽ sử dụng thiết lập đường dẫn ngữ cảnh trong ngữ cảnh xml để phân biệt giữa hai cá thể.

trong jetty.xml, hãy tham khảo ip hoặc máy chủthư mục để chứa các context.xml cho ví dụ 1:

<Call name="addConnector"> 
    <Arg> 
     <New class="org.mortbay.jetty.nio.SelectChannelConnector"> 
     <Set name="host">HOST OR IP FOR FIRST INSTANCE</Set> 
     <Set name="port"><SystemProperty name="jetty.port" default="80"/></Set> 
     <Set name="maxIdleTime">30000</Set> 
     <Set name="Acceptors">2</Set> 
     <Set name="statsOn">false</Set> 
     <Set name="confidentialPort">443</Set> 
     <Set name="lowResourcesConnections">5000</Set> 
     <Set name="lowResourcesMaxIdleTime">5000</Set> 
     </New> 
    </Arg> 
</Call> 
<Call name="addLifeCycle"> 
    <Arg> 
    <New class="org.mortbay.jetty.deployer.ContextDeployer"> 
     <Set name="contexts"><Ref id="Contexts"/></Set> 
     <Set name="configurationDir"><SystemProperty name="jetty.home" default="."/>/contexts/directory_for_FIRST_instance</Set> 
     <Set name="scanInterval">5</Set> 
    </New> 
    </Arg> 
</Call> 

trong jetty.xml, hãy tham khảo ip hoặc máy chủthư mục để chứa các context.xml cho ví dụ 2:

<Call name="addConnector"> 
    <Arg> 
     <New class="org.mortbay.jetty.nio.SelectChannelConnector"> 
     <Set name="host">HOST OR IP FOR SECOND INSTANCE</Set> 
     <Set name="port"><SystemProperty name="jetty.port" default="80"/></Set> 
     <Set name="maxIdleTime">30000</Set> 
     <Set name="Acceptors">2</Set> 
     <Set name="statsOn">false</Set> 
     <Set name="confidentialPort">443</Set> 
     <Set name="lowResourcesConnections">5000</Set> 
     <Set name="lowResourcesMaxIdleTime">5000</Set> 
     </New> 
    </Arg> 
</Call> 
<Call name="addLifeCycle"> 
    <Arg> 
    <New class="org.mortbay.jetty.deployer.ContextDeployer"> 
     <Set name="contexts"><Ref id="Contexts"/></Set> 
     <Set name="configurationDir"><SystemProperty name="jetty.home" default="."/>/contexts/directory_for_SECOND_instance</Set> 
     <Set name="scanInterval">5</Set> 
    </New> 
    </Arg> 
</Call> 

Nếu được định nghĩa như được hiển thị ở trên, bạn có thể tải lại tệp chiến tranh và khởi động lại ứng dụng bằng cách chạm vào tệp xml ngữ cảnh.

Đặt tệp ngữ cảnh riêng biệt trong thư mục con riêng biệt của thư mục ngữ cảnh, mỗi tệp trỏ đến cùng một tệp chiến tranh, nhưng với các đường dẫn ngữ cảnh khác nhau và các máy chủ ảo khác nhau.

/opt/Jetty/contexts/subdirectory_for_first_instance/context_first.xml
/opt/Jetty/contexts/subdirectory_for_second_instance/context_second.xml

trong context_first.xml - bạn có thể chỉ định một nút (firstapp) mà sẽ luôn liên kết đến ứng dụng đầu tiên của bạn

<Set name="contextPath">/firstapp</Set> 

in context_second.xml - bạn có thể chỉ định một nút (firstapp) mà sẽ luôn luôn liên kết đến ứng dụng thứ hai của bạn

<Set name="contextPath">/secondapp</Set> 

(Trên đây là cần thiết (hai con đường bối cảnh khác nhau) nếu bạn muốn chạy chúng từ ip cùng, tôi tin)

Sau đó xác định hai máy chủ ảo (phải ánh xạ url hiện đang được sử dụng bởi các trình duyệt) trong các file bối cảnh riêng biệt:
trong context_first.xml:

<Set name="virtualHosts"> 
    <Array type="String"> 
    <Item>www.my_first_app.com</Item> 
    </Array> 
</Set> 

Và trong context_second.xml

<Set name="virtualHosts"> 
    <Array type="String"> 
    <Item>www.my_second_app.com</Item> 
    </Array> 
</Set> 

Lưu ý: nếu bạn có hai ip hoặc tên máy chủ, bạn có thể thiết lập các đường dẫn ngữ cảnh của cả hai ứng dụng để "/"
nếu bạn chỉ có một ip, con đường bối cảnh sẽ xác định ứng dụng được truy cập

Ngoài ra, và quan trọng là bạn có thể gửi các tham số ngữ cảnh cho ứng dụng của mình để nó có thể xác định được cá thể đó là gì, nếu cần.

Ví dụ về các thông số ngữ cảnh để gửi các giá trị duy nhất cho mỗi dụ:

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> 
<!-- Custom context configuration         --> 
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> 
<Set name="initParams"> 
    <New class="java.util.HashMap"> 
    <Put name="customer">Joes Fish Store</Put> 
    <Put name="ShowPanelNames">N</Put> 
    <Put name="FiscalYearStartMonth">10</Put> 
    <Put name="LiveEmail">Y</Put> 
    </New> 
</Set> 
+0

Giải pháp được giải thích rất tốt – Kyle

0

Tôi nhận ra điều này là cũ nhưng kể từ khi câu trả lời cung cấp không thực sự trả lời câu hỏi, để tham khảo trong tương lai bạn có thể đạt được nhiều WebappContext s bằng cách thêm một thuộc tính id vào Configure.

<Configure id="magazinesContext" class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="contextPath">/magazines</Set> 
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set> 
    <Set name="extractWAR">true</Set> 
</Configure> 

<Configure id="booksContext" class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="contextPath">/books</Set> 
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set> 
    <Set name="extractWAR">true</Set> 
</Configure> 

Lưu ý tuy nhiên rằng tất cả các tài nguyên đặt tên được định nghĩa trong bối cảnh phải được một trong hai giao cho bối cảnh sử dụng

<Arg> 
    <Ref id="magazinesContext" /> 
</Arg> 

Vì vậy, nếu bạn có DBCP tổng hợp tài nguyên "pg_conn", mà không có sự Arg với tham chiếu đến id của WebappContext (trong trường hợp này hoặc là "magazineContext" hoặc "booksContext") Tài nguyên sẽ được định nghĩa toàn cầu, tức là lần cuối cùng WebAppContext được tải thắng.

Đưa ví dụ như WebappContext định nghĩa sau đây "pg_conn" được định nghĩa toàn cầu:

<Configure id="magazinesContext" class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="contextPath">/magazines</Set> 
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set> 
    <Set name="extractWAR">true</Set> 
    <New id="pg_conn" class="org.mortbay.jetty.plus.naming.Resource"> 
     <Arg>jdbc/db</Arg> 
     <Arg> 
      <New class="org.apache.commons.dbcp.BasicDataSource"> 
       <Set name="driverClassName">org.postgresql.Driver</Set> 
       <Set name="url">jdbc:postgresql://localhost:5432/test_db</Set> 
       <Set name="username">test</Set> 
       <Set name="password">*****</Set> 
      </New> 
     </Arg> 
    </New> 
</Configure> 

và thế này, nơi nó được định nghĩa cho trường hợp của WebappContext:

<Configure id="magazinesContext" class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="contextPath">/magazines</Set> 
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set> 
    <Set name="extractWAR">true</Set> 
    <New id="pg_conn" class="org.mortbay.jetty.plus.naming.Resource"> 
     <Arg> 
      <Ref id="magazinesContext" /> 
     </Arg> 
     <Arg>jdbc/db</Arg> 
     <Arg> 
      <New class="org.apache.commons.dbcp.BasicDataSource"> 
       <Set name="driverClassName">org.postgresql.Driver</Set> 
       <Set name="url">jdbc:postgresql://localhost:5432/test_db</Set> 
       <Set name="username">test</Set> 
       <Set name="password">*****</Set> 
      </New> 
     </Arg> 
    </New> 
</Configure> 
Các vấn đề liên quan