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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@localhost ~]# vi /etc/rc.d/init.d/tomcat


#!/bin/bash
# description: Tomcat7 Start Stop Restart
# processname: tomcat7
# chkconfig: 234 20 80

#安装jdk的路径
JAVA_HOME=/usr/lib/jvm/jdk1.8.0_171
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH

#安装tomcat的路径
CATALINA_HOME=/usr/local/tomcat
case $1 in
start)
sh $CATALINA_HOME/bin/startup.sh
;;
stop)
sh $CATALINA_HOME/bin/shutdown.sh
;;
restart)
sh $CATALINA_HOME/bin/shutdown.sh
sh $CATALINA_HOME/bin/startup.sh
;;
esac
exit 0
  • 设置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
    2
    make
    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
2
[root@localhost nginx-1.16.1]# ./configure
[root@localhost nginx-1.16.1]# make && make install

编译完成后查看版本(主要,安装后ningx在local下,而不是解压后的文件)

1
2
[root@localhost sbin]# ./nginx -v
nginx version: nginx/1.16.1

Nginx 配置

创建 Nginx 运行使用的用户 www:

1
2
[root@bogon conf]# /usr/sbin/groupadd www 
[root@bogon conf]# /usr/sbin/useradd -g www www

配置nginx.conf ,将conf/nginx.conf替换为以下内容(参考了菜鸟教程)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
user www www;
worker_processes 2; #设置值和CPU核心数一致
error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日志位置和日志级别
pid /usr/local/webserver/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 65535;
}
http
{
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';

#charset gb2312;

server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;

sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;

#limit_zone crawler $binary_remote_addr 10m;
#下面是server虚拟主机的配置
server
{
listen 80;#监听端口
server_name localhost;#域名
index index.html index.htm index.php;
root /usr/local/webserver/nginx/html;#站点目录
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$
{
expires 30d;
# access_log off;
}
location ~ .*\.(js|css)?$
{
expires 15d;
# access_log off;
}
access_log off;
}

}

检查配置文件nginx.conf的正确性命令,报错基本上是路径路径日志问题,touch一下就ok

1
2
3
[root@localhost nginx]# sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

启动

1
2
3
4
5
6
[root@localhost sbin]# ./nginx 
[root@localhost sbin]# ps -ef | grep nginx
root 40326 1 0 23:43 ? 00:00:00 nginx: master process ./nginx
www 40327 40326 0 23:43 ? 00:00:00 nginx: worker process
www 40328 40326 0 23:43 ? 00:00:00 nginx: worker process
root 40381 32630 0 23:44 pts/4 00:00:00 grep --color=auto 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 <———> server

    1、浏览器向服务器发送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
    3
    cd /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/下并重命令为mysqld
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

增加执行权限
chmod 755 /etc/init.d/mysqld

检查自启动项列表中没mysqld这个
chkconfig --list mysqld

如果没就添加mysqld
chkconfig --add mysqld

用这个命令设置开机启动
chkconfig mysqld on

如果在执行第一步就报错,则说明刚刚配置出问题了

  • 测试是否配置成功
    启动服务
    service mysqld start
    重启服务
    service mysqld restart
    停止服务
    service mysqld stop

初始化mysql用户root密码

登录mysql

1
2
3
4
5
[root@localhost ~]# mysql -uroot -p
Enter password: # 这里输入刚刚的随机密码

# 重置密码,例如root用户将密码改回1234
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '1234';

远程链接

用于链接工具链接上数据库(前提是需要网络联通,并且开放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
2
[root@MySQL mysql]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS!

解压新版本的包

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
2
[root@MySQL ~]# /etc/init.d/mysqld start
Starting MySQL..... SUCCESS!

使用mysql_upgrade 升级MySQL数据中的系统表升级

1
[root@MySQL ~]# /usr/local/mysql/bin/mysql_upgrade -s -p

进入mysql查看版本号

1
2
3
4
5
6
7
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.31 |
+-----------+
1 row in set (0.00 sec)

项目启动与暂停
tomcat > redis > mysql > phoenix > hbase > hadoop 依次暂停
kafka与zookeeper可以不用暂停
开启就倒序开启(最后启动tomcat)