分类: 默认

  • 手绘

    最近换了一只新的笔,感应充电的,价格极低,不得不感慨一下技术进步


  • Spring Security的response header

    Spring Security会默认配置若干个相关的HeaderWriter,比如HstsHeaderWriter、XXssProtectionHeaderWriter等。

    默认情况下响应的头部类似这样

    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Pragma: no-cache
    Expires: 0
    X-Content-Type-Options: nosniff
    Strict-Transport-Security: max-age=31536000 ; includeSubDomains
    X-Frame-Options: DENY
    X-XSS-Protection: 1; mode=block

    这其中有五个HeaderWrite,撇开第一个Cache Control不谈,因为主要是涉及旧版本迁移,剩下了四个。

    Content Type Options

    这个选项是由于浏览器对于资源会去“猜”。如果返回的资源没有指明类型,那么浏览器就会自己去判断。自动去判断内容是危险,可以构造出XSS攻击。

    X-Content-Type-Options: nosniff

    当然开启这一特性那么就必须在返回的资源中指明类型,不然会出现无法正确解析的情况。

    HTTP Strict Transport Security

    一些网站自身就可以同时通过http和https访问,而有些只允许https访问,设置对应的头

    Strict-Transport-Security: max-age=31536000 ; 
  • Spring boot中使用WebJars

    一个Java Web项目或多或少需要是一些javascript或者css依赖,比较容易想到的办法就是用前端构建工具管理依赖,然后直接拷贝到Webapp目录,当然spring boot对于静态资源还支持一下几个位置:

    "classpath:/META-INF/resources/"
    "classpath:/resources/"
    "classpath:/static/"
    "classpath:/public/"

    我对于前端管理工具并不喜欢,也不想安装诸如node等相关环境,这个时候就可以试用WebJars了。

    WebJars

    WebJars将前端资源打包到jar中,这样开发人员就可以简单的管理依赖,并且可以使用已有的JVM base构建工具和生态链,同时对于RequireJS也有一些自动化支持。

    在Spring Boot中使用WebJars是非常简单的,简单的引入依赖就可以,所有资源都暴露在 /webjars/** 下,只要你知道版本号和文件名,就可以直接在前端页面中引用相关资源。

    Spring Boot的支持

    在Spring Boot中使用WebJars如此简单,主要是因为Spring Boot有一个默认的支持,是否启动对应配置的条件在OnEnabledResourceChainCondition类

    class OnEnabledResourceChainCondition extends SpringBootCondition {
    
    	public static final String WEBJAR_ASSERT_LOCATOR = "org.webjars.WebJarAssetLocator";
    
    	@Override
    	public ConditionOutcome getMatchOutcome(ConditionContext context,
    			AnnotatedTypeMetadata metadata) {
    		
  • Docker container的监控

    迁移到Docker以后遇到的一个问题就是监控上的,比如当前资源消耗如何等等。

    之前的监控是用的OneAPM,但是都是应用级别的,需要不同的应用安装不同的探针。

    虽然也有很多可以监控Docker容器的,但是要在服务器安装服务我确实又不太想,找了一下发现OneAPM支持Docker化安装探针。

    对应镜像的构建脚本可以看这里,官方的老是启动不起来,我就自己构建了一个。

    在DaoCloud直接部署

    agent

    然后就直接去OneAPM控制台看结果了

    docker-info

    可以很容易看到每个container的内容消耗,也可以自己定义仪表盘。…

  • 迁移遗留项目到Docker

    结合DaoCloud体验了几天Docker,感觉非常的不错,所以也准备把已有的一个项目也迁移到Docker上。

    遗留项目

    这个项目是一个Java的Web项目,需要Java8环境,使用了Spring Boot,自带了运行容器,可以直接 java -jar 启动。项目使用了MySql数据库,没有用什么专有特性。数据库中数据也不多,可以mysqldump来迁移。

    迁移数据库

    先从数据库开始吧,原有数据库监听于3306端口,和应用一个主机。第一步打算就是先docker化数据库,但是仍然绑定端口在3306上,这样可以在只迁移数据库的情况下依然保证整个应用可用。

    先去Daocloud的应用编排里面创建一个新的应用

    db:
      image: mariadb
      restart: always
      ports:
      - 3306:3306
      volumes:
      - /alidata/data/acgmo-data:/var/lib/mysql
      environment:
      - MYSQL_ROOT_PASSWORD=你的密码

    然后直接连接到这个数据库

    mysql -u root -p 数据库名 < bak.sql

    完成后直接重启java web应用,看看应用是不是一切正常。

    迁移Java Web项目

    这个就稍微复杂一些了,因为mysql啥的中央库都有,不需要自己构建。但是这个就必须自己构建了。

    DaoCloud提供了代码构建功能,也支持bitbucket的私有库,唯一需要做的就是添加一个Dockerfile来构建,当然如果不想添加到代码库中也可以使用云Dockerfile功能。

    比如这个项目的Dockerfile如下

    FROM 
  • DaoCloud基于Docker快速搭建wordpress

    DaoCloud基于Docker快速搭建wordpress

    一直使用Java生态圈,自己的机器,服务器上都是java环境,也没有用过太多php的东西。

    想迁移博客到wordpress上觉得网上教程那么多,总有办法的,结果一下子就折腾了很多天。

    服务器原来是有nginx和mysql的,但是都不是用apt-get安装的,是阿里云镜像市场找的,所以启动目录,配置位置都不一下。本来想试试nginx+php的,但是网上教程很多,操作每一步也是一样的,但是就是没有效果,连个php helloworld都没有。再 尝试了apache+php,很顺利,因为都是可以apt-get安装的,但是装好了wordpress提示没有mysql的支持。本来简简单单一个

    apt-get install php5-mysql

    就可以搞定,但是它依赖了mysql-common,这样原来的mysql就坏掉了。还好有阿里云快照,尝试手动安装,但是很不顺利,索性准备用docker。

    Docker之前用过,但是主要是有很多免费的docker container,基本是为了当临时免费主机使用。要我完全用Docker搭建wordpress还是有困难的,命令行也不顺,操作和日志都是问题。

    DaoCloud之前用过免费加速,这次就装上了集群管理,安装步骤很简单

    docker-machine

    安装好以后直接用应用编排功能

    wordpress:
      image: wordpress
      restart: always
      links:
      - db:mysql
      ports:
      - 127.0.0.1:8020:80
      volumes:
      - /alidata/data/blog-www:/var/www/html
    db:
      image: mariadb
      restart: always
      volumes:
      - /alidata/data/blog-data:/var/lib/mysql
      environment:
      - MYSQL_ROOT_PASSWORD=密码随意

    创建以后自动启动…

  • 迁移博客到wordpress

    之前一直使用的hexo,静态博客生成系统,对于服务器要求低,用markdown书写。

    但随着自己使用阿里云服务器开始,hexo的优势就越发削弱。服务器可以自己控制,环境自然不是问题,反过来客户端的种种环境需要限制了书写的便利性。

    前思后想,还是将博客迁到wordpress上,万幸的是hexo的文章地址和wordpress基本一样,也就省去了很多流量损失。加上wordpress的搜索引擎友好性不错,有ping功能和搜索引擎的各种插件,基本不太担心这块。

    谈到迁移,hexo是可以导出rss的,但是这个是atom那种,wordpress导入识别不了,找了一个atom专用的导入插件,但是导入的格式太诡异,特别是代码那块问题太多,索性干脆自己抓取原博客,通过rest api导入。

    wordpress需要安装两个插件wp rest api和json basic auth。后者可以直接用用户名密码认证,我直接在本地搭建一个wordpress先迁移好,再导出wordpress格式导入线上环境,确认无误之后再修改nginx反向代理的指向。之前用hexo是静态托管,现在改成反向代理。

    wordpress有很多周边生态,比如我现在使用的手机客户端,随时都能码字。…

  • Maven Wrapper

    Maven Wrapper

    Maven是一个常用的构建工具,但是Maven的版本和插件的配合并不是那么完美,有时候你不得不切换到一个稍微旧一些的版本,以保证所有东西正常工作。

    而Gradle提供了一个Wrapper,可以很好解决版本切换的问题,当然更重要的是不需要预安装Gradle。

    Maven虽然没有官方的Wrapper,但是有一个第三方的Wrapper可以使用。

    安装很简单mvn -N io.takari:maven:wrapper,安装完成如下

    安装

    使用的时候直接./mvnw clean install即可,它会自动下载最新版本来执行。

    运行

    如果需要指定版本,重新生成mvnw文件在运行即可

    mvn -N io.takari:maven:wrapper -Dmaven=3.1.0
    ./mvnw clean install

    切换版本

  • 使用git@osc的WebHook自动部署

    有一个小项目代码托管在git@osc上,因为oschina支持免费的私有库,代码就放在上面了。

    因为毕竟是实验性的东西,部署比较频繁,就写了一小段shell去做部署,也就是每次需要部署的时候登陆到主机执行这段shell即可。

    后面看到了deploybot,感觉挺有意思的,但是最后的部署需要登录到主机上,总感觉不安全。

    看了一下,利用WebHook也可以自己做到相关功能。

    git@osc的WebHook是可以配置密码的,所以安全性还可以。

    因为很简单的功能,监听一个端口,获取到post到的数据,然后判断密码,在判断commit信息,如果包含[deploy]就调用部署脚本。

    图方便直接使用nodejs来写,虽然对nodejs很不熟,但是毕竟快。用到的库是express,日志用的log4js

    var express=require('express');
    var app= express();
    var bodyParser=require('body-parser');
    var spawn=require('child_process').spawn;
    var log4js=require('log4js');
    log4js.configure({
    appenders:[
    {type:'console' },
    {type:'file', filename:'logs.log' }
    ]
    });
    var logger = log4js.getLogger();
    app.use(bodyParser.urlencoded({ extended:false }));
    
  • 用jitpack直接引入github项目

    用jitpack直接引入github项目

    Github是一个汇聚了很多有趣东西的地方。如果你使用java作为主要开发语言,并配合gradle,maven等构建工具,那么项目的依赖大部分应该取自maven仓库。

    但有些时候总有有些意外,有些项目的作者并没有将项目发布到maven中央仓库,有些分布在自己的一些第三方的仓库中。

    没有发布的还好,自己寻找方案,如果发布到第三方仓库的,很有可能出现一些问题。

    一直正常运行的项目突然CI挂了,去看看结果发现对方的第三方库挂了,而且这个依赖还是一个snapshot的依赖。

    虽然在github上有源码,但是使用时我并不需要修改源码,所以并不希望直接使用源码级的依赖,采用jar的依赖是最好的。

    无意之间发现了jitpack,解决了这个问题。

    以这个项目为例modular ,项目基于maven,有pom.xml配置。

    直接jitpack中填入这个地址,可以看到几个选项。

    jitpack

     

    我需要最新版本,选择第一个,然后在gradle配置中添加

    repositories {
      maven {url"https://jitpack.io" }
    }
    dependencies {
      compile'com.github.mountainblade:modular:4bf87e0a75'
    }

    一切就搞定了。

    jitpack会自动打包并生成jar包,第一次请求会慢一些,后面就正常了。还可以查看打包的日志和项目文档。

    比如https://jitpack.io/com/github/mountainblade/modular/4bf87e0a75/build.log.…