網店版重生系列:Linux下Jboss啟動、關閉、連接埠配置等常見問題FAQ

來源:互聯網
上載者:User
  1. 單台Linux伺服器中如何部署多個獨立應用,即多個應用不能run在一個jboss執行個體中?
    換言之,這個問題也可以這樣描述:在單台Linux伺服器中服務啟動多個Jboss執行個體?
    預設情況下,jboss啟動時載入server/default/目錄下的配置,要實現多個執行個體的啟動,主要是解決連接埠衝突的問題,因為一套連接埠只能被一個應用佔有;
    一般來說,我們可以在Jboss啟動時通過-Djboss.server.home設定當前執行個體啟動時載入不同的目錄來實現;
    比如Jboss主程式安裝在/usr/xx/jboss/,應用放在/home/admin/app/;那此時就可以cp一份default目錄到當前應用app目錄下,通過-Djboss.server.home=/home/admin/app/default來啟動該執行個體;
    若直接在/usr/xx/jboss/server/下複製default目錄並改名為yy,則可以用更簡單的參數-c yy來啟動; 
    對於多應用的情況,我們仍然要解決連接埠衝突的問題,有兩種方式:
    其一,直接修改各應用對應的default目錄下的所有配置連接埠,主要涉及設定檔conf/jboss-service.xml、tomcat下的server.xml;該方法比較土,很容易出錯,因為連接埠眾多,只要有一項連接埠沒有改,jboss就將無法正常啟動;若應用較少,比如就只有2個,那這種方式勉強可以用用;
    其二,在jboss-service.xml中啟用jboss.system:service=ServiceBindingManager這個mbean服務,設定ServerName、StoreURL屬性;將各套應用對應的連接埠全部配置在同一個檔案中;推薦採用該方案,具體可參考:<mbean code="org.jboss.services.binding.ServiceBindingManager"<br /> name="jboss.system:service=ServiceBindingManager"><br /> <attribute name="ServerName">ports-01</attribute><br /> <attribute name="StoreURL">${jboss.home.url}/docs/examples/binding-manager/sample-bindings.xml</attribute><br /> <attribute name="StoreFactoryClassName"><br /> org.jboss.services.binding.XMLServicesStoreFactory<br /> </attribute><br /></mbean>
  2. Jboss無法正常啟動,報異常javax.management.MBeanRegistrationException: preRegister() failed?
    一般來說,上面的異常出現在4.2及其以後的版本中,比較詳細的異常如下:javax.management.MBeanRegistrationException: preRegister() failed: [ObjectName='jboss.remoting:service=NetworkRegistry', Class=org.jboss.remoting.network.NetworkRegistry (org.jboss.remoting.network.NetworkRegistry@16b6c55)]<br /> at org.jboss.mx.server.registry.BasicMBeanRegistry.invokePreRegister(BasicMBeanRegistry.java:713)<br /> at org.jboss.mx.server.registry.BasicMBeanRegistry.registerMBean(BasicMBeanRegistry.java:211)<br /> at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)<br /> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br /> at java.lang.reflect.Method.invoke(Method.java:585)<br /> at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)<br /> ... 51 more<br />Caused by: java.lang.RuntimeException: Exception creating identity: mall_dev4: mall_dev4<br /> at org.jboss.remoting.ident.Identity.get(Identity.java:211)<br /> at org.jboss.remoting.network.NetworkRegistry.preRegister(NetworkRegistry.java:268)<br /> at org.jboss.mx.server.AbstractMBeanInvoker.invokePreRegister(AbstractMBeanInvoker.java:966)<br /> at org.jboss.mx.modelmbean.ModelMBeanInvoker.invokePreRegister(ModelMBeanInvoker.java:489)<br /> at org.jboss.mx.server.AbstractMBeanInvoker.preRegister(AbstractMBeanInvoker.java:654)<br /> at org.jboss.mx.server.registry.BasicMBeanRegistry.invokePreRegister(BasicMBeanRegistry.java:697)<br /> ... 56 more
    這主要是因為Jboss啟動了一個jboss.remoting:service=NetworkRegistry的mbean服務,啟動時卻又無法根據當前hostname找到IP!
    解決方案為在/etc/hosts中綁定當前伺服器的主機名稱和IP,比如10.2.224.214 mall_dev4; 
    對於4.2系列之前的版本,如果沒有綁定主機名稱和IP,雖然會出現以下的異常,但並不一定會影響應用的正常啟動;11:32:12,427 WARN [ServiceController] Problem starting service jboss:service=invoker,type=http<br />java.net.UnknownHostException: mall_dev4: mall_dev4<br /> at java.net.InetAddress.getLocalHost(InetAddress.java:1308)<br /> at org.jboss.invocation.http.server.HttpInvoker.checkInvokerURL(HttpInvoker.java:204)<br /> at org.jboss.invocation.http.server.HttpInvoker.startService(HttpInvoker.java:101)<br /> at org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:289)<br /> at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:245)<br /> at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)<br /> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br /> at java.lang.reflect.Method.invoke(Method.java:585)<br /> at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)<br /> at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)<br /> at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)<br /> at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)<br /> at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)<br /> at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:978)<br /> at $Proxy0.start(Unknown Source)<br /> at org.jboss.system.ServiceController.start(ServiceController.java:417)
  3. Jboss已經正常啟動,但是無法用IP或者綁定IP訪問應用?
    熟悉Linux相關知識的筒靴都知道一個連接埠是綁定在某個地址上的,可以是一個,也可以是多個,一個連接埠在同一個地址上不能被兩個應用佔有;
    出現這個問題一般是因為你使用的是4.2系列及其之後的版本,因為從這個系列開始,Jboss預設綁定的連接埠由之前的0.0.0.0變成了127.0.0.1;前者表示綁定當前伺服器下所有地址,包括自身的IP、127.0.0.1;而後者只綁定了127.0.0.1,而沒有綁定本機IP,通過IP去訪問應用自然也就無法成功了,因為訪問的IP地址沒有開放對應的連接埠;
    對於預設的這種情況,一般來說jboss是要和apache搭配使用的,apache暴露應用外部存取的連接埠,然後apache再監聽本地(也就是127.0.0.1)的連接埠;
    當然這個預設配置也是可以修改的,方式也比較多,比如:
    方式1,啟動指令碼中通過參數-b, --host=<host or ip>指定地址,比如-b 0.0.0.0就表示綁定所有地址;
    方式2,啟動指令碼中通過參數-Djboss.bind.address指定地址,比如-Djboss.bind.address=0.0.0.0;
    方式3,直接修改需要對外暴露的連接埠綁定地址,比如tomcat/server.xml中的http連接埠綁定address資訊;
  4. Jboss正常啟動,但是用shutdown指令碼無法關閉應用?
    對於jboss的關閉,shutdown命令允許好幾種方式的關閉,可以參考該命令的協助:usage: shutdown [options] <operation><br />options:<br /> -h, --help Show this help message (default)<br /> -D<name>[=<value>] Set a system property<br /> -- Stop processing options<br /> -s, --server=<url> Specify the JNDI URL of the remote server<br /> -n, --serverName=<url> Specify the JMX name of the ServerImpl<br /> -a, --adapter=<name> Specify JNDI name of the MBeanServerConnection to use<br /> -u, --user=<name> Specify the username for authentication<br /> -p, --password=<name> Specify the password for authentication<br />operations:<br /> -S, --shutdown Shutdown the server<br /> -e, --exit=<code> Force the VM to exit with a status code<br /> -H, --halt=<code> Force the VM to halt with a status code 一般來說,我們使用-s參數來關閉,也即通過JNDI URL;
    若是基於JNDI URL的方式出現這種情況一般有三種可能:
    其一,當前應用所使用的default目錄內的內容與當前運行jboss自身的default內容不一致,比如當前jboss版本為4.0.5,而啟動時指定的default卻是從jboss 4.2.1中cp過來的;這種情況在搭建環境時經常出現,因為一般直接從另外一台linux伺服器中scp過來,但其實兩台伺服器自身安裝的jboss版本不一致;
    其二,shutdown命令中指定的JNDI連接埠與實際應用啟動的JNDI連接埠不一致
    其三,/etc/hosts中對當前主機名稱綁定的IP地址不正確,比如當前伺服器實際的IP地址為10.2.224.214,而hosts中綁定的卻是10.0.0.1;
    總之,出現此類情況都是因為jboss自身無法正確接收到正確的關閉命令所致,一般來說在jboss的server.log中會拋如下的異常資訊:
    Exception in thread "main" javax.naming.CommunicationException [Root exception is java.rmi.ConnectException: Connection refused to host: 10.0.0.1; nested exception is:<br /> java.net.ConnectException: Connection timed out]<br /> at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:707)<br /> at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:572)<br /> at javax.naming.InitialContext.lookup(InitialContext.java:351)<br /> at org.jboss.Shutdown.main(Shutdown.java:202)<br />Caused by: java.rmi.ConnectException: Connection refused to host: 10.0.0.1; nested exception is:<br /> java.net.ConnectException: Connection timed out<br /> at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:574)<br /> at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)<br /> at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)<br /> at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:94)<br /> at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)<br /> at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:610)<br /> ... 3 more
  5. 如何對Linux下的Jboss應用進行debug?
    其實這個問題和Jboss是否部署在Linux下沒有直接關係,可以在jboss啟動時指定遠程debug連接埠即可,比如:
    -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n
    然後在eclipse中建立remote debug時指定對應的連接埠即可; 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.