Jeżeli używamy serwer JBoss na serwerze produkcyjnym, powinien on zostać skonfigurowany tak, aby uruchamiał się podczas startu aplikacji i zatrzymywał podczas jego wyłączanie.
Opis powstał w oparciu o Ubuntu, ale raczej nie powinno być większych problemów z przystosowaniem go do działania na innych systemach linuksowych. Prawdopodobnie wystarczy odpowiednio zmodyfikować ścieżki dostępu oraz skonfigurować odpowiednie linki uruchamiające JBossa w odpowiednim poziomie startu.
Skrypt startowy
JBoss przychodzi ze skryptami pozwalającymi na jego automatyczne uruchamianie. Można je znaleźć w katalogu $JBOSS_HOME/bin
:
- jboss_init_hpux.sh
- jboss_init_redhat.sh
- jboss_init_solaris.sh
Jak widać istnieją trzy skrypty przygotowanie do użycia w rożnych systemach operacyjnych. Nam potrzebny będzie jboss_init_redhat.sh
Pierwszym krokiem będzie skopiowanie pliku jboss_init_redhat.sh
do katalogu /etc/init.d
pod nową nazwą jboss
:
Teraz należy skrypt startowy odpowiednio zmodyfikować i dostosować do konfiguracji naszego systemu operacyjnego. Wszelkie modyfikacje powinny być wprowadzane w pliku /etc/init.d/jboss
.
Utworzenie nieuprzywilejowanego użytkownika
Serwer aplikacji JBoss w swojej standardowej konfiguracji nie wymaga ani dostępu do uprzywilejowanych miejsc w systemie operacyjnym ani nie używa żadnych uprzywilejowanych portów. Z tego powodu powinien być on uruchamiany jako na uprawnieniach nieuprzywilejowanego użytkownika. Należy więc utworzyć odpowiedniego użytkownika i użyć go do uruchomienia serwera aplikacji:
Polecenie to spowoduje utworzenie użytkownika jboss
wraz z grupą jboss
ale bez tworzenia katalogu domowego, oraz bez definiowania hasła czy innych parametrów użytkownika.
Należy jeszcze odpowiednio zmienić uprawnienia katalogu z serwerem JBoss:
Dostosowanie skryptu startowego
Teraz trzeba odpowiednio dostosować skrypt startowy do naszego systemu operacyjnego. Poniżej omówię konfigurację potrzebnych zmiennych środowiskowych, należy pamiętać aby odpowiednie modyfikacje wprowadzić w pliku /etc/init.d/jboss
.
- katalog domowy
Konfiguracja katalogu domowego znajduje się w zmiennej$JBOSS_HOME
. Należy ją zmodyfikować tak, aby wskazywała na katalog, gdzie znajduje się serwer aplikacji JBoss:18JBOSS_HOME="/opt/jboss-5.1.0.GA" - użytkownik nieuprzywilejowany
Nazwa użytkownika na prawach którego ma zostać uruchomiony serwer aplikacji znajduje się w zmiennej$JBOSS_USER
:21JBOSS_USER="jboss"Jeżeli nazwa użytkownika zostanie ustawiona na wartość
RUNASIS
to wtedy serwer JBoss zostanie uruchomiony bez zmiany użytkownika, czyli na uprawnienia tego użytkownika, który wywoła skrypt uruchomieniowy. - ścieżka do Javy
Ścieżka dostępu do maszyny wirtualnej Javy znajduje się w zmiennej$JAVAPTH
. Należy w niej podać katalog, w którym znajduje się aplikacjajava
.24JAVAPTH="/usr/lib/jvm/java-6-openjdk/bin" - definicja konfiguracji
Kolejnym elementem jest podanie konfiguracji, która ma zostać uruchomiona.27JBOSS_CONF="default" - konfiguracja interfejsu sieciowego
W domyślnej konfiguracji JBoss nasłuchuje na przychodzące połączenia tylko na lokalnym interfejsie sieciowym. Aby to zmienić, należy go odpowiednio o tym poinformaować. W skrypcie startowym służy do tego zmienna$JBOSS_HOST
. Nie jest ona zdefiniowana w skrypcie, należy utworzyć ją samodzielnie. Należy dodać następującą linię (powinna być umieszczona przed linią 30, która zawiera definicję zmiennej$JBOSS_BIND_ADDR
, w której$JBOSS_HOST
jest wykorzystywana):28JBOSS_HOST="192.168.1.10"
Teraz pozostaje tylko sprawdzić, czy wszystkie wartości zostały zdefiniowane poprawnie i spróbować uruchomić serwera aplikacji:
Automatyczne uruchamianie serwera JBoss
Ostatnim krokiem jest zdefiniowanie w jakich poziomach startu ma być automatycznie uruchamiany serwera aplikacji, czy należy utworzyć odpowiednie linki z pliku /etc/init.d/jboss
. W systemach opartych o Debiana można w tym celu użyć komendy update-rc.d
:
Spowoduje to utworzenie odpowiednich linków pozwalających na uruchomienie serwera w trakcie uruchamianie komputera oraz zatrzymanie go w trakcie wyłączania systemu operacyjnego.
W przypadku systemów z rodziny RedHata należy dodać jeszcze dwie linijki do pliku /etc/init.d/jboss
:
7 8 | # chkconfig: - 90 10 # description: Run JBoss Server |
Pozwalają one na możliwość utworzenia odpowiednich linków przez polecenie chkconfig
:
Problem z wyłączeniem serwera
Może wystąpić błąd podczas próby wyłączenia serwera przy użyciu komendy:
Błąd jest następujący:
at org.jnp.interfaces.NamingContext.checkRef(NamingContext.java:1763)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:693)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:686)
at javax.naming.InitialContext.lookup(InitialContext.java:409)
at org.jboss.Shutdown.main(Shutdown.java:219)
Caused by: javax.naming.CommunicationException: Failed to connect to server localhost/127.0.0.1:1099 [Root exception is javax.naming.ServiceUnavailableException: Failed to connect to server localhost/127.0.0.1:1099 [Root exception is java.net.ConnectException: Connection refused]]
at org.jnp.interfaces.NamingContext.getServer(NamingContext.java:335)
at org.jnp.interfaces.NamingContext.checkRef(NamingContext.java:1734)
... 4 more
Caused by: javax.naming.ServiceUnavailableException: Failed to connect to server localhost/127.0.0.1:1099 [Root exception is java.net.ConnectException: Connection refused]
at org.jnp.interfaces.NamingContext.getServer(NamingContext.java:305)
... 5 more
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:310)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:176)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:163)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
at java.net.Socket.connect(Socket.java:546)
at org.jnp.interfaces.TimedSocketFactory.createSocket(TimedSocketFactory.java:97)
at org.jnp.interfaces.TimedSocketFactory.createSocket(TimedSocketFactory.java:82)
at org.jnp.interfaces.NamingContext.getServer(NamingContext.java:301)
... 5 more
Pojawia się on wtedy, gdy serwer JBoss będzie nasłuchiwał na innym interfejsie sieciowym niż localhost
. Spowodowany on jest błędem w skrypcie startującym, który podczas próby wywoływania w serwerze akcji jego zamknięcie nie bierze pod uwagę zawartości zmiennej $JBOSS_HOST
. Rozwiązanie jest proste, wystarczy wskazać odpowiedniej komendzie adres IP na którym nasłuchuje serwer.
Definicja komendy wywołującej zamknięcie serwera wygląda następująco:
62 | JBOSS_CMD_STOP=${JBOSS_CMD_STOP:-"java -classpath $JBOSSCP org.jboss.Shutdown --shutdown"} |
Wystarczy teraz dodać do niej następujący ciąg -s jnp://${JBOSS_HOST}:1099
, tak aby ta linia miała następującą postać:
62 | JBOSS_CMD_STOP=${JBOSS_CMD_STOP:-"java -classpath $JBOSSCP org.jboss.Shutdown --shutdown -s jnp://${JBOSS_HOST}:1099"} |
Teraz wywołania akcji stop
powinno już działać bez problemów.
$JBOSS_HOST
.Należy także pamiętać, że jeżeli dostęp do konsoli JMX został zezwolony tylko autoryzowanym użytkownikom, to należy jeszcze do powyższego skryptu dodać parametry określające nazwę użytkownika oraz jego hasło. W takie sytuacji powyższa linia powinna wyglądać następująco:
62 | JBOSS_CMD_STOP=${JBOSS_CMD_STOP:-"java -classpath $JBOSSCP org.jboss.Shutdown --shutdown -s jnp://${JBOSS_HOST}:1099 -u UZYTKOWNIK -p HASLO"} |