茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1670797 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_00037.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

爪哇咖啡屋 : [轉貼]Jetty 的工作原理以及與 Tomcat 的比較

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]Jetty 的工作原理以及與 Tomcat 的比較

Jetty 的工作原理以及與 Tomcat 的比較

Jetty 應該是目前最活躍也是很有前景的一個 Servlet 引擎。本文將介紹 Jetty 基本架構與基本的工作原理:您將瞭解到 Jetty 的基本體系結構;Jetty 的啟動過程;Jetty 如何接受和處理用戶的請求。你還將瞭解到 AJP 的一些細節:Jetty 如何基於 AJP 工作;以及 Jetty 如何集成到 Jboss;最後我們將比較一下兩個 Servlet 引擎:Tomcat 和 Jetty 的優缺點。

Jetty 的基本架構

Jetty 目前的是一個比較被看好的 Servlet 引擎,它的架構比較簡單,也是一個可擴展性和非常靈活的應用服務器,它有一個基本數據模型,這個數據模型就是 Handler,所有可以被擴展的組件都可以作為一個 Handler,添加到 Server 中,Jetty 就是幫你管理這些 Handler。

Jetty 的基本架構

下圖是 Jetty 的基本架構圖,整個 Jetty 的核心組件由 Server 和 Connector 兩個組件構成,整個 Server 組件是基於 Handler 容器工作的,它類似與 Tomcat 的 Container 容器,Jetty 與 Tomcat 的比較在後面詳細介紹。Jetty 中另外一個比不可少的組件是 Connector,它負責接受客戶端的連接請求,並將請求分配給一個處理隊列去執行。

圖 1. Jetty 的基本架構

Jetty 中還有一些可有可無的組件,我們可以在它上做擴展。如 JMX,我們可以定義一些 Mbean 把它加到 Server 中,當 Server 啟動的時候,這些 Bean 就會一起工作。

圖 2. Jetty 的主要組件的類圖

從上圖可以看出整個 Jetty 的核心是圍繞著 Server 類來構建,Server 類繼承了 Handler,關聯了 Connector 和 Container。Container 是管理 Mbean 的容器。Jetty 的 Server 的擴展主要是實現一個個 Handler 並將 Handler 加到 Server 中,Server 中提供了調用這些 Handler 的訪問規則。

整個 Jetty 的所有組件的生命週期管理是基於觀察者模板設計,它和 Tomcat 的管理是類似的。下面是 LifeCycle 的類關係圖

每個組件都會持有一個觀察者(在這裡是 Listener 類,這個類通常對應到觀察者模式中常用的 Observer 角色,關於觀察者模式可以參考 Tomcat 系統架構與設計模式,第 2 部分
: 設計模式分析》一文中關於觀察者模式的講解)集合,當 start、fail 或 stop 等事件觸發時,這些 Listener 將會被調用,這是最簡單的一種設計方式,相比 Tomcat 的 LifeCycle 要簡單的多。

Handler 的體系結構

前面所述 Jetty 主要是基於 Handler 來設計的,Handler 的體系結構影響著整個 Jetty 的方方面面。下面總結了一下 Handler 的種類及作用:

圖 3. Handler 的體系結構(

Jetty 主要提供了兩種 Handler 類型,一種是 HandlerWrapper,它可以將一個 Handler 委託給另外一個類去執行,如我們要將一個 Handler 加到 Jetty 中,那麼就必須將這個 Handler 委託給 Server 去調用。配合 ScopeHandler 類我們可以攔截 Handler 的執行,在調用 Handler 之前或之後,可以做一些另外的事情,類似於 Tomcat 中的 Valve;另外一個 Handler 類型是 HandlerCollection,這個 Handler 類可以將多個 Handler 組裝在一起,構成一個 Handler 鏈,方便我們做擴展。


Jetty 的啟動過程


Jetty 的入口是 Server 類,Server 類啟動完成了,就代表 Jetty 能為你提供服務了。它到底能提供哪些服務,就要看 Server 類啟動時都調用了其它組件的 start 方法。從 Jetty 的配置文件我們可以發現,配置 Jetty 的過程就是將那些類配置到 Server 的過程。下面是 Jetty 的啟動時序圖:

圖 4. Jetty 的啟動流程

因為 Jetty 中所有的組件都會繼承 LifeCycle,所以 Server 的 start 方法調用就會調用所有已經註冊到 Server 的組件,Server 啟動其它組件的順序是:首先啟動設置到 Server 的 Handler,通常這個 Handler 會有很多子 Handler,這些 Handler 將組成一個 Handler 鏈。Server 會依次啟動這個鏈上的所有 Handler。接著會啟動註冊在 Server 上 JMX 的 Mbean,讓 Mbean 也一起工作起來,最後會啟動 Connector,打開端口,接受客戶端請求,啟動邏輯非常簡單。


接受請求

Jetty 作為一個獨立的 Servlet 引擎可以獨立提供 Web 服務,但是它也可以與其他 Web 應用服務器集成,所以它可以提供基於兩種協議工作,一個是 HTTP,一個是 AJP 協議。如果將 Jetty 集成到 Jboss 或者 Apache,那麼就可以讓 Jetty 基於 AJP 模式工作。下面分別介紹 Jetty 如何基於這兩種協議工作,並且它們如何建立連接和接受請求的。

基於 HTTP 協議工作

如果前端沒有其它 web 服務器,那麼 Jetty 應該是基於 HTTP 協議工作。也就是當 Jetty 接收到一個請求時,必須要按照 HTTP 協議解析請求和封裝返回的數據。那麼 Jetty 是如何接受一個連接又如何處理這個連接呢?


我們設置 Jetty 的 Connector 實現類為 org.eclipse.jetty.server.bi.SocketConnector 讓 Jetty 以 BIO 的方式工作,Jetty 在啟動時將會創建 BIO 的工作環境,它會創建 HttpConnection 類用來解析和封裝 HTTP1.1 的協議,ConnectorEndPoint 類是以 BIO 的處理方式處理連接請求,ServerSocket 是建立 socket 連接接受和傳送數據,Executor 是處理連接的線程池,它負責處理每一個請求隊列中任務。acceptorThread 是監聽連接請求,一有 socket 連接,它將進入下面的處理流程。

當 socket 被真正執行時,HttpConnection 將被調用,這裡定義了如何將請求傳遞到 servlet 容器裡,有如何將請求最終路由到目的 servlet,關於這個細節可以參考《 servlet 工作原理解析》一文。

下圖是 Jetty 啟動創建建立連接的時序圖:

圖 5. 建立連接的時序圖

Jetty 創建接受連接環境需要三個步驟:

  1. 創建一個隊列線程池,用於處理每個建立連接產生的任務,這個線程池可以由用戶來指定,這個和 Tomcat 是類似的。
  2. 創建 ServerSocket,用於準備接受客戶端的 socket 請求,以及客戶端用來包裝這個 socket 的一些輔助類。
  3. 創建一個或多個監聽線程,用來監聽訪問端口是否有連接進來。

相比 Tomcat 創建建立連接的環境,Jetty 的邏輯更加簡單,牽涉到的類更少,執行的代碼量也更少了。

當建立連接的環境已經準備好了,就可以接受 HTTP 請求了,當 Acceptor 接受到 socket 連接後將轉入下圖所示流程執行:

圖 6. 處理連接時序圖

Accetptor 線程將會為這個請求創建 ConnectorEndPoint。HttpConnection 用來表示這個連接是一個 HTTP 協議的連接,它會創建 HttpParse 類解析 HTTP 協議,並且會創建符合 HTTP 協議的 Request 和 Response 對象。接下去就是將這個線程交給隊列線程池去執行了。

基於 AJP 工作

通常一個 web 服務站點的後端服務器不是將 Java 的應用服務器直接暴露給服務訪問者,而是在應用服務器,如 Jboss 的前面在加一個 web 服務器,如 Apache 或者 nginx,我想這個原因大家應該很容易理解,如做日誌分析、負載均衡、權限控制、防止惡意請求以及靜態資源預加載等等。

下圖是通常的 web 服務端的架構圖:

圖 7. Web 服務端架構(

這種架構下 servlet 引擎就不需要解析和封裝返回的 HTTP 協議,因為 HTTP 協議的解析工作已經在 Apache 或 Nginx 服務器上完成了,Jboss 只要基於更加簡單的 AJP 協議工作就行了,這樣能加快請求的響應速度。

對比 HTTP 協議的時序圖可以發現,它們的邏輯幾乎是相同的,不同的是替換了一個類 Ajp13Parserer 而不是 HttpParser,它定義了如何處理 AJP 協議以及需要哪些類來配合。

實際上在 AJP 處理請求相比較 HTTP 時唯一的不同就是在讀取到 socket 數據包時,如何來轉換這個數據包,是按照 HTTP 協議的包格式來解析就是 HttpParser,按照 AJP 協議來解析就是 Ajp13Parserer。封裝返回的數據也是如此。


讓 Jetty 工作在 AJP 協議下,需要配置 connector 的實現類為 Ajp13SocketConnector,這個類繼承了 SocketConnector 類,覆蓋了父類的 newConnection 方法,為的是創建 Ajp13Connection 對像而不是 HttpConnection。如下圖表示的是 Jetty 創建連接環境時序圖:

與 HTTP 方式唯一不同的地方的就是將 SocketConnector 類替換成了 Ajp13SocketConnector。改成 Ajp13SocketConnector 的目的就是可以創建 Ajp13Connection 類,表示當前這個連接使用的是 AJP 協議,所以需要用 Ajp13Parser 類解析 AJP 協議,處理連接的邏輯都是一樣的。如下時序圖所示:

基於 NIO 方式工作

前面所描述的 Jetty 建立客戶端連接到處理客戶端的連接都是基於 BIO 的方式,它也支持另外一種 NIO 的處理方式,其中 Jetty 的默認 connector 就是 NIO 方式。

關於 NIO 的工作原理可以參考 developerworks 上關於 NIO 的文章,通常 NIO 的工作原型如下:


 Selector selector = Selector.open();
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.configureBlocking( false );
SelectionKey key = ssc.register( selector, SelectionKey.OP_ACCEPT );
ServerSocketChannel ss = (ServerSocketChannel)key.channel();
SocketChannel sc = ss.accept();
sc.configureBlocking( false );
SelectionKey newKey = sc.register( selector, SelectionKey.OP_READ );
Set selectedKeys = selector.selectedKeys();

創建一個 Selector 相當於一個觀察者,打開一個 Server 端通道,把這個 server 通道註冊到觀察者上並且指定監聽的事件。然後遍歷這個觀察者觀察到事件,取出感興趣的事件再處理。這裡有個最核心的地方就是,我們不需要為每個被觀察者創建一個線程來監控它隨時發生的事件。而是把這些被觀察者都註冊一個地方統一管理,然後由它把觸發的事件統一發送給感興趣的程序模塊。這裡的核心是能夠統一的管理每個被觀察者的事件,所以我們就可以把服務端上每個建立的連接傳送和接受數據作為一個事件統一管理,這樣就不必要每個連接需要一個線程來維護了。

這裡需要注意的地方時,很多人認為監聽 SelectionKey.OP_ACCEPT 事件就已經是非阻塞方式了,其實 Jetty 仍然是用一個線程來監聽客戶端的連接請求,當接受到請求後,把這個請求再註冊到 Selector 上,然後才是非阻塞方式執行。這個地方還有一個容易引起誤解的地方是:認為 Jetty 以 NIO 方式工作只會有一個線程來處理所有的請求,甚至會認為不同用戶會在服務端共享一個線程從而會導致基於 ThreadLocal 的程序會出現問題,其實從 Jetty 的源碼中能夠發現,真正共享一個線程的處理只是在監聽不同連接的數據傳送事件上,比如有多個連接已經建立,傳統方式是當沒有數據傳輸時,線程是阻塞的也就是一直在等待下一個數據的到來,而 NIO 的處理方式是只有一個線程在等待所有連接的數據的到來,而當某個連接數據到來時 Jetty 會把它分配給這個連接對應的處理線程去處理,所以不同連接的處理線程仍然是獨立的。

Jetty 的 NIO 處理方式和 Tomcat 的幾乎一樣,唯一不同的地方是在如何把監聽到事件分配給對應的連接的處理方式。從測試效果來看 Jetty 的 NIO 處理方式更加高效。下面是 Jetty 的 NIO 處理時序圖:


處理請求

下面看一下 Jetty 是如何處理一個 HTTP 請求的。


實際上 Jetty 的工作方式非常簡單,當 Jetty 接受到一個請求時,Jetty 就把這個請求交給在 Server 中註冊的代理 Handler 去執行,如何執行你註冊的 Handler,同樣由你去規定,Jetty 要做的就是調用你註冊的第一個 Handler 的 handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) 方法,接下去要怎麼做,完全由你決定。

要能接受一個 web 請求訪問,首先要創建一個 ContextHandler,如下代碼所示:


 Server server = new Server(8080);
ContextHandler context = new ContextHandler();
context.setContextPath("/");
context.setResourceBase(".");
context.setClassLoader(Thread.currentThread().getContextClassLoader());
server.setHandler(context);
context.setHandler(new HelloHandler());
server.start();
server.join();

當我們在瀏覽器裡敲入 http://localhost:8080 時的請求將會代理到 Server 類的 handle 方法,Server 的 handle 的方法將請求代理給 ContextHandler 的 handle 方法,ContextHandler 又調用 HelloHandler 的 handle 方法。這個調用方式是不是和 Servlet 的工作方式類似,在啟動之前初始化,然後創建對像後調用 Servlet 的 service 方法。在 Servlet 的 API 中我通常也只實現它的一個包裝好的類,在 Jetty 中也是如此,雖然 ContextHandler 也只是一個 Handler,但是這個 Handler 通常是由 Jetty 幫你實現了,我們一般只要實現一些我們具體要做的業務邏輯有關的 Handler 就好了,而一些流程性的或某些規範的 Handler,我們直接用就好了,如下面的關於 Jetty 支持 Servlet 的規範的 Handler 就有多種實現,下面是一個簡單的 HTTP 請求的流程。

訪問一個 Servlet 的代碼:


 Server server = new Server();
Connector connector = new SelectChannelConnector();
connector.setPort(8080);
server.setConnectors(new Connector[]{ connector });
ServletContextHandler root = new
ServletContextHandler(null,"/",ServletContextHandler.SESSIONS);
server.setHandler(root);
root.addServlet(new ServletHolder(new
org.eclipse.jetty.embedded.HelloServlet("Hello")),"/");
server.start();
server.join();

創建一個 ServletContextHandler 並給這個 Handler 添加一個 Servlet,這裡的 ServletHolder 是 Servlet 的一個裝飾類,它十分類似於 Tomcat 中的 StandardWrapper。下面是請求這個 Servlet 的時序圖:

圖 8. Jetty 處理請求的時序圖

上圖可以看出 Jetty 處理請求的過程就是 Handler 鏈上 handle 方法的執行過程,在這裡需要解釋的一點是 ScopeHandler 的處理規則,ServletContextHandler、SessionHandler 和 ServletHandler 都繼承了 ScopeHandler,那麼這三個類組成一個 Handler 鏈,它們的執行規則是:ServletContextHandler.handleServletContextHandler.doScope SessionHandler. doScopeServletHandler. doScopeServletContextHandler. doHandleSessionHandler. doHandleServletHandler. doHandle,它這種機制使得我們可以在 doScope 做一些額外工作。


與 Jboss 集成

前面介紹了 Jetty 可以基於 AJP 協議工作,在正常的企業級應用中,Jetty 作為一個 Servlet 引擎都是基於 AJP 協議工作的,所以它前面必然有一個服務器,通常情況下與 Jboss 集成的可能性非常大,這裡介紹一下如何與 Jboss 集成。

Jboss 是基於 JMX 的架構,那麼只要符合 JMX 規範的系統或框架都可以作為一個組件加到 Jboss 中,擴展 Jboss 的功能。Jetty 作為主要的 Servlet 引擎當然支持與 Jboss 集成。具體集成方式如下:


Jetty 作為一個獨立的 Servlet 引擎集成到 Jboss 需要繼承 Jboss 的 AbstractWebContainer 類,這個類實現的是模板模式,其中有一個抽像方法需要子類去實現,它是 getDeployer,可以指定創建 web 服務的 Deployer。Jetty 工程中有個 jetty-jboss 模塊,編譯這個模塊就會產生一個 SAR 包,或者可以直接從官網下載一個 SAR 包。解壓後如下圖:

圖 9. jboss-jetty 目錄

在 jboss-jetty-6.1.9 目錄下有一個 webdefault.xml 配置文件,這個文件是 Jetty 的默認 web.xml 配置,在 META-INF 目錄發下發現 jboss-service.xml 文件,這個文件配置了 MBean,如下:


name="jboss.web:service=WebServer" xmbean-dd="META-INF/webserver-xmbean.xml">

同樣這個 org.jboss.jetty.JettyService 類也是繼成 org.jboss.web.AbstractWebContainer 類,覆蓋了父類的 startService 方法,這個方法直接調用 jetty.start 啟動 Jetty。


與 Tomcat 的比較

Tomcat 和 Jetty 都是作為一個 Servlet 引擎應用的比較廣泛,可以將它們比作為中國與美國的關係,雖然 Jetty 正常成長為一個優秀的 Servlet 引擎,但是目前的 Tomcat 的地位仍然難以撼動。相比較來看,它們都有各自的優點與缺點。

Tomcat 經過長時間的發展,它已經廣泛的被市場接受和認可,相對 Jetty 來說 Tomcat 還是比較穩定和成熟,尤其在企業級應用方面,Tomcat 仍然是第一選擇。但是隨著 Jetty 的發展,Jetty 的市場份額也在不斷提高,至於原因就要歸功與 Jetty 的很多優點了,而這些優點也是因為 Jetty 在技術上的優勢體現出來的。

架構比較

從架構上來說,顯然 Jetty 比 Tomcat 更加簡單,如果你對 Tomcat 的架構還不是很瞭解的話,建議你先看一下 Tomcat 系統架構與設計模式》這篇文章。


Jetty 的架構從前面的分析可知,它的所有組件都是基於 Handler 來實現,當然它也支持 JMX。但是主要的功能擴展都可以用 Handler 來實現。可以說 Jetty 是面向 Handler 的架構,就像 Spring 是面向 Bean 的架構,iBATIS 是面向 statement 一樣,而 Tomcat 是以多級容器構建起來的,它們的架構設計必然都有一個「元神」,所有以這個「元神「構建的其它組件都是肉身。

從設計模板角度來看 Handler 的設計實際上就是一個責任鏈模式,接口類 HandlerCollection 可以幫助開發者構建一個鏈,而另一個接口類 ScopeHandler 可以幫助你控制這個鏈的訪問順序。另外一個用到的設計模板就是觀察者模式,用這個設計模式控制了整個 Jetty 的生命週期,只要繼承了 LifeCycle 接口,你的對象就可以交給 Jetty 來統一管理了。所以擴展 Jetty 非常簡單,也很容易讓人理解,整體架構上的簡單也帶來了無比的好處,Jetty 可以很容易被擴展和裁剪。

相比之下,Tomcat 要臃腫很多,Tomcat 的整體設計上很複雜,前面說了 Tomcat 的核心是它的容器的設計,從 Server 到 Service 再到 engine 等 container 容器。作為一個應用服務器這樣設計無口厚非,容器的分層設計也是為了更好的擴展,這是這種擴展的方式是將應用服務器的內部結構暴露給外部使用者,使得如果想擴展 Tomcat,開發人員必須要首先瞭解 Tomcat 的整體設計結構,然後才能知道如何按照它的規範來做擴展。這樣無形就增加了對 Tomcat 的學習成本。不僅僅是容器,實際上 Tomcat 也有基於責任鏈的設計方式,像串聯 Pipeline 的 Vavle 設計也是與 Jetty 的 Handler 類似的方式。要自己實現一個 Vavle 與寫一個 Handler 的難度不相上下。表面上看,Tomcat 的功能要比 Jetty 強大,因為 Tomcat 已經幫你做了很多工作了,而 Jetty 只告訴,你能怎麼做,如何做,有你去實現。


打個比方,就像小孩子學數學,Tomcat 告訴你 1+1=2,1+2=3,2+2=4 這個結果,然後你可以根據這個方式得出 1+1+2=4,你要計算其它數必須根據它給你的公式才能計算,而 Jetty 是告訴你加減乘除的算法規則,然後你就可以根據這個規則自己做運算了。所以你一旦掌握了 Jetty,Jetty 將變得異常強大。

性能比較

單純比較 Tomcat 與 Jetty 的性能意義不是很大,只能說在某種使用場景下,它表現的各有差異。因為它們面向的使用場景不盡相同。從架構上來看 Tomcat 在處理少數非常繁忙的連接上更有優勢,也就是說連接的生命週期如果短的話,Tomcat 的總體性能更高。

而 Jetty 剛好相反,Jetty 可以同時處理大量連接而且可以長時間保持這些連接。例如像一些 web 聊天應用非常適合用 Jetty 做服務器,像淘寶的 web 旺旺就是用 Jetty 作為 Servlet 引擎。

另外由於 Jetty 的架構非常簡單,作為服務器它可以按需加載組件,這樣不需要的組件可以去掉,這樣無形可以減少服務器本身的內存開銷,處理一次請求也是可以減少產生的臨時對象,這樣性能也會提高。另外 Jetty 默認使用的是 NIO 技術在處理 I/O 請求上更佔優勢,Tomcat 默認使用的是 BIO,在處理靜態資源時,Tomcat 的性能不如 Jetty。

特性比較

作為一個標準的 Servlet 引擎,它們都支持標準的 Servlet 規範,還有 Java EE 的規範也都支持,由於 Tomcat 的使用的更加廣泛,它對這些支持的更加全面一些,有很多特性 Tomcat 都直接集成進來了。但是 Jetty 的應變更加快速,這一方面是因為 Jetty 的開發社區更加活躍,另一方面也是因為 Jetty 的修改更加簡單,它只要把相應的組件替換就好了,而 Tomcat 的整體結構上要複雜很多,修改功能比較緩慢。所以 Tomcat 對最新的 Servlet 規範的支持總是要比人們預期的要晚。


總結


本文介紹了目前 Java 服務端中一個比較流行應用服務器 Jetty,介紹了它的基本架構和工作原理以及如何和 Jboss 工作,最後與 Tomcat 做了比較。在看這篇文章的時候最好是結合我前面寫的兩篇文章《 Tomcat 系統架構與設計模式》和《 Servlet 工作原理解析》以及這些系統的源代碼,耐心的都看一下會讓你對 Java 服務端有個總體的瞭解。

參考資料

學習

  • 查看文章 《 Tomcat 系統架構與設計模式》(developerWorks,2010 年 5 月):瞭解 Tomcat 中容器的體系結構,基本的工作原理,以及 Tomcat 中使用的經典的設計模式介紹。
  • Servlet 工作原理解析,(developerWorks,2011 年 2 月):以 Tomcat 為例瞭解 Servlet 容器是如何工作的?一個 Web 工程在 Servlet 容器中是如何啟動的? Servlet 容器如何解析你在 web.xml 中定義的 Servlet ?用戶的請求是如何被分配給指定的 Servlet 的? Servlet 容器如何管理 Servlet 生命週期?你還將瞭解到最新的 Servlet 的 API 的類層次結構,以及 Servlet 中一些難點問題的分析。
  • Tomcat vs Jetty,對 Tomcat 與 Jetty 的做了比較。

  • HTTP 協議,W3C 關於 HTTP 協議的詳細描述。
  • developerWorks Java 技術專區:這裡有數百篇關於 Java 編程各個方面的文章。

討論

  • 加入 developerWorks 中文社區。查看開發人員推動的博客、論壇、組和維基,並與其他 developerWorks 用戶交流。

原文出處: Jetty 的工作原理以及与 Tomcat 的比较
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]Install Jetty Web Server On CentOS 7

Install Jetty Web Server On CentOS 7

By Jijo


Jetty is a pure Java-based HTTP (Web) server and Java Servlet container. Jetty is now often used for machine to machine communications, usually within larger software frameworks. But the other Web Servers are usually associated with serving documents to humans. Jetty is developed as a free and open source project as part of the Eclipse Foundation. The web server is used in products such as Apache ActiveMQ, Alfresco, Apache Geronimo, Apache Maven, Apache Spark, Google App Engine, Eclipse, FUSE, Twitter's Streaming API and Zimbra.

This article explains ‘How to install jetty web server in your CentOS server’.

First of all we have to install java JDK, By the following command:

yum -y install java-1.7.0-openjdk wget

After the JDK installation, We will download the latest version of Jetty:

wget http://download.eclipse.org/jetty/stable-9/dist/jetty-distribution-9.2.7.v20150116.tar.gz

Extract and move the the downloaded package to /opt:

tar zxvf jetty-distribution-9.2.5.v20141112.tar.gz -C /opt/

Rename the file name to jetty:

mv /opt/jetty-distribution-9.2.5.v20141112.tar.gz/ /opt/jetty

Create a user called jetty:

useradd -m jetty

Change the ownership of jetty:

chown -R jetty:jetty /opt/jetty/

Make a Symlink jetty.sh to /etc/init.d directory to create a start up script file:

ln -s /opt/jetty/bin/jetty.sh /etc/init.d/jetty

Add script:

chkconfig --add jetty

Make the jetty web server auto starts on system boot:

chkconfig --level 345 jetty on

Open /etc/default/jetty in your favorite editor and replace port and listening address desired value:

vi /etc/default/jetty

JETTY_HOME=/opt/jetty
JETTY_USER=jetty
JETTY_PORT=8080
JETTY_HOST=50.116.24.78
JETTY_LOGS=/opt/jetty/logs/

We finished the installation, Now you have to start the jetty service.

service jetty start

All done!

Now you can access jetty web sever in http://:8080

That’s it!

Cheers!!

在CentOS 7中安裝Jetty服務器

編譯自: http://www.unixmen.com/install-jetty-web-server-centos-7/ 作者: Jijo
原創: LCTT
https://linux.cn/article-4792-1.html
譯者: geekpi
本文地址: https://linux.cn/article-4792-1.html

Jetty 是一款純Java的HTTP (Web) 服務器和Java Servlet容器。 通常在更大的網絡框架中,Jetty經常用於設備間的通信,而其他Web服務器通常給“人類”傳遞文件 :D。Jetty是一個Eclipse基金會的免費開源項目。這個Web服務器用於如Apache ActiveMQ、 Alfresco、 Apache Geronimo、 Apache Maven、 Apache Spark、Google App Engine、 Eclipse、 FUSE、 Twitter的 Streaming API 和 Zimbra中。

這篇文章會介紹‘如何在CentOS服務器中安裝Jetty服務器’。

首先我們要用下面的命令安裝JDK:


yum -y install java-1.7.0-openjdk wget

JDK安裝之後,我們就可以下載最新版本的Jetty了:


wget http://download.eclipse.org/jetty/stable-9/dist/jetty-distribution-9.2.5.v20141112.tar.gz

解壓並移動下載的包到/opt:


tar zxvf jetty-distribution-9.2.5.v20141112.tar.gz -C /opt/

重命名文件夾名為jetty:


mv /opt/jetty-distribution-9.2.5.v20141112/ /opt/jetty

創建一個jetty用戶:


useradd -m jetty

改變jetty文件夾的所屬用戶:


chown -R jetty:jetty /opt/jetty/

為jetty.sh創建一個軟鏈接到 /etc/init.d directory 來創建一個啟動腳本文件:


ln -s /opt/jetty/bin/jetty.sh /etc/init.d/jetty

添加腳本:


chkconfig --add jetty

是jetty在系統啟動時啟動:


chkconfig --level 345 jetty on

使用你最喜歡的文本編輯器打開 /etc/default/jetty 並修改端口和監聽地址:


vi /etc/default/jetty



JETTY_HOME=/opt/jetty
JETTY_USER=jetty
JETTY_PORT=8080
JETTY_HOST=50.116.24.78
JETTY_LOGS=/opt/jetty/logs/

* 我們完成了安裝,現在可以啟動jetty服務了 *


service jetty start

完成了!

現在你可以在 http://<你的 IP 地址>:8080 中訪問了

就是這樣。

乾杯!!


via: http://www.unixmen.com/install-jetty-web-server-centos-7/

作者: Jijo 譯者: geekpi 校對: wxy

本文由 LCTT 原創翻譯, Linux中國 榮譽推出


原文出處: Install Jetty Web Server On CentOS 7 | Unixmen

原文出處: 在CentOS 7中安装Jetty服务器-系统运维|Linux.中国-开源社区
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]在 Ubuntu 14.10 Server 上安裝 Jetty 9

在 Ubuntu 14.10 Server 上安裝 Jetty 9(Java服務引擎和Web服務器)

Jetty提供了一個Web服務器和javax.servlet容器,為SPDY、WebSocket、OSGi、JMX、JNDI、JAAS以及許多其它集成套件添加了支持。這些組件都是開源的,也可用於商業用途和分發。


Jetty被廣泛用於多種項目和產品,都可以在開發環境和生產環境中使用。Jetty可以很容易地嵌入到設備、工具、框架、應用服務器以及集群中。更多用途可參見Jetty網頁。

Jetty特性

  • 全功能並基於標準
  • 開源與商用兩可
  • 靈活和可擴展
  • 小足跡
  • 可嵌入
  • 異步支持
  • 企業彈性擴展
  • Apache和Eclipse雙重許可證

ubuntu 14.10 server上安裝Jetty 9

先決條件

在安裝Jetty服務器前,您需要通過以下命令安裝Java


sudo apt-get install openjdk-8-jdk

Java將會安裝到/usr/lib/jvm/java-8-openjdk-i386,同時在該目錄下會創建一個名為java-8-openjdk-i386的符號鏈接,在/usr/bin/java下也會相應創建符號鏈接。

現在你需要從 這裡下載Jetty9,在下載完成後,你需要使用以下命令來解壓縮


$tar -xvf jetty-distribution-9.2.5.v20141112.tar.gz

該操作會將它解壓到jetty-distribution-9.2.5.v20141112,而你需要使用以下命令將歸檔文件移動到/opt/jetty


$mv jetty-distribution-9.2.5.v20141112 /opt/jetty

你需要創建jetty用戶,並將其設置成/opt/jetty目錄的屬主


sudo useradd jetty -U -s /bin/false
sudo chown -R jetty:jetty /opt/jetty

使用以下命令拷貝Jetty腳本到啟動目錄,以便讓它作為一個服務來運行


$ cp /opt/jetty/bin/jetty.sh /etc/init.d/jetty

現在,你需要使用以下內容來創建Jetty設置文件


sudo vi /etc/default/jetty

添加以下行


JAVA_HOME=/usr/bin/java
JETTY_HOME=/opt/jetty
NO_START=0
JETTY_ARGS=jetty.port=8085
JETTY_HOST=0.0.0.0
JETTY_USER=jetty

保存並退出該文件

你需要使用以下命令來啟動Jetty服務


sudo service jetty start

你應該看到和下面類似的輸出


Starting Jetty: OK Mon Nov 24 11:55:48 GMT 2014

如果你看到了下面的錯誤

** ERROR: JETTY_HOME not set, you need to set it or install in a standard location

你需要確保在/etc/default/jetty文件中設置了正確的Jetty家目錄路徑,你可以使用以下URL來測試jetty。

Jetty現在應該運行在8085端口,打開瀏覽器並訪問http://服務器IP:8085,你應該可以看到Jetty屏幕。

Jetty服務檢查

使用以下命令來驗證並檢查配置


sudo service jetty check

使用以下命令來讓Jetty開重啟後自動啟動


sudo update-rc.d jetty defaults

重啟服務器並測試Jetty是否自動啟動。

要檢查Jetty運行在哪個端口上,或者該端口是否與其它程序衝突,可以運行netstat -tln


via: http://www.ubuntugeek.com/install-jetty-9-java-servlet-engine-and-webserver-on-ubuntu-14-10-server.html

作者: ruchi 譯者: GOLinux 校對: wxy

本文由 LCTT 原創翻譯, Linux中國 榮譽推出


原文出處:在 Ubuntu 14.10 Server 上安装 Jetty 9(Java服务引擎和Web服务器)-系统运维|Linux.中国-开源社区
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|