1 介绍:
Linux的后台进程运行有好几种方法,例如nohup,screen等,但是,如果是一个服务程序,要可靠地在后台运行,我们就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启。
supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。
Supervisor的作用与配置:实现对异常中断的子进程的自动重启
Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。
supervisor管理进程工具,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可执行文件的路径添加到supervisor的配置文件中就好了。此时被管理进程被视为supervisor的子进程,若该子进程异常中断,则父进程可以准确的获取子进程异常中断的信息,通过在配置文件中设置autostart=ture,可以实现对异常中断的子进程的自动重启。
主要就两个命令:
supervisord : supervisor的服务器端部分,启动supervisor就是运行这个命令
supervisorctl:启动supervisor的命令行窗口。
因为Supervisor是Python开发的,安装前先检查一下系统否安装了Python2.4以上版本。下面以CentOS7,Python2.7版本环境下,介绍Supervisor的安装与配置步聚:
2 安装:
(1)第一种安装supervisor:
pip install supervisor
pip的安装
cat pip_an.sh #!/bin/bash wget tar zxvf setuptools-0.6c11.tar.gz 5 cd setuptools-0.6c11 python setup.py build python setup.py install wget " tar -xzvf pip-1.5.4.tar.gz cd pip-1.5.411 python setup.py install
(2)第二种安装supervisor
安装Python包管理工具(easy_install)
easy_install是setuptools包里带的一个命令,使用easy_install实际上是在调用setuptools来完成安装模块的工作,所以安装setuptools即可。
[root@docker1 ~]# cd /home [root@docker1 home]# wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py -O - | python [root@docker1 home]# unzip setuptools-33.1.1.zip [root@docker1 home]# cd setuptools-33.1.1 [root@docker1 setuptools-33.1.1]# ls bootstrap.py conftest.py easy_install.py LICENSE msvc-build-launcher.cmd PKG-INFO pytest.ini setup.cfg setuptools tests CHANGES.rst docs launcher.c MANIFEST.in pavement.py pkg_resources README.rst setup.py setuptools.egg-info tox.ini [root@docker1 setuptools-33.1.1]# python setup.py install ......
yum install python-setuptools
easy_install supervisor
(3)第三种安装supervisor(推荐使用这种安装方式)
wget https://pypi.python.org/packages/source/s/supervisor/supervisor-3.1.3.tar.gz
tar zxvf supervisor-3.1.3.tar.gz
cd supervisor-3.1.3
python setup.py install
(4)第四种安装supervisor
yum install -y epel-release
yum install -y supervisor
3 配置测试:
supervisor安装完成后会生成三个执行程序:supervisortd、supervisorctl、echo_supervisord_conf,分别是
supervisor的守护进程服务(用于接收进程管理命令)、
客户端(用于和守护进程通信,发送管理进程的指令)、
生成初始配置文件程序。
运行supervisord服务的时候,需要指定supervisor配置文件,如果没有显示指定,默认在以下目录查找:
$CWD表示运行supervisord程序的目录。
可以通过运行echo_supervisord_conf程序生成supervisor的初始化配置文件,如下所示:
#测试是否安装成功
echo_supervisord_conf
#创建配置文件
echo_supervisord_conf > /etc/supervisor/supervisord.conf
------------------------------------------------------------------------------------------------------------------------------------------------------
安装tomcat过程:
①部署java环境
一.下载安装对应的jdk,并配置Java环境。
下载地址:
jdk-8u60-linux-x64.tar.gz https://share.weiyun.com/5I4VPLS
下载将jdk解压后放到/usr/local目录下:
[root@docker1 home]# cd /usr/local/
[root@docker1 local]# rz -y
rz waiting to receive.
Starting zmodem transfer. Press Ctrl+C to cancel.
Transferring jdk-8u60-linux-x64.tar.gz...
100% 176990 KB 11799 KB/sec 00:00:15 0 Errors
[root@docker1 local]# tar -xf jdk-8u60-linux-x64.tar.gz
[root@docker1 local]# ls
bin etc extundelete games include jdk1.8.0_60 jdk-8u60-linux-x64.tar.gz lib lib64 libexec sbin share src
建立/usr/local/下的jdk软连接方便以后版本升级 :
[root@docker1 local]# ln -s /usr/local/jdk1.8.0_60/ /usr/local/jdk
[root@docker1 local]# ls
bin etc extundelete games include jdk jdk1.8.0_60 jdk-8u60-linux-x64.tar.gz lib lib64 libexec sbin share src
配置环境变量:
在 /etc/profile 中加入以下内容
JAVA_HOME=/usr/local/jdk1.8.0_60
JAVA_BIN=/usr/local/jdk1.8.0_60/bin
PATH=$PATH:$JAVA_BIN
CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
保存退出
[root@docker1 local]# source /etc/profile
查看java环境变量是否生效
[root@docker1 local]# java -version
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)
测试成功
②安装Tomcat(http://tomcat.apache.org/)
下载地址:
apache-tomcat-8.0.27.tar.gz https://share.weiyun.com/57PQ94r
[root@docker1 local]# cd /home
[root@docker1 home]# rz -y
rz waiting to receive.
Starting zmodem transfer. Press Ctrl+C to cancel.
Transferring apache-tomcat-8.0.27.tar.gz...
100% 8914 KB 8914 KB/sec 00:00:01 0 Errors
[root@docker1 home]# tar -xf apache-tomcat-8.0.27.tar.gz
[root@docker1 home]# mv apache-tomcat-8.0.27/ /usr/local/apache-tomcat-8.0.27
[root@docker1 home]# cd /usr/local/
[root@docker1 local]# ln -s /usr/local/apache-tomcat-8.0.27/ /usr/local/tomcat
[root@docker1 local]# cd tomcat/bin/
[root@docker1 bin]# ls
bootstrap.jar catalina-tasks.xml configtest.bat digest.bat setclasspath.sh startup.bat tomcat-native.tar.gz version.bat
catalina.bat commons-daemon.jar configtest.sh digest.sh shutdown.bat startup.sh tool-wrapper.bat version.sh
catalina.sh commons-daemon-native.tar.gz daemon.sh setclasspath.bat shutdown.sh tomcat-juli.jar tool-wrapper.sh
[root@docker1 bin]# echo "CATALINA_HOME=/usr/local/apache-tomcat-8.0.27/" >> catalina.sh
③Tomcat安全优化和性能优化
7.2.1 屏蔽dns查询enableLookups="false"
[root@docker1 conf]# cat server.xml 修改更改为
7.2.2 jvm调优
Tomcat最吃内存,只要内存足够,这只猫就跑的很快。
如果系统资源有限,那就需要进行调优,提高资源使用率。
1. 优化catalina.sh配置文件。在catalina.sh配置文件中添加以下代码:
2.
3. JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"
4.
5. server:一定要作为第一个参数,在多个CPU时性能佳
6. -Xms:初始堆内存Heap大小,使用的最小内存,cpu性能高时此值应设的大一些
7. -Xmx:初始堆内存heap最大值,使用的最大内存
8. 上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
9. -XX:PermSize:设定内存的永久保存区域
10. -XX:MaxPermSize:设定最大内存的永久保存区域
11. -XX:MaxNewSize:
12. -Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
13. +XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
14. -Xss:每个线程的Stack大小
15. -verbose:gc 现实垃圾收集信息
16. -Xloggc:gc.log 指定垃圾收集日志文件
17. -Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
18. -XX:+UseParNewGC :缩短minor收集的时间
19. -XX:+UseConcMarkSweepGC :缩短major收集的时间
④ 启动tomcat服务器
[root@docker1 bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk1.8.0_60
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@docker1 bin]# ./shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk1.8.0_60
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@docker1 bin]# ./catalina.sh run
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk1.8.0_60
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
......
------------------------------------------------------------------------------------------------------------------------------------------------------
supervisord.conf配置文件参数说明
supervisor的配置参数较多,下面介绍一下常用的参数配置,详细的配置及说明,请参考官方文档介绍。
注:分号(;)开头的配置表示注释
[root@docker1 supervisor]# cat supervisord.conf (supervisord.conf权限默认644,无需更改) [unix_http_server] file=/var/run/supervisor/supervisor.sock ;UNIX socket文件,supervisorctl会使用 ;chmod=0700 ;socket文件的mode,默认是0700 ;chown=nobody:nogroup ;socket文件的owner,格式: uid:gid [inet_http_server] ;HTTP服务器,提供web管理界面 port=127.0.0.1:9001 ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性 port=10.0.0.10:9001 ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性 username=user ;登录管理后台的用户名 password=123 ;登录管理后台的密码 [supervisord] logfile=/var/run/supervisor/supervisord.log ;日志文件,默认是$CWD/supervisord.log logfile_maxbytes=50MB ;日志文件大小,超出会rotate替换,默认50MB,如果设成0,表示不限制大小 logfile_backups=10 ;日志文件保留备份数量默认10,设为0表示不备份 loglevel=info ;日志级别,默认info,其他:debug,warn,trace pidfile=/tmp/supervisord.pid ;pid文件 nodaemon=false ;是否在前台启动,默认是false,即以daemon的方式启动 minfds=1024 ;可以打开的文件描述符的最小值,默认1024 minprocs=200 ;可以打开的进程数的最小值,默认200 [supervisorctl] password=123 ;登录管理后台的密码 [supervisord] logfile=/var/run/supervisor/supervisord.log ;日志文件,默认是$CWD/supervisord.log logfile_maxbytes=50MB ;日志文件大小,超出会rotate替换,默认50MB,如果设成0,表示不限制大小 logfile_backups=10 ;日志文件保留备份数量默认10,设为0表示不备份 [unix_http_server] file=/var/run/supervisor/supervisor.sock ;UNIX socket文件,supervisorctl会使用 ;chmod=0700 ;socket文件的mode,默认是0700 ;chown=nobody:nogroup ;socket文件的owner,格式: uid:gid [inet_http_server] ;HTTP服务器,提供web管理界面 port=127.0.0.1:9001 ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性 port=10.0.0.10:9001 ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性 username=user ;登录管理后台的用户名 password=123 ;登录管理后台的密码 [supervisord] logfile=/var/run/supervisor/supervisord.log ;日志文件,默认是$CWD/supervisord.log logfile_maxbytes=50MB ;日志文件大小,超出会rotate替换,默认50MB,如果设成0,表示不限制大小 logfile_backups=10 ;日志文件保留备份数量默认10,设为0表示不备份 loglevel=info ;日志级别,默认info,其他:debug,warn,trace pidfile=/tmp/supervisord.pid ;pid文件 nodaemon=false ;是否在前台启动,默认是false,即以daemon的方式启动 minfds=1024 ;可以打开的文件描述符的最小值,默认1024 minprocs=200 ;可以打开的进程数的最小值,默认200 [supervisorctl] serverurl=unix:///var/run/supervisor/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致 ;serverurl=http://127.0.0.1:9001 ;通过HTTP的方式连接supervisord [program:supervisor_tomcat1] ;[program:xx]是被管理的进程配置参数,xx是进程的名称 command=/usr/local/apache-tomcat-8.0.27/bin/catalina.sh run ;在supervisord启动的时候也自动启动 autostart=true ;在supervisord启动的时候也自动启动 startsecs=10 ;启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒 autorestart=true ;程序退出后自动重启,可选值:[unexpected,true,flase],默认为unexpected,表示进程意味杀死后才重启 startretries=3 ;启动失败自动重试次数,默认是3 ;user=tomcat ;用哪个用户启动进程,默认是root user=root priority=999 ;进行启动优先级,默认999,值小的优先启动 redirect_stderr=true ;把stderr重定向到stdout,默认false stdout_logfile_maxbytes=20MB ;stdout日志文件大小,默认50MB stdout_logfile_backups=20 ;stdout日志文件备份数,默认是10 ;stdout日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord会自动创建日志文件) stdout_logfile=/usr/local/apache-tomcat-8.0.27/logs/catalina.out stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程 killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程 ;包含其他配置文件 [include] ;files = relative/directory/*.ini ;可以指定一个或多个以.ini结束的配置文件 files = /etc/supervisor/config.d/*.ini [rpcinterface:supervisor] #不添加这行,后续启动后会有错误① supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
错误①:
[root@docker1 supervisor]# supervisorctl #启动后报错
Sorry, supervisord responded but did not recognize the supervisor namespace commands that supervisorctl uses to control it. Please check that the [rpcinterface:supervisor] section is enabled in the configuration file (see sample.conf).
supervisor>
include示例:
[include]
files = /opt/absolute/filename.ini /opt/absolute/.*ini foo.conf config??.ini
配置管理进程
进程管理配置参数,不建议全都写在supervisord.conf文件中,应该每个进程写一个配置文件放在include指定的目录下包含进supervisord.conf文件中。
1> 创建/etc/supervisor/config.d目录,用于存放进程管理的配置文件
2> 修改/etc/supervisor/supervisord.conf中的include参数,将/etc/supervisor/conf.d目录添加到include中
[root@docker1 supervisor]# mkdir conf.d
[root@docker1 supervisor]# ls
conf.d supervisord.conf
下面是配置Tomcat进程的一个例子:
[root@docker1 supervisor]# cd conf.d/ [root@docker1 conf.d]# vi tomcat.ini [program:tomcat] ;[program:xx]是被管理的进程配置参数,tomcat是进程的名称 command=/usr/local/apache-tomcat-8.0.27/bin/catalina.sh run ;在supervisord启动的时候也自动启动 autostart=true ;在supervisord启动的时候也自动启动 startsecs=10 ;启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒 autorestart=true ;程序退出后自动重启,可选值:[unexpected,true,flase],默认为unexpected,表示进程意味杀死后才重启 startretries=3 ;启动失败自动重试次数,默认是3 user=tomcat ;用哪个用户启动进程,默认是root priority=999 ;进行启动优先级,默认999,值小的优先启动 redirect_stderr=true ;把stderr重定向到stdout,默认false stdout_logfile_maxbytes=20MB ;stdout日志文件大小,默认50MB stdout_logfile_backups=20 ;stdout日志文件备份数,默认是10 ;stdout日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord会自动创建日志文件) stdout_logfile=/usr/local/apache-tomcat-8.0.27/logs/catalina.out stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程 killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程
启动Supervisor服务
[root@docker1 supervisor]# supervisord -c /etc/supervisor/supervisord.conf
Error: The directory named as part of the path /var/run/supervisor/supervisord.log does not exist.
For help, use /usr/bin/supervisord -h
[root@docker1 supervisor]# mkdir /var/run/supervisor/
[root@docker1 supervisor]# supervisord -c /etc/supervisor/supervisord.conf # 指定配置文件启动supervisord
控制进程
(1)交互式终端
supervisord启动成功后,可以通过supervisorctl客户端控制进程,启动、停止、重启。运行supervisorctl命令,不加参数,会进入supervisor客户端的交互终端,并会列出当前所管理的所有进程。
[root@docker1 local]# supervisorctl -c /etc/supervisor/supervisord.conf supervisor_tomcat1 RUNNING pid 23080, uptime 0:00:31 supervisor> help default commands (type help): ===================================== add clear fg open quit remove restart start stop update avail exit maintail pid reload reread shutdown status tail version supervisor> help stop stop Stop a process stop :* Stop all processes in a group stop Stop multiple processes or groups stop all Stop all processes supervisor> quit
上面的supervisor_tomcat1就是我们在配置文件中[program:supervisor_tomcat1]指定的名字。
输入help可以查看可以执行的命令列表,如果想看某个命令的作用,运行help 命令名称,如:help stop
(2)bash终端
supervisorctl stop program_name # 停止某一个进程,program_name 为 [program:x] 里的 x
supervisorctl start program_name # 启动某个进程
supervisorctl restart program_name # 重启某个进程
supervisorctl stop groupworker: # 结束所有属于名为 groupworker 这个分组的进程 (start,restart 同理)
supervisorctl stop groupworker:name1 # 结束 groupworker:name1 这个进程 (start,restart 同理)
supervisorctl stop all # 停止全部进程,注:start、restartUnlinking stale socket /tmp/supervisor.sock、stop 都不会载入最新的配置文件
supervisorctl reload # 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程supervisorctl update # 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
supervisor基本命令(后四个命令可以省略“-c supervisor.conf”):
supervisord -c supervisor.conf 通过配置文件启动supervisor
supervisorctl -c supervisor.conf status 查看状态
supervisorctl -c supervisor.conf reload 重新载入配置文件
supervisorctl -c supervisor.conf start [all]|[x] 启动所有/指定的程序进程
supervisorctl -c supervisor.conf stop [all]|[x] 关闭所有/指定的程序进程
supervisorctl status
supervisorctl stop tomcat
supervisorctl start tomcat
supervisorctl restart tomcat
supervisorctl reread
supervisorctl update
(3)web管理界面(生产环境最好关闭)
出于安全考虑,默认配置是没有开启web管理界面,需要修改supervisord.conf配置文件打开http访权限,将下面的配置(取消注释):
修改成:
错误②:
[root@docker1 logs]# supervisorctl
http://localhost:9001 refused connection
supervisor>
解决:指定配置文件
[root@docker1 local]# supervisorctl -c /etc/supervisor/supervisord.conf reload
Restarted supervisord
[root@docker1 local]# supervisorctl -c /etc/supervisor/supervisord.conf
supervisor_tomcat1 RUNNING pid 23080, uptime 0:11:12
supervisor>
重启方法1:
[root@docker1 supervisor]# supervisorctl reload
重启方法2:
[root@docker1 supervisor]# ps -ef|grep sup
root 15602 1 0 15:05 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
root 16247 3526 0 15:15 pts/0 00:00:00 grep --color=auto sup
[root@docker1 supervisor]# kill -9 15602
[root@docker1 supervisor]# supervisord -c /etc/supervisor/supervisord.conf
port:绑定访问IP和端口,这里是绑定的是本地IP和9001端口
username:登录管理后台的用户名
password:登录管理后台的密码
web界面的Restart能够对supervisor_tomcat1重启,stop对tomcat1关闭,clear Log对logs/catalina.out的内容自动清除
(4)测试是否实现对异常中断的子进程的自动重启
[root@docker1 local]# ps -ef |grep tomcat root 23080 22624 1 20:22 ? 00:00:03 /usr/local/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-8.0.27/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-8.0.27/endorsed -classpath /usr/local/apache-tomcat-8.0.27/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.27/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-8.0.27 -Dcatalina.home=/usr/local/apache-tomcat-8.0.27 -Djava.io.tmpdir=/usr/local/apache-tomcat-8.0.27/temp org.apache.catalina.startup.Bootstrap start root 23279 21375 0 20:25 pts/1 00:00:00 grep --color=auto tomcat [root@docker1 local]# kill -9 23080 #单独杀死tomcat,发现PID 23080 变为 23287 [root@docker1 local]# ps -ef |grep tomcat root 23287 22624 95 20:25 ? 00:00:00 /usr/local/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-8.0.27/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-8.0.27/endorsed -classpath /usr/local/apache-tomcat-8.0.27/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.27/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-8.0.27 -Dcatalina.home=/usr/local/apache-tomcat-8.0.27 -Djava.io.tmpdir=/usr/local/apache-tomcat-8.0.27/temp org.apache.catalina.startup.Bootstrap start root 23304 21375 0 20:26 pts/1 00:00:00 grep --color=auto tomcat [root@docker1 local]# supervisorctl -c /etc/supervisor/supervisord.conf reload #重启supervisor,发现tomcat PID 23287 变为 23336 Restarted supervisord [root@docker1 local]# ps -ef |grep tomcat root 23336 22624 99 20:26 ? 00:00:01 /usr/local/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-8.0.27/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-8.0.27/endorsed -classpath /usr/local/apache-tomcat-8.0.27/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.27/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-8.0.27 -Dcatalina.home=/usr/local/apache-tomcat-8.0.27 -Djava.io.tmpdir=/usr/local/apache-tomcat-8.0.27/temp org.apache.catalina.startup.Bootstrap start root 23354 21375 0 20:26 pts/1 00:00:00 grep --color=auto tomcat [root@docker1 local]# ps -ef |grep super root 22624 1 0 20:14 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf root 23395 21375 0 20:27 pts/1 00:00:00 grep --color=auto super [root@docker1 local]# kill -9 22624 #杀死supervisor进程,发现tomcat的进程PID不变 [root@docker1 local]# ps -ef |grep super root 23404 21375 0 20:27 pts/1 00:00:00 grep --color=auto super [root@docker1 local]# ps -ef |grep tomcat root 23336 1 3 20:26 ? 00:00:02 /usr/local/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-8.0.27/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-8.0.27/endorsed -classpath /usr/local/apache-tomcat-8.0.27/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.27/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-8.0.27 -Dcatalina.home=/usr/local/apache-tomcat-8.0.27 -Djava.io.tmpdir=/usr/local/apache-tomcat-8.0.27/temp org.apache.catalina.startup.Bootstrap start root 23409 21375 0 20:27 pts/1 00:00:00 grep --color=auto tomcat
开机启动Supervisor服务
(1)配置systemctl服务
1> 进入/lib/systemd/system目录,并创建supervisor.service文件
[root@docker1 /]# cd /lib/systemd/system [root@docker1 system]# vi supervisor.service [Unit] Description=supervisor After=network.target [Service] Type=forking ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown ExecReload=/usr/bin/supervisorctl $OPTIONS reload KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
2> 设置开机启动
[root@docker1 system]# systemctl enable supervisor.service Created symlink from /etc/systemd/system/multi-user.target.wants/supervisor.service to /usr/lib/systemd/system/supervisor.service. [root@docker1 system]# systemctl daemon-reload
3、修改文件权限为766
[root@docker1 system]# chmod 766 supervisor.service
(2)配置service类型服务
[root@docker1 init.d]# cd /etc/rc.d/init.d [root@docker1 init.d]# cat supervisor #!/bin/bash # # processname: supervisord # config: /etc/supervisor/supervisord.conf # pidfile: /var/run/supervisord.pid # . /etc/rc.d/init.d/functions RETVAL=0 start() { echo -n $"Starting supervisord: " daemon "supervisord -c /etc/supervisor/supervisord.conf " RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/supervisord } stop() { echo -n $"Stopping supervisord: " killproc supervisord echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/supervisord } restart() { stop start } case "$1" in start) start ;; stop) stop ;; restart|force-reload|reload) restart ;; condrestart) [ -f /var/lock/subsys/supervisord ] && restart ;; status) status supervisord RETVAL=$? ;; *) echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}" exit 1 esac exit $RETVAL
修改文件权限为755,并设置开机启动
注意:修改脚本中supervisor配置文件路径为你的supervisor的配置文件路径
======================================重点=======================================
1. supervisor 比较适合监控业务应用,且只能监控前台程序,php fork方式实现的daemon不能用它监控,否则supervisor> status 会提示:BACKOFF Exited too quickly (process log may have details)
2.每次修改配置文件后需进入supervisorctl,执行reload, 改动部分才能生效。
3.两个命令
supervisord : supervisor的服务器端部分,用于supervisor启动。
supervisorctl:启动supervisor的命令行窗口,在该命令行中可执行start、stop、status、reload等操作。
4.如果9001端口拒绝访问,服务器允许9001端口访问 ,保存iptables规则 。
[root@localhost ~]# iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 9001 -j ACCEPT
[root@localhost ~]# service iptables save
5.Supervisor只能管理非daemon的进程,也就是说Supervisor不能管理守护进程。否则提示Exited too quickly (process log may have details)异常。例子中的Tomcat默认是以守护进程启动的,所以我们改成了catalina.sh run,以前台进程的方式运行。
默认配置文件:/etc/supervisor/supervisord.conf
进程管理配置文件放到:/etc/supervisor/conf.d目录下即可
默认日志文件:/tmp/supervisord.log,可以查看进程的启动信息
------------------------------------------------------------------------------------
tomcat多实例的配置:
[root@docker1 ~]# cd /usr/local/
[root@docker1 local]# ls
apache-tomcat-8.0.27 etc games jdk jdk-8u60-linux-x64.tar.gz lib64 redis sbin src
bin extundelete include jdk1.8.0_60 lib libexec redis_init_script share tomcat
[root@docker1 local]# cp -r apache-tomcat-8.0.27/ apache-tomcat-8.0.28/
[root@docker1 local]# cd apache-tomcat-8.0.28
[root@docker1 apache-tomcat-8.0.28]# ls
bin conf lib LICENSE logs NOTICE RELEASE-NOTES RUNNING.txt temp webapps work
[root@docker1 apache-tomcat-8.0.28]# cd bin/
[root@docker1 bin]# ls
bootstrap.jar catalina-tasks.xml configtest.bat digest.bat setclasspath.sh startup.bat tomcat-native.tar.gz version.bat
catalina.bat commons-daemon.jar configtest.sh digest.sh shutdown.bat startup.sh tool-wrapper.bat version.sh
catalina.sh commons-daemon-native.tar.gz daemon.sh setclasspath.bat shutdown.sh tomcat-juli.jar tool-wrapper.sh
[root@docker1 bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/apache-tomcat-8.0.28
Using CATALINA_HOME: /usr/local/apache-tomcat-8.0.28
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-8.0.28/temp
Using JRE_HOME: /usr/local/jdk1.8.0_60
Using CLASSPATH: /usr/local/apache-tomcat-8.0.28/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.28/bin/tomcat-juli.jar
Tomcat started.
[root@docker1 bin]# ps -ef |grep tomcat #从这里看到tomcat并未启动,是由于端口冲突
root 84265 84264 0 16:38 ? 00:00:11 /usr/local/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-8.0.27/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-8.0.27/endorsed -classpath /usr/local/apache-tomcat-8.0.27/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.27/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-8.0.27 -Dcatalina.home=/usr/local/apache-tomcat-8.0.27 -Djava.io.tmpdir=/usr/local/apache-tomcat-8.0.27/temp org.apache.catalina.startup.Bootstrap start
root 86747 78819 0 17:28 pts/1 00:00:00 grep --color=auto tomcat
需要修改apache-tomcat-8.0.28/conf/server.xml文件:
☻服务端口
☻访问连接端口
第一个连接器监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。
connectionTimeout="6000" enableLookups="flase" acceptCount="800" redirectPort="8443" /> ☻与HTTP服务器连接端口 第二个连接器监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。 ☻修改war的存放目录(如果需要的话) < [root@docker1 bin]# ./startup.sh Using CATALINA_BASE: /usr/local/apache-tomcat-8.0.28 Using CATALINA_HOME: /usr/local/apache-tomcat-8.0.28 Using CATALINA_TMPDIR: /usr/local/apache-tomcat-8.0.28/temp Using JRE_HOME: /usr/local/jdk1.8.0_60 Using CLASSPATH: /usr/local/apache-tomcat-8.0.28/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.28/bin/tomcat-juli.jar Tomcat started. [root@docker1 bin]# ps -ef|grep tomcat root 84265 84264 0 16:38 ? 00:00:12 /usr/local/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-8.0.27/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-8.0.27/endorsed -classpath /usr/local/apache-tomcat-8.0.27/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.27/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-8.0.27 -Dcatalina.home=/usr/local/apache-tomcat-8.0.27 -Djava.io.tmpdir=/usr/local/apache-tomcat-8.0.27/temp org.apache.catalina.startup.Bootstrap start root 87379 1 37 17:41 pts/1 00:00:03 /usr/local/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-8.0.28/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-8.0.28/endorsed -classpath /usr/local/apache-tomcat-8.0.28/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.28/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-8.0.28 -Dcatalina.home=/usr/local/apache-tomcat-8.0.28 -Djava.io.tmpdir=/usr/local/apache-tomcat-8.0.28/temp org.apache.catalina.startup.Bootstrap start root 87404 78819 0 17:41 pts/1 00:00:00 grep --color=auto tomcat 配置supervisor [root@docker1 supervisor]# cat /etc/supervisor/supervisord.conf ...... ;包含其他配置文件 [include] ;files = relative/directory/*.ini ;可以指定一个或多个以.ini结束的配置文件 files = /etc/supervisor/config.d/*.ini ...... [root@docker1 supervisor]# cd /etc/supervisor/ [root@docker1 supervisor]# ls supervisord.conf [root@docker1 supervisor]# mkdir config.d [root@docker1 supervisor]# cd config.d/ [root@docker1 config.d]# vi tomcat.ini [program:supervisor_tomcat2] ;[program:xx]是被管理的进程配置参数,xx是进程的名称 command=/usr/local/apache-tomcat-8.0.28/bin/catalina.sh run ;在supervisord启动的时候也自动启动 autostart=true ;在supervisord启动的时候也自动启动 startsecs=10 ;启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒 autorestart=true ;程序退出后自动重启,可选值:[unexpected,true,flase],默认为unexpected,表示进程意味杀死后才重启 startretries=3 ;启动失败自动重试次数,默认是3 ;user=tomcat ;用哪个用户启动进程,默认是root user=root priority=999 ;进行启动优先级,默认999,值小的优先启动 redirect_stderr=true ;把stderr重定向到stdout,默认false stdout_logfile_maxbytes=20MB ;stdout日志文件大小,默认50MB stdout_logfile_backups=20 ;stdout日志文件备份数,默认是10 stdout_logfile=/usr/local/apache-tomcat-8.0.28/logs/catalina.out stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程 killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程 [root@docker1 supervisor]# supervisorctl update supervisor_tomcat2: added process group [root@docker1 supervisor]# supervisorctl supervisor_tomcat1 RUNNING pid 88429, uptime 0:00:23 supervisor_tomcat2 FATAL Exited too quickly (process log may have details) supervisor> stop supervisor_tomcat2 #需要多次执行start stop supervisor_tomcat2 supervisor_tomcat1: stopped supervisor> start supervisor_tomcat2 supervisor_tomcat2: started 附: Python包管理工具(easy_install) http://down.51cto.com/data/2448286 supervisor-3.1.3.tar http://down.51cto.com/data/2448338 jdk-8u60-linux-x64.tar.gz https://share.weiyun.com/5I4VPLS apache-tomcat-8.0.27.tar.gz http://down.51cto.com/data/2448652 https://share.weiyun.com/57PQ94r