1"use strict";(globalThis.webpackChunkmikes_dev_notebook=globalThis.webpackChunkmikes_dev_notebook||[]).push([[4691],{508046(n,r,e){e.r(r),e.d(r,{assets:()=>i,contentTitle:()=>a,default:()=>m,frontMatter:()=>c,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"DevOps/Tomcat/2020-12-26-tomcat10-cluster-with-individual-nodes/index","title":"Tomcat 10 Cluster with individual Node Server","description":"Siem Reap, Cambodia","source":"@site/docs/DevOps/Tomcat/2020-12-26-tomcat10-cluster-with-individual-nodes/index.md","sourceDirName":"DevOps/Tomcat/2020-12-26-tomcat10-cluster-with-individual-nodes","slug":"/DevOps/Tomcat/2020-12-26-tomcat10-cluster-with-individual-nodes/2020-12-26","permalink":"/docs/DevOps/Tomcat/2020-12-26-tomcat10-cluster-with-individual-nodes/2020-12-26","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/DevOps/Tomcat/2020-12-26-tomcat10-cluster-with-individual-nodes/index.md","tags":[{"inline":true,"label":"LINUX","permalink":"/docs/tags/linux"},{"inline":true,"label":"Tomcat","permalink":"/docs/tags/tomcat"},{"inline":true,"label":"Docker","permalink":"/docs/tags/docker"}],"version":"current","sidebarPosition":9060,"frontMatter":{"sidebar_position":9060,"slug":"2020-12-26","title":"Tomcat 10 Cluster with individual Node Server","authors":"mpolinowski","tags":["LINUX","Tomcat","Docker"]}
1,"sidebar":"tutorialSidebar","previous":{"title":"Tomcat","permalink":"/docs/category/tomcat"},"next":{"title":"Tomcat 10 Docker Cluster","permalink":"/docs/DevOps/Tomcat/2020-12-25-tomcat10-docker-cluster/2020-12-25"}}');var o=e(474848),s=e(28453);const c={sidebar_position:9060,slug:"2020-12-26",title:"Tomcat 10 Cluster with individual Node Server",authors:"mpolinowski",tags:["LINUX","Tomcat","Docker"]},a=void 0,i={},l=[{value:"Setting up Minion and Master Nodes with Docker-Compose",id:"setting-up-minion-and-master-nodes-with-docker-compose",level:2},{value:"NGINX Configuration",id:"nginx-configuration",level:3},{value:"default.conf",id:"defaultconf",level:4},{value:"nginx.conf",id:"nginxconf",level:4}];function d(n){const r={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...n.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.p,{children:(0,o.jsx)(r.img,{alt:"Siem Reap, Cambodia",src:e(372582).A+"",width:"1500",height:"706"})}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsxs)(r.li,{children:[(0,o.jsx)(r.a,{href:"#setting-up-minion-and-master-nodes-with-docker-compose",children:"Setting up Minion and Master Nodes with Docker-Compose"}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsxs)(r.li,{children:[(0,o.jsx)(r.a,{href:"#nginx-configuration",children:"NGINX Configuration"}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"#defaultconf",children:"default.conf"})}),"\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"#nginxconf",children:"nginx.conf"})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"setting-up-minion-and-master-nodes-with-docker-compose",children:"Setting up Minion and Master Nodes with Docker-Compose"}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.strong,{children:"docker-compose.yml"})}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-yml",children:'version: "3.8"\r\nservices:\r\n\r\n tomcatOne:\r\n container_name: tomcatOne\r\n image: tomcat:10-jdk11-corretto\r\n networks:\r\n - gateway\r\n restart: unless-stopped\r\n networks:\r\n gateway:\r\n ipv4_address: 172.25.0.10\r\n\r\n volumes:\r\n - /opt/tomcat/docker/cluster/tomcat/conf/server.xml:/usr/local/tomcat/conf/server.xml\r\n - /opt/tomcat/docker/cluster/tomcat/conf/tomcat-users.xml:/usr/local/tomcat/conf/tomcat-users.xml\r\n - /opt/tomcat/docker/cluster/tomcat/webapps/ROOT_01:/usr/local/tomcat/webapps/ROOT\r\n\r\n tomcatTwo:\r\n container_name: tomcatTwo\r\n image: tomcat:10-jdk11-corretto\r\n networks:\r\n - gateway\r\n restart: unless-stopped\r\n networks:\r\n gateway:\r\n ipv4_address: 172.25.0.20\r\n volumes:\r\n - /opt/tomcat/docker/cluster/tomcat/conf/server.xml:/usr/local/tomcat/conf/server.xml\r\n - /opt/tomcat/docker/cluster/tomcat/conf/tomcat-users.xml:/usr/local/tomcat/conf/tomcat-users.xml\r\n - /opt/tomcat/docker/cluster/tomcat/webapps/ROOT_02:/usr/local/tomcat/webapps/ROOT\r\n\r\n tomcatThree:\r\n container_name: tomcatThree\r\n image: tomcat:10-jdk11-corretto\r\n networks:\r\n - gateway\r\n restart: unless-stopped\r\n networks:\r\n gateway:\r\n ipv4_address: 172.25.0.30\r\n volumes:\r\n - /opt/tomcat/docker/cluster/tomcat/conf/server.xml:/usr/local/tomcat/conf/server.xml\r\n - /opt/tomcat/docker/cluster/tomcat/conf/tomcat-users.xml:/usr/local/tomcat/conf/tomcat-users.xml\r\n - /opt/tomcat/docker/cluster/tomcat/webapps/ROOT_03:/usr/local/tomcat/webapps/ROOT\r\n\r\n ingress:\r\n image: nginx:stable-alpine\r\n container_name: ingress\r\n networks:\r\n gateway:\r\n ipv4_address: 172.25.0.5\r\n ports:\r\n - "192.168.2.111:443:443"\r\n restart: unless-stopped\r\n volumes:\r\n - /opt/tomcat/docker/cluster/nginx/conf.d:/etc/nginx/conf.d\r\n - /opt/tomcat/docker/cluster/nginx/ssl:/etc/nginx/ssl\r\n - /opt/tomcat/docker/cluster/nginx/nginx.conf:/etc/nginx/nginx.conf\r\n depends_on:\r\n - tomcatOne\r\n - tomcatTwo\r\n - tomcatThree\r\n\r\nnetworks:\r\n gateway:\r\n ipam:\r\n config:\r\n - subnet: 172.25.0.0/24\n'})}),"\n",(0,o.jsx)(r.h3,{id:"nginx-configuration",children:"NGINX Configuration"}),"\n",(0,o.jsx)(r.h4,{id:"defaultconf",children:"default.conf"}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.strong,{children:"Master / Minion1"})}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-cfg",children:"##########################################################################\r\n########################## Cluster Ingress ###############################\r\n##########################################################################\r\n\r\n\r\nserver {\r\n listen 80;\r\n listen [::]:80;\r\n\r\n server_name virtual-host1.com;\r\n\r\n return 301 https://$server_name$request_uri;\r\n}\r\n\r\n\r\nupstream cluster_nodes {\r\n server virtual-host2.com:443;\r\n server virtual-host3.com:443;\r\n}\r\n\r\nserver {\r\n listen 443 ssl http2 default_server;\r\n listen [::]:443 ssl http2;\r\n include conf.d/self-signed.conf;\r\n include conf.d/ssl-params.conf;\r\n include conf.d/header.conf;\r\n\r\n server_name virtual-host1.com;\r\n\r\n location = / {\r\n proxy_pass http://cluster_nodes;\r\n }\r\n\r\n error_page 404 /404.html;\r\n error_page 500 502 503 504 /50x.html;\r\n location = /50x.html {\r\n root /usr/share/nginx/html;\r\n }\r\n}\r\n\r\n\r\n##########################################################################\r\n########################## Tomcat Servlet 1 ##############################\r\n##########################################################################\r\n\r\n\r\nserver {\r\n listen 80;\r\n\r\n server_name virtual-host2.com;\r\n\r\n return 301 https://$server_name$request_uri;\r\n}\r\n\r\n\r\nupstream tc_servlets {\r\n server tomcatOne:8080;\r\n server tomcatTwo:8080;\r\n server tomcatThree:8080;\r\n}\r\n\r\nserver {\r\n listen 443 ssl http2;\r\n include conf.d/self-signed.conf;\r\n include conf.d/ssl-params.conf;\r\n include conf.d/header.conf;\r\n\r\n server_name virtual-host2.com;\r\n\r\n location = / {\r\n proxy_pass http://tc_servlets;\r\n }\r\n\r\n error_page 404 /404.html;\r\n error_page 500 502 503 504 /50x.html;\r\n location = /50x.html {\r\n root /usr/share/nginx/html;\r\n }\r\n}\n"})}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.strong,{children:"Minion2"})}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-cfg",children:"##########################################################################\r\n########################## Tomcat Servlet 2 ##############################\r\n##########################################################################\r\n\r\n\r\nserver {\r\n listen 80;\r\n\r\n server_name virtual-host3.com;\r\n\r\n return 301 https://$server_name$request_uri;\r\n}\r\n\r\n\r\nupstream tc_servlets {\r\n server tomcatOne:8080;\r\n server tomcatTwo:8080;\r\n server tomcatThree:8080;\r\n}\r\n\r\nserver {\r\n listen 443 ssl http2;\r\n include conf.d/self-signed.conf;\r\n include conf.d/ssl-params.conf;\r\n include conf.d/header.conf;\r\n\r\n server_name virtual-host3.com;\r\n\r\n location = / {\r\n proxy_pass http://tc_servlets;\r\n }\r\n\r\n error_page 404 /404.html;\r\n error_page 500 502 503 504 /50x.html;\r\n location = /50x.html {\r\n root /usr/share/nginx/html;\r\n }\r\n}\n"})}),"\n",(0,o.jsx)(r.h4,{id:"nginxconf",children:"nginx.conf"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-cfg",children:"user nginx;\r\nworker_processes auto;\r\nworker_rlimit_nofile 15000;\r\npid /var/run/nginx.pid;\r\ninclude /usr/share/nginx/modules/*.conf;\r\n\r\n\r\nevents {\r\n worker_connections 2048;\r\n multi_accept on;\r\n use epoll;\r\n}
1\r\n\r\n\r\nhttp {\r\n default_type application/octet-stream;\r\n # access_log /var/log/nginx/access.log;\r\n # activate the server access log only when needed\r\n access_log off;\r\n error_log /var/log/nginx/error.log;\r\n # don't display server version on error pages\r\n server_tokens off;\r\n server_names_hash_bucket_size 64;\r\n include /etc/nginx/mime.types;\r\n sendfile on;\r\n tcp_nopush on;\r\n tcp_nodelay on;\r\n\r\n charset utf-8;\r\n source_charset utf-8;\r\n charset_types text/xml text/plain text/vnd.wap.wml application/javascript application/rss+xml;\r\n\r\n include /etc/nginx/conf.d/default.conf;\r\n include /etc/nginx/conf.d/buffers.conf;\r\n include /etc/nginx/conf.d/timeouts.conf;\r\n # Only activate caching in production\r\n # include /etc/nginx/conf.d/cache.conf;\r\n include /etc/nginx/conf.d/gzip.conf;\r\n}\n"})}),"\n",(0,o.jsxs)(r.p,{children:["I forwarded the Tomcat service on port ",(0,o.jsx)(r.code,{children:"443"})," so I can now access the sample app under:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-bash",children:"https://<My-Server>:443/sample/\n"})}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.img,{alt:"Tomcat 10 Docker Cluster",src:e(910800).A+"",width:"785",height:"202"})}),"\n",(0,o.jsx)(r.p,{children:"Repeat these steps on all your minion servers."})]})}function m(n={}){const{wrapper:r}={...(0,s.R)(),...n.components};return r?(0,o.jsx)(r,{...n,children:(0,o.jsx)(d,{...n})}):d(n)}},372582(n,r,e){const t=e.p+"assets/images/photo-kt443t6d_64hdh43hfh6dgjdfhg4_d-dbec03b1535301c8b293ac3087af0dd4.jpg";e.d(r,["A",0,t])},910800(n,r,e){const t=e.p+"assets/images/tomcat10-docker-cluster_01-b5f7c91a1cd0a3ac4c0e5207cd3b73ed.gif";e.d(r,["A",0,t])},28453(n,r,e){e.d(r,{R:()=>c,x:()=>a});var t=e(296540);const o={},s=t.createContext(o);function c(n){const r=t.useContext(s);return t.useMemo(function(){return"function"==typeof n?n(r):{...r,...n}},[r,n])}function a(n){let r;return r=n.disableParentContext?"function"==typeof n.components?n.components(o):n.components||o:c(n.components),t.createElement(s.Provider,{value:r},n.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.