使用nginx unit部署微服务

前端时间,nginx发布了nginx unit。NGINX Unit 是一个动态的网络应用服务器,它被设计为可运行多种编程语言的。通过API可以轻巧,多面化的动态配置Unit。目前为止nginx unit支持php,python以及go。其他语言如java,javascript等语言尚未提供支持。

有了nginx unit,我们就可以不用配置繁琐的php-fpm和uwsgi,只需要一个json文件即可部署一个微服务。

NGINX Unit 现在是beta版本。你现在虽然可以使用它,但建议仅用于测试环境,不建议用于生产环境。

GitHub:https://github.com/nginx/unit/

中文文档:https://github.com/tuzimoe/unit/blob/master/README_zh-Hans.md

下面我们使用nginx unit部署一个django项目,以hyriamb/nem-downloader: django网易云音乐下载器,适用于新版api为例。

使用Jenkins持续集成Java应用

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具。用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件持续集成。
在这学期的软件工程课设中,我们使用Jenkins持续构建、测试及部署一个Spring Boot应用。

安装Jenkins

在安装之前请确保已经安装了JDK和maven。
安装Jenkins有两种方法,一种是从官网下载打包好的.war包;或通过apt等包管理器安装。我的系统是Debian8,安装过程参考这篇文章即可,本文不再赘述。
How To Install Jenkins on Ubuntu 16.04 | DigitalOcean

使用Laravel和jwt-auth编写API

JSON Web Token(JWT)是一个轻量级的认证规范,它允许用户和服务器之间传递安全可靠的信息。

在传统的WEB应用中,服务端成功的返回一个响应于两件事。其一是通过一种存储机制保存会话信息(SESSION)。每一个会话都有它独特的信息,常常是一个长的,随机化的字符串,它被用来让未来的请求检索信息。其次,包含在响应头里面的信息使客户端保存了一个COOKIE。服务器自动的在每个子请求里面加上了会话ID,这使得服务器可以通过检索SESSION中的信息来辨别用户。
API应该被设计成无状态的。这意味着没有登录,注销的方法,也没有SESSION和COOKIE。因此,我们引入JWT。

使用jwt进行认证和授权

认证

客户端向服务器发送用于登录的用户名和密码,服务器将用户名和密码和数据库比对成功后,将一条形如

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

的token返回给客户端,客户端应在本地存储这个token。
这条token被.分为三个部分:头部(Header),载荷(Payload)和签名(Signature)。其中头部的algtyp两个字段定义了此token所使用的加密算法和token类型;载荷中包含有认证用户的信息;签名则将头部和载荷以及key用base64编码后计算SHA256。

Python异步任务队列

在开发的过程中,有时会需要用到类似下面的这些操作

  • 用户注册时发送认证邮件
  • 带有Web界面的爬虫
  • 定时计划任务

这些任务的共同特点是执行所需的时间较长,但是我们又不希望其阻塞后续的操作。因此我们将这些任务放进任务队列里来运行。

Python常见的异步任务队列实现有功能较丰富的Celery和轻量级的RQ,本文以celery为例。

Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统。
Celery经常和RabbitMQ同时提起,但实际上,RabbitMQ和celery并不是同一层面的东西。Celery需要存储介质来存储任务(称为broker),可选的broker有RabbitMQ, redis, mysql, mongodb等。

fabric.js裁剪图片对象

最近手上的一个项目使用fabric.js构建一个图片编辑器,裁剪图片是需求之一。虽然fabric.js提供了原生的裁剪功能,但是内置的裁剪功能目的在于将一个图片裁剪成特定的形状而边框不变(如下图),准确的说,这是一个遮罩,而不是裁剪。Google上能搜到的JSFiddle上几乎也都是使用的同样的方法,例如https://fiddle.jshell.net/filiperoberto/wLub3jau/,因此不符合我的需求。

Neuxs 6P的意外掉电故障

去年12月起,大量Nexus6P用户遇到了在电池仍有足够电量(60%-15%)时掉电并关机的情况。从上周开始,我的手机也毫无预兆地出现了同样的问题,而且比网上大多遇到同样问题的用户更严重,意外掉电发生时的电量为50%-80%不等。

原因

在问题最初爆发时,在Reddit上就有大量用户在讨论,分析如下:

Reading through the battery issue threads, I’ve seen a few arguments about whether the early shutdown problem is due to a hardware or a software problem, so I figured it might be useful to add a bit of information about how the battery system works.
In short, the phones are probably shutting down early because the performance of the battery doesn’t match the calibration of the fuel gauge software.
The idle (no-load) voltage of a li-ion cell ranges between about 4.2V when fully charged and about 3.3V when discharged. These values vary a bit from one phone model to another, but not by much. If that was all there is to it, it would be very easy to have a reliable battery gauge, but there’s another factor:
All batteries have a certain internal resistance, and the internal resistance dictates how the battery responds when you draw power from it. When you draw current from a battery, the output voltage will sag, and it’ll recover when you stop drawing current. So the phone may show a 75% charge level and the battery may be sitting at 4.0V. You start the camera app and because the camera is relatively power-hungry, the voltage drops to 3.8V. You close the camera app and the voltage recovers to 4.0V. The higher the internal resistance, the larger the voltage drop.
The internal resistance and the resulting voltage drop is a potential problem because these phones need a certain minimum voltage to function. Even if there’s still plenty of juice inside the battery, if the momentary voltage drop is too severe, the voltage will drop below the minimum threshold and the phone will shut off.
There are several factors that have an influence on the internal resistance:
State of charge. The internal resistance goes up when the cell is discharged.
Health of the battery. Old cells have a higher internal resistance than new ones.
Temperature. The colder it is, the higher the internal resistance.
This is also why some Samsung phones won’t let you use the camera when the battery is at 5% or lower. There’s still juice in the battery, but power-hungry loads like the camera would cause an excessive voltage drop at this state of charge, and the phone would shut off prematurely.
When calculating the percentage, the fuel gauge system makes certain assumptions about the internal resistance and how the battery will perform under load, and if the predictions don’t match the reality, the phone will shut down even though the fuel gauge may still be showing 25%. It expects a small voltage drop, but the battery can’t cope with the current draw, the output voltage dips below the minimum operating voltage of the device and it shuts off.
If you’re out of warranty, a new battery would probably cure the problem since it’s going to have a lower resistance. If you want to mitigate the problem a bit, keep the phone warm and turn down the brightness of the screen.

JavaScript代码同步化

我最近一直在写js。在这期间,我在群里提的最多的问题就是

函数a在函数b执行之前就执行了,我应该怎么办?

我有一个用python写的网易云音乐的下载器,我最近在试图把它用nodejs重写一遍。
它的逻辑非常简单。但是我写了一半就写不下去了,因为一层一层的回调嵌套,代码已经成了>形。

js一个重大的特点就是异步非阻塞,但是在一些情况下,下一步的操作需要依赖上一步的执行结果。这样就会有回调中再回调的情况出现。 当业务逻辑一复杂,回调的嵌套越来越多,可读性就会变差,维护起来也会很困难,这就是回调地狱。
node有很多第三方的模块用来将异步调用同步化,来解决这个问题。

使用scrapy构建爬虫

新建一个scrapy项目

scrapy startproject spider

scrapy会初始化一个项目,项目文件包括:

  • items.py定制需要储存的文件的域,类似于orm
  • pipelines.py管道
  • settings.py设置相关参数
  • spider文件夹 定制爬虫

scrapy爬虫的组成

scarpy抓取一个页面的大致流程:

  1. 下载器下载HTTP响应内容
  2. 下载器传给执行回调函数进行解析
  3. 解析后调度器进行过滤,查重等等
  4. 将数据传给管道,作进一步处理

ubuntu升级内核及开启BBR TCP拥塞控制

最近了解到了BBR这个东西。BBR是Google开发的一种TCP拥塞控制算法。很多人反映境外的VPS用上BBR之后,速度得到了明显的提升。
如果有兴趣了解一些原理上的东西,可以参考这里:Linux Kernel 4.9 中的 BBR 算法与之前的 TCP 拥塞控制相比有什么优势?
从Linux内核4.9起,BBR已经被整合进Linux内核中,所以直接升级内核到4.9以上的版本并开启BBR模块即可。
只有KVM和Xen架构的VPS可以自行升级内核,因为OpenVZ无法进行内核层级的操作。