JoyLau's Blog

JoyLau 的技术学习与思考

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%