Jboss eap7.1 配置部署

小猴紫啊發表於2019-08-28

本文介紹了Linux系統下Jboss-eap-7.1伺服器 standalone 模式的配置部署入門。90%的內容來自jboss的官方配置文件
只不過從初學者的角度對配置過程進行了梳理,介紹了部署應用時普遍會用到的配置項。參考本文,大多數應用可以在Jboss-eap-7.1上成功執行。
下文出現的命令、程式碼和檔案地址中,{JBOSS_HOME}指代Jboss-eap-7.1所處的根目錄。
安裝與啟動、停止
安裝:所謂“安裝”,就是把下載好的包解壓到某個地址即可。
啟動:進入{JBOSS_HOME}/bin目錄,執行 standalone.sh 指令碼,看到輸出started in XXXXms,就證明伺服器已經成功啟動。
停止:伺服器的程式通常都是後臺執行。停止時,在{JBOSS_HOME}/bin目錄下執行 ./jboss-cli.sh --connect,進入命令列管理頁面,輸入shutdown命令,即可停止伺服器。(也可以合併為一條語句:./jboss-cli.sh --connect command=:shutdown)
配置:修改{JBOSS_HOME}/bin下的 standalone.conf 檔案,可以改變Jboss啟動的配置。
在檔案中加入 JAVA_HOME="/path/jdk",可以指定使用的jdk,而不必依賴於系統預設的java環境變數。
在檔案中加入 LANG=Zh_CN.GB18030,可以設定語言環境為中文
修改JAVA_OPTS,可以設定JVM的啟動引數
基本概念

jboss-eap-7.1有兩種執行模式,standalone——單機模式 和 domain——叢集模式。本文介紹了單機模式的部署。
jboss啟動伺服器時,預設讀取的配置檔案是{JBOSS_HOME}/standalone/configuration/standalone.xml。也可以指定讀取其他配置檔案,命令是./standalone.sh --server-config=standalone-custom.xml

jboss-cli(command line interface),是jboss的命令列管理工具。執行{JBOSS_HOME}/bin/jboss-cli.sh即可進入。通過命令列實現部署解除安裝應用、配置系統設定和執行管理任務的功能。使用該工具修改系統配置時,最終也會作用到standalone.xml中。直接改xml的方式非常直觀,所以更受本人青睞,本文所有配置示例均是直接修改xml。
Management Console,管理控制檯。是jboss提供的web管理系統,地址在http://localhost:9990/console/App.html, 所有的操作均可通過jboss-cli實現,本文不再介紹該工具。

standalone.xml配置
地址配置
預設的配置,伺服器啟動後只能通過localhost訪問。通過網路卡IP地址訪問時,需修改配置檔案。找到下面的配置片段

<interfaces>
    <interface name="management">
        <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
    </interface>
    <interface name="public">
        <inet-address value="${jboss.bind.address:127.0.0.1}"/>
    </interface>
</interfaces>

將 public 標籤下的地址修改為網路卡ip地址,這樣就能通過IP地址訪問。也可以設定為0.0.0.0,機器上所有可用的ip地址均可以訪問。
不建議修改 management 標籤下的地址,個人認為遠端的管理存在一定風險,還是直接在機器上做比較好。
埠配置
修改監聽的埠,找到下面的配置片段:

<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
    <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
    ………… ………… …………
    <socket-binding name="http" port="${jboss.http.port:8080}"/>
    <socket-binding name="https" port="${jboss.https.port:8443}"/>
    ………… ………… …………
</socket-binding-group>

根據需要修改不同協議監聽的埠。管理控制檯的埠預設是9990,也可以在此處修改。
資料來源配置

資料來源配置如下面程式碼所示,標籤的含義非常明晰,不再針對標籤做解釋說明。

<subsystem xmlns="urn:jboss:domain:datasources:5.0">
    <datasources>
        ………… ………… …………  
        <datasource jndi-name="java:jboss/datasources/MyDB" pool-name="MyDB" enabled="true" use-java-context="true" use-ccm="true">
            <connection-url>jdbc:jtds:sybase://10.2.4.16:11100/testDB;charset=cp936</connection-url>
            <driver>jtds124</driver>
            <pool>
                <min-pool-size>1</min-pool-size>
                <max-pool-size>20</max-pool-size>
                <prefill>true</prefill>
            </pool>
            <security>
                <user-name>user</user-name>
                <password>password</password>
            </security>
            <validation>
                <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.sybase.SybaseValidConnectionChecker"/>
                <check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
                <validate-on-match>true</validate-on-match>
                <exception-sorter class-name="org.jboss.resource.adapter.jdbc.vendor.SybaseExceptionSorter"/>
            </validation>
            <timeout>
                <blocking-timeout-millis>30000</blocking-timeout-millis>
                <idle-timeout-minutes>1</idle-timeout-minutes>
            </timeout>
            <statement>
                <track-statements>true</track-statements>
            </statement>
        </datasource>
        <drivers>
            ………… ………… …………      
            <driver name="jtds124" module="net.sourceforge.jtds.jdbc.124">
                <xa-datasource-class>net.sourceforge.jtds.jdbcx.JtdsDataSource</xa-datasource-class>
            </driver>
        </drivers>
    </datasources>
</subsystem>

配置好資料來源後,需要將資料庫驅動jar包放在 {JBOSS_HOME}/modules 下正確的位置,才能成功繫結資料來源。驅動的放置目錄要和driver標籤中module的值保持一致,以上面的配置為例,驅動jar包的路徑應該是
${JBOSS_HOME}/modules/modules/net/sourceforge/jtds/jdbc/124/main/
main不要體現在屬性中,124資料夾下必須要有main資料夾,jar包在main資料夾中。
main資料夾下還要有module.xml,配置示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="net.sourceforge.jtds.jdbc.124">
    <resources>
        <resource-root path="jtds-1.2.4.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
        <module name="org.jboss.as.connector"/>
    </dependencies>
</module>

module.xml中module標籤的 name 屬性要和standalone.xml中driver標籤的 module 屬性保持一致。
符合JDBC標準的資料來源如此就配置完成。但本例中使用的是jtds,所以還要做額外的操作,否則無法正確繫結資料來源。在驅動jar包的META-INF資料夾中新建 services 資料夾,然後新建名為 java.sql.Driver 的檔案,在檔案第一行寫下Driver的路徑。本例中,java.sql.Driver檔案的內容如下:
net.sourceforge.jtds.jdbc.Driver
經過上述配置,在啟動伺服器時,看到輸出Started Driver service with driver-name = jtds124,證明資料來源配置成功。
Undertow容器配置
經過下面的配置操作,修改了接收http請求的設定、容器預設的字符集,移除了jboss預設的歡迎頁面,開啟了http訪問的日誌以及輸出http請求和響應的資訊。
找到如下配置片段,預設配置為:

<subsystem xmlns="urn:jboss:domain:undertow:4.0">
    <buffer-cache name="default"/>
    <server name="default-server">
        <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
        <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/>
        <host name="default-host" alias="localhost">
            <location name="/" handler="welcome-content"/>
            <filter-ref name="server-header"/>
            <filter-ref name="x-powered-by-header"/>
            <http-invoker security-realm="ApplicationRealm"/>
        </host>
            </server>
    <servlet-container name="default">
        ………… ………… …………
    </servlet-container>
    <handlers>
        <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
    </handlers>
    <filters>
        ………… ………… …………
    </filters>
</subsystem>

修改後的配置如下:

<subsystem xmlns="urn:jboss:domain:undertow:4.0">
    <buffer-cache name="default"/>
    <server name="default-server">
        <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true" url-charset="GBK" decode-url="false"/>
        <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/>
        <host name="default-host" alias="localhost">
            <!-- <location name="/" handler="welcome-content"/> -->
            <filter-ref name="server-header"/>
            <filter-ref name="x-powered-by-header"/>
            <http-invoker security-realm="ApplicationRealm"/>
            <filter-ref name="request-dumper"/>
            <access-log pattern="combined" directory="${jboss.home.dir}/standalone/log"/>
        </host>
            </server>
    <servlet-container name="default" default-encoding="GBK" use-listener-encoding="true">
        ………… ………… …………
    </servlet-container>
    <!-- <handlers>
        <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
    </handlers> -->
    <filters>
        ………… ………… …………
        <filter name="request-dumper" class-name="io.undertow.server.handlers.RequestDumpingHandler" module="io.undertow.core"/>
    </filters>
</subsystem>

修改http請求設定:在http-listener標籤中,增加了url-charset和decode-url。其中url-charset預設使用的UTF-8,可以根據需要修改。decode-url指是否使用字符集解碼url和引數,預設為true。設為false則交由後續程式碼進行解碼處理。http-listener的詳細配置屬性點選這裡。

修改容器預設字符集:在servlet-container標籤中,default-encoding設定所有應用的字符集(預設為utf-8),use-listener-encoding指是否使用listener定義的編碼。servlet-container的詳細配置屬性點選這裡。

移除Jboss預設歡迎頁面:配置檔案中註釋的部分,就是jboss預設歡迎頁面的配置。直接註釋就是將其移除,也可以將預設地址對映到某個應用上。

開啟http訪問日誌:在host標籤下增加access-log這一標籤,即可將http請求的資訊記在日誌中,便於除錯。directory是日誌存放的目錄,預設檔名為access_log.log。pattern是要日誌中記錄的資訊,預定義了common和combined兩種模式,combined的資訊豐富一些。自定義的輸出模式詳見此處。

輸出http請求和響應的資訊:在filters標籤下增加名為request-dumper的filter,在host標籤下增加命名一致的filter-ref,就能在jboss日誌中輸出每一個http請求的request和response資訊,便於除錯。

注:對於上面的操作1,早期版本中,在extensions和management標籤之間增加下面的配置程式碼,可以實現同樣的效果。但自從wildfly 8 之後,jboss放棄tomcat容器轉而使用undertow,所以下面的配置不再起作用了。

<system-properties>
    <property name="org.apache.catalina.connector.URI_ENCODING" value="GBK"/>
    <property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true"/>
</system-properties>

部署應用

下面將介紹三種部署模式,但官方推薦在生產環境中,使用第三種手動模式,前兩種可以應用於開發環境。
應用部署相關的預設配置如下:

<subsystem xmlns="urn:jboss:domain:deployment-scanner:2.0">
            <deployment-scanner path="deployments" relative-to="jboss.server.base.dir" scan-interval="5000" runtime-failure-causes-rollback="${jboss.deployment.scanner.rollback.on.failure:false}"/>
</subsystem>

scan-interval是每隔多少毫秒掃描deployments資料夾下的變化。如果設定的值小於1,則只在啟動時掃描。
全自動模式
在預設配置下,將war包上傳至{JBOSS_HOME}/standalone/deployments,伺服器會在啟動時和每5000毫秒間隔,檢查deployments下的檔案變化,部署應用。
半自動模式
增加屬性 auto-deploy-zipped=“false”
上傳應用myApp.war至deployments資料夾後,在deployments資料夾下新建一個檔案,命名為myApp.war.dodeploy,伺服器檢測到這個檔案後,則會開始執行部署。更多配置詳情點選這裡。
手動模式
增加屬性scan-enabled=“false”
此模式是官方推薦的生產環境部署應用方式,無需將應用上傳至deployments資料夾下。首先保證myApp.war在伺服器上,假設其路徑為/usr/me/myApp.war。
啟動伺服器,並使用./jboss-cli.sh --connect命令進入命令列管理介面。執行命令deploy /usr/me/myApp.war部署應用。取消部署時,在命令列管理介面執行 undeploy myApp.war。
應用的資料會在{JBOSS_HOME}/standalone/data/content下,並且standalone.xml最下方會出現deployments標籤,顯示已經部署的應用。
題外話
既然是一個入門級的教程,就介紹下jboss一系列的產品。因為改名,導致jboss系列越來越亂,下面做一個簡單梳理。
Undertow: Jboss自主研發的Servlet容器。
Jboss AS(Application Server): Jboss社群版的早期版本,由於和Jboss eap名稱相近,在Jboss AS7之後就改名為Wildfly。內部封裝的容器是基於Tomcat的升級版。
WildFly: 版本號從WildFly 8.0開始,由Jboss AS改名而來。內部封裝的容器是Undertow。
Jboss EAP(Enterprise Application Platform):Jboss的企業版。會將社群版中驗證過的,成熟的技術引入該版本,支援週期長。6的版本以Jboss AS7為基礎;7的版本以Wildfly為基礎。

參考資料

[1. 非jdbc驅動配置services](https://developer.jboss.org/thread/249928)

轉自:https://www.jianshu.com/p/4baaf549436b

相關文章