这段时间真的是太忙了,中间碰到了很多技术盲区,实在没来得及记录,都先写在了草稿上,待有空再回过头来整理一下。
  
  首先整理下这个最坑的jsvc问题,一行代码浪费了我一天时间,查边整个百度都查不到相应的资料,最后在Google上搜到一个论坛中有人遇到相同问题,看到一行关键字才得以解决。而且关于jsvc和Tomcat在Linux下以非root用户的daemon运行,也没有一篇完美的博文,几乎都是几年前的而且错误一大堆。
  
  既然说到jsvc就顺便把Tomcat在Linux下的整个环境(生产环境)部署说一下。
  
  至于为什么生产环境下用daemon来运行而不是直接用.sh运行这里就不赘述了。
  
  好,进入正题,首先我用的是CentOS7.3,生产环境稳定最重要,当然关于大家觉得用什么发行版最稳定,我就不争了,反正每次聊到这个问题都会有人冒出一句“Debian大法好”,这不是这篇的主题。
  

1.系统

  • 一般装完系统第一件事都是更新打补丁

CentOS:yum update
Debian:apt-get upgrade

  • 然后设置swap,一般买的vps和ecs都是没有swap的,设置为内存的1.5-2倍为宜

1.先检查下有没有swap:free -m 有就跳过了
2.进入部署目录,我一般喜欢部署在/var下面
3.创建文件:/sbin/mkswap swapfile
可以无视他的警告 swapon: /var/swapfile: insecure permissions 0644, 0600 suggested.
4.激活文件:/sbin/swapon swapfile
5.添加到启动项echo /var/swapfile swap swap defaults 0 0 >> /etc/fstab

  • OK,这两步做完可以重启了systemctl reboot,有强迫症的也可以先改下hostname
  • 重启完,有强迫症的我还有一步。。。就是删除旧的内核
      

2.JDK

  • 下载最新版的SUN JDK,为什么要带Cookie?下载过JDK的应该都知道,下载之前Oracle需要让你同意他的许可证,所以不带Cookie你下下来的只是个html而已
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz
  • 创建文件夹:mkdir /usr/java
  • 解压:tar -xf jdk-8u131-linux-x64.tar.gz -C /usr/java
  • 如果不需要运行别的Java程序,可以不用配系统环境变量(懒)
  • 测试下:/usr/java/jdk1.8.0_131/bin/java -Xmx3072m -version

-Xmx3072m是测试下设定jvm最大3072m的内存会不会报错,我的ECS是4G内存

java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
  • 好的没问题,下一步
      

3.Tomcat 8.5

  • 第一步当然又是下载咯
wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.14/bin/apache-tomcat-8.5.14.tar.gz
// 下面这个链接在外服比较快
wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.14/bin/apache-tomcat-8.5.14.tar.gz
  • 创建文件夹、解压、编译jsvc(一步带过了,不细说了,都是基础):
mkdir /usr/tomcat
tar -xf apache-tomcat-8.5.14.tar.gz -C /usr/tomcat
cd /usr/tomcat/apache-tomcat-8.5.14/bin
tar -xf commons-daemon-native.tar.gz
cd commons-daemon-1.0.15-native-src/unix/
./configure --with-java=/usr/java/jdk1.8.0_131
make
cp jsvc ../..
  • 创建一个不能登录的tomcat用户:useradd tomcat -s /sbin/nologin -M
  • 设置文件夹权限:chown -R tomcat.tomcat /usr/tomcat/apache-tomcat-8.5.14
  • 创建service文件:vi /etc/systemd/system/tomcat.service
[Unit]
Description=auto run Tomcat 8.5.14
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking

ExecStart=/usr/tomcat/apache-tomcat-8.5.14/bin/daemon.sh start
ExecStop=/usr/tomcat/apache-tomcat-8.5.14/bin/daemon.sh stop

Restart=always
RestartSec=1

PrivateTmp=true

User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target
  • 在bin目录下创建setenv.sh:

setenv就是set environment的意思,配置tomcat环境,不管用catalina还是daemon运行,都是会调用的

JAVA_HOME="/usr/java/jdk1.8.0_131"
CATALINA_HOME="/usr/tomcat/apache-tomcat-8.5.14"
CATALINA_BASE="/usr/tomcat/apache-tomcat-8.5.14"
JAVA_OPTS="-server -Xms3072m -Xmx3072m -XX:NewSize=1024m -XX:MaxNewSize=1024m -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly"
SERVICE_START_WAIT_TIME=90
  • 重中之重,关键点终于出现了,搞了我一天的问题,就是这条SERVICE_START_WAIT_TIME=90,因为daemon默认的启动时间是90秒,而jsvc默认是10秒,正式项目,大部分的war包都不可能在10秒内运行起来的,导致了,一直返回Service exit with a return value of 143,因为我的项目war包需要20秒,每次在第十秒的时候被终止了。

其实你在start之后看status是可以看到wait10的,只是一开始没意识到,改成90之后就变成了wait90

  • 重载systemd:systemctl daemon-reload
  • 设置tomcat开机启动:systemctl enable tomcat
  • 别急着启动项目,如果到这里就结束了,我又想说,你又要进坑了,这样的tomcat启动又会直接失去响应几分钟甚至几十分钟,甚至直接宕机(强行关机都关不掉)。
  • 因为tomcat启动需要用到一个熵池(entropy pool),通过噪音产生的随机值(真随机,不是伪随机),不信你可以看一下cat /proc/sys/kernel/random/entropy_avail一般新的服务器最多几十。
  • 解决方案有两种,就是真假随机,最完美的当然不是改成伪随机,而是扩大熵池,那么,说了半天,其实安装一个服务就好了yum install rng-tools
  • 启动:systemctl start rngd,然后你再看一下熵池,有3000了吧
  • 接下来,不要以为设置结束了,我知道你想改成80端口,说一句,非root用户是不能启动1024以下端口的,那怎么办,用防火墙做一个转发就可以了,CentOS7开始默认为firewall,你也可以用iptables。
  • 检查下防火墙开启没有:systemctl status firewalld,没开就开一下,别忘了开机自启动
  • 永久开放80端口:firewall-cmd --permanent --zone=public --add-port=80/tcp
  • 端口转发,必须先临时,再永久,直接永久会失败:
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
  • 只示范一下80端口,如果还需要别的端口,比如443之类的,记得也要放行和转发
  • OK,重载下配置:firewall-cmd --reload
  • 检查下配置,默认都在public区域:firewall-cmd --zone=public --list-all

你也可以先看下自己的活动区域或接口:firewall-cmd --get-active-zones

  • 好了,终于可以启动了:systemctl start tomcat
  • systemctl status tomcat
● tomcat.service - auto run Tomcat 8.5.14
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2017-05-03 22:19:37 CST; 17h ago
  Process: 3695 ExecStop=/usr/tomcat/apache-tomcat-8.5.14/bin/daemon.sh stop (code=exited, status=0/SUCCESS)
  Process: 3721 ExecStart=/usr/tomcat/apache-tomcat-8.5.14/bin/daemon.sh start (code=exited, status=0/SUCCESS)
 Main PID: 3733 (jsvc)
   CGroup: /system.slice/tomcat.service
           ├─3733 jsvc.exec -java-home /usr/java/jdk1.8.0_131 -user tomcat -pidfile /usr/tomcat/apache-tomcat-8.5.14/logs/catalina-daemon.pid -wait 90 -outfile /usr/tomcat/apache-tomcat-8.5.14/logs/catalina-daemon.out -errfile &1 -classpath /usr/tomcat/apache-tomcat-...
           └─3734 jsvc.exec -java-home /usr/java/jdk1.8.0_131 -user tomcat -pidfile /usr/tomcat/apache-tomcat-8.5.14/logs/catalina-daemon.pid -wait 90 -outfile /usr/tomcat/apache-tomcat-8.5.14/logs/catalina-daemon.out -errfile &1 -classpath /usr/tomcat/apache-tomcat-..

  

温馨提示:

  • 编译需要gcc和make

如果访问有问题,请检查一下以下可能出现的问题

  • 如果用的阿里云ECS之类的,千万别忘记设置安全组,入网开放访问端口,出网看需求
  • SELinux的设置
      


好了,关于tomcat的daemon部署,基本上就讲完了,关于,部署完之后的安全配置,就不在这一篇了讲了