JoyLau's Blog

JoyLau 的技术学习与思考

SpringBoot-Start

说明

  • 玄铁重剑是神雕侠侣中杨过的兵器,外表看似笨重无比,但内在却精致有细。
  • 在脚本语言和敏捷开发大行其道的时代,JavaEE的开发显得尤为笨重,这使得很多开发人员本应该如此,Spring在提升JavaEE的开发效率上从未停止过努力,SpringBoot的出现时具有颠覆性和划时代意义的。

开始准备

  • JDK1.7+
  • Maven3.x+
  • Tomcat8.5+
  • Spring4.3.x+
  • IntelliJ IDEA / MyEclipse(强烈推荐IDEA,我认为IDEA目前所有 IDE 中最具备沉浸式的 IDE,没有之一

优缺点

优点

  • 习惯优于配置:使用SpringBoot只需要很少的配置,在绝大部分时候我们只需要使用默认配置
  • 项目极速搭建,可无配置整合其他第三方框架,极大提高开发效率
  • 完全不使用XML配置,只使用自动配置和JavaConfig
  • 内嵌Servlet容器,可打成jar包独立运行
  • 强大的运行时监控
  • 浑然天成的集成云计算

缺点

  • 流汗没有

优雅的开始

  • Spring 官方网站搭建

    1. 访问:http://start.spring.io/
    2. 选择构建工具Maven Project、Spring Boot版本1.5.1以及一些工程基本信息,可参考下图所示
      SpringInitializr
    3. 点击Generate Project下载项目压缩包
    4. 导入到你的工程,如果是IDEA,则需要:
      a.菜单中选择File–>New–>Project from Existing Sources...
      b.选择解压后的项目文件夹,点击OK
      c.点击Import project from external model并选择Maven,点击Next到底为止。
      d.若你的环境有多个版本的JDK,注意到选择Java SDK的时候请选择Java 7以上的版本
  • IntelliJ IDEA创建(强烈推荐
    在File菜单里面选择 New > Project,然后选择Spring Initializr,接着如下图一步步操作即可。
    SpringInitializr
    SpringInitializr-2
    SpringInitializr-3
    SpringInitializr-4

若上述步骤步骤没有出现网络错误导致的无法搭建,基本上已经没有什么问题了

项目目录

根据上面的操作已经初始化了一个Spring Boot的框架了,项目结构如下:
SpringBootProject-view

项目里面基本没有代码,除了几个空目录外,还包含如下几样东西。

  • pom.xml:Maven构建说明文件。
  • JoylauApplication.java:一个带有main()方法的类,用于启动应用程序(关键)。
  • JoylauApplicationTests.java:一个空的Junit测试类,它加载了一个使用Spring Boot字典配置功能的Spring应用程序上下文。
  • application.properties:一个空的properties文件,你可以根据需要添加配置属性。(还推荐一种yml文件的配置方式)

项目文件

我们来看pom.xml文件

1
2
3
4
5
6
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

这块配置就是Spring Boot父级依赖,有了这个,当前的项目就是Spring Boot项目了,spring-boot-starter-parent是一个特殊的starter,它用来提供相关的Maven默认依赖,使用它之后,常用的包依赖可以省去version标签。

并不是每个人都喜欢继承自spring-boot-starter-parent POM。也有可能我们需要使用的自己的公司标准parent,或者我们更喜欢显式声明所有的Maven配置。
如果不想使用spring-boot-starter-parent,仍然可以通过使用scope = import依赖关系来保持依赖关系管理:

1
2
3
4
5
6
7
8
9
10
11
12
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

该设置不允许使用spring-boot-dependencies所述的属性(properties)覆盖各个依赖项,要实现相同的结果,需要在spring-boot-dependencies项之前的项目的dependencyManagement中添加一个配置,例如,要升级到另一个Spring Data版本系列,可以将以下内容添加到pom.xml中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<dependencyManagement>
<dependencies>
<!-- Override Spring Data release train provided by Spring Boot -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>Fowler-SR2</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

项目依赖

起步依赖 spring-boot-starter-xx

Spring Boot提供了很多”开箱即用“的依赖模块,都是以spring-boot-starter-xx作为命名的。举个例子来说明一下这个起步依赖的好处,比如组装台式机和品牌机,自己组装的话需要自己去选择不同的零件,最后还要组装起来,期间有可能会遇到零件不匹配的问题。耗时又消力,而品牌机就好一点,买来就能直接用的,后续想换零件也是可以的。相比较之下,后者带来的效果更好点(这里就不讨论价格问题哈),起步依赖就像这里的品牌机,自动给你封装好了你想要实现的功能的依赖。就比如我们之前要实现web功能,引入了spring-boot-starter-web这个起步依赖。我们来看看spring-boot-starter-web到底依赖了哪些,如下图:
SpringBoot-starter-web-dependencies

最后

项目启动的三种方式

  1. main方法
    SpringBoot-Start1
  2. 使用命令 mvn spring-boot:run在命令行启动该应用,IDEA中该命令在如下位置
    SpringBoot-Start2
  3. 运行mvn package进行打包时,会打包成一个可以直接运行的 JAR 文件,使用java -jar命令就可以直接运行
    SpringBoot-Start3
    SpringBoot-Start4

MATE Desktop

上面的截图是我安装好之后界面,安装的是MATE桌面

说明

  • 1.阿里云官网默认的Linux Centos7系统镜像,都是没有安装桌面环境的,用户如果要使用桌面,需要自己在服务器上进行安装
  • 2.生产环境下不要安装桌面,毕竟生产环境下的资源都是很紧张的
  • groups是Centos7才有的命令

开始安装

  • 登录服务器,执行命令安装桌面环境(537M)

    1
    yum groups install "MATE Desktop"
  • 安装好MATE Desktop 后,再安装X Window System(19M)

    1
    yum groups install "X Window System"

配置

  • 设置服务器默认启动桌面
    1
    systemctl  set-default  graphical.target

启动

  • 重启服务器
    1
    reboot

在ECS控制台,用管理终端登录服务器,进入到服务器系统登录界面,用root密码登录服务器。

卸载

1
2
3
4
yum groupremove 'X Window System' -y
yum groupremove 'MATE Desktop' -y
// 恢复至默认启动界面
systemctl set-default multi-user.target

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
////////////////////////////////////////////////////////////////////
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永无BUG //
////////////////////////////////////////////////////////////////////

说明

  • 有一些命令是centos7特有的,在低版本的可能无法使用

防火墙

  • 查看防火墙状态: systemctl status firewalld
  • 开启防火墙 : systemctl start firewalld
  • 停止防火墙: systemctl disable firewalld
  • 重启防火墙: systemctl restart firewalld.service
  • 开启80端口: firewall-cmd --zone=public --add-port=80/tcp --permanent
  • 禁用防火墙: systemctl stop firewalld
  • 查看防火墙开放的端口号: firewall-cmd --list-ports

Tomcat

  • 查看tomcat运行状态:ps -ef |grep tomcat
  • 看到tomcat的pid之后:kill -9 pid 可以强制杀死tomcat的进程

系统信息

  • 查看cpu及内存使用情况:top(停止刷新 -q)
  • 查看内存使用情况 :free

文件操作

  • 删除文件里机器子文件夹的内容:rm -rf /var/lib/mysql
  • 查找某个文件所在目录:find / -name filename

压缩与解压缩

  • 解压zip压缩文件:unzip file.zip,相反的,压缩文件 zip file (需安装yum install unzip zip,),解压到指定目录可加参数-d,如:unzip file.zip -d /root/
  • 将 test.txt 文件压缩为 test.zip,zip test.zip test.txt,当然也可以指定压缩包的目录,例如 /root/test.zip ,后面的test.txt也可以换成文件夹
  • linux下是不支持直接解压rar压缩文件,建议将要传输的文件压缩成zip文件
  • yum install p7zip 安装7z解压,支持更多压缩格式(卸载yum remove p7zip

快速删除文件夹/文件

  • 有时我们的文件夹里有很多文件,默认的删除方式是递归删除,文件夹深了及文件多了,删除会非常的慢,这时候:
  • 先建立一个空目录
    mkdir /data/blank
  • 用rsync删除目标目录
    rsync–delete-before -d /data/blank/ /var/spool/clientmqueue/
  • 同样的对于大文件:创建空文件
    touch /data/blank.txt
  • 用rsync清空文件
    rsync-a –delete-before –progress –stats /root/blank.txt /root/nohup.out

端口

  • 查看6379端口是否占用:netstat -tunpl | grep 6379 (注意,redis服务需要 root 权限才能查看,不然只能检查到6379被某个进程占用,但是看不到进程名称。)

主机

  • 修改主机名:hostnamectl set-hostname 新主机名

yum

  • 列出所有可更新的软件清单命令:yum check-update
  • 更新所有软件命令:yum update
  • 仅安装指定的软件命令:yum install <package_name>
  • 仅更新指定的软件命令:yum update <package_name>
  • 列出所有可安裝的软件清单命令:yum list
  • 删除软件包命令:yum remove <package_name>
  • 查找软件包 命令:yum search <keyword>
  • 清除缓存命令:
  • yum clean packages: 清除缓存目录下的软件包
  • yum clean headers: 清除缓存目录下的 headers
  • yum clean oldheaders: 清除缓存目录下旧的 headers

systemctl

  • systemctl restart nginx : 重启nginx
  • systemctl start nginx : 开启nginx
  • systemctl stop nginx : 关闭nginx
  • systemctl enable nginx : nginx开机启动
  • systemctl disable nginx : 禁用nginx开机启动
  • systemctl status nginx : 查看nginx服务信息
  • systemctl is-enabled nginx : 查看服务是否开机启动
  • systemctl list-unit-files|grep enabled : 查看已启动的服务列表
  • systemctl --failed : 查看启动失败的服务列表
  • systemctl daemon-reload : 重新加载service文件
  • systemctl reboot : 重启
  • systemctl poweroff : 关机

压缩解压命令

压缩

  • tar –cvf jpg.tar *.jpg //将目录里所有jpg文件打包成tar.jpg
  • tar –czf jpg.tar.gz *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz
  • tar –cjf jpg.tar.bz2 *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2
  • tar –cZf jpg.tar.Z *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z
  • rar a jpg.rar *.jpg //rar格式的压缩,需要先下载rar for linux
  • zip jpg.zip *.jpg //zip格式的压缩,需要先下载zip for linux

解压

  • tar –xvf file.tar //解压 tar包
  • tar -xzvf file.tar.gz //解压tar.gz
  • tar -xjvf file.tar.bz2 //解压 tar.bz2
  • tar –xZvf file.tar.Z //解压tar.Z
  • unrar e file.rar //解压rar
  • unzip file.zip //解压zip

总结

  • .tar 用 tar –xvf 解压
  • .gz 用 gzip -d或者gunzip 解压
  • .tar.gz和*.tgz 用 tar –xzf 解压
  • .bz2 用 bzip2 -d或者用bunzip2 解压
  • .tar.bz2用tar –xjf 解压
  • .Z 用 uncompress 解压
  • .tar.Z 用tar –xZf 解压
  • .rar 用 unrar e解压
  • .zip 用 unzip 解压

yum更换为阿里源

  • 备份 :mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

  • 下载新的CentOS-Base.repo 到/etc/yum.repos.d/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
## CentOS 5 :

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo

## 或者

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo

## CentOS 6 :

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

## 或者

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

## CentOS 7 :

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

## 或者

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  • 之后运行 yum makecache 生成缓存

创建用户,权限,密码等

  • adduser es -s /bin/bash : 创建用户为 es ,shell指定为bash
  • passwd es 更改 es 用户的密码
  • chown -R es:es /project/elasticsearch-5.6.3 循环遍历更改 /project/elasticsearch-5.6.3 目录下的文件拥有者及用户组
  • su - es : 切换成es用户重新登录系统
  • su es : 表示与 es 建立一个连接,通过 es 来执行命令

注: 以上命令在安装 elasticsearch 时都会用的到

2018-06-22 更新

  1. vim 永久显示行号 vim /etc/vimrc 添加 set nu 或者 set number

  2. 最小化安装 centos 是没有 tab 键补全提示的, 需要安装 yum install bash-completion

  3. tab 补全提示不区分大小写 : vim /etc/inputrc 添加 set completion-ignore-case on

注: 以上 增加配置是全局的,只对当前用户的话,可以在当前目录下新建相应的文件,再添加配置,例如: ~/.inputrc

2018-9-12 更新

  1. killall -9 nginx : 批量结束指定进程,比如不小心运行了 nginx,会产生1个master和n个work进程,这时候一个个结束不实际,killall就是最好的方式
  2. 有时候我们安装 rpm 安装包会出现某些依赖库找不到,比如
    libSM.so.6: cannot open shared object file: No such file or directory
    这时候我们使用 yum provides libSM.so.6 来寻找包含的动态库
1
2
3
4
5
6
7
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
gperftools-libs-2.6.1-1.el7.i686 : Libraries provided by gperftools
Repo : Private-Base
Matched from:
Provides : libprofiler.so.0

找到后安装即可 yum install gperftools-libs

2018-12-20 更新

  1. /dev/null 2>&1 解释
    > 覆盖原来的内容
    >> 在原来的内容上追加新的内容
    0是标准输入 使用<或<<
    1是标准输出 使用>或>>
    2是标准错误输出 使用2>或2>>
    >/dev/null 2>&1 即错误输出与标准输出全部重定向到空,可以写成 1>/dev/null 2>/dev/null
    标准输入0和标准输出1可以省略。(当其出现重定向符号左侧时)
    文件描述符在重定向符号左侧时直接写即可,在右侧时前面加&
    文件描述符与重定向符号之间不能有空格

2019-01-23 更新

  1. 在命令后加个 & 代表该命令在后台运行, shell 的控制台会立即释放,但是和守护进程又不一样, shell 断开会终止运行
  2. command > file.log 2>&1 等价于 command 2>file.log 1>&2 前一个指的是标准错误重定向到标准输出,标准输出在重定向到文件 file.log 中, 其中 1 省略了;后一个指的是标准输出重定向到标准错误,标准错误又重定向到文件 file.log, 其中2 不能省略
  3. shell 脚本中无法报命令不存在的错误: 在 shell 脚本第一行使用 #!/usr/bin/env bash 或者 #!/usr/bin/bash 或者 #!/bin/bash
  4. 如果运行还是命令不存在的话: 创建一个软连接 ln -s command /usr/bin/command, 参数 -s 创建了个符号链接,相当于快捷方式,不加参数 -s 就是创建硬链接,相当于文件拷贝

2019-03-07 更新

没有联网的机器做时间服务器,写了个接口获取网络的时间,然后服务器使用 crontab 定时设置时间
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
/**
* 同步时间
*/
@GetMapping("traffic/syncDateTime")
public String syncDateTime() {
String taobaoTime = "http://api.m.taobao.com/rest/api.do?api=mtop.common.getTimestamp";
String suningTime = "http://quan.suning.com/getSysTime.do";
JSONObject jsonObject;
jsonObject = getDateTime(taobaoTime);
if (null != jsonObject && jsonObject.containsKey("data")) {
String time = jsonObject.getJSONObject("data").getString("t");
return LocalDateTime.ofEpochSecond(Long.parseLong(time) / 1000, 0, ZoneOffset.ofHours(8))
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
jsonObject = getDateTime(suningTime);
if (null != jsonObject && jsonObject.containsKey("sysTime2")) {
return jsonObject.getString("sysTime2");
}
return null;

}

private JSONObject getDateTime(String url){
return restTemplate.getForObject(url,JSONObject.class);
}

shell:

1
2
3
4
5
6
7
8
#!/usr/bin/env bash
time=$(curl -G -s http://34.0.7.227:9338/traffic/syncDateTime)
if [ ! -n "$time" ]; then
echo "time is null...."
else
date -s "${time}"
hwclock -w
fi

2019-03-15 更新

  1. shell 修改文件固定行的内容
1
sed -i "108c 'update content'" filename

2019-03-18 更新

删除 Ubuntu 多余内核

  1. dpkg --get-selections|grep linux : 查看全部安装的内核
  2. 确定当前使用的内核,一般为版本号最新的内核,删除旧内核: sudo apt remove linux-headers-4.15.0-43 linux-headers-4.15.0-43-generic linux-image-4.15.0-43-generic linux-modules-4.15.0-43-generic linux-modules-extra-4.15.0-43-generic
  3. 再次输入第一步的命令查看现在的内核信息,现在会看到刚才删除的内核会出现 deinstall 的状态
  4. 删除 deinstall 状态的内核: sudo dpkg -P xxxxxx

Server

前言

  • 本次搭建JavaTomcat的运行环境,后续将接着搭建Mysql,Git,Nginx,Redis,Docker…环境

Java环境搭建

  • 1.在/usr/目录下创建java目录

    1
    2
    [root@JoyLau ~]# mkdir/usr/java
    [root@JoyLau ~]# cd /usr/java
  • 2.官网下载jdk,拷贝到服务器上,然后解压

    1
    [root@JoyLau java]# tar -zxvf jdk-8u121-linux-x64.gz
  • 3.设置环境变量

    1
    [root@JoyLau java]# vi /etc/profile
  • 4.在profile中添加如下内容:

    1
    2
    3
    4
    5
    6
    7
    #set java environment
    JAVA_HOME=/usr/java/jdk1.8.0_121
    JRE_HOME=/usr/java/jdk1.8.0_121
    CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
    PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
    export JAVA_HOME JRE_HOME CLASS_PATH PATH

  • 5.让修改生效:

    1
    2
    [root@JoyLau java]# source /etc/profile

  • 6.验证

    1
    2
    3
    4
    [root@JoyLau ~]# java --version
    java version "1.8.0_121"
    Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
    Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
  • 还有2中方法可以安装jdk:

    • 1.用yum安装jdk
    • 2.Ubuntu 上使用apt-get安装jdk

yum 安装jdk

  • yum search jdk : 查看yum源上的jdk版本信息
  • 选择一个jdk8的来安装: yum install java-1.8.0-openjdk.x86_64
  • 等待即可

注意的是默认安装的只是 Java JRE,而不是 JDK,为了开发方便,我们还是需要通过 yum 进行安装 JDK
yum install java-1.8.0-openjdk-devel.x86_64

之后就可以直接使用 Java javac 命令了

配置 JAVA_HOME变量:

vim ~/.bashrc
在文件最后面添加如下单独一行(指向 JDK 的安装位置),并保存:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
接着还需要让该环境变量生效,执行如下代码:
source ~/.bashrc # 使变量设置生效
设置好后我们来检验一下是否设置正确:
echo $JAVA_HOME # 检验变量值
java -version
$JAVA_HOME/bin/java -version # 与直接执行 java -version 一样
如果设置正确的话,$JAVA_HOME/bin/java -version 会输出 java 的版本信息,且和 java -version 的输出结果一样

rpm 安装jdk

  1. 官网下载 jdk rpm包
  2. rpm -ivh jdk_xxxxx.rpm
  3. 配置环境变量(和上述配置一致)
  4. 卸载: rpm -qa|grep jdk , 查出什么,就使用 rpm -e –nodeps java_xxx 来卸载

Tomcat环境搭建

先配置

  • 配置catalina.sh,加入以下配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #add JAVA and TOMCAT config
    JAVA_OPTS="-Xms512m -Xmx1024m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=1024m"
    export TOMCAT_HOME=/project/apache-tomcat-8.5.11
    export CATALINA_HOME=/project/apache-tomcat-8.5.11
    export JRE_HOME=/usr/java/jdk1.8.0_121/jre
    export JAVA_HOME=/usr/java/jdk1.8.0_121

    #add tomcat pid
    CATALINA_PID="$TOMCAT_HOME/tomcat.pid"
  • 增加tomcat.service在/usr/lib/systemd/system目录下增加tomcat.service,目录必须是绝对目录。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [Unit]
    Description=Tomcat
    After=syslog.target network.target remote-fs.target nss-lookup.target

    [Service]
    Type=forking
    PIDFile=/project/apache-tomcat-8.5.11/tomcat.pid
    ExecStart=/project/apache-tomcat-8.5.11/bin/startup.sh
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s QUIT $MAINPID
    PrivateTmp=true

    [Install]
    WantedBy=multi-user.target

再使用

  • 配置开机启动 systemctl enable tomcat
  • 启动tomcat systemctl start tomcat
  • 停止tomcat systemctl stop tomcat
  • 重启tomcat systemctl restart tomcat

说明

  • 因为配置pid,在启动的时候会再tomcat根目录生成tomcat.pid文件,停止之后删除
  • 同时tomcat在启动时候,执行start不会启动两个tomcat,保证始终只有一个tomcat服务在运行
  • 多个tomcat可以配置在多个目录下,互不影响。

遇到2个很尴尬的问题

  • 这个问题我尝试过很多次,那就是Tomcat启动的特别慢,后来查看日志发现是部署项目的时候花费时间特别长,详细看这里
  • 遇到无法启动的问题,最后是startup.sh没有权限,你知道该怎么做的~~

使用yum安装的tomcat注意

  • 安装位置 /etc/tomcat
  • 主程序/软件存放webapp位置 /var/lib/tomcat/webapps
  • 在Centos使用yum安装后,Tomcat相关的目录都已采用符号链接到/usr/share/tomcat6目录,包含webapps等,这很方便我们配置管理 /usr/share/tomcat
  • 日志记录位置 /var/log/tomcat
  • 查看全部tomcat安装目录 rpm -ql tomcat6 | cat -n

Mysql5.7数据库安装

说明

开始

  • 在mysql的官网上找到mysql的源链接

Mysql官网截图

  • 找到原链接:https://repo.mysql.com//mysql57-community-release-el7-9.noarch.rpm

安装

  • 安装命令

    1
    2
    3
    # wget https://repo.mysql.com//mysql57-community-release-el7-9.noarch.rpm
    # rpm -ivh mysql57-community-release-el7-9.noarch.rpm
    # yum install mysql-community-server
  • 安装过程中有确认操作,一律y

  • 接下来就是漫长的下载,只需要等待即可。

启动

  • 安装完成后: systemctl start mysqld 启动mysqld服务

配置

  • 查看/var/log/mysqld.log里的日志(可以查找password关键字)
    mysqlLog
  • 可以看到创建的临时密码
  • 登录MySQL:mysql -u root -p
  • 输入刚才在日志里看到的临时密码
  • 这个时候我输入任何的命令都会提示You must reset your password using ALTER USER statement before executing this statement.
    alterTips
  • 通过 alter user 'root'@'localhost' identified by 'root' 命令,修改 root 用户的密码为 root,注意修改的密码不能过于简单
  • 退出,重新以root用户和刚设置的密码进行登录即可

MySql配置文件

  • 将所有权限赋给root用户并提供外网访问

    1
    grant all privileges on *.* to root@'%'identified by 'root';
  • 紧接着就可以在自己的机器上用Navicat

  • 配置my.cnf:/etc/my.cnf

    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
    [mysqld]
    #
    # Remove leading # and set to the amount of RAM for the most important data
    # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
    # innodb_buffer_pool_size = 128M
    #
    # Remove leading # to turn on a very important data integrity option: logging
    # changes to the binary log between backups.
    # log_bin
    #
    # Remove leading # to set options mainly useful for reporting servers.
    # The server defaults are faster for transactions and fast SELECTs.
    # Adjust sizes as needed, experiment to find the optimal values.
    # join_buffer_size = 128M
    # sort_buffer_size = 2M
    # read_rnd_buffer_size = 2M
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    //设置端口号
    port= 3333

    //设置服务器端编码
    character-set-server=utf8

    //Linux下表名是严格区分大小写的,设置为0表示区分,设置为1表示不区分
    lower_case_table_names= 1

    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0

    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid

MySQL卸载

  • yum remove mysql mysql-server mysql-libs mysql-server;
  • rpm -qa|grep mysql(查询出来的东西yum remove掉)
  • find / -name mysql (将找到的相关东西delete掉;)

值得注意的是:

  • 1.show variables like 'character%';可以看到数据库的编码方式
    • 其中,character_set_client为客户端编码方式;
    • character_set_connection为建立连接使用的编码;
    • character_set_database数据库的编码;
    • character_set_results结果集的编码;
    • character_set_server数据库服务器的编码;
    • 只要保证以上四个采用的编码方式一样,就不会出现乱码问题。
  • 2.暂时能配置只有这些,以后有更新,我会加上的

Redis的安装

说明

Linux安装redis是需要在官网下载redis的源码然后再编译的

下载安装

  • 下载linux版的压缩包,截止到我写博客的时间,官网给的稳定版是3.2.8,我们就下载redis-3.2.8.tar.gz
  • tar -zxvf redis-3.2.8.tar.gz
  • 进入src目录:cd redis-3.2.8/src
  • make 编译
  • 这时我们不执行make intsall,因为该操作会把编译生成的**重要的文件**拷贝到user/local/bin下,我们想要自定义配置路径

注意

  • 中间可能报/bin/sh: cc:未找到命令,对于这样的情况只需要

    1
    2
    yum install gcc 
    yum install gcc-c++
  • 这里的重要文件指的是下图所示的8个文件,在redis以前版本好像是7个文件(没具体试过)

  • 注意文件和文件夹的权限

路径配置

  • ls查看src下的文件,你会看到有些文件是绿色的,这些事重要的文件,也正是我们所需要的,我们将这些文件单独存下来
    Redis源码编译后的重要文件
  • 我们来看看编译出来的几个程序分别是干什么的:
    redis-server:顾名思义,redis服务
    redis-cli:redis client,提供一个redis客户端,以供连接到redis服务,进行增删改查等操作
    redis-sentinel:redis实例的监控管理、通知和实例失效备援服务
    redis-benchmark:redis的性能测试工具
    redis-check-aof:若以AOF方式产生日志,当意外发生时用来快速修复
    redis-check-rdb:若以RDB方式产生日志,当意外发生时用来快速修复
  • 保存好之后我们的路径如下:
    Redis根目录
    Redis-bin
    Redis-etc

配置文件配置

  • redis.conf我只修改了以下配置

    • port : 端口
    • requirepass 密码
    • bind 0.0.0.0 : 配置外网可访问
    • daemonize yes : 将redis服务作为守护进程,作为开机启动
  • 有了基本配置,redis还需要有一个管理启动、关闭、重启的一个脚本。redis源码里其实已经提供了一个初始化脚本redis_init_script,这是我的配置

    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
    #!/bin/sh
    # chkconfig: 2345 90 10
    # description: Redis is a persistent key-value database
    # Simple Redis init.d script conceived to work on Linux systems
    # as it does use of the /proc filesystem.
    # 如果redis设置了密码,则$CLIEXEC -a $PASSWORD -p $REDISPORT shutdown 需要加一个参数

    REDISPORT=6379
    PASSWORD=123
    EXEC=/project/redis3.2.8/bin/redis-server
    CLIEXEC=/project/redis3.2.8/bin/redis-cli

    PIDFILE=/var/run/redis_${REDISPORT}.pid
    CONF=/project/redis3.2.8/etc/redis.conf

    case "$1" in
    start)
    if [ -f $PIDFILE ]
    then
    echo "$PIDFILE exists, process is already running or crashed"
    else
    echo "Starting Redis server..."
    $EXEC $CONF
    fi
    ;;
    stop)
    if [ ! -f $PIDFILE ]
    then
    echo "$PIDFILE does not exist, process is not running"
    else
    PID=$(cat $PIDFILE)
    echo "Stopping ..."
    $CLIEXEC -a $PASSWORD -p $REDISPORT shutdown
    while [ -x /proc/${PID} ]
    do
    echo "Waiting for Redis to shutdown ..."
    sleep 1
    done
    echo "Redis stopped"
    fi
    ;;
    *)
    echo "Please use start or stop as first argument"
    ;;
    esac

  • 头部的chkconfig的添加是为了保证chkconfig redis on能够执行

  • 接着将redis_init_script脚本拷贝到**/etc/init.d/redis**,这里重命名为redis

    1
    # cp /project/redis-3.2.8/utils/redis_init_script /etc/init.d/redis
  • 现在还缺一个系统启动时的配置:chkconfig redis on

  • 执行之后,redis便是以系统服务启动、关闭了

    1
    2
    3
    systemctl start redis;
    systemctl stop redis;
    systemctl restart redis;

FTP 服务端安装

  1. yum install vsftpd
  2. 修改 vim /etc/vsftpd/vsftpd.conf
    anonymous_enable=NO : 不允许匿名用户登录
    chroot_local_user=YES : 用户不能跳出当前的 home 目录
  3. 安装好之后其实已经创建了个 ftp 的用户了,可以查看 /etc/passwd 文件,只是没有密码,这个时候使用 ftp 工具来登录是可以看到目录的,默认 ftp 的 home 目录在 /var/ftp/ 下
  4. 修改 ftp 用户密码 passwd ftp
  5. 这时使用 ftp 用户登录,发现不能 上传文件和删除文件,有 553 错误

解决不能上传和删除文件

  1. 首先 selinux 会默认拦截 vsftp,想要不被拦截的话,可以关闭 selinux, 但是关闭后安全性得不到保障,可能会出现其他的问题,这里我们不关闭,可以开放权限

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    setenforce 0 #暂时让SELinux进入Permissive模式
    getsebool -a | grep ftpd #查看 ftpd 的权限

    ftpd_anon_write --> off
    ftpd_connect_all_unreserved --> off
    ftpd_connect_db --> off
    ftpd_full_access --> on
    ftpd_use_cifs --> off
    ftpd_use_fusefs --> off
    ftpd_use_nfs --> off
    ftpd_use_passive_mode --> off

    setsebool -P ftpd_full_access 1 # 设置ftpd_full_access的权限为 on

    setenforce 1 # 开启 selinux
  2. 这时 selinux 已经开放了 vsftpd 的权限

  3. 给 ftp 用户的 home 目录赋予写的权限 chmod a+w /var/ftp

  4. vsftpd 在新版本时,如果检测到用户不能跳出当前的 home 目录,那么用户的 home 不能有写的权限,会报 500 OOPS: vsftpd: refusing to run with writable root inside chroot() 错误,这时就尴尬了

  5. 解决方式: 在配置文件中添加: allow_writeable_chroot=YES

  6. 重启 vsftpd

无法连接 FTP 服务器

使用 FTP 工具连接失败,报如下错误:

1
2
3
4
5
6
7
8
状态: 	连接建立,等待欢迎消息...
状态: 不安全的服务器,不支持 FTP over TLS。
命令: USER ftp
响应: 331 Please specify the password.
命令: PASS ******
响应: 530 Login incorrect.
错误: 严重错误: 无法连接到服务器
状态: 已从服务器断开

解决方法: 找到 /etc/pam.d/vsftpd 注释掉 #auth required pam_shells.so

Docker 安装 FTP

1
docker run -d --name ftp-server --restart always -p 6106:21 -p 6107:20 -p 6108-6109:21100-21101 -v /data/etc-service-data/nginx-data/data/ftp:/home/vsftpd -e PASV_ADDRESS=112.29.246.234 -e FTP_USER=ky -e FTP_PASS='Kaiyuan@2020' -e PASV_MAX_PORT=21101 fauria/vsftpd

RabbitMQ 服务端安装

  1. yum install rabbitmq-server
  2. rabbitmq-plugins enable rabbitmq_management
  3. systemctl start rabbitmq-server

问题

  1. 当主机的 hostname 不是 localhost 时, 启动会报错: unable to connect to epmd (port 4369) on 68: badarg (unknown POSIX error) , 这时在文件中 /etc/rabbitmq/rabbitmq-env.conf 写入 NODENAME=rabbit@localhost 保存重启.

MariaDB 的安装

  1. yum install mariadb-server
  2. 登入 mariadb mysql -uroot -p , 第一次登陆是 root 用户没有密码,直接进入即可
  3. 初始化设置: mysql_secure_installation ,可以设置 root 密码,移除匿名账号等等…
  4. 设置 root 可远程登录:
    1. mysql -uroot -p 登录
    2. GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION; 授权 root 账户,密码 123456
    3. flush privileges;
  5. 继续后续操作

Mybatis 连接 MariaDB 中文乱码问题

MariaDB的默认编码是latin1,插入中文会乱码,因此需要将编码改为utf8

  1. 首先设置数据库的编码都为 utf8

    1. SHOW VARIABLES LIKE 'character%'; 查看编码
    2. 修改 /etc/my.cnf.d/client.cnf , 在 [client] 里加入 default-character-set=utf8
    3. 修改 /etc/my.cnf.d/server.cnf , 在 [mysqld] 里加入 character-set-server=utf8
    4. systemctl restart mariadb 重启生效
    5. 再次查看 SHOW VARIABLES LIKE 'character%'; 查看编码
  2. 建库,建表,表里的 varchar 字段的字符集都用 utf8, 排序规则都用 utf8_unicode_ci

  3. 至此服务端就配置完成了

  4. 连接数据配置文件,加上参数

1
2
3
datasource:
druid:
url: jdbc:mysql://34.0.7.183:3306/traffic-service?useUnicode=true&characterEncoding=utf8&useSSL=false

DNS 服务安装

  1. yum install bind 安装完成后服务名为 named
  2. vim /etc/named.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
options {
listen-on port 53 { 34.0.7.183; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; };

/*
- If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
- If you are building a RECURSIVE (caching) DNS server, you need to enable
recursion.
- If your recursive DNS server has a public IP address, you MUST enable access
control to limit queries to your legitimate users. Failing to do so will
cause your server to become part of large scale DNS amplification
attacks. Implementing BCP38 within your network would greatly
reduce such attack surface
*/
recursion yes;

dnssec-enable yes;
dnssec-validation yes;

/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";

managed-keys-directory "/var/named/dynamic";

pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};

logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};

zone "." IN {
type hint;
file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

listen-on port 53 { 127.0.0.1; }; # 指定服务监听的端口,建议写本机IP,减少服务器消耗
allow-query { any; }; # 允许哪些客户端访问DNS服务,此处改为“any”,表示任意主机

修改这2项配置即可

配置自定义域名解析

include "/etc/named.rfc1912.zones"; # include代表该文件是子配置文件

  1. vim /etc/named.rfc1912.zones , 添加一个我们自定义的域名配置,这里我使用的是 baidu.com
1
2
3
4
5
zone "baidu.com" IN {
type master;
file "data/baidu.com.zone";
allow-update { none; };
};

上述文件默认的目录在 /var/named/data 目录下

  1. vim /var/named/data/baidu.com.zone

配置如下: 注意格式

1
2
3
4
5
6
7
8
9
10
11
12
13
$TTL 1D
@ IN SOA baidu.com. root (
1 ; serial
1D ; refresh
1H ; retry
1W ; expire
0 ) ; minimum

@ IN NS ns.baidu.com.
ns IN A 34.0.7.183
@ IN A 34.0.7.183
test IN A 34.0.7.183
liufa IN A 34.0.7.227

注意第一条记录 ns.baidu.com. 的解析必须添加否则会报错,添加之后,再加一条 ns 子域名的解析,直接指向自己即可

这里附上一些配置的解释:

  • serial:序列号。可以供从服务器判断何时获取新数据的,这里我设成今天的日期。更新数据文件必须要更新这个序列号,否则从服务器将不更新
  • refresh:指定多长时间从服务器要与主服务器进行核对
  • retry:如果从服务器试图检查主服务器的序列号时,主服务器没有响应,则经过这个时间后将重新进行检查
  • expire:将决定从服务器在没有主服务器的情况下权威地持续提供域数据服务的时间长短
  • minimum:高速缓存否定回答的存活时间
  • SOA记录:每个区仅有一个SOA记录,该区一直延伸到遇见另一个SOA记录为止。SOA记录包括区的名字,一个技术联系人和各种不同的超时值
  • IN记录:使用“IN”,对应的是internet
  • A记录:是DNS数据库的核心。一个主机必须为它的每个网络接口得到一条A记录
  • NS记录:识别对一个区有权威性的服务器(即所有主服务器和从服务器),并把子域委托给其他机构。
  • MX记录:电子邮件系统就是使用MX记录来更有效的路由邮件。
  • PTR记录:从IP地址到主机名的反向映射。与A记录一样,必须为每个网络接口有一条PTR记录。
  1. chown root:named baidu.com.zone 修改权限
  2. systemctl restart named

PostgreSQL 安装

说明

yum 安装的版本可能比较低,对于一些应用来说可能不好,这里使用官网的安装包

安装

  1. 打开 https://www.postgresql.org/download/linux/redhat/
  2. 选择版本
  3. 安装源,我这里以 10 为例, yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
  4. 安装程序, yum install postgresql10 , yum install postgresql10-server
  5. 初始化数据库 /usr/pgsql-10/bin/postgresql-10-setup initdb
  6. 开机启动 systemctl enable postgresql-10;systemctl start postgresql-10

修改管理员密码

数据库的默认管理员用户是 postgres, 在 PostgreSQL 安装好后会创建用户 postgres

  1. 切换到 postgres 用户 su postgres
  2. 执行 psql 登陆数据库
  3. 修改密码: ALTER USER postgres WITH PASSWORD 'postgres';

配置远程访问

  1. 修改 postgresql.conf 文件的 listen_address = *
  2. 用户授权: 修改 pg_hba.conf 添加 host all all 0.0.0.0/0 password 一行

说明:

  • ident: 系统用户和数据库用户对于即可访问
  • md5: md5 加密的密码认证
  • password: 明文密码
  • trust: 无需密码
  • reject: 拒接认证

修改数据存放目录

  1. 修改 /usr/lib/systemd/system/postgresql-10.servicePGDATA
  2. systemctl daemon-reload
  3. postgresql-step initdb 初始化数据库,遇到权限问题,先创建好目录
    1. chrow -R postgres:postgres /…
    2. chmod -R 700 /…
    3. 实在不行就使用 postgres 的身份操作
  4. 如果之前数据库有数据,可以直接拷贝数据目录,之后目录的权限设定好即可

Thymeleaf

注意事项

  • 云服务器 ECS 仅支持对数据盘进行二次分区,而不支持对 系统盘 进行二次分区(不管是 Windows 还是 Linux 系统)
  • 强行使用第三方工具对系统盘进行二次分区操作,可能引发未知风险,如系统崩溃、数据丢失等。
  • 对新购的数据盘可以选择分区或者不分区,这个根据自身的情况而定
  • 下面内容的xvdbvdb分别对应非 I/O优化I/O 优化;非 I/O 优化和 I/O 优化的区别在于,前者比后者多一个字母 x
  • 新数据盘的挂载可以自定义文件夹,本示例中用的是/mnt

开始

  • 运行 fdisk -l 命令查看数据盘。注意:在没有分区和格式化数据盘之前,使用 df -h 命令是无法看到数据盘的。在下面的示例中,有一个 5 GB 的数据盘需要挂载。
  • 如果执行了 fdisk -l 命令后,没有发现 /dev/xvdb,则表示您的实例没有数据盘,因此无需挂载

Image1

需要进行分区的情况

  • 运行 fdisk /dev/xvdb,对数据盘进行分区。根据提示,依次输入 n,p,1,两次回车,wq,分区就开始了。

Image2

  • 运行 fdisk -l 命令,查看新的分区。新分区 xvdb1 已经创建好。如下面示例中的/dev/xvdb1。

Image3

不需要进行分区的情况

一般情况下我都是直接格式化一整块数据盘,然后挂载的。

  • 运行 mkfs.ext3 /dev/xvdb1,对新分区进行格式化。格式化所需时间取决于数据盘大小。您也可自主决定选用其他文件格式,如 ext4 等。

Image4

  • 运行 echo /dev/xvdb1 /mnt ext3 defaults 0 0 >> /etc/fstab 写入新分区信息。完成后,可以使用 cat /etc/fstab 命令查看。

Image5

Ubuntu 12.04 不支持 barrier,所以对该系统正确的命令是:echo /dev/xvdb1 /mnt ext3 defaults 0 0 >> /etc/fstab
如果需要把数据盘单独挂载到某个文件夹,比如单独用来存放网页,可以修改以上命令中的 /mnt 部分。

最后

  • 运行 mount /dev/xvdb1 /mnt 挂载新分区,然后执行 df -h 查看分区。如果出现数据盘信息,说明挂载成功,可以使用新分区了。

    1
    2
    3
    4
    5
    6
    mount /dev/xvdb1 /mnt
    df -h
    Filesystem Size Used Avail Use% Mounted on
    /dev/xvda1 40G 1.5G 36G 4% /
    tmpfs 498M 0 498M 0% /dev/shm
    /dev/xvdb1 5.0G 139M 4.6G 3% /mnt

Thymeleaf

历史篇

曾经交往过

  • 说是历史,也就是在去年,但我感觉已经过了很久。去年我在写SpringBoot项目的时候,想找一套前端的模板引擎,看到SpringBoot官网推荐使用Thymeleaf,就用了它
  • 在写了几个页面之后,我在项目里写下了这样一段话
    曾经学习的历史记录

没好印象,我甩了她

  • 可以看到我放弃了它,选择了我熟悉的 Freemarker(不要问我为什么不选择JSP)

重逢篇

相遇在spring

  • Spring一直都是我崇尚和追求的项目,没事都会翻翻Spring的文档查阅查阅
  • 无意中我发现Spring的官方文档,很多都是用Thymeleaf渲染的,这使我重新提起了兴趣

交往篇

决定重新尝试交往

  • 我决定重新学习一下

深入了解

  • Thymeleaf 官网: http://www.thymeleaf.org/
  • Thymeleaf是一个页面模板,类似于FreemarkerVelocity等,但Thymeleaf可以在服务器环境和静态环境下都能正常运行的页面模板,深受前后端分离开发的团队人员的青睐。
  • Thymeleaf的数据展现全部通过以th:开头的html自定义标签来完成。当运行在服务器环境时将会按规则替换th:对应的地方显示出服务器上的数据,当运行在静态环境时,html会自动过虑th:开头的属性,显示默认的数据,从而达到两者都能正常运行。
  • 整合SpringBoot
    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    如此简单

…….. 未完待更 ……..

SSL

Apache 2.x 证书部署

文件准备

Apache

获取证书

  • Apache文件夹内获得证书文件 1_root_bundle.crt,2_www.domain.com_cert.crt 和私钥文件 3_www.domain.com.key,
  • 1_root_bundle.crt 文件包括一段证书代码 “—–BEGIN CERTIFICATE—–”和“—–END CERTIFICATE—–”,
  • 2_www.domain.com_cert.crt 文件包括一段证书代码 “—–BEGIN CERTIFICATE—–”和“—–END CERTIFICATE—–”,
  • 3_www.domain.com.key 文件包括一段私钥代码“—–BEGIN RSA PRIVATE KEY—–”和“—–END RSA PRIVATE KEY—–”。

证书安装

  • 编辑Apache根目录下 conf/httpd.conf 文件,

  • 找到 #LoadModule ssl_module modules/mod_ssl.so 和 #Include conf/extra/httpd-ssl.conf,去掉前面的#号注释;

  • 编辑Apache根目录下 conf/extra/httpd-ssl.conf 文件,修改如下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    <VirtualHost www.domain.com:443>
    DocumentRoot "/var/www/html"
    ServerName www.domain.com
    SSLEngine on
    SSLCertificateFile /usr/local/apache/conf/2_www.domain.com_cert.crt
    SSLCertificateKeyFile /usr/local/apache/conf/3_www.domain.com.key
    SSLCertificateChainFile /usr/local/apache/conf/1_root_bundle.crt
    </VirtualHost>
  • 配置完成后,重新启动 Apache 就可以使用https://www.domain.com来访问了
    注:

    • SSLEngine on : 启用SSL功能
    • SSLCertificateFile :证书文件
    • SSLCertificateKeyFile : 私钥文件
    • SSLCertificateChainFile : 证书链文件

Nginx 证书部署

文件准备

Nginx

获取证书

证书安装

  • 将域名 www.domain.com 的证书文件1_www.domain.com_bundle.crt 、私钥文件2_www.domain.com.key保存到同一个目录,例如/usr/local/nginx/conf目录下。

  • 更新Nginx根目录下 conf/nginx.conf 文件如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    server {
    listen 443;
    server_name www.domain.com; #填写绑定证书的域名
    ssl on;
    ssl_certificate 1_www.domain.com_bundle.crt;
    ssl_certificate_key 2_www.domain.com.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
    ssl_prefer_server_ciphers on;
    location / {
    root html; #站点目录
    index index.html index.htm;
    }
    }
  • 配置完成后,先用bin/nginx –t来测试下配置是否有误,正确无误的话,重启nginx。就可以使 https://www.domain.com 来访问了。
    注:

    • listen 443 SSL访问端口号为443
    • ssl on 启用SSL功能
    • ssl_certificate 证书文件
    • ssl_certificate_key 私钥文件
    • ssl_protocols 使用的协议
    • ssl_ciphers 配置加密套件,写法遵循openssl标准

使用全站加密,http自动跳转https(可选)

  • 对于用户不知道网站可以进行https访问的情况下,让服务器自动把http的请求重定向到https。
  • 在服务器这边的话配置的话,可以在页面里加js脚本,也可以在后端程序里写重定向,当然也可以在web服务器来实现跳转。Nginx是支持rewrite的(只要在编译的时候没有去掉pcre)
  • 在http的server里增加rewrite ^(.*) https://$host$1 permanent;
  • 这样就可以实现80进来的请求,重定向为https了。

Tomcat 证书部署

文件准备

Nginx

获取证书

  • 如果申请证书时有填写私钥密码,下载可获得Tomcat文件夹,其中有密钥库 www.domain.com.jks;
  • 如果没有填写私钥密码,不提供Tomcat证书文件的下载,需要用户手动转换格式生成。
  • 可以通过 Nginx 文件夹内证书文件和私钥文件生成jks格式证书
  • 转换工具:https://www.trustasia.com/tools/cert-converter.htm
  • 使用工具时注意填写 密钥库密码 ,安装证书时配置文件中需要填写。

证书安装

  • 配置SSL连接器,将www.domain.com.jks文件存放到conf目录下,然后配置同目录下的server.xml文件:
    1
    2
    3
    4
    5
    <Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
    maxThreads="150" scheme="https" secure="true"
    keystoreFile="conf\www.domain.com.jks"
    keystorePass="changeit"
    clientAuth="false" sslProtocol="TLS" />
    注:
  • clientAuth 如果设为true,表示Tomcat要求所有的SSL客户出示安全证书,对SSL客户进行身份验证
  • keystoreFile 指定keystore文件的存放位置,可以指定绝对路径,也可以指定相对于 (Tomcat安装目录)环境变量的相对路径。如果此项没有设定,默认情况下,Tomcat将从当前操作系统用户的用户目录下读取名为 “.keystore”的文件。
  • keystorePass 密钥库密码,指定keystore的密码。(如果申请证书时有填写私钥密码,密钥库密码即私钥密码)
  • sslProtocol 指定套接字(Socket)使用的加密/解密协议,默认值为TLS

http自动跳转https的安全配置

  • 到conf目录下的web.xml。在后面,,也就是倒数第二段里,加上这样一段

    1
    2
    3
    4
    5
    6
    7
    <web-resource-collection >
    <web-resource-name >SSL</web-resource-name>
    <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
  • 这步目的是让非ssl的connector跳转到ssl的connector去。所以还需要前往server.xml进行配置:

    1
    2
    3
    <Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="443" />
  • redirectPort改成ssl的connector的端口443,重启后便会生效。

说明

  • 由于我域名是托管到腾讯云上的,各个服务器的SSL文件均在腾讯云平台上下载的。
  • 各个服务器亲测可用

Tomcat

事发起因

  • 只有一台云服务器
  • 服务器配置较低,只能开一台Server
  • 对外只想提供80及443端口
  • 想把2个项目放到一个更目录下
  • 2个项目想用不同的二级域名来访问:

事发经过

建立文件夹

  • 在Tomcat的根目录下建立blog文件夹
    blog文件夹
  • 在blog文件夹下建立ROOT文件夹,用作新项目的根路径
    ROOT文件夹

修改配置

  • 修改server.xml配置文件,多加一对配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <Engine name="Catalina" defaultHost="localhost">
    <Realm className="org.apache.catalina.realm.LockOutRealm">
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
    resourceName="UserDatabase"/>
    </Realm>

    <Host name="localhost" appBase="webapps"
    unpackWARs="true" autoDeploy="true">
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    prefix="localhost_access_log" suffix=".txt"
    pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    </Host>

    <Host name="blog.joylau.cn" appBase="blog"
    unpackWARs="true" autoDeploy="true">
    </Host>
    </Engine>

事发结果

  • 重启服务器,问题解决。

总结

  • 建立新的文件夹的时候一定要保证和webapps在同一级目录,以备在server.xml文件里路径被识别

补充

Tomcat开启压缩资源文件功能

  • 原理
    HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求服务器对应资源后,从服务器端将资源文件压缩,再输出到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML ,CSS,Javascript , Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,压缩效率也很高。

  • 配置

    1
    2
    3
    4
    5
    6
    <Connector port="80" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="443" compression="on"
    compressionMinSize="2048"
    noCompressionUserAgents="gozilla,traviata"
    compressableMimeType="text/html,text/xml,text/javascript,application/x-javascript,application/javascript,text/css,text/plain"/>
  • 参数说明

    • compression=”on” 打开压缩功能
    • compressionMinSize=”50” 启用压缩的输出内容大小,默认为2KB
    • noCompressionUserAgents=”gozilla, traviata” 对于以下的浏览器,不启用压缩
    • compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain” 哪些资源类型需要压缩
0%