Tomcat在Ubuntu18.04下安装部署与HTTPS配置

准备环境

  • tomcat8.5.42
  • openjdk11.0.3
  • war包
  • https证书

tomcat安装

这里示范如何在Ubuntu18.04下安装Tomcat8.5,其他操作系统也类似。

1.安装jdk
OpenJDK是Ubuntu18.04上默认的java开发包和运行时库,他是一个java平台的开源实现。安装OpenJDK很简单

$ sudo apt install default-jdk

这样安装的是当前最新的OpenJDK版本。

2.创建Tomcat用户
创建一个新的系统用户tomcat,并且指定用户家目录/opt/tomcat,用户运行Tomcat service

$ sudo useradd -m -U -d /opt/tomcat -s /bin/false tomcat

3.下载Tomcat
我们使用wgetunzip来下载和解压Tomcat压缩包。如果你的系统没有安装unzipwget,请先安装这两个包

$ sudo apt install unzip wget

下载Tomcat 8.5.42版本可以通过Tomcat下载页面来下载最新的版本。
也可以通过wget方式来获取。先切到系统的/tmp然后通过wget进行下载

$ cd /tmp
$ wget http://www-us.apache.org/dist/tomcat/tomcat-8/v8.5.42/bin/apache-tomcat-8.5.42.zip

一旦下载了tomcat完毕,就可以通过unzip进行解压,解压后,将解压后的目录移植到/opt/tomcat目录下

$ unzip apache-tomcat-8.5.42.zip
$ sudo mkdir /opt/tomcat
$ sudo mv apache-tomcat-8.5.42 /opt/tomcat/

为了后续更好的更新tomcat,我们这里创建一个软连接latest,指向当前最新的tomcat安装目录

$ sudo ln -s /opt/tomcat/apache-tomcat-8.5.42 /opt/tomcat/latest

这样子,如果后续有更新tomcat版本,那么只要将软连接指向最新的安装目录即可
tomcat用户需要权限访问来访问/opt/tomcat目录,所以我们需要改变目录的归属用户

$ sudo chown -R tomcat: /opt/tomcat

并且将tomcat目录下的bin目录中的可执行脚本,都加上+x赋予执行权限

$ sudo sh -c 'chmod +x /opt/tomcat/latest/bin/*.sh'

4.创建系统服务
为了将Tomcat运行成一个服务,需要在/etc/systemd/system目录下面创建一个tomcat.service文件,并且加入一下内容

[Unit]
Description=Tomcat 8.5 servlet container
After=network.target

[Service]
Type=forking

User=tomcat
Group=tomcat

Environment="JAVA_HOME=/usr/lib/jvm/default-java"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"

Environment="CATALINA_BASE=/opt/tomcat/latest"
Environment="CATALINA_HOME=/opt/tomcat/latest"
Environment="CATALINA_PID=/opt/tomcat/latest/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"

ExecStart=/opt/tomcat/latest/bin/startup.sh
ExecStop=/opt/tomcat/latest/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

通知systemd我们创建了一个 新的服务,并且可以通过以下命令启动服务

$ sudo systemctl daemon-reload
$ sudo systemctl start tomcat

检查tomcat服务状态可以用下面命令

$ sudo systemctl status tomcat
● tomcat.service - Tomcat 8.5 servlet container
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2019-07-10 21:32:33 CST; 12h ago
  Process: 4980 ExecStop=/opt/tomcat/latest/bin/shutdown.sh (code=exited, status=0/SUCCESS)
  Process: 5026 ExecStart=/opt/tomcat/latest/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 5036 (java)
    Tasks: 57 (limit: 1130)
   CGroup: /system.slice/tomcat.service
           └─5036 /usr/lib/jvm/default-java/bin/java -Djava.util.logging.config.file=/opt/tomcat/latest/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dja

Jul 10 21:32:33 iZapkefd3rcnlhZ systemd[1]: Starting Tomcat 8.5 servlet container...
Jul 10 21:32:33 iZapkefd3rcnlhZ startup.sh[5026]: Existing PID file found during start.
Jul 10 21:32:33 iZapkefd3rcnlhZ startup.sh[5026]: Removing/clearing stale PID file.
Jul 10 21:32:33 iZapkefd3rcnlhZ startup.sh[5026]: Tomcat started.
Jul 10 21:32:33 iZapkefd3rcnlhZ systemd[1]: Started Tomcat 8.5 servlet container.

如果运行没有错误的话,我们可以将tomcat服务加入到开机自启

$ sudo systemctl enable tomcat

5.调整防火墙
如果你使用了防火墙进行保护,并且想要通过外部网络访问你的tomcat,那么需要打开你配置的端口,默认是8080,这里以8080举例,为了允许通过8080端口进行tcp交互,需要执行如下命令:

$ sudo ufw allow 8080/tcp

如果有接入负载均衡等,最好使用8080端口,将80端口留给负载均衡器使用,并且限制8080端口只能内部使用。

6.测试安装
测试你的安装是否成功,在浏览器中输入http://<你的tomcat服务器ip>:8080
如果出现一只猫的管理页面,就代表你的安装成功了。

WAR包部署

我的工程使用了SpringBoot,并且通过idea进行开发,所以我们这里讲解一下如何通过配置,借助idea进行生产war包。

1.配置Spring Boot
配置Spring Boot生成war包,首先我们需要在pom.xml文件的<project>根目录下配置

<packaging>war</packaging>

如果没有这个节点,则加上,如果有存在,可能配置是jar,则替换成war。
默认生成的war包名称由{artifactId}-{version}.war组成,我们需要自己配置生成的war包名称

<build>
    <finalName>${artifactId}</finalName>
</build>

这样我们生成的war包名称,就和属性一致了,这里我们暂定叫spring-boot-tomcat-demo
最重要的,我们需要配置tomcat的依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <scope>provided</scope>
</dependency>

最后,还需要配置一下@SpringBootApplication注解的类,继承SpringBootServletInitializer类即可

@SpringBootApplication
public class SpringBootTomcatApplication extends SpringBootServletInitializer {
}

2.生成war包
为了构建我们有tomcat依赖的war程序,我们执行mvn clean package,然后我们的war包就会在target目录下生成spring-boot-tomcat-demo.war文件(这里的spring-boot-tomcat-demo是上面pom的配置中,暂定的artifactId属性)。
或者在idea的左侧或者右侧的maven菜单中,找到Lifecycle->install菜单,双击运行即可,生成的目标文件与上面路径一致,都在target目录下。

3.部署在tomat
上面步骤我们已经完成了war包的生成,现在要将war包部署在tomcat中,部署其实很简单:

这样我们就将war包部署在tomcat中了。

HTTPS配置

在配置HTTPS之前,我们首先需要准备两个东西:

  • 域名
  • 证书

端口使用

首先将域名的A记录指向我们的服务器地址,对于http请求默认端口是80,https默认端口是443,那我们之前在tomcat中配置的http是8080端口,是否需要将8080端口改为80呢,其实当然是可以的,但是我们的tomcat部署在,ubuntu服务器上,并且我们脚本中是采用tomcat用户启动,在linux下非root用户不能打开1024以下的端口,如果强行将tomcat中的启动端口改为80,那么在tomcat启动后,本地通过命令行netstat -npl查看应用程序占用端口时,我们发现tomcat并未绑定80端口,所以,这种情况下,有两种解决方案:
方案一
如果有接入负载均衡器,则将域名指向负载均衡器的ip地址,负载均衡器监听80端口,并且将请求转发到8080端口上,这样就可以实现tomcat使用8080端口
方案二
如果没有使用负载均衡器,服务器上只有一个tomcat怎么办,那我们只能通过本地端口转发,在防火墙上将80端口直接转发到8080端口上

$ iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

这样默认的http请求使用80端口,就能转发到tomcat中了。当然别忘记了,打开防火墙允许80端口进行tcp交互:

$ sudo ufw allow 80/tcp

证书配置

上面我们讲了http怎么配置tomcat使用80端口,现在我们讲一下我们的证书要怎么使用,怎么和tomcat结合起来用。
首先你要去CA机构申请一个证书,如果使用自签名的证书,网站访问会提示不安全,是否继续访问等信息,给用户照成困扰,所以建议还是去购买一个,如何申请不在本文范围内,请参考文章末尾的链接。
那我手上拿到的是一个PFX格式的证书,我们暂且叫它server.pfx,拿到这个证书的同时,我们还需要证书密码,才能配置。步骤如下
1.放置证书
在tomcat7开始已经支持PFX格式的证书,所以我们用的tomcat8可以支持,首先我们需要在tomcat的目录下,新建一个cert目录,这个cert目录名字可以自定义,但是与第二点中配置tomcat中的keystoreFile属性值有关系,下文具体讲

存放证书目录

在cert中放置我们的server.pfx证书文件。

2.配置tomcat
在tomcat中,我们需要配上证书和密码才能正常使用,在tomcat根目录下/conf/server.xml文件,我们在Service节点下配置我们的Connector节点,如下:

<Service name="Catalina">
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="cert/server.pfx" keystoreType="PKCS12" keystorePass="xxxx" useBodyEncodingForURI="true" URIEncoding="UTF-8" />    
</Service>

port指的是我们监听的端口;
SSLEnabled开启ssl;
scheme值为https,表示支持的是https;
sslProtocol支持的https协议;
keystoreFile这里存放的就是我们的证书文件路径,在cert目录下server.pfx文件,这里cert是我们第一点中建立的cert目录,如果是其他目录,这里请自行修改;
keystorePass这里就是存放的是证书的密码;

通过这样配置后,我们重启tomcat

$ sudo systemctl stop tomcat
$ sudo systemctl start tomcat

这样重启后,通过域名访问,https://<域名>:8443/spring-boot-tomcat-demo/<springboot中的访问路径>,这样就能够通过https访问网站了。

3.修改端口
第二点中说到的访问方式,我们还是通过了8443端口进行访问,而https默认端口是443,所以我们需要像修改http访问80端口一样,需要做一层本地端口转发,将443端口转发到8443,这样在访问时,就不需要带上8443端口了

$ iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443

最后别忘了打开防火墙433端口允许tcp交互

$ sudo ufw allow 443/tcp

4.配置总结
总体来说配置证书的过程还是比较简单的,首先就是放置证书位置,然后在server.xml中配置,最后端口转发,防火墙端口开放,就可以正常访问了。

其他

在上文我们的war包部署中,我们是通过war包拷贝到webapps目录下,在tomcat启动时会自动解压在一个与war包同名的文件夹下,在通过url请求时,需要带上这个目录名称作为路径的一部分才能访问,这给我们造成了一定的困扰,如果我们想要去掉这个路径,直接访问该怎么办呢?解决办法肯定是有的,在server.xml中,找到<Host>节点,增加一个<Context>配置

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
    <Context path="" docBase="xxx.war" reloadable="true" debug="0" crossContext="true"/>
</Host>

其默认会将首页映射到$CATALINA_HOME/webapps/ROOT, 从官网上下载内容,默认为tomcat的管理控制台。

  • path:指定访问该Web应用的URL入口
  • docBase:指定Web应用的文件路径,可以给定绝对路径,也可以给定相对于<Host>的appBase属性的相对路径,如果Web应用采用开放目录结构,则指定Web应用的根目录,如果Web应用是个war文件,则指定war文件的路径。(指定项目所在地址)
  • reloadable:如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用

总结

本文讲了从tomcat、openjdk的安装开始,一步一步到war包配置,怎么打成war包部署在tomcat中,最后讲了https的证书配置以及端口转发,整体上来说参考本文,就可以做到简单的整套部署与配置,希望对大家有帮助,有问题可以留言交流~~~

参考链接

How to install Tomcat 8.5 on Ubuntu 18.04
Deploy a Spring Boot WAR into a Tomcat Server
linux下开通443端口
linux下用iptables做本机端口转发方法
一篇文章让你搞懂 SSL 证书
Tomcat8下将webapps目录与tomcat目录分离

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容