tomcat、mysql、nginx、redis版本升级
Tomcat
安装
查看当前tomcat版本:
tomcat安装在/usr/local/下
cd 至apache-tomcat-xxx/bin
sh version.sh命令,查看版本信息下载需要的tomcat安装包:
下载网址:https://tomcat.apache.org/
选择需要下载的版本:
上传包,并解压
[root@localhost local]# tar -xvf apache-tomcat-8.0.52.tar.gz
把Tomcat文件移动到Tomcat文件夹
[root@localhost tomcat]# mv * /usr/local/tomcat
进入tomcat下的bin然后启动Tomcat
[root@localhost bin]# ./startup.sh
查看进程
ps -ef | grep tomcat
以service方式启动
对tomcat
文件进行编辑
1 | [root@localhost ~]# vi /etc/rc.d/init.d/tomcat |
设置tomcat的文件属性,把tomcat 修改为可运行的文件
chmod 755 tomcat
服务就添加成功
chkconfig –list测试
service tomcat start
service tomcat stop
service tomcat restart
service tomcat status
升级
去服务器备份apache-tomcat-xx 下的全部文件。
来到apache-tomcat-xx同级目录新建一个文件夹:
命令:mkdir tomcat-backups
复制apache-tomcat-xx下的所有文件到 tomcat-backups:
命令:cp -Rf apache-tomcat-xx路径/* tomcat-backups/将现apache-tomcat-xx改名为apache-tomcat-old
命令mv apache-tomcat-xx apache-tomcat-old上传下载过的tomcat安装包。
创建放置tomcat服务器的文件夹,使用 tar -zxvf命令解压tomcat到该文件夹
复制备份的tomcat-backups下的conf,项目,server.keystore文件到升级后的tomcat下。并删除ROOT,docs,manager文件(没有则不用管)
cd 至tomcat/bin目录下,执行 ./shutdown.sh关闭 ./startup.sh启动服务器
升级后在/bin目录下查看版本
运行机制
对一个servlet容器
1:实现Servlet api规范。这是最基础的一个实现,servlet api大部分都是接口规范。如request、response、session、cookie。为了我们应用端能正常使用,容器必须有一套完整实现。
2:启动Socket监听端口,等待http请求。
3:获取http请求,分发请求给不同的协议处理器,如http和https在处理上是不一样的。
4:封装请求,构造HttpServletRequest。把socket获取的用户请求字节流转换成java对象httprequest。构造httpResponse。
5:调用(若未创建,则先加载)servlet,调用init初始化,执行servlet.service()方法。
6:为httpResponse添加header等头部信息。
7:socket回写流,返回满足http协议格式的数据给浏览器。
8:实现JSP语法分析器,JSP标记解释器。JSPservlet实现和渲染引擎。
9:JNDI、JMX等服务实现。容器一般额外提供命名空间服务管理。
10:线程池管理,创建线程池,并为每个请求分配线程。
Redis
安装
redis历史版本下载
http://download.redis.io/releases/
最新版本下载
https://redis.io/download
下载下来后解压
tar xzvf redis-x.x.x.tar.gz
进入解压后的文件夹
cd redis-x.x.x
安装
1
2make
make install PREFIX=/usr/local/redis
查看是否启动
检查后台进程是否正在运行ps -ef |grep redis
检测6379端口是否在监听netstat -lntp | grep 6379
客户端检测连接是否正常/usr/local/redis-6.0.5/bin/redis-cli
redis make 失败的解决方法
其实最大可能是系统gcc通常安装不全面
- 安装gcc套装
yum install cpp
yum install binutils
yum install glibc
yum install glibc-kernheaders
yum install glibc-common
yum install glibc-devel
yum install gcc
yum install make - 升级gcc
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash - 完事
升级
其实主要就是换配置文件cp /usr/local/redis-6.0.5/redis.conf /usr/local/redis-6.0.6/redis.conf
Nginx
安装
官网下载链接http://nginx.org/en/download.html
也可以用wget下载wget http://nginx.org/download/nginx-1.18.0.tar.gz
由于需要编译,需要事先安装编译文件yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
解压nginx解压包tar zxvf nginx-1.16.1.tar.gz
进入nginx目录,编译安装
1 | [root@localhost nginx-1.16.1]# ./configure |
编译完成后查看版本(主要,安装后ningx在local下,而不是解压后的文件)
1 | [root@localhost sbin]# ./nginx -v |
Nginx 配置
创建 Nginx 运行使用的用户 www:
1 | [root@bogon conf]# /usr/sbin/groupadd www |
配置nginx.conf
,将conf/nginx.conf
替换为以下内容(参考了菜鸟教程)
1 | user www www; |
检查配置文件nginx.conf的正确性命令,报错基本上是路径路径日志问题,touch一下就ok
1 | [root@localhost nginx]# sbin/nginx -t |
启动
1 | [root@localhost sbin]# ./nginx |
访问站点(本机ip)
升级
进入新版本的的bin目录,编译一遍configure
,和make
一遍就ok了 但项目具体不是这样操作
在nginx/sbin
目录下选择nginx
启动,旧的自动改名为nginx.old
运行原理
master进程用来管理worker进程,包括:接受来自外界的信号,向个worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动启动新的worker进程。
master进程充当整个进程组与用户的交互接口,同时对进程进行监护,他不需要处理网络时间,不负责业务的执行,只会通过管理worker进程来实现重启服务,平滑升级,管理日志文件,配置文件实时生效等功能。
我们控制nginx,只需要通过kill向master进程发送信号就行了。比如 kill -HUP pid,从容重启nginx,服务是不中断的。因为matser进程接受信号后,会重新加载配置文件,然后再启动新的worker进程,并向老的worker进程发送信号,告送他可以退休。新的worker在起动后就开始接受新的请求,而老的worker在收到master的信号后,就不再接受新的请求,并且在当前进程中处理完所有请求后再退出。worker进程处理基本的网络事件。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各个进程相互之间是独立的。一个请求只可能在一个worker进程中处理,一个worker进程,不可能处理其他进程的请求。
首先每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。
优点:
1、对于每个worker进程来说,都是独立的进程,不需要加锁,所以省掉了锁带来的开销。
2、采用独立的进程,可以让互相之间不会影响,一个进程退出后,其他进程还在工作,服务不会中断,master进程则会很快的启动新的worker进程
3、如果worker进程异常退出,肯定是程序有bug,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,降低了风险。nginx的事件处理过程
首先看一下web服务器B/S
web服务器以B/S方式提供服务。浏览器和服务器的交互方式如下
browser <———> server1、浏览器向服务器发送http请求(request)
2、服务器收到浏览器的请求数据,经过分析处理,向浏览器输出响应数据(response)
3、浏览器收到服务器的响应数据,经过分析处理,将最终结果显示在浏览器中。
基于这个B/S,到达系统底层就是数据的读写事件,nginx采用的是异步非阻塞,具体到系统调用就是像liunx系统中的select、poll/epoll/kqueue。nginx默认使用epoll:
当事件没有准备好时,放到epoll里面,事件准备好了,我们就去读写,当读写返回engain时,我们将它再次放入到epoll里面。这样,只要有事件准备好了,我们就去处理它,只有当所有事件都没有准备好时,才在epoll里面等着。这样,我们就可以并发处理大量的并发了,当然,这里的并发请求是指未处理完的请求,线程只有一个,所以同时能处理的请求当然只有一个了,只是在请求间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的,这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事件。于多线程相比,这种事件处理方式有很大的优势,不需要创建线程,每个请求占用的内存也很少,没有上下文切换,事件处理非常轻量级。并发数再多也不会导致无谓的资源浪费(上下文切换)。更多的并发数只是会占用更多的内存而已。
推荐设置worker的个数是cpu的核数,这里就容易理解了,更多的worker数,只会导致进程来竞争cpu资源,从而带来不必要的上下文切换。
MySQL
安装
安装mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
环境CentOS-7-x86_64-Everything-2003(桌面版)
在local文件夹下创建文件夹mysql,再在mysql里面创建data
1
[root@localhost ~]# mkdir -p /usr/local/mysql/data
创建一个名为mysql的用户组,在用户组下创建用户
1
2[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd -g mysql -d /usr/local/mysql mysql上传并解压包
tar -xvf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
进入刚刚解压的文件夹
cd mysql-5.7.30-linux-glibc2.12-x86_64
将里面的文件移动的use/local/mysql下
mv * use/local/mysql
进入mysql目录,然后开始初始化
1
2
3cd /usr/local/mysql
./bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
进入mysql的data目录下清空数据
1
2[root@localhost mysql]# cd data/
[root@localhost data]# rm -rf *在mysql文件夹下运行以下命令
./bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize
成功,最后的是随机生成的初始密码,后续需要用到记得保存
测试
./support-files/mysql.server start
成功
出现下面错误不要怕继续往底下做创建软连接
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
备份、修改配置文档
1
2
3
4
5
6
7
8
9
10
11
12[root@localhost ~]# mv /etc/my.cnf /etc/my.cnf.bak
[root@localhost ~]# vi /etc/my.cnf
# 复制以下配置信息写进my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
character_set_server=utf8
init_connect='SET NAMES utf8'
[client]
default-character-set=utf8配置开机启动
拷贝启动文件到/etc/init.d/下并重命令为mysqldcp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
增加执行权限chmod 755 /etc/init.d/mysqld
检查自启动项列表中没mysqld这个chkconfig --list mysqld
如果没就添加mysqldchkconfig --add mysqld
用这个命令设置开机启动chkconfig mysqld on
如果在执行第一步就报错,则说明刚刚配置出问题了
- 测试是否配置成功
启动服务service mysqld start
重启服务service mysqld restart
停止服务service mysqld stop
初始化mysql用户root密码
登录mysql
1 | [root@localhost ~]# mysql -uroot -p |
远程链接
用于链接工具链接上数据库(前提是需要网络联通,并且开放3306端口或关闭防火墙)
1 | mysql> grant all on *.* to 'root'@'%' identified by '1234'; |
升级
下载安装包
MYSQL官方archives链接地址:http://downloads.mysql.com/archives/community/
备份data数据cp -r ./mysql/date ./mysql_date_bak
停止数据库的运行
1 | [root@MySQL mysql]# /etc/init.d/mysqld stop |
解压新版本的包
1 | [root@MySQL ~]# tar zxvf mysql-5.7.31-linux-glibc2.5-x86_64.tar.gz -C /usr/local/ |
删除原有的链接
1 | [root@MySQL ~]# unlink /usr/local/mysql |
新建软连接
1 | [root@MySQL ~]# ln -s /usr/local/mysql-5.7.31-linux-glibc2.5-x86_64 /usr/local/mysql |
启动
1 | [root@MySQL ~]# /etc/init.d/mysqld start |
使用mysql_upgrade 升级MySQL数据中的系统表升级
1 | [root@MySQL ~]# /usr/local/mysql/bin/mysql_upgrade -s -p |
进入mysql查看版本号
1 | mysql> select version(); |
项目启动与暂停
tomcat > redis > mysql > phoenix > hbase > hadoop 依次暂停
kafka与zookeeper可以不用暂停
开启就倒序开启(最后启动tomcat)