JoyLau's Blog

JoyLau 的技术学习与思考

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” 哪些资源类型需要压缩

HelloWorld

关于博客

搭建一个自己博客的想法

  • 其实在老早以前自己就有搭建一个自己博客的想法,中途也搭建尝试自己动手操作过,但是好几次都半途而废了。
    在这期间主要的原因是自己平时没有那么多的时间,这也许跟我自己的想法有关系,原先我认为搭建一个博客就类似于开发一套管理系统,要有前台页面,后台管理…
  • 我本身是做Java后端开发的,虽然说在实际的项目中大部分都是Web项目,但是要我自己真正的写一套前台页面,对我来说真的是很难。
  • 我也从网站找过很多的博客类模板,并自己动手开发过,花了不少的时间,时间越久,发现很多都是不符合自己的想法的。这时我意识到之前的想法错了,或者说过于陈旧了。

WordPress

  • 再后来自己动手搭过很出名的WordPress博客系统,WordPress是基于PHP开发的。
    期间还研究了一段时间的PHP,搭好过后换着主题玩了一段时间,后来想二次开发一些自己的东西,但是无从下手啊…..于是这个就没再玩了…

Solo

  • Solo这个词儿肯定很熟悉,当然了不是LOL里面的solo,这个一个完全开源的Java博客系统,在GitHub上找一下就知道,
    Solo 是目前 GitHub 上关注度最高的 Java 开源博客系统,在GitHub上是start最多的。clone下来用着还真算不错。后来在里面发现一款主题,和我现在博客使用的很像。
    顺藤摸瓜,于是有了现在的这套博客系统….

Hexo

  • Hexo 的中文官网:http://hexo.io/zh-cn/
  • 官网的介绍是这样的:

    Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。

  • 而我是这么理解的:

    用Github + Hexo + Nodejs搭建的博客,把逼格一下提到了凡人不可企及的高度。

  • 当我打开官网的文档查阅后,发现了这个很有意思的搭建方式,不需要花那么多的时间去做开发,直接专注的写好自己的技术博客就可以,而且还可以基于Bootstrap生成移动端和网页端都可以兼容的页面。
  • 我觉得很有搞头,于是决定马上动手搭建起来……

动手干活

所需工具软件

搭建过程

  • git和Nodejs的下载和安装过程就不说了

  • Node.js 官方源默认是:http://registry.npmjs.org, 但是由于在国外,说不定你使用的时候就抽风无法下载任何软件。所以我们决定暂时使用淘宝提供的源,淘宝源官网:http://npm.taobao.org/, (然而比较坑爹的是公司的网络将与taobao相关的域名都和谐掉了)
    在 Git Bash 中我们执行下面这一句

    1
    2
    3
    4
    alias cnpm="npm --registry=https://registry.npm.taobao.org \
    --cache=$HOME/.npm/.cache/cnpm \
    --disturl=https://npm.taobao.org/dist \
    --userconfig=$HOME/.cnpmrc"
  • 接下来就是使用cnmp命令了,值得注意的是:cnmp这个命令是临时的,当窗口关闭下次再打开就不会再生效了,于是每次你都需要执行以下这个命令。

  • 检测安装是否成功 cnpm info express,若成功会有一大串的信息提示。

  • 安装Hexo

    1
    cnpm install -g hexo-cli
  • 创建Hexo项目

    1
    2
    3
    4
    //打开到hexo的根目录
    cd h:/hexo
    hexo init
    cnpm install
  • 启动Hexo服务

    1
    hexo server

搭建完成

  • 浏览器访问:http://localhost:4000/
  • 搭建结束搭建完之后可以修改自定义的配置文件 _config.yml ,以及更换成自己想要的主题 themes

文章置顶

  • 编辑这个文件:node_modules/hexo-generator-index/lib/generator.js

  • 覆盖原文件内容,采用下面内容:

    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
    'use strict';
    var pagination = require('hexo-pagination');
    module.exports = function(locals){
    var config = this.config;
    var posts = locals.posts;
    posts.data = posts.data.sort(function(a, b) {
    if(a.top && b.top) { // 两篇文章top都有定义
    if(a.top == b.top) return b.date - a.date; // 若top值一样则按照文章日期降序排
    else return b.top - a.top; // 否则按照top值降序排
    }
    else if(a.top && !b.top) { // 以下是只有一篇文章top有定义,那么将有top的排在前面(这里用异或操作居然不行233)
    return -1;
    }
    else if(!a.top && b.top) {
    return 1;
    }
    else return b.date - a.date; // 都没定义按照文章日期降序排
    });
    var paginationDir = config.pagination_dir || 'page';
    return pagination('', posts, {
    perPage: config.index_generator.per_page,
    layout: ['index', 'archive'],
    format: paginationDir + '/%d/',
    data: {
    __index: true
    }
    });
    };
  • 然后在文章头部的:Front-matter 位置加上一个:top: 1000 的内容。数值越大,越靠前

文章推送

  • 安装git插件 : npm install hexo-deployer-git –save
  • 配置文件
1
2
3
4
deploy:
type: git
repository: https://github.com/JoyLau/blog-public.git
branch: master
  • 使用方式: hexo g -d ,会自动推送到上面配置的github地址,分支名为 master 默认的分支名为gh-page

博客建设

博客用途

  • 整理一些在项目中用到的小知识或者技术点做一个总结及叙述,希望通过这些记录,能够将自己的学习成果归纳出来,与大家分享交流,同时能够对这些技术进行备忘,以便日后查询

以后建设

  • 这个博客只用作技术记录。
  • 自己打算再开一个专门记录生活的博客站,域名都起好了:http://life.joylau.cn (**已弃用**,发现真心没那么多时间去搞很多东西)
0%