mirroir readonly du Gitit wiki.evolix.org (attention, ne rien commiter/merger sur ce dépôt) https://wiki.evolix.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

394 lines
12 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. ---
  2. categories: web java
  3. title: Howto Tomcat
  4. ...
  5. * Documentation : <http://tomcat.apache.org/tomcat-8.0-doc/>
  6. * Rôle Ansible : <https://forge.evolix.org/projects/ansible-roles/repository/revisions/stable/show/tomcat-instance>
  7. [Tomcat](http://tomcat.apache.org/) est un serveur d'applications Java : il rend accessible des pages JSP (moteur _Jasper_) et des servlets Java (moteur _Catalina_) via le protocole [HTTP](HowtoHTTP) (connecteur _Coyote_) ou [AJP (Apache JServ Protocol)](https://fr.wikipedia.org/wiki/Protocole_Apache_JServ). On l'utilise en général avec [Apache](HowtoApache) en complément.
  8. ## Installation
  9. ~~~
  10. # apt install openjdk-7-jdk tomcat8 tomcat8-user
  11. # /usr/share/tomcat8/bin/version.sh
  12. Using CATALINA_BASE: /usr/share/tomcat8
  13. Using CATALINA_HOME: /usr/share/tomcat8
  14. Using CATALINA_TMPDIR: /usr/share/tomcat8/temp
  15. Using JRE_HOME: /usr
  16. Using CLASSPATH: /usr/share/tomcat8/bin/bootstrap.jar:/usr/share/tomcat8/bin/tomcat-juli.jar
  17. Server version: Apache Tomcat/8.0.14 (Debian)
  18. Server built: Feb 13 2017 09:37:48
  19. Server number: 8.0.14.0
  20. OS Name: Linux
  21. OS Version: 3.16.0-4-amd64
  22. Architecture: amd64
  23. JVM Version: 1.7.0_121-b00
  24. JVM Vendor: Oracle Corporation
  25. ~~~
  26. > *Note* : on peut également installer Tomcat 7 avec les paquets _tomcat7*_
  27. ## Configuration
  28. La configuration système de Tomcat, et notamment les paramètres de la JVM, se trouve dans le fichier `/etc/default/tomcat8` que l'on adapte ainsi :
  29. ~~~
  30. # Rare sont les cas ou l'on peut activer le Java security manager
  31. TOMCAT6_SECURITY=no
  32. # Reglages memoire de base (a adapter selon votre quantite de RAM, dans l'exemple on a une seule instance et 4 Go de RAM)
  33. JAVA_OPTS="${JAVA_OPTS} -Xms1g -Xmx2g -XX:NewSize=512m -XX:MaxPermSize=256m -Xss256k"
  34. # Reglages du garbage collector
  35. JAVA_OPTS="${JAVA_OPTS} -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:CMSInitiatingOccupancyFraction=80"
  36. # Compression des adresses 64bits sur 32bits pour gagner en memoire libre
  37. JAVA_OPTS="${JAVA_OPTS} -XX:+UseCompressedOops"
  38. # file limits pour eviter les "too many open files"
  39. ulimit -n 8192
  40. ~~~
  41. La configuration des options de Tomcat se trouve dans le répertoire `/etc/tomcat8/` notamment dans le fichier `/etc/tomcat8/server.xml` :
  42. ~~~{.xml}
  43. <?xml version='1.0' encoding='utf-8'?>
  44. <Server port="8005" shutdown="SHUTDOWN">
  45. <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  46. <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  47. <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  48. <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  49. <GlobalNamingResources>
  50. <Resource name="UserDatabase" auth="Container"
  51. type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved"
  52. factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" />
  53. </GlobalNamingResources>
  54. <Service name="Catalina">
  55. <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="UTF-8" redirectPort="8443" />
  56. <Engine name="Catalina" defaultHost="localhost">
  57. <Realm className="org.apache.catalina.realm.LockOutRealm">
  58. <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
  59. </Realm>
  60. <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
  61. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
  62. prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  63. </Host>
  64. </Engine>
  65. </Service>
  66. </Server>
  67. ~~~
  68. On peut ainsi désactiver le déploiement automatique (à chaud) en modifiant :
  69. ~~~{.xml}
  70. <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false">
  71. ~~~
  72. Ou encore changer les paramètres du connecteur HTTP (port TCP utilisé, _timeout_ de la connexion) via :
  73. ~~~{.xml}
  74. <Connector port="8765" protocol="HTTP/1.1" connectionTimeout="5000" URIEncoding="UTF-8" redirectPort="8443" />
  75. ~~~
  76. ## Arborescence
  77. Les fichiers de _Tomcat_ sont dispersés, voici les répertoires importants :
  78. * CATALINA_BASE : ${catalina.base} = /var/lib/tomcat8
  79. * CATALINA_HOME : ${catalina.home} = /usr/share/tomcat8
  80. Le répertoire CATALINA_BASE contient :
  81. ~~~
  82. /var/lib/tomcat8/
  83. ├── conf -> /etc/tomcat8
  84. ├── lib
  85. ├── logs -> /var/log/tomcat8
  86. ├── policy
  87. │   └── catalina.policy
  88. ├── webapps (répertoire où l'on peut déposer les servlets)
  89. │   └── ROOT
  90. │   ├── index.html
  91. │   └── META-INF
  92. │   └── context.xml
  93. └── work -> /var/cache/tomcat8
  94. ~~~
  95. Un élément important concerne les classes Java qui peuvent être déposées à différents endroits.
  96. L'ordre de chargement de ces classes (_Class Loader_) se fait ainsi :
  97. * /usr/share/tomcat6/lib/ : classes communes à toutes les servlets
  98. * /var/lib/tomcat8/webapps/foo/WEB-INF/lib/ : classes spécifiques à la servlet foo
  99. ## Administration
  100. ### Manager Tomcat
  101. On peut installer le _Manager Tomcat_, une interface web permettant notamment déployer des servlets Java :
  102. ~~~
  103. # apt install tomcat8-admin
  104. ~~~
  105. Il faut ensuite ajouter un utilisateur au rôle _manager_, dans le fichier `/etc/tomcat8/tomcat-users.xml` :
  106. ~~~{.xml}
  107. <tomcat-users>
  108. [...]
  109. <role rolename="manager"/>
  110. <user username="foo" password="PASSWORD" roles="manager"/>
  111. </tomcat-users>
  112. ~~~
  113. L'accès au _Manager Tomcat_ se fait sur http://127.0.0.1:8080/manager/html
  114. ## Instances Tomcat
  115. On peut faire tourner plusieurs instances Tomcat complètement indépendantes, avec leurs propres réglages et en permettant des arrêts/redémarrages d'une instance sans impacter les autres, le tout en mutualisant les binaires.
  116. Pour cela, on s'appuye sur [systemd](HowtoSystemd) pour lequel il faut installer la bibliothèque PAM :
  117. ~~~
  118. # apt install libpam-systemd
  119. ~~~
  120. Et l'on crée une unité systemd `/etc/systemd/user/tomcat.service` :
  121. ~~~{.ini}
  122. [Unit]
  123. Description=Tomcat %u.
  124. After=network.target
  125. [Service]
  126. WorkingDirectory=%h
  127. Environment="CATALINA_BASE=%h"
  128. EnvironmentFile=%h/conf/env
  129. UMask=0002
  130. ExecStart=/usr/share/tomcat8/bin/startup.sh
  131. ExecStop=/usr/share/tomcat8/bin/shutdown.sh
  132. # Pour Tomcat 7
  133. #ExecStart=/usr/share/tomcat7/bin/startup.sh
  134. #ExecStop=/usr/share/tomcat7/bin/shutdown.sh
  135. Type=forking
  136. [Install]
  137. WantedBy=default.target
  138. ~~~
  139. On peut ensuite créer une instance nommée _foo_ avec un utilisateur dédié :
  140. ~~~
  141. # mkdir -p /srv/tomcat
  142. # tomcat8-instance-create /srv/tomcat/foo
  143. # useradd -d /srv/tomcat/foo foo
  144. # chown -R app:app /srv/tomcat/foo
  145. # chmod -R u=rwX,g=rX,o= /srv/tomcat/foo
  146. # chmod -R g+ws /srv/tomcat/foo
  147. ~~~
  148. Créer les variables d'environnement dans `/srv/tomcat/foo/conf/env` :
  149. ~~~{.bash}
  150. # Memory allocation options.
  151. # Xmx Max memory allocated to instance.
  152. # Xms Allocated memory at startup.
  153. # XX:MaxPermSize Memory allocated to internal objects.
  154. JAVA_HOME="/usr/lib/jvm/java-1.7.0-openjdk-amd64"
  155. JAVA_OPTS="${JAVA_OPTS} -server -Xms1g -Xmx2g -XX:NewSize=512m -XX:MaxPermSize=256m -Xss256k"
  156. JAVA_OPTS="${JAVA_OPTS} -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:CMSInitiatingOccupancyFraction=80"
  157. JAVA_OPTS="${JAVA_OPTS} -XX:+UseCompressedOops"
  158. JAVA_OPTS="${JAVA_OPTS} -XX:+UseParNewGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -Xverify:none"
  159. ~~~
  160. Il reste ensuite à ajuster les ports HTTP et SHUTDOWN dans `/srv/tomcat/app/conf/server.xml` :
  161. ~~~{.xml}
  162. <Server port="SHUTDOWN_PORT" shutdown="SHUTDOWN">
  163. <Connector port="HTTP_PORT" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="UTF-8" redirectPort="8443"/>
  164. ~~~
  165. Enfin, il est nécessaire d'activer la conservation de la session de l'utilisateur :
  166. ~~~
  167. # loginctl enable-linger foo
  168. ~~~
  169. ### Gestion d'une instance Tomcat
  170. Activation au démarrage de l'instance :
  171. ~~~
  172. # su - foo
  173. $ systemctl --user enable tomcat
  174. ~~~
  175. Démarrage de l'instance :
  176. ~~~
  177. # su - foo
  178. $ systemctl --user start tomcat
  179. ~~~
  180. Arrêt de l'instance :
  181. ~~~
  182. # su - foo
  183. $ systemctl --user stop tomcat
  184. ~~~
  185. Redémarrage de l'instance :
  186. ~~~
  187. # su - foo
  188. $ systemctl --user restart tomcat
  189. ~~~
  190. Afficher le statut de l'instance :
  191. ~~~
  192. # su - foo
  193. $ systemctl --user status -l tomcat
  194. ~~~
  195. ## Configuration avec Apache
  196. Nous conseillons d'utiliser [Apache](HowtoApache) comme reverse-proxy HTTP/HTTPS devant _Tomcat_.
  197. Pour cela on conseille d'utiliser le module *proxy_http* avec le connecteur HTTP de _Tomcat_.
  198. On peut également utiliser le module mod-jk avec le connecteur AJP de _Tomcat_.
  199. ### avec proxy_http
  200. ~~~
  201. # a2enmod proxy_http
  202. ~~~
  203. Voici un VirtualHost type :
  204. ~~~{.apache}
  205. <VirtualHost *:80>
  206. ServerName www.example.com
  207. <IfModule mod_proxy_http.c>
  208. ProxyPass / http://127.0.0.1:8080/
  209. ProxyPassReverse / http://127.0.0.1:8080/
  210. <Proxy http://127.0.0.1:8080/>
  211. Allow from all
  212. </Proxy>
  213. </IfModule>
  214. </VirtualHost>
  215. ~~~
  216. ### avec mod-jk
  217. ~~~
  218. # apt install libapache2-mod-jk
  219. ~~~
  220. Il faut ensuite s'assurer d'avoir activer le connecteur AJP dans le fichier `server.xml` :
  221. ~~~{.xml}
  222. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
  223. ~~~
  224. On édite `/etc/libapache2-mod-jk/workers.properties` pour lister les instances Tomcat concernées :
  225. ~~~
  226. workers.tomcat_home=/usr/share/tomcat8
  227. workers.java_home=/usr/lib/jvm/default-java
  228. worker.list=ajp13_worker
  229. worker.ajp13_worker.port=8009
  230. worker.ajp13_worker.host=localhost
  231. worker.ajp13_worker.type=ajp13
  232. ~~~
  233. Voici un VirtualHost type :
  234. ~~~{.apache}
  235. <VirtualHost *:80>
  236. ServerName www.example.com
  237. # Tout rediriger vers l'instance :
  238. JkMount /* ajp13_worker
  239. # Ne pas rediriger une destination spécifique :
  240. JkUnMount /favicon.ico ajp13_worker
  241. JkUnMount /documents/* ajp13_worker
  242. </VirtualHost>
  243. ~~~
  244. > *Note* : les options pour _libapache2-mod-jk_ sont configurables dans le fichier `/etc/apache2/mods-available/jk.conf`
  245. ## Monitoring
  246. ### Nagios
  247. Vérification simple du port HTTP :
  248. ~~~
  249. $ /usr/lib/nagios/plugins/check_http -H 127.0.0.1 -p 8080
  250. ~~~
  251. Vérification simple du port AJP :
  252. ~~~
  253. $ /usr/lib/nagios/plugins/check_tcp -H 127.0.0.1 -p 8009
  254. ~~~
  255. ## FAQ
  256. ### access_log de Tomcat
  257. _Tomcat_ peut générer des journaux d'accès similaires à ceux d'Apache. On configure cela via le fichier `server.xml` :
  258. ~~~{.xml}
  259. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
  260. prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
  261. ~~~
  262. ### Connecteur HTTP
  263. Pour activer la compression GZIP de certains types de fichiers, ajouter les options suivantes dans le connecteur HTTP via le fichier `server.xml` :
  264. ~~~
  265. compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/plain,text/javascript,application/javascript"
  266. ~~~
  267. ### Drivers JDBC
  268. Pour installer le driver JDBC pour MySQL :
  269. ~~~
  270. # aptitude install libmysql-java
  271. # cd /usr/share/tomcat6/lib/
  272. # ln -s ../../java/mysql-connector-java.jar mysql.jar
  273. ~~~
  274. Pour installer le driver JDBC pour PostgreSQL :
  275. ~~~
  276. # aptitude install libpg-java
  277. # cd /usr/share/tomcat6/lib/
  278. # ln -s ../../java/mysql-connector-java.jar mysql.jar
  279. ~~~
  280. ### Qu'est-ce que c'est JSVC ? Pourquoi l'utiliser ?
  281. JSVC est un outil permettant d'uniformiser le lancement de "daemon" en JAVA pour tous les systèmes, notamment sous Windows. Sous Linux, il est parfois utilisé, mais son utilisation reste déconseillée vu qu'il existe d'autres outils pour faire cela *et* que son utilisation ne permet pas une gestion via JMX. Sous Debian, il a été utilisé sous Debian Lenny, mais il n'est plus utilisé dans les versions suivantes.
  282. ### Tomcat n'écoute pas en IPv4, pourquoi ? Comment le corriger ?
  283. Les versions récentes de Java préfèrent l'IPv6 si elle est présente. Le problème c'est que dans ce cas, il peut arriver que tomcat n'écoute pas en IPv4. Il faut alors modifier les propriétés par défaut en ajoutant ceci aux JAVA_OPTS :
  284. ~~~
  285. -Djava.net.preferIPv4Stack=true
  286. ~~~