Tomcat+mysql+nginx学习笔记

现在web开发基本离不开nginx这个大名鼎鼎的工具,这次笔记从0开始把jdk+tomcat+mysql+nginx组建一下

nginx要特别注意一下.以后用的只会越来越多(rpm引入:redhat package management)

1.java环境

A. 注意开源很多用的是OpenJdk,推荐最好用Oracle的jdk.用java -version看看信息就知道了.

以前如果就自带了OpenJdk,需要先卸载一下.如何在所有安装过的包查看呢,使用rpm

1
2
rpm -qa |grep python #查看跟python相关的包
rpm -e --nodeps java-1.6.0-1.13.7.1.el6_6.i686 #卸载相关包

B. 安装jdk

方法常见有两种,一是ftp上传之后解压安装,二是直接从linux下下载安装,第一种方式是必须掌握的.

因为有时候直接下载因为镜像源的问题很慢.而且动辄几百兆的安装包影响做其他事的效率.

一.FTP安装

其实也很简单:

1
2
3
4
5
6
7
8
9
10
11
12
a. 找好稳定官方的安装包,用ftp软件直接丢到/root目录下(当然,最好直接放在指定的目录)
b. cd /usr/local &&mkdir java #目录下自己创建一个java文件夹,然后把文件复制进去解压cp省了
c. tar -xvf jdk1.7.... #tab自动补全
d. yum install glibc.i686 #安装java的依赖,类似windows下很多软件安装的时候需要c++的包
e. vi /etc/profile #配置环境变量,在最后添加上这些,然后保存
#set java environment
2JAVA_HOME=/usr/local/s rc/java/jdk1.7.0_71
2CLASSPATH=.:$JAVA_HOME/lib.tools.jar
2PATH=$JAVA_HOME/bin:$PATH
2export JAVA_HOME CLASSPATH PATH
2
f. source /etc/profile #重新加载文件

2.mysql相关

1.检查是否安装过mysql(cent7.2还要检查整改,否则会报冲突)

  • 同理先检查一下

    1
    2
    3
    4
    5
    rpm -qa | grep mysql #查找如果没有就没安装
    rpm -e --nodeps mysqlxxxxx #如果有需要卸载的命令
    #cent7下要卸载系统自带的 mariadb-lib
    rpm -qa|grep mariadb # mariadb-libs-5.5.44-2.el7.centos.x86_64
    rpm -e --nodeps mariadb-libs-5.5.44-2.el7.centos.x86_64 #有时候后面不提示也行
  1. 上传之后安装步骤(同java)

    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
    A. ftp直接丢到/root目录下(当然,最好直接放在指定的目录)
    B. cd /usr/local &&mkdir mysql #目录下自己创建一个mysql文件夹,然后把文件复制进去解压
    C. tar -xvf Mysql.... #tab自动补全

    D. yum install glibc.i686 #安装mysql的依赖,这里注意不同cent版本需要不同,报错要注意看,不可一概而论,安装以mysql5.5为例
    #cent7.2 下最少需要这两个(看具体情况)
    2d.1 yum -y install libaio.so.1 #server包需要
    2d.2 yum -y install libncurses.so.5 #client包需要
    E. rpm -ivh MySQL-server-xxxx.rpm #安装server
    rpm -ivh MySQL-client-xxxx.rpm #安装client

    F. service mysql status && service mysql start #启动mysql服务

    G. mysql -uroot #第一次要设置mysql密码,不然以后登录不了
    #修改密码:
    2use mysql;
    2show tables;
    2update user set password =password('sakura') where user ='root'; #这里字符串你就是你要设置 的密码(不过官方说以后要换个方法改,自行关注后续可以修改此文档)
    2flush privileges #刷新-->以后就需要 mysql -uroot -p 登录了

    H. grant all privileges on *.* to 'root' @'%' identified by 'sakura';#开启root远程访问权限赋给所有表,不然其他人无法访问,当然这是比较简单粗暴的,考虑安全最好还是稳重一点
    flush privileges;
    #补充,如果上面授权不成功,可以看
    2mysql> use information_schema
    2mysql> select * from user_privileges;
    2查询到有下面的结果:’admin’@’%',说明mysql已经授权远程连接。
    #Ubuntu 14server专属
    还需要修改 /etc/mysql/my.cnf文件中注释掉地址绑定配置bind-address = 127.0.0.1这行

    I. /sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT#3306端口放行,修改iptables
    /etc/rc.d/init.d/iptables save#持久化规则.cen7.2或者ubuntu不是必须的且文件不一样,根据实际情况看.

    J. chkconfig --add mysql #加到系统服务中
    chkconfig mysql on #设置开机自动启动mysql服务

3.tomcat相关

1.安装步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
A. 前面步骤同上,不累赘,在/usr/local/tomcat7目录下复制安装包,然后解压.
B. cd bin && sh startup.sh #启动tomcat-->进入bin目录
2或者是 ./startup.sh #同sh命令
#启动成功后,如下
# Using CATALINA_BASE: /usr/local/tomcat7/apache-tomcat-7.0.52
# Using CATALINA_HOME: /usr/local/tomcat7/apache-tomcat-7.0.52
# Using CATALINA_TMPDIR: /usr/local/tomcat7/apache-tomcat-7.0.52/temp
# Using JRE_HOME: /usr/local/java/jdk1.7.0_72
# Using CLASSPATH: /usr/local/tomcat7/apache-tomcat- #7.0.52/bin/bootstrap.jar:/usr/local/tomcat7/apache-tomcat-7.0.52/bin/tomcat-juli.jar
# Tomcat started.

C. /sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT#在iptables中开启默认的8080端口
/etc/rc.d/init.d/iptables save #持久化规则,cent7.2不是这里
#另外一种办法
vi + /etc/sysconfig/iptables #编辑路由表,加入下面这行然后保存
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT

补: tail -f ../logs/catalina.out #动态查看tomcat日志文件

4.部署项目

1.发布所需

  1. 数据库跟表

    • 备份本地数据库

      1. windows下命令

        1
        mysqldump -uroot -pxx dbName > D:/rec.sql #xx代表root密码,备份dbName到本地D盘
      2. linux下操作

        1
        2
        3
        mysql -uroot -u#sql上传,然后登录mysql
        create dbName #创建同名database
        source /root/rec.sql #进入database.然后加载sql
2.上传导入项目文件

一般导入java项目是先打包成war包(类似zip包),然后加载.并不是原生直接加载class文件配置之类的

在tomcat的 /webapps 目录下,tomcat启动之后,war就会自动解压

war包其实也可以直接右键项目源文件保存为zip然后重命名一下..但是不太推荐这样做

打包上传移动到tomcat7/webapps目录下之后.会发现自动就解压了,然后直接访问就行了.

5.nginx引入

nginx是这次笔记的学习重点.一般简说nginx是一个高性能http跟反向代理服务器(俄罗斯猿设计的哦)

主要特点是:性能好,占内存少.反向代理,负载均衡,动静分离. (常用)

A.反向代理

要了解反向代理,就得先了解正向代理–>比如说Breaking the GFW

1.正向代理

​ 用户自己设置ip, 端口,找一个服务器,然后去连接目标的服务器.如图:

正向代理

2.反向代理

​ 服务器给自己的代理,用户无需任何设置.简单说可以理解为真实服务器的一个替身.就像电影里,观众看以为是某个明星本人,其实只是他的替身罢了.如图:

反向代理

B.负载均衡

负载均衡是比较好理解的,就相当于一种分流机制.大家一起来做事,分散服务器的压力,提高利用率

比如说银行柜台,如果只有一个口,那么自然压力巨大,排队很长.

如果开多个柜台口,自然就好很多.那么服务器中重点就在于集群的问题.

C.动静分离

动静分离说起来比较抽象,简单来说,有两种场景,一是前后台分离.nginx跑前台,tomcat之类的跑后台.

二是把图片,或者一些不变得东西存储在nginx所在的服务器,后续的一堆服务器都不需要去管这种静态资源的问题了,只需要处理动态的数据.

D.windows上搭建nginx集群相关

集群,顾名思义>1个服务器,demo来说用两个就可以看出效果了

随便启动两个jsp页面输出一句话的项目.两个项目端口不一样就行.(server.xml中修改)

  1. 我们要的最后的效果就是,两个项目,用户不需要不同路径去访问,而是通过nginx去分配.

    windows直接双击解压之后的nginx.exe就行了,非常简单,默认就是80端口,直接可以在localhost:80就可以看到

1
tasklist /fi "imagename eq nginx.exe" #cmd下查看命令,正常会有两个,一个是守护进程
  1. 在nginx中配置集群

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    nginx/conf 目录下打开nginx.conf  '#'代表注释
    #找到http开头的部分 http{xxxx server{xxx } }
    A. 在 location / {
    root html;
    index index.html index.htm;#在这下面加一行
    proxy_pass http://localhost:8080;#
    }
    B. 在http{ }中添加一个
    upstream xxx{ #xxx为任意名
    server localhost:8080;#本地下是127 其他自行变动,包括端口. 后面可以加weight 表示权重
    server localhost:8070;这里有多台服务器,端口不同,由xx共同代理
    }
    然后,在A的基础上,把之前的proxy_pass注释,改成http://xxx;如下
    location / {
    root html;
    index index.html index.htm;#在这下面加一行
    proxy_pass http://xxx;#xxx跟上面upstream 的名字保持一致
    }

3.这里就引入了一个很重要的问题—Session共享

同一个用户访问的时候,sessionId需要一致,但是只是简单实现负载均衡之后并不能达到这种效果,就会导致有很严重的问题,如何解决呢.有一些基本的方案

  1. web服务器解决(采用广播机制) –tomcat下这种方式性能低,weblogic很好 (windows下才合适)
  2. 保证一个ip地址访问的一直是同一台服务器 –nginx配置upstream中添加ip_hash(Linux下常用)
  3. redis存储sessionId然后共享 (推荐+趋势) —以后单独再谈

这里先说简单的web服务实现方式,那么就需要修改两个地方:

  • 修改tomcat的server.xml 支持共享(多个tomcat都需要修改添加Cluster [集群]项)

    1
    2
    3
    <Engin name="Catalina" defaultHost="localhost">
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/><!--这行默认是被注释了的 -->
    </Engin>
  • 修改项目的配置文件(多个项目的web.xml文件都需要修改)

    1
    2
    <!--项目的web.xml文件中添加一个distributable节点 -->
    <distributable/>

做完以上,就会发现极其简单就能完成一次windows下带session共享的ngingx负载均衡.当然,推荐还是在linux搭服务器.

E.linux上跑nginx

linux下直接上传nginx然后解压先.步骤完全同前,直接跳到解压之后

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
#1.这里不同于windows下直接可以运行nginx.exe,需要先编译一次,再安装(提前要安装依赖包)
yum install gcc-c++ #nginx用c++编写,自然需要这gcc环境
yum install -y pcre pcre-devel #perl
yum install -y zlib zlib-devel #cent 7.2下这个貌似自带,勿重复安装.cent6.x自行测试.
yum install -y openssl openssl-devel #

#2.安装nginx
make #直接在nginx目录下执行
make install #紧接着执行,完成就安装成功了

#3.启动nginx
cd .. #转到上一层目录,进入sbin目录,这个下面有一个nginx执行程序
./nginx #启动,如何查看呢,ps -ef |grep nginx
./nginx -s quit #等待程序执行完关闭,推荐
./nginx -s reload #不关闭nginx前提下更新配置文件,

#可选
/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT#添加80端口到防火墙中并保存
/etc/rc.d/init.d/iptables save#这两步cent7.2不需要,其他版本自行看

#4.修改conf文件 类似windows
upstream jin{ #这是新增的
server 139.199.13.63:8090;
server 139.199.13.63:8100;
ip_hash;#nginx的hash算法,保证单个ip只访问一个主机
}
server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html;
index index.html index.htm;
proxy_pass http://jin; #生效
}
./nginx -s reload #切换到sbin目录,重载ngingx
/usr/local/nginx/sbin/nginx //启动
/usr/local/nginx/sbin/nginx -s stop //关闭
/usr/local/nginx/sbin/nginx -s reload //重启

#5.把多个tomcat服务器的server.xml编辑好,改一下端口,默认的8080最好不要用了,以免冲突.编辑参考windows下
./tomcat1/apache-tomcat-7.0.52/bin/startup.sh #编辑完之后启动tomcat1和2,就大功告成了

补充说明一下,关于nginx中upstream的权重,建议不要随便配置,windows下测试发现,如果一个tomcat崩掉了,不加权重的时候回很快只使用余下正常的tomcat,但是加了权重就很可能会一直处于loading状态.

是否有其他参数避免这种情况,有待补充或者讨论.