{"id":14978,"date":"2025-05-29T17:46:18","date_gmt":"2025-05-29T12:16:18","guid":{"rendered":"https:\/\/www.skynats.com\/?p=14978"},"modified":"2025-05-29T17:46:20","modified_gmt":"2025-05-29T12:16:20","slug":"how-to-install-apache-tomcat-10-0-20-on-ubuntu","status":"publish","type":"post","link":"https:\/\/www.skynats.com\/blog\/how-to-install-apache-tomcat-10-0-20-on-ubuntu\/","title":{"rendered":"How To Install Apache Tomcat 10.0.20 on Ubuntu"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">How to Install Apache Tomcat 10.0.20 on Ubuntu with Apache Proxy Integration. In this guide, we walk through the process to Install Apache Tomcat 10.0.20 on Ubuntu server. We&#8217;ll also configure Apache HTTPD as a reverse proxy to route traffic from port 80 to Tomcat&#8217;s default port 8080.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-small-font-size\" id=\"h-create-the-tomcat-user\"><strong>Create the Tomcat User<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>useradd -m -d \/opt\/tomcat -U -s \/bin\/false tomcat<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\" id=\"h-install-java\"><strong>Install Java<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/tmp\nwget https:\/\/archive.apache.org\/dist\/tomcat\/tomcat-10\/v10.0.20\/bin\/apache-tomcat-10.0.20.tar.gz\ntar xzvf apache-tomcat-10*tar.gz -C \/opt\/tomcat --strip-components=1<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\" id=\"h-set-permissions\"><strong>Set Permissions<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>chown -R tomcat:tomcat \/opt\/tomcat\/\nchmod -R u+x \/opt\/tomcat\/bin<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\" id=\"h-configure-users-and-roles\">Configure Users and Roles<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Edit the Tomcat users configuration file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vim \/opt\/tomcat\/conf\/tomcat-users.xml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add the following:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;role rolename=\"manager-gui\" \/>\n&lt;user username=\"manager\" password=\"manager_password\" roles=\"manager-gui\" \/>\n\n&lt;role rolename=\"admin-gui\" \/>\n&lt;user username=\"admin\" password=\"admin_password\" roles=\"manager-gui,admin-gui\" \/><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\" id=\"h-allow-remote-access-to-manager-app\"><strong>Allow Remote Access to Manager App<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>vim \/opt\/tomcat\/webapps\/manager\/META-INF\/context.xml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Edit the contents:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;Context antiResourceLocking=\"false\" privileged=\"true\" >\n  &lt;CookieProcessor className=\"org.apache.tomcat.util.http.Rfc6265CookieProcessor\"\n                   sameSiteCookies=\"strict\" \/>\n&lt;!--  &lt;Valve className=\"org.apache.catalina.valves.RemoteAddrValve\"\n         allow=\"127\\.\\d+\\.\\d+\\.\\d+|::1|0:0:0:0:0:0:0:1\" \/> -->\n  &lt;Manager sessionAttributeValueClassNameFilter=\"java\\.lang\\.(?:Boolean|Integer|Long|Number|String)|org\\.apache\\.catalina\\.filters\\.Csr>\n&lt;\/Context><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\" id=\"h-check-java-alternatives\">\u00a0<strong>Check Java Alternatives<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>update-java-alternatives -l<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\" id=\"h-create-systemd-service-for-tomcat\"><strong>Create Systemd Service for Tomcat<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>vim \/etc\/systemd\/system\/tomcat.service<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Paste the following:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[Unit]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Description=Tomcat<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After=network.targe<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[Service]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Type=forking<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">User=tomcat<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Group=tomcat<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Environment=&#8221;JAVA_HOME=\/usr\/lib\/jvm\/java-1.10.0-openjdk-amd64&#8243;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Environment=&#8221;JAVA_OPTS=-Djava.security.egd=file:\/\/\/dev\/urandom&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Environment=&#8221;CATALINA_BASE=\/opt\/tomcat&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Environment=&#8221;CATALINA_HOME=\/opt\/tomcat&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Environment=&#8221;CATALINA_PID=\/opt\/tomcat\/temp\/tomcat.pid&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Environment=&#8221;CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ExecStart=\/opt\/tomcat\/bin\/startup.sh<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ExecStop=\/opt\/tomcat\/bin\/shutdown.sh<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">RestartSec=10<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Restart=always<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[Install]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">WantedBy=multi-user.target<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\" id=\"h-reload-and-start-tomcat-service\"><strong>Reload and Start Tomcat Service<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">systemctl daemon-reload<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">systemctl start tomcat<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">systemctl status tomcat<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\" id=\"h-configure-apache-as-a-reverse-proxy\"><strong>Configure Apache as a Reverse Proxy<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create a proxy configuration:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vim \/etc\/apache2\/sites-available\/tomcat-proxy.conf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add the following:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&lt;VirtualHost *:80&gt;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;ServerName ip_address<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;ProxyPreserveHost On<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;ProxyPass \/ http:\/\/localhost:8080\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;ProxyPassReverse \/ http:\/\/localhost:8080\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;ErrorLog ${APACHE_LOG_DIR}\/tomcat_error.log<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;CustomLog ${APACHE_LOG_DIR}\/tomcat_access.log combined<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&lt;\/VirtualHost&gt;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Replace ip_address with your server&#8217;s IP or domain name.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\" id=\"h-nbsp-conclusion\">&nbsp;<strong>Conclusion<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You now have Apache Tomcat 10.0.20 running under a dedicated tomcat user, managed by systemd, and served via Apache HTTPD on port 80 using a reverse proxy. This setup is robust, secure, and suitable for production environments with minor tweaks. Let me know if you\u2019d like this blog exported as a Markdown file or formatted for a specific platform like Medium, <a href=\"https:\/\/github.com\/\" target=\"_blank\" rel=\"noopener\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-secondary-color\">GitHub<\/mark><\/a>, or Confluence.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you encounter any issues or need expert assistance during the setup, don\u2019t hesitate to reach out. Our team specializes in <a href=\"https:\/\/www.skynats.com\/linux-server-management\/\">Linux server management<\/a> and can help you install Apache Tomcat 10.0.20 on Ubuntu quickly and securely. Contact us today for reliable support and hassle-free server configuration!<br><br><br><br><br><br><br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>How to Install Apache Tomcat 10.0.20 on Ubuntu with Apache Proxy Integration. In this guide, we walk through the process to Install Apache Tomcat 10.0.20 on Ubuntu server. We&#8217;ll also configure Apache HTTPD as a reverse proxy to route traffic from port 80 to Tomcat&#8217;s default port 8080. Create the Tomcat User Install Java Set [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[1010,236,1038],"class_list":["post-14978","post","type-post","status-publish","format-standard","hentry","category-blog","tag-linux-server-management-services","tag-ubuntu","tag-upache-tomcat"],"_links":{"self":[{"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/posts\/14978","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/comments?post=14978"}],"version-history":[{"count":2,"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/posts\/14978\/revisions"}],"predecessor-version":[{"id":14983,"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/posts\/14978\/revisions\/14983"}],"wp:attachment":[{"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/media?parent=14978"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/categories?post=14978"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skynats.com\/blog\/wp-json\/wp\/v2\/tags?post=14978"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}