Difference between revisions of "Tomcat"
(Created page with "Tomcat Tomcat is a Java servlet container, it can be used to display simple JSP and run ''Spring'' applications. However, it cannot run Java EE, you'll need a proper applica...") |
(No difference)
|
Revision as of 19:07, 26 January 2014
Tomcat
Tomcat is a Java servlet container, it can be used to display simple JSP and run Spring applications.
However, it cannot run Java EE, you'll need a proper application server such IBM WAS, Glassfish, Jboss, etc. to do so.
Contents
installation
Automatic install
This is the recommended installation.
apt-get install tomcat7 tomcat7-admin tomcat7-common tomcat7-docs tomcat7-examples
On Debian, the service is not available. So you can add a symlink for tomcat7:
ln -s /etc/init.d/tomcat7 /usr/bin/tomcat7
Manual install
Get and install file
Get Tomcat latest version from the official website: http://tomcat.apache.org/ Unzip Tomcat to /opt: => /opt/tomcat
Adjust rights
chown -R tomcat:tomcat /opt/tomcat
Add server to path
You need to add an environment variable:
vim /etc/profile
Add
export CATALINA_HOME="/opt/tomcat"
PATH="[...]:$JAVA_HOME/bin:$M2:$CATALINA_HOME/bin"
Take changes into account
source /etc/profile
Startup script
vim /etc/init.d/tomcat
Put the following content:
#!/bin/bash
### BEGIN INIT INFO
# Provides: tomcat
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Tomcat7
### END INIT INFO
# description: tomcat Start - Stop - Restart
# processname: tomee
# chkconfig: 234 20 80
export JAVA_HOME="/usr/lib/jvm"
PATH="$PATH:$JAVA_HOME/bin"
export PATH
export CATALINA_HOME=/opt/tomcat
case $1 in
start)
echo "Starting Tomcat"
sh $CATALINA_HOME/bin/startup.sh
;;
stop)
echo "Stopping Tomcat"
sh $CATALINA_HOME/bin/shutdown.sh
;;
restart)
echo "Restarting Tomcat"
sh $CATALINA_HOME/bin/shutdown.sh
sh $CATALINA_HOME/bin/startup.sh
;;
*)
echo $"Usage: $0 {start|stop}"
exit 1
;;
esac
exit 0
Update rights
chmod 750 /etc/init.d/tomcat
Update boot sequence
cd /etc/init.d
update-rc.d tomcat defaults
Remove from boot sequence=
update-rc.d tomee remove
Tomcat # Server configuration
Create users and user-rights
Manual installation
vim /opt/tomcat/conf/tomcat-users.xml
Automatic installation
vim /etc/tomcat7/tomcat-users.xml
Add / uncomment:
<role rolename="manager" />
<role rolename="admin" />
<role rolename="manager-gui" />
<role rolename="manager-script" />
<role rolename="admin-gui" />
<user username="tomcat" password="password" roles="admin, admin-gui, manager, manager-gui, manager-script" />
Increase permgen space
Manual install
Add JAVA_OPTS parameters as environment variable
vim /etc/profile
Add following line:
export JAVA_OPTS="-Xms1024m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+DisableExplicitGC"
Take changes into account
source /etc/profile
Check changes
echo $JAVA_OPTS
Automatic install
vim /etc/default/tomcat7
Add following line:
JAVA_OPTS="-Djava.awt.headless=true -XX:+UseConcMarkSweepGC -Xms1024m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+DisableExplicitGC"
Take changes into account
service tomcat7 restart
Add UTF-8 support on Tomcat
By default Tomcat will rely on the O.S locale.
In order to support UTF-8 URLs, you’ve to manually update the server’s configuration.
- automatic install: $Tomcat = /etc/tomcat7
vim $TOMCAT/conf/server.xml
~ Line 70 change the “<connector port=”8080” …” value.
- Before
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
- After
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
Restart Tomcat server
service tomcat7 restart
War deployment
There is 2 ways to deploy a war:
- By pushing the target war into ${Tomcat root} / webapps
- By using the graphical tool http://localhost:8080/manager
If you plan to use the graphical tool then you have to adjust the war file max size.
Edit:
${Tomcat root} / webapps / manager / WEB-INF / web.xml
Adjust following values ~line 54 :
<multipart-config>
<max-file-size>104857600</max-file-size>
<max-request-size>104857600</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>
Tomcat # add JMX management
Tomcat can be remotely monitored through JMX. That’s useful to check the status of the server: memory, threads and processes, performances, etc.
Unsafe configuration
Just edit your default Tomcat launcher:
vim /etc/default/tomcat7
Add the following lines:
JAVA_HOME=/usr/lib/jvm/default-jvm/ → That must be the ORACLE JDK
# JMX configuration
JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote"
JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.port=8090"
JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.authenticate=false"
JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.ssl=false"
# Remote access setup
JAVA_OPTS="${JAVA_OPTS} -Djava.rmi.server.hostname=dev.daxiongmao.eu"
Restart tomcat
Service tomcat7 restart
Open firewall
Edit your firewall script
vim /etc/firewall/firewall-start.sh
Incoming connections
$IPTABLES -A INPUT -p tcp --dport 8090 -j ACCEPT # Tomcat JMX
Outgoing connections
$IPTABLES -t filter -A OUTPUT -p tcp -m state --state NEW --dport 8090 -j ACCEPT # Tomcat JMX
Just restart your firewall to apply changes
firewall restart
jConsole (simple viewer)
Just execute jConsole from Linux or Windows >> TODO: add picture
Just fill up the server:port
>> TODO: add picture
You should have the following warning:
>> TODO: add picture
jVisualVM (advanced monitoring)
Just execute jvisualvm
Add a remote host
>> TODO: add picture
Just type the server name and click OK
>> TODO: add picture
Then, add a JMX connection
>> TODO: add picture
Then you can access the server
Restricted access
You can also restricted the access
Create the JMX users rights
vim /var/lib/tomcat7/conf/jmxremote.access
Put the following
<syntaxhighlight lang="bash">
monitorRole readonly → replace monitorRole by your ''userName''
controlRole readwrite
Create the JMX users password
vim /var/lib/tomcat7/conf/jmxremote.password
Put the following
monitorRole tomcat → replace monitorRole by username | replace tomcat by password
controlRole tomcat
Set rights and permissions upon login files
chmod 400 /var/lib/tomcat7/conf/jmxremote.*
chown tomcat7:tomcat7 /var/lib/tomcat7/conf/jmxremote.*
Edit the default tomcat launcher
# JMX configuration
JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote"
JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.port=8090"
JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.authenticate=true"
JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.access.file=/var/lib/tomcat7/conf/jmxremote.access"
JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.password.file=/var/lib/tomcat7/conf/jmxremote.password"
JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.ssl=false"
# Remote access setup
JAVA_OPTS="${JAVA_OPTS} -Djava.rmi.server.hostname=dev.daxiongmao.eu"
Restart tomcat
# service tomcat7 restart
Tomcat # Add MySQL datasource
Setup MySQL JDBC connector
1. Download MySQL JDBC driver http://dev.mysql.com/downloads/connector/j/
2. Decompress content and extract mysql-connector-java-XXX-bin.jar
3. Copy this file into $TOMCAT/libs Automatic install: /usr/share/tomcat7/lib
Declare MySQL datasource
Server.xml
Automatic install: /etc/tomcat7/server.xml
$TOMCAT/server.xml
Add
<host>
...
<GlobalNamingResources>
...
<!-- ####################################################################### -->
<!-- MySQL datasource -->
<!-- ####################################################################### -->
<!-- maxActive: Maximum number of database connections in pool. Set to -1 for no limit. -->
<!-- maxIdle: Maximum number of idle database connections to retain in pool. Set to -1 for no limit. -->
<!-- maxWait: Maximum time to wait for a database connection to become available in ms. Set to -1 to wait indefinitely. -->
<!-- driverClassName: Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver. -->
<Resource name="jdbc/myDataSource"
auth="Container" type="javax.sql.DataSource"
username="user" password="password"
url="jdbc:mysql://localhost:3306/mySchema"
maxActive="50" maxIdle="30" maxWait="10000"
driverClassName="com.mysql.jdbc.Driver"
factory="org.apache.commons.dbcp.BasicDataSourceFactory"
/>
…
</GlobalNamingResources>
Ubuntu Tomcat Fix
You must use the Factory line for Ubuntu !
This will fix the “ClassNotFoundException: BasicDataSourceFactory”
You may encountered this error with a Tomcat out of the box. Source: http://stackoverflow.com/questions/14712308/ubuntu-tomcat7-java-lang-classnotfoundexception-org-apache-tomcat-dbcp-dbcp-bas
Context.xml
Edit:
$TOMCAT/context.xml
Add the following declaration
<!-- ####################################################################### -->
<!-- MySQL datasource -->
<!-- ####################################################################### -->
<ResourceLink name="jdbc/myDataSource"
global="jdbc/myDataSource"
type="javax.sql.datasource" />
web.xml
Edit
$TOMCAT/web.xml
Add the following declaration
<!-- ####################################################################### -->
<!-- MySQL datasource -->
<!-- ####################################################################### -->
<resource-ref>
<description>RTD database</description>
<res-ref-name>jdbc/VehcoData</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
Take changes into account
Restart tomcat
service tomcat7 restart
Check result: http://localhost:8080/manager/text/resources
Use datasource
To use the datasource with a JNDI name you must prefix it with: java:comp/env/
java:comp/env/jdbc/myDataSource
Datasource improvements
You can tweak the datasource using some specific config parameters. Edit:
$TOMCAT/server.xml
Edit your JDBC resource:
<Resource auth="Container"
name="jdbc/APP_NAME"
username="user"
password="password"
type="javax.sql.DataSource"
url="jdbc:oracle:thin:@server.domain:1521:development" → ORACLE database
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:mysql://localhost:3306/rtd" → MySQL database
driverClassName="com.mysql.jdbc.Driver"
maxActive="50" maxIdle="30" maxWait="10000" → Connection pool
maxIdle="10"
maxWait="5000"
maxActive="30" → To remove none close connections
logAbandoned="true" To report the stacktrace of the faulty code
removeAbandoned="true" To remedy connection starvation while leaky code is not fixed
removeAbandonedTimeout="60" Interval for fixing connection starvation
validationQuery="select 1 from dual" custom query to perform regular checks
validationInterval="30000" To be adjusted! Interval in ms.
testOnBorrow="true"
testOnReturn="false"
testWhileIdle="true"
timeBetweenEvictionRunsMillis="5000"
numTestsPerEvictionRun="3"
minEvictableIdleTimeMillis="30000"
/>
More tweaks: http://commons.apache.org/proper/commons-dbcp/configuration.html
Tomcat # Basic tasks
Files location
The applications files are in $Tomcat/webapps
- Automatic installation: /var/lib/tomcat/webapps
Remove old temp files
In case of bugs, you can remove the working directory: $Tomcat/work/Catalina/localhost/*
rm -Rf /var/lib/tomcat7/work/Catalina/localhost/*