Developer

Systemd 定时器教程

Systemd 作为 Linux 的系统启动器,功能强大。 本文通过一个简单例子,介绍 Systemd 如何设置定时任务。这不仅实用,而且可以作为 Systemd 的上手教程。 一、定时任务 所谓定时任务,就是未来的某个或多个时点,预定要执行的任务,比如每五分钟收一次邮件、每天半夜两点分析一下日志等等。 Linux 系统通常都使用 cron 设置定时任务,但是 Systemd 也有这个功能,而且优点显著。 自动生成日志,配合 Systemd 的日志工具,很方便除错 可以设置内存和 CPU 的使用额度,比如最多使用50%的 CPU 任务可以拆分,依赖其他 Systemd 单元,完成非常复杂的任务 下面,我就来演示一个 Systemd 定时任务:每小时发送一封电子邮件。 二、邮件脚本 先写一个发邮件的脚本mail.sh。 #!/usr/bin/env bash echo "This is the body" | /usr/bin/mail -s "Subject" someone@example.com 上面代码的someone@example.com,请替换成你的邮箱地址。 然后,执行这个脚本。 $ bash mail.sh 执行后,你应该就会收到一封邮件,标题为Subject。 Read more…

By RSSBot, ago
Developer

HTTP/2 服务器推送(Server Push)教程

HTTP/2 协议的主要目的是提高网页性能。 头信息(header)原来是直接传输文本,现在是压缩后传输。原来是同一个 TCP 连接里面,上一个回应(response)发送完了,服务器才能发送下一个,现在可以多个回应一起发送。 服务器推送(server push)是 HTTP/2 协议里面,唯一一个需要开发者自己配置的功能。其他功能都是服务器和浏览器自动实现,不需要开发者关心。 本文详细介绍服务器推送的原理和配置方法。 一、传统的网页请求方式 下面是一个非常简单的 HTML 网页文件index.html。 hello world 这个网页包含一张样式表style.css和一个图片文件https://0x1024.com/wp-content/uploads/2018/03/example.png。为了渲染这个网页,浏览器会发出三个请求。第一个请求是index.html。 GET /index.html HTTP/1.1 服务器收到这个请求,就把index.html发送给浏览器。浏览器发现里面包含了样式表和图片,于是再发出两个请求。 GET /style.css HTTP/1.1 GET /https://0x1024.com/wp-content/uploads/2018/03/example.png HTTP/1.1 这就是传统的网页请求方式。它有两个问题,一是至少需要两轮 HTTP 通信,二是收到样式文件之前,网页都会显示一片空白,这个阶段一旦超过2秒,用户体验就会非常不好。 二、传统方式的改进 一种解决办法就是把外部资源合并在网页文件里面,减少 HTTP 请求。比如,把样式表的内容写在 标签之中,把图片改成 Base64 编码的 Data URL。 另一种方法就是资源的预加载(preload)。网页预先告诉浏览器,立即下载某些资源。比如,上例可以写成下面这样。 对于上例来说,preload命令并没有什么帮助。但是,如果前一个网页就使用这个命令,预加载后一个网页需要的资源,那么用户打开后一个网页时,就会感觉速度飞快。 这两种方法都有缺点。第一种方法虽然减少了 HTTP 请求,但是把不同类型的代码合并在一个文件里,违反了分工原则。第二种方法只是提前了下载时间,并没有减少 HTTP 请求。 三、服务器推送的概念 服务器推送(server push)指的是,还没有收到浏览器的请求,服务器就把各种资源推送给浏览器。 比如,浏览器只请求了index.html,但是服务器把index.html、style.css、https://0x1024.com/wp-content/uploads/2018/03/example.png全部发送给浏览器。这样的话,只需要一轮 Read more…

By RSSBot, ago
Developer

Nginx 容器教程

春节前,我看到 Nginx 加入了 HTTP/2 的 server push 功能,就很想试一下。 正好这些天,我在学习 Docker,就想到可以用 Nginx 容器。万一哪里改乱了,直接删掉,再重启一个容器就可以了。 下面就是我搭建 Nginx 容器的过程,以及如何加入 SSL 证书。你会看到 Docker 用来测试软件的新功能,真的很方便,很值得学习。如果你还不会 Docker,可以先看《Docker 入门教程》,非常简单,半小时以内就能学会。 一、HTTP 服务 Nginx 的最大作用,就是搭建一个 Web Server。有了容器,只要一行命令,服务器就架设好了,完全不用配置。 $ docker container run -d -p 127.0.0.2:8080:80 --rm --name mynginx nginx 上面命令下载并运行官方的 Nginx image,默认是最新版本(latest),当前是 1.13.9。如果本机安装过以前的版本,请删掉重新安装,因为只有 1.13.9 才开始支持 server push。 上面命令的各个参数含义如下。 -d:在后台运行 -p :容器的80端口映射到127.0.0.2:8080 Read more…

By RSSBot, ago
Developer

Docker 微服务教程

Docker 是一个容器工具,提供虚拟环境。很多人认为,它改变了我们对软件的认识。 站在 Docker 的角度,软件就是容器的组合:业务逻辑容器、数据库容器、储存容器、队列容器……Docker 使得软件可以拆分成若干个标准化容器,然后像搭积木一样组合起来。 这正是微服务(microservices)的思想:软件把任务外包出去,让各种外部服务完成这些任务,软件本身只是底层服务的调度中心和组装层。 微服务很适合用 Docker 容器实现,每个容器承载一个服务。一台计算机同时运行多个容器,从而就能很轻松地模拟出复杂的微服务架构。 上一篇教程介绍了 Docker 的概念和基本用法,本文接着往下介绍,如何在一台计算机上实现多个服务,让它们互相配合,组合出一个应用程序。 我选择的示例软件是 WordPress。它是一个常用软件,全世界用户据说超过几千万。同时它又非常简单,只要两个容器就够了(业务容器 + 数据库容器),很适合教学。而且,这种”业务 + 数据库”的容器架构,具有通用性,许多应用程序都可以复用。 为了加深读者理解,本文采用三种方法,演示如何架设 WordPress 网站。 方法 A:自建 WordPress 容器 方法 B:采用官方的 WordPress 容器 方法 C:采用 Docker Compose 工具 一、预备工作:image 仓库的镜像网址 本教程需要从仓库下载 image 文件,但是国内访问 Docker 的官方仓库很慢,还经常断线,所以要把仓库网址改成国内的镜像站。这里推荐使用官方镜像 registry.docker-cn.com。 打开/etc/default/docker文件(需要sudo权限),在文件的底部加上一行。 DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com" 然后,重启 Docker 服务。 $ sudo Read more…

By RSSBot, ago
Developer

Docker 入门教程

2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。 但是,许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?本文就来详细解释,帮助大家理解它,还带有简单易懂的实例,教你如何将它用于日常开发。 一、环境配置的难题 软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来? 用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。 如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:”它在我的机器可以跑了”(It works on my machine),言下之意就是,其他机器很可能跑不了。 环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。 二、虚拟机 虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。 虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。 (1)资源占用多 虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。 (2)冗余步骤多 虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。 (3)启动慢 启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。 三、Linux 容器 由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。 Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。 由于容器是进程级别的,相比虚拟机有很多优势。 (1)启动快 容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。 (2)资源占用少 容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。 Read more…

By RSSBot, ago
Developer

持续集成服务 Travis CI 教程

编写代码只是软件开发的一小部分,更多的时间往往花在构建(build)和测试(test)。 为了提高软件开发的效率,构建和测试的自动化工具层出不穷。Travis CI 就是这类工具之中,市场份额最大的一个。 本文介绍 Travis CI 的基本用法。用好这个工具不仅可以提高效率,还能使开发流程更可靠和专业化,从而提高软件的价值。而且,它对于开源项目是免费的,不花一分钱,就能帮你做掉很多事情。 一、什么是持续集成? Travis CI 提供的是持续集成服务(Continuous Integration,简称 CI)。它绑定 Github 上面的项目,只要有新的代码,就会自动抓取。然后,提供一个运行环境,执行测试,完成构建,还能部署到服务器。 持续集成指的是只要代码有变更,就自动运行构建和测试,反馈运行结果。确保符合预期以后,再将新代码”集成”到主干。 持续集成的好处在于,每次代码的小幅变更,就能看到运行结果,从而不断累积小的变更,而不是在开发周期结束时,一下子合并一大块代码。 二、使用准备 Travis CI 只支持 Github,不支持其他代码托管服务。这意味着,你必须满足以下条件,才能使用 Travis CI。 拥有 GitHub 帐号 该帐号下面有一个项目 该项目里面有可运行的代码 该项目还包含构建或测试脚本 如果这些条件都没问题,就可以开始使用 Travis CI 了。 首先,访问官方网站 travis-ci.org,点击右上角的个人头像,使用 Github 账户登入 Travis CI。 Travis 会列出 Github 上面你的所有仓库,以及你所属于的组织。此时,选择你需要 Travis 帮你构建的仓库,打开仓库旁边的开关。一旦激活了一个仓库,Travis 会监听这个仓库的所有变化。 三、.travis.yml Travis Read more…

By RSSBot, ago
Developer

Bash 脚本 set 命令教程

服务器的开发和管理离不开 Bash 脚本,掌握它需要学习大量的细节。 set命令是 Bash 脚本的重要环节,却常常被忽视,导致脚本的安全性和可维护性出问题。本文介绍它的基本用法,让你可以更安心地使用 Bash 脚本。 一、简介 我们知道,Bash 执行脚本的时候,会创建一个新的 Shell。 $ bash script.sh 上面代码中,script.sh是在一个新的 Shell 里面执行。这个 Shell 就是脚本的执行环境,Bash 默认给定了这个环境的各种参数。 set命令用来修改 Shell 环境的运行参数,也就是可以定制环境。一共有十几个参数可以定制,官方手册有完整清单,本文介绍其中最常用的四个。 顺便提一下,如果命令行下不带任何参数,直接运行set,会显示所有的环境变量和 Shell 函数。 $ set 二、set -u 执行脚本的时候,如果遇到不存在的变量,Bash 默认忽略它。 #!/usr/bin/env bash echo $a echo bar 上面代码中,$a是一个不存在的变量。执行结果如下。 $ bash script.sh bar 可以看到,echo $a输出了一个空行,Bash 忽略了不存在的$a,然后继续执行echo bar。大多数情况下,这不是开发者想要的行为,遇到变量不存在,脚本应该报错,而不是一声不响地往下执行。 set -u就用来改变这种行为。脚本在头部加上它,遇到不存在的变量就会报错,并停止执行。 Read more…

By RSSBot, ago
Developer

双因素认证(2FA)教程

所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤。 密码是最常见的认证方法,但是不安全,容易泄露和冒充。 越来越多的地方,要求启用双因素认证(Two-factor authentication,简称 2FA)。本文介绍它的概念和实现方法。 文章结尾有一则活动消息,优达学城(Udacity)的”双十一优惠”,课程最高减免1111元。 一、双因素认证的概念 一般来说,三种不同类型的证据,可以证明一个人的身份。 秘密信息:只有该用户知道、其他人不知道的某种信息,比如密码。 个人物品:该用户的私人物品,比如身份证、钥匙。 生理特征:该用户的遗传特征,比如指纹、相貌、虹膜等等。 这些证据就称为三种”因素”(factor)。因素越多,证明力就越强,身份就越可靠。 双因素认证就是指,通过认证同时需要两个因素的证据。 银行卡就是最常见的双因素认证。用户必须同时提供银行卡和密码,才能取到现金。 二、双因素认证方案 常用的双因素组合是密码 + 某种个人物品,比如网上银行的 U 盾。用户插上 U 盾,再输入密码,才能登录网上银行。 但是,用户不可能随时携带 U 盾,手机才是最好的替代品。密码 + 手机就成了最佳的双因素认证方案。 国内的很多网站要求,用户输入密码时,还要提供短消息发送的验证码,以证明用户确实拥有该手机。 但是,短消息是不安全的,容易被拦截和伪造,SIM 卡也可以克隆。已经有案例,先伪造身份证,再申请一模一样的手机号码,把钱转走。 因此,安全的双因素认证不是密码 + 短消息,而是下面要介绍的 TOTP。 三、TOTP 的概念 TOTP 的全称是”基于时间的一次性密码”(Time-based One-time Password)。它是公认的可靠解决方案,已经写入国际标准 RFC6238。 它的步骤如下。 第一步,用户开启双因素认证后,服务器生成一个密钥。 第二步:服务器提示用户扫描二维码(或者使用其他方式),把密钥保存到用户的手机。也就是说,服务器和用户的手机,现在都有了同一把密钥。 注意,密钥必须跟手机绑定。一旦用户更换手机,就必须生成全新的密钥。 第三步,用户登录时,手机客户端使用这个密钥和当前时间戳,生成一个哈希,有效期默认为30秒。用户在有效期内,把这个哈希提交给服务器。 第四步,服务器也使用密钥和当前时间戳,生成一个哈希,跟用户提交的哈希比对。只要两者不一致,就拒绝登录。 五、TOTP 的算法 仔细看上面的步骤,你可能会有一个问题:手机客户端和服务器,如何保证30秒期间都得到同一个哈希呢? Read more…

By RSSBot, ago
Developer

CSS 框架 Bulma 教程

网页样式需要大量时间开发,最省事的方法就是使用 CSS 框架。 Bootstrap 是最著名的 CSS 框架,但是今天我想推荐另一个更轻量化、更易用的框架—-Bulma。有了它,即使完全不懂 CSS,也可以轻而易举做出美观的网页。 我要感谢 100offer 对我提供赞助。100offer 是国内第一流的人力资源网站,本文结尾有他们的简介,最近想换工作的朋友可以看一下。 一、简介 Bulma 框架最大的特点,就是简单好用。所有样式都基于class,只需为 HTML 元素指定class,样式立刻生效。 Login 上面代码中,a 元素只需加上几个class,就会出现一个主色调(is-primary)的大(is-large)按钮。 Bulma 是一个手机优先的框架,提供五个宽度断点,具有良好的自适应特性,可以随心所欲为不同设备设置不同样式。 mobile:小于等于768px tablet:大于等于769px desktop:大于等于1024px widescreen:大于等于1216px fullhd:大于等于1408px 它提供二十多种常用组件,比如表单 、表格、图标、面包屑、菜单、导航、Modal 窗口等等。简单的网站,可以不用写任何 CSS 代码。 二、基本用法 Bulma 的安装只需一步,把样式表插入网页即可。 使用更简单,就是为 HTML 元素加上class。 Button 上面的代码为 a 元素加上button类,这个链接就会被渲染成按钮。 Bulma 提供大量的修饰类,用来改变基类的样式。它们都是以is-或has-开头。比如,要改变 Button 的大小,就可以使用下面的修饰类。 Small Normal Medium Large Read more…

By RSSBot, ago
Developer

开源许可证教程

作为一个开发者,如果你打算开源自己的代码,千万不要忘记,选择一种开源许可证(license)。 许多开发者对开源许可证了解很少,不清楚有哪些许可证,应该怎么选择。本文介绍开源许可证的基本知识,主要参考了 OpenSource.com (1,2)。 一、什么是开源许可证 开源许可证是一种法律许可。通过它,版权拥有人明确允许,用户可以免费地使用、修改、共享版权软件。 版权法默认禁止共享,也就是说,没有许可证的软件,就等同于保留版权,虽然开源了,用户只能看看源码,不能用,一用就会侵犯版权。所以软件开源的话,必须明确地授予用户开源许可证。 二、开源许可证的种类 目前,国际公认的开源许可证共有80多种。它们的共同特征是,都允许用户免费地使用、修改、共享源码,但是都有各自的使用条件。 如果一种开源许可证没有任何使用条件,连保留作者信息都不需要,那么就等同于放弃版权了。这时,软件可以直接声明进入”公共领域”(public domain)。 根据使用条件的不同,开源许可证分成两大类。 宽松式(permissive)许可证 Copyleft 许可证 三、宽松式许可证 3.1 特点 宽松式许可证(permissive license)是最基本的类型,对用户几乎没有限制。用户可以修改代码后闭源。 它有三个基本特点。 (1)没有使用限制 用户可以使用代码,做任何想做的事情。 (2)没有担保 不保证代码质量,用户自担风险。 (3)披露要求(notice requirement) 用户必须披露原始作者。 3.2 常见许可证 常见的宽松式许可证有四种。它们都允许用户任意使用代码,区别在于要求用户遵守的条件不同。 (1)BSD(二条款版) 分发软件时,必须保留原始的许可证声明。 (2) BSD(三条款版) 分发软件时,必须保留原始的许可证声明。不得使用原始作者的名字为软件促销。 (3)MIT 分发软件时,必须保留原始的许可证声明,与 BSD(二条款版)基本一致。 (4)Apache 2 分发软件时,必须保留原始的许可证声明。凡是修改过的文件,必须向用户说明该文件修改过;没有修改过的文件,必须保持许可证不变。 四、Copyleft 许可证 4.1 Copyleft 的含义 Copyleft 是理查德·斯托曼发明的一个词,作为 Copyright Read more…

By RSSBot, ago