跳到主要内容

Supervisor 安装与配置

· 阅读需 6 分钟

Supervisor 安装与配置

安装 supervisor

Yum 安装

# 配置 yum 源安装
yum install epel-release #安装yum源
yum install -y supervisor

# 启动 supervisor
/usr/bin/supervisord -c /etc/supervisord.conf
### 如果报错:error:class 'socket.error' [Errno 2] No such file or directory: file: /usr/lib64/python2.7/socket
/usr/bin/python2 /usr/bin/supervisord -c /etc/supervisord.conf

二进制安装

cd /usr/local/src
wget https://pypi.python.org/packages/7b/17/88adf8cb25f80e2bc0d18e094fcd7ab300632ea00b601cbbbb84c2419eae/supervisor-3.3.2.tar.gz

tar -zxvf supervisor-3.3.2.tar.gz
cd supervisor-3.3.2
python setup.py install #本地python版本为python2.7
# python2.7 setup.py install #本地python版本为python3以上

py工具安装

# 安装easy_install       
sudo yum install python-setuptools-devel

# 安装Supervisor
easy_install supervisor

# 生成配置文件
echo_supervisord_conf > /etc/supervisord.conf

# 启动
supervisord -c /etc/supervisord.conf
ps aux | grep supervisord

Supervisor 配置文件路径

supervisor配置文件:/etc/supervisord.conf
子进程配置文件路径:/etc/supervisord.d/

Supervisor 配置详解

supervisord.conf

[unix_http_server]
file=/tmp/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和端口,如果开放到公网,需要注意安全性
username=user #登录管理后台的用户名
password=123 #登录管理后台的密码

[supervisord]
logfile=/tmp/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:///tmp/supervisor.sock #通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
serverurl=http://127.0.0.1:9001 #通过HTTP的方式连接supervisord

#包含其它配置文件
[include]
files = relative/directory/*.ini #可以指定一个或多个以.ini结束的配置文件

子进程配置文件说明

给需要管理的子进程(程序)编写一个配置文件,放在/etc/supervisor.d/目录下,以.ini作为扩展名(每个进程的配置文件都可以单独分拆也可以把相关的脚本放一起)

如任意定义一个和脚本相关的项目名称的选项组(/etc/supervisord.d/test.conf):

#项目名
[program:blog]
#脚本目录
directory=/opt/bin
#脚本执行命令
command=/usr/bin/python /opt/bin/test.py

#supervisor启动的时候是否随着同时启动,默认True
autostart=true
#当程序exit的时候,这个program不会自动重启,默认unexpected,设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的
autorestart=false
#这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1
startsecs=1

#脚本运行的用户身份
user = test

#日志输出
stderr_logfile=/tmp/blog_stderr.log
stdout_logfile=/tmp/blog_stdout.log
#把stderr重定向到stdout,默认 false
redirect_stderr = true
#stdout日志文件大小,默认 50MB
stdout_logfile_maxbytes = 20MB
#stdout日志文件备份数
stdout_logfile_backups = 20

写个例子

[program:test] 
directory=/opt/bin
command=/usr/bin/python /opt/bin/test.py #最好使用绝对路径
autostart=true
autorestart=false
stderr_logfile=/tmp/test_stderr.log
stdout_logfile=/tmp/test_stdout.log
#user = test

以 Nginx 进程配置为例

[program: nginx]    
;管理的子进程。后面的是名字,最好写的具有代表性,避免日后”认错“

command=/usr/local/nginx/sbin/nginx -g 'daemon off;'
;我们的要启动进程的命令路径,可以带参数。

directory=/root ;
;进程运行前,会先切换到这个目录

autorestart=true;
;设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。false表示无论什么情况下,都不会被重新启动;unexpected表示只有当进程的退出码不在下面的exitcodes里面定义的退出码的时候,才会被自动重启。当为true的时候,只要子进程挂掉,将会被无条件的重启

autostart=true ;
;如果是true的话,子进程将在supervisord启动后被自动启动,默认就是true

stderr_logfile=/home/work/super/nginx_error.log ;
stdout_logfile=/home/work/super/nginx_stdout.log ;

environment=ASPNETCORE_ENVIRONMENT=Production ;
;这个是子进程的环境变量,默认为空

user=nginx ;
;可以用来管理该program的用户

stopsignal=INT
;进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1等,默认为TERM

startsecs=10 ;
;子进程启动多少秒之后,此时状态如果是running,我们认为启动成功了,默认值1

startretries=5 ; 当进程启动失败后,最大尝试的次数。当超过5次后,进程的状态变为FAIL

stopasgroup=true
;这个东西主要用于,supervisord管理的子进程,这个子进程本身还有子进程。那么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程有可能会变成孤儿进程。所以可以设置这个选项,把整个该子进程的整个进程组干掉。默认false

Supervisor 常用命令

supervisorctl status        //查看所有进程的状态

supervisord //启动supervisord
supervisorctl start all //启动supervisord管理的所有进程
supervisorctl stop all //停止supervisord管理的所有进程
supervisorctl restart all // 重启所有进程
supervisorctl stop zedis //停止zedis, name为[program:xx]中的xx
supervisorctl start zedis //启动zedis
supervisorctl restart zedis //重启zedis
supervisorctl update //配置文件修改后使用该命令加载新的配置
supervisorctl reload //重新加载配置文件并启动
supervisorctl shutdown //停止supervisord

Java 常用注解

· 阅读需 5 分钟

Java 常用注解整理

不断补充,更新中...

一、Spring

  • @Autowire

@Autowrie(require=false)

自动装配bean,默认不允许值为null(即require=true),可以在属性上或者Set方法上使用 先通过bytype的方式查找,再通过byname的方式查找

  • @Resource

自动装配 bean

先通过 byname 的方式查找,再通过 bytype 的方式查找

  • @Nullable

字段可以为 null

  • @Qualifier(value="xxx")

制定唯一的 Bean 注入(通过别名寻找),配合 @Autowire 使用

  • @Component、@Repository、@Service、@Controller

注册 Bean 并装配到 Spring 容器中,通过类路径扫描来自动侦测,等价于<bean id="xx" class="xxx">

一般 @Component 在 pojo 中使用、@Respository 在 Dao 中使用、@Service在 Service 中使用、@Controller 在 Controller 中使用

本质上都是 @Component

  • @Value("xxx")

注入值、等价于<property name="xxx" value="xxx"/>

  • @Scope(value="xxx")

配置 bean 的作用域,默认是单例的,可放在属性上或者set方法上

  • @Configuration

使一个 Java 类成为配置类,等价于<beans> ... </beans>

  • @ComponentScan("包名")

根据制定的配置自动扫描 package

默认扫描规则是扫描被 @Component, @Repository, @Service, @Controller 或者已经声明过 @Component 自定义注解标记的组件

  • @Import(配置类的class)

将对应类注册到 ioc 容器中

一般用于将包扫描路径外的类注册到 ios 容器中

  • @Bean

注册 Bean 并装配到 Spring 容器中,通常是在标有该注解的方法中定义产生这个 bean 的逻辑 (return对象),等价于<Bean id="方法名" class="返回值"/>

  • @Aspect

标注这个类是一个切面

@Before("execution(* com.xxx.(..))")

@After("execution( com.xxx.*(..))")

二、Mybatis

  • @Mapper

说明该接口的实现类由 mybatis 创建,并将生成后的对象注册到 ioc 容器中

  • @MapperScan

自动扫描某个包下的所有接口,相当于包下的所有接口都加上了 @Mapper 注解

  • @Param

对应 sql 中#{}占位符中的变量名称,常在不同类型时制定

TDeposit queryByGuinoAndBoxid(@Param("guino")String guino, @Param("boxid")Integer boxid);
  • @Alias

在pojo类中使用,为其起一个别名,配合@Resource使用

@Service,@Controller等注解集成了@Alias注解,直接通过value属性设置即可

@Alias("author")
public class Author {
...
}
@Service(value = "hahhh")
  • @Insert @Delete @Select @Update

对应增删改查语句

三、Lombok

  • @Data

包含@ToString、@EqualsAndHashCode、@Getter、@Setter的功能

  • @ToString

自动生成toSring()方法

  • @Getter、@Setter

自动生成get、set方法

  • @NONNULL

自动加上if (members == null) throw new java.lang.NullPointerException("members");

  • @Synchronized

自动给方法加同步锁

synchronized ($lock) { ... }

  • @Slf4j

简化日志的定义

四、SpringMVC

  • @Controller

实际上是@Component,作为组件注册到ioc容器

  • ResponseBody

返回值将和response的body绑定,即页面会直接显示返回的内容

  • @RestController

相当于@Controller+@ResponseBody的组合注解

  • @RequestBody

用于获取请求body里的内容

  • @RequestMapping

用于定于访问路径。默认请求方式是GET

/**
* value: uri地址
* method: 指定请求的method类型, GET、POST、PUT、DELETE等
* consumes: 指定Content-Type
* produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
* params: 指定request中必须包含某些参数值是,才让该方法处理。
* headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
**/
@RequestMapping(value="/test", method = RequestMethod.GET)
  • @RequestParam

从请求URL中读取请求参数。默认是必须参数

/**
* value: 入参的请求参数名字
* required: 是否必须,默认是true
* defaultValue: 默认值
**/
public String queryUserName((@RequestParam(value = "name", required = false, defaultValue = "honey") String name))
  • @PathVariable

获取URI中Path变量定义为花括号的内容

@RequestMapping(value = "/products/```{id}```", method = RequestMethod.PUT)
@PathVariable("id") String id
  • @GetMapping("/{id}"), @PostMapping("/{id}"), @PutMapping("/{id}"), @DeleteMapping("/{id}")

相当于指定了method参数的@RequestMapping

五. 异常处理

  • @ControllerAdvice

全局处理异常

  • @ExceptionHandler

@ExceptionHandler(value = ProductNotfoundException.class)

@ControllerAdvice
public class ProductExceptionController {
@ExceptionHandler(value = ProductNotfoundException.class)
public ResponseEntity\`<Object>\` exception(ProductNotfoundException exception) {
return new ResponseEntity<>("Product not found", HttpStatus.NOT_FOUND);
}
}

六、SpringBoot

  • @SpringBootApplication

@SpringBootApplication 启动注解,是一个复合注解

包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解

  • @SpringBootConfiguration

继承 @Configuration 注解,主要用于加载配置文件, 标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。

  • @EnableAutoConfiguration 注解,开启自动配置功能

可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自动配置功效才得以大功告成

  • @ComponentScan

主要用于组件扫描和自动装配 , 自动扫描并加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中。我们可以通过basePackages等属性指定@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现从声明@ComponentScan所在类的package进行扫描,默认情况下是不指定的,所以SpringBoot的启动类最好放在root package下。

  • @ServletComponentScan

在SpringBootApplication上使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。

  • @MapperScan(“com.Vm.server”)

只会扫描包中的接口,不会扫描类,扫描指定包中的接口

  • @EnableScheduling

spring自带的定时服务

public class ScheduledTasks {
@Scheduled(fixedRate = 1000 * 30) //每30秒执行一次
public void reportCurrentTime(){
System.out.println ("Scheduling Tasks Examples: The time is now " + dateFormat().format (new Date ()));
}
}

Linux 安装 java 环境

· 阅读需 1 分钟

Linux 安装 java 环境

下载 JDK 安装包

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

解压安装包

cd /opt

tar xf jdk-8u311-linux-i586.tar.gz

配置环境变量

vim /etc/profile

export JAVA_HOME=/opt/jdk1.8.0_311
export PATH=$JAVA_HOME/bin:$PATH

# 使配置文件生效
source /etc/profile

报错处理

java -version 测试报错:
# “bash: ./java: /lib/ld-linux.so.2: bad ELF interpreter:

# 为什么报错?
# 镜像使用的MINI ISO,部分依赖需要自己下载

# 解决方案:
yum install glibc.i686