2015年10月

假如你已经完全配好了你的 SSL:使用了强加密算法、禁用了废弃的协议,而且你提供了 100% SHA-2 的证书链。SSL Labs 给了你一个 A+ 评分,shaaaaaaaaaaaaa.com 也没发现你使用了 SHA-1。但是,有些情况下,当你访问你的网站时,Chrome 仍旧会在 URL 栏处显示一个红叉,并且说你的网站提供了 SHA-1 证书,是“ 肯定不安全的 affirmatively insecure ” 的:

URL bar showing red cross through 'https'

这可能吗?不幸的是,有可能。你的服务器所发送的证书也许并不是你的浏览器所使用的。在迁移到 SHA-2 的过程中不应该是这样的,但是由于某些 CA 糟糕的做法和用户使用了老旧的软件,有时候会出现这样的问题。具体听我一一道来。

背景知识:证书链如何工作

一个 SSL 证书必须被 证书授权中心 certificate authority,CA 签名才是可信的。在最简单的情况下,网站的证书( 终端证书 end-entity certificate )是由浏览器所信任的 CA 的( 根证书 root certificate )直接签名的。

简单 PKI: 终端证书由根证书直接签名

浏览器校验直接由根证书签名的证书很简单:浏览器在它的根证书库里面查找终端证书的签发者,如果找到,就使用该根证书的公钥来校验终端证书的签名。

然而,终端证书很少会由根证书进行签名。相反的,终端证书是由一个“ 中间证书 intermediate certificate ”(有时候也称之为 下级 CA subordinate CA )进行签名的,而中间证书则由根证书进行签名。

典型的 PKI 是使用一个中间证书

校验一个由中间证书签名的证书是困难的。浏览器不能简单地在它的根证书库中找到签发者,因为该证书并不是由根证书签名的。相反,浏览器需要找到签名该证书的中间证书,需要的话还得迭代这个过程(中间证书也许是由其它的中间证书签名的),直到沿着这个证书链找到根证书。而事实上更复杂,因为也许从终端证书到根证书有几种可能的链路。

让浏览器找到中间证书链的最简单的办法是,让服务器告诉它。这就是为什么当你部署一个 SSL 证书时,不仅仅需要你自己的证书,还需要中间证书。不过,浏览器通常会缓存中间证书,也许会使用一个缓存的证书而不是使用由你的服务器提供的证书。这就是为什么在你全部使用了 SHA-2 之后, Chrome 也许还会显示一个红叉的原因:它并没有使用你的证书链上提供的证书,而是使用了其所缓存的 SHA-1 的证书链。

理论上,这是可以避免的,如果 CA 可以正确操作、用户也运行最新的软件的话。不幸的是,现实并不总是这样,个别情况下已知导致这个问题的原因有两个。

(注意:澄清一下,生成证书链的并不是 Chrome ,而是 Chrome 交由操作系统的加密库构建证书链。加密库在 Windows 上是 CryptoAPI,Linux 上是 NSS。)

问题一:将 SHA-1 中间证书用 SHA-2 重用

当 CA 迁移到 SHA-2 时,它可以通过对已有的公钥用 SHA-2 重新签名,从而重用已有的中间证书,或者也可以生成一个带有新的公钥和 主题名 subject name 的新中间证书。

两种新的 SHA-2 签名方式

第一种方式是错误的。虽然 CA 可以用已有的中间证书使用 SHA-2 重新签名,但是浏览器也许会缓存着带有旧的 SHA-1 签名的中间证书。如上面解释的,浏览器可以忽略由服务器提供的链证书,即便服务器发送了带有新的 SHA-2 签名的中间证书,客户端依然会使用其所缓存的 SHA-1 中间证书来构建证书链。CryptoAPI 就是这样的。

服务器发送了 SHA-2 证书,浏览器使用了缓存的 SHA-1 证书

而第二个办法就避免了缓存证书链的问题。因为 CA 生成了一个新的中间证书,有新的名字和公钥,浏览器不可能有用 SHA-1 签名的旧版本。这就是为什么 Ballot 118 在 CA/Browser Forum 这样说:

SHA-2 下级证书绝不应该链到 SHA-1 的 CA 下级证书上。

不幸的是,有些 CA 根本没在意这个忠告,比如某个 CA ,StartCom,仍然使用 SHA-1 中间证书签发 SHA-2 终端证书。虽然他们提供了一个 SHA-2 签名的中间证书,但是如果浏览器已经有一个缓存的 SHA-1 版本时就会有问题。

幸运的是,SSLMate 的两个 CA 都正确地从新的 SHA-2 中间证书签发证书,所以,SSLMate 的客户不需要担心这个。

问题二:过期的 NSS 和交叉签名的根证书

有时候根证书自身也由其它的根证书签名,通常这称之为 交叉签名 cross-signing 。这提供了一个抵达可信根证书的另外一条路径,交叉签名可以让一个不在你的浏览器的可信证书库中的新根证书也可以工作。当浏览器开始信任一个根证书时,交叉签名的证书就不再需要了。然而,和中间证书一样,交叉签名的证书也是可以缓存的,而在 NSS 中一个 bug 会导致 Linux 上的 Chrome 使用缓存的交叉签名的根证书,即使有更短和更新的证书链存在。如果这个缓存的交叉签名证书正好使用 SHA-1,Chrome 就会使用这个有问题的证书链并显示一个红叉,而不管你的服务器是否发送了全都使用 SHA-2 的证书链。

NSS 使用缓存的交叉签名证书构建证书链

这个 bug 在 NSS 3.17.4 中修复,发布于1/28。不幸的是,Debian 更新 NSS 软件包非常缓慢。这个 bug 在2014/12/30 就提交到了 Debian 的 bug tracker 上了,但是直到 5/13 都没在 Debian Unstable 中修复。同时,Debian Stable (Jessie)继续用着 NSS 3.17.2 。Debian 安全团队排除了会通过安全更新修复它,而且看起来包维护者也不像是会快速响应将这个修复加入到即将发布(本文写作时)的 Debian Stable 中。Ubuntu 则不同,将此作为安全问题,在 2/19 给其所有发行版发布了更新包。

不幸的是,CA 不能为使用过期 NSS 的用户做些什么。直到 Debian 为其稳定发行版发布更新的 NSS 包之前,Debian 上的 Chrome 用户会一直看到许多这样的红叉:

URL bar showing red cross through 'https'

或者,如果证书在 2016 年失效的话是这样:

URL bar for https://bugs.debian.org, with orange alert symbol

更新:由 SSLMate 的 Andrew Ayer 提供的 NSS 更新包,放到了 2015/9/5 发布的 Debian Jessie 8.2 中。

有那么一段时间我没更换主题了,可能最近的一段时间没有一款主题能让我眼前一亮了。我考虑过更换 Ubuntu 上最好的图标主题,但是它们和 Numix 和 Moka 差不多,而且我觉得 Numix 也不错。

但是前几天我试了试 Xenslim WildFire,我必须承认,它看起来太棒了。极简风格是设计界当前的流行趋势,而 Xenlism 完美的表现了这种风格。平滑而美观,Xenlism 显然受到了诺基亚的 Meego 和苹果图标的影响。

让我们来看一下它的几个不同应用的图标:

文件夹图标看起来像这样:

主题开发者 Nattapong Pullkhow 说,这个图标主题最适合 GNOME,但是在 Unity 和 KDE,Mate 上也表现良好。

安装 Xenlism Wildfire

Xenlism Theme 大约有 230 MB, 对于一个主题来说确实很大,但是考虑到它所支持的庞大的软件数量,这个大小,确实也不是那么令人吃惊。

在 Ubuntu/Debian 上安装 Xenlism

在 Ubuntu 系列中安装之前,用以下的命令添加 GPG 秘钥:

sudo apt-key adv --keyserver keys.gnupg.net --recv-keys 90127F5B

添加完成之后,输入如下的命令进行安装:

echo "deb http://downloads.sourceforge.net/project/xenlism-wildfire/repo deb/" | sudo tee -a /etc/apt/sources.list
sudo apt-get update
sudo apt-get install xenlism-wildfire-icon-theme

除了主题之外,你也可以选择是否下载配套的桌面背景图:

sudo apt-get install xenlism-artwork-wallpapers

在 Arch 上安装 Xenlism

你需要编辑 Pacman 软件仓库。在终端中使用如下命令:

sudo nano /etc/pacman.conf

添加如下的代码块,在配置文件中:

[xenlism-arch]
SigLevel = Never
Server = http://downloads.sourceforge.net/project/xenlism-wildfire/repo/arch

更新系统并且安装:

sudo pacman -Syyu
sudo pacman -S xenlism-wildfire

使用 Xenlism 主题

在 Ubuntu Unity, 可以使用 Unity Tweak Tool 来改变主题。 在 GNOME 中,使用 Gnome Tweak Tool 改变主题。 我确信你会接下来的步骤,如果你不会,请来信通知我,我会继续完善这篇文章。

这就是 Xenlism 在 Ubuntu 15.04 Unity 中的截图。同时也使用了 Xenlism 桌面背景。

这看来真棒,不是吗?如果你试用了,并且喜欢它,你可以感谢它的开发者:

Xenlism 是一个用于 Linux 的、令人兴奋的极简风格的图标主题,感谢 @xenatt 做出这么漂亮的主题。

我希望你喜欢它。同时也希望你分享你对这个主题的看法,或者你喜欢的主题。Xenlism 真的很棒,可能会替换掉你最喜欢的主题。


via: http://itsfoss.com/xenlism-wildfire-theme/

作者:Abhishek 译者:MikeCoder 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

大家好,Node.JS 4.0 发布了,这个流行的服务器端 JS 平台合并了 Node.js 和 io.js 的代码,4.0 版就是这两个项目结合的产物——现在合并为一个代码库。这次最主要的变化是 Node.js 封装了4.5 版本的 Google V8 JS 引擎,与当前的 Chrome 所带的一致。所以,紧跟 V8 的发布可以让 Node.js 运行的更快、更安全,同时更好的利用 ES6 的很多语言特性。

Node JS

Node.js 4.0 发布的主要目标是为 io.js 用户提供一个简单的升级途径,所以这次并没有太多重要的 API 变更。下面的内容让我们来看看如何轻松的在 ubuntu server 上安装、配置 Node.js。

基础系统安装

Node 在 Linux,Macintosh,Solaris 这几个系统上都可以完美的运行,linux 的发行版本当中使用 Ubuntu 相当适合。这也是我们为什么要尝试在 ubuntu 15.04 上安装 Node.js,当然了在 14.04 上也可以使用相同的步骤安装。

1) 系统资源

Node.js 所需的基本的系统资源取决于你的架构需要。本教程我们会在一台 1GB 内存、 1GHz 处理器和 10GB 磁盘空间的服务器上进行,最小安装即可,不需要安装 Web 服务器或数据库服务器。

2) 系统更新

在我们安装 Node.js 之前,推荐你将系统更新到最新的补丁和升级包,所以请登录到系统中使用超级用户运行如下命令:

# apt-get update

3) 安装依赖

Node.js 仅需要你的服务器上有一些基本系统和软件功能,比如 'make'、'gcc'和'wget' 之类的。如果你还没有安装它们,运行如下命令安装:

# apt-get install python gcc make g++ wget

下载最新版的Node JS v4.0.0

访问链接 Node JS Download Page 下载源代码.

nodejs download

复制其中的最新的源代码的链接,然后用wget 下载,命令如下:

# wget https://nodejs.org/download/rc/v4.0.0-rc.1/node-v4.0.0-rc.1.tar.gz

下载完成后使用命令tar 解压缩:

# tar -zxvf node-v4.0.0-rc.1.tar.gz

wget nodejs

安装 Node JS v4.0.0

现在可以开始使用下载好的源代码编译 Node.js。在开始编译前,你需要在 ubuntu server 上切换到源代码解压缩后的目录,运行 configure 脚本来配置源代码。

root@ubuntu-15:~/node-v4.0.0-rc.1# ./configure

Installing NodeJS

现在运行命令 'make install' 编译安装 Node.js:

root@ubuntu-15:~/node-v4.0.0-rc.1# make install

make 命令会花费几分钟完成编译,安静的等待一会。

验证 Node.js 安装

一旦编译任务完成,我们就可以开始验证安装工作是否 OK。我们运行下列命令来确认 Node.js 的版本。

root@ubuntu-15:~# node -v
v4.0.0-pre

在命令行下不带参数的运行node 就会进入 REPL(Read-Eval-Print-Loop,读-执行-输出-循环)模式,它有一个简化版的emacs 行编辑器,通过它你可以交互式的运行JS和查看运行结果。

node version

编写测试程序

我们也可以写一个很简单的终端程序来测试安装是否成功,并且工作正常。要做这个,我们将会创建一个“test.js” 文件,包含以下代码,操作如下:

root@ubuntu-15:~# vim test.js
var util = require("util");
console.log("Hello! This is a Node Test Program");
:wq!

现在为了运行上面的程序,在命令行运行下面的命令。

root@ubuntu-15:~# node test.js

Node Program

在一个成功安装了 Node JS 的环境下运行上面的程序就会在屏幕上得到上图所示的输出,这个程序加载类 “util” 到变量 “util” 中,接着用对象 “util” 运行终端任务,console.log 这个命令作用类似 C++ 里的cout

结论

就是这些了。如果你刚刚开始使用 Node.js 开发应用程序,希望本文能够通过在 ubuntu 上安装、运行 Node.js 让你了解一下Node.js 的大概。最后,我们可以认为我们可以期待 Node JS v4.0.0 能够取得显著性能提升。


via: http://linoxide.com/ubuntu-how-to/setup-node-js-4-0-ubuntu-14-04-15-04/

作者:Kashif Siddique 译者:osk874 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

NetBSD 项目发布了 NetBSD 7.0,这是 NetBSD 操作系统发布的第五个主要版本。

这次发布带来了稳定性的提升、几百个 bug 修复以及许多新功能。主要有:

  • DRM/KMS 支持为使用现代的 Intel 和 Radeon 显卡的 x86 系统带来了图形性能提升
  • 支持 ARM 多处理器
  • 支持许多新的 ARM 主板:

    • 树莓派 2
    • ODROID-C1
    • BeagleBoard, BeagleBone, BeagleBone Black
    • MiraBox
    • Allwinner A20, A31: Cubieboard2, Cubietruck, Banana Pi, etc.
    • Freescale i.MX50, i.MX51: Kobo Touch, Netwalker
    • Xilinx Zynq: Parallella, ZedBoard
  • NPF 的重要改进:

    • BPF 默认带有即时 (JIT) 编译功能
    • 支持动态规则
    • 支持静态(无状态)NAT
    • 支持 RFC 6296 的 IPv6-to-IPv6 网络前缀翻译 (NPTv6)
    • 支持基于 CDB 的表(使用完美哈希和可靠的无锁 O(1) 查找)
  • USB 子系统中支持多处理器
  • 一个集成了包过滤器的新的守护进程 blacklistd(8) 可以动态保护诸如 ssh, named 和 ftpd 等其它网络守护进程免受攻击
  • 在磁盘 wedges 处理方面的几个改进(关于 wedges 参见 dkctl(8)
  • 在 sysinst 中通过扩展分区菜单支持 GPT
  • Lua 内核级脚本
  • epoc32:一个支持 Psion EPOC PDA 的新移植
  • GCC 4.8.4:支持 C++11
  • 可选的完整 BSD 协议的 C/C++ 运行时环境: compiler\_rt, libc++, libcxxrt.

NetBSD 7.0 的完整更新列表见此

完整的 NetBSD 7.0 的源代码和二进制可以在全球的许多站点下载到。下载站点列表:http://www.NetBSD.org/mirrors/,支 FTP, AnonCVS, SUP 等服务。建议需要下载 ISO 或 USB 磁盘镜像的用户通过 BitTorrent 下载, 种子在此 。使用 PGP 签名的校验列表: http://ftp.NetBSD.org/pub/NetBSD/security/hashes/NetBSD-7.0\_hashes.asc

NetBSD 7.0 支持许多种架构,提供二进制发行版的有:

NetBSD/acorn26Acorn Archimedes, A-series and R-series systems
NetBSD/acorn32Acorn RiscPC/A7000, VLSI RC7500
NetBSD/algorAlgorithmics, Ltd. MIPS evaluation boards
NetBSD/alphaDigital/Compaq Alpha (64-bit)
NetBSD/amd64AMD family processors like Opteron, Athlon64, and Intel CPUs with EM64T extension
NetBSD/amigaCommodore Amiga and MacroSystem DraCo
NetBSD/amigappcPowerPC-based Amiga boards.
NetBSD/arcMIPS-based machines following the Advanced RISC Computing spec
NetBSD/atariAtari TT030, Falcon, Hades
NetBSD/beboxBe Inc's BeBox
NetBSD/catsChalice Technology's CATS and Intel's EBSA-285 evaluation boards
NetBSD/cesficCES FIC8234 VME processor board
NetBSD/cobaltCobalt Networks' MIPS-based Microservers
NetBSD/dreamcastSega Dreamcast game console
NetBSD/emipsThe Extensible MIPS architecture from Microsoft Research
NetBSD/epoc32Psion EPOC PDAs
NetBSD/evbarmVarious ARM-based evaluation boards and appliances
NetBSD/evbmipsVarious MIPS-based evaluation boards and appliances
NetBSD/evbppcVarious PowerPC-based evaluation boards and appliances
NetBSD/evbsh3Various Hitachi Super-H SH3 and SH4-based evaluation boards and appliances
NetBSD/ews4800mipsNEC's MIPS-based EWS4800 workstation
NetBSD/hp300Hewlett-Packard 9000/300 and 400 series
NetBSD/hppaHewlett-Packard 9000 Series 700 workstations
NetBSD/hpcarmStrongARM based Windows CE PDA machines
NetBSD/hpcmipsMIPS-based Windows CE PDA machines
NetBSD/hpcshHitachi Super-H based Windows CE PDA machines
NetBSD/i386IBM PCs and PC clones with i486-family processors and up
NetBSD/ibmnwsIBM Network Station 1000
NetBSD/iyonixCastle Technology's Iyonix ARM based PCs
NetBSD/landiskSH4 processor based NAS appliances
NetBSD/luna68kOMRON Tateisi Electric's LUNA series
NetBSD/mac68kApple Macintosh with Motorola 68k CPU
NetBSD/macppcApple PowerPC-based Macintosh and clones
NetBSD/mipscoMIPS Computer Systems Inc. family of workstations and servers
NetBSD/mmeyeBrains mmEye multimedia server
NetBSD/mvme68kMotorola MVME 68k Single Board Computers
NetBSD/mvmeppcMotorola PowerPC VME Single Board Computers
NetBSD/netwinderStrongARM based NetWinder machines
NetBSD/news68kSony's 68k-based “NET WORK STATION” series
NetBSD/newsmipsSony's MIPS-based “NET WORK STATION” series
NetBSD/next68kNeXT 68k “black” hardware
NetBSD/ofppcOpenFirmware PowerPC machines
NetBSD/pmaxDigital MIPS-based DECstations and DECsystems
NetBSD/prepPReP (PowerPC Reference Platform) and CHRP machines
NetBSD/rs6000IBM RS/6000 MCA-based PowerPC machines.
NetBSD/sandpointMotorola Sandpoint reference platform, including many PPC-based NAS boxes
NetBSD/sbmipsBroadcom SiByte evaluation boards
NetBSD/sgimipsSilicon Graphics' MIPS-based workstations
NetBSD/sharkDigital DNARD (“shark”)
NetBSD/sparcSun SPARC (32-bit) and UltraSPARC (in 32-bit mode)
NetBSD/sparc64Sun UltraSPARC (in native 64-bit mode)
NetBSD/sun2Sun Microsystems Sun 2 machines with Motorola 68010 CPU
NetBSD/sun3Motorola 68020 and 030 based Sun 3 and 3x machines
NetBSD/vaxDigital VAX
NetBSD/x68kSharp X680x0 series
NetBSD/xenThe Xen virtual machine monitor
NetBSD/zaurusSharp ARM PDAs

这个版本中只支持源代码格式的 port 的有:

NetBSD/ia64Itanium family of processors

在生产环境中,我会更喜欢做与自动化相关的所有事情。如果计算机能完成你的任务,何必需要你亲自动手呢?但是,在不断变化并存在多种技术的环境中,创建和实施自动化是一项艰巨的任务。这就是为什么我喜欢 Ansible 的原因。Ansible 是一个用于 IT 配置管理,部署和业务流程的开源工具,使用起来非常方便。

我最喜欢 Ansible 的一个特点是,它是完全无客户端的。要管理一个系统,通过 SSH 建立连接,它使用Paramiko(一个 Python 库)或本地的 OpenSSH。Ansible 另一个吸引人的地方是它有许多可扩展的模块。这些模块可被系统管理员用于执行一些的常见任务。特别是,它们使用 Ansible 这个强有力的工具可以跨多个服务器、环境或操作系统安装和配置任何程序,只需要一个控制节点。

在本教程中,我将带你使用 Ansible 完成安装和部署开源 NGINX 和我们的商业产品 NGINX Plus。我将在 CentOS 服务器上演示,但我也在下面的“在 Ubuntu 上创建 Ansible Playbook 来安装 NGINX 和 NGINX Plus”小节中包含了在 Ubuntu 服务器上部署的细节。

在本教程中我将使用 Ansible 1.9.2 版本,并在 CentOS 7.1 服务器上部署运行。

$ ansible --version
ansible 1.9.2

$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)

如果你还没有 Ansible,可以在 Ansible 网站 查看说明并安装它。

如果你使用的是 CentOS,安装 Ansible 十分简单,只要输入以下命令。如果你想使用源码编译安装或使用其他发行版,请参阅上面 Ansible 链接中的说明。

$ sudo yum install -y epel-release && sudo yum install -y ansible

根据环境的不同,在本教程中的命令有的可能需要 sudo 权限。文件路径,用户名和目标服务器取决于你的环境的情况。

创建一个 Ansible Playbook 来安装 NGINX (CentOS)

首先,我们要为 NGINX 的部署创建一个工作目录,包括子目录和部署配置文件。我通常建议在你的主目录中创建该目录,在文章的所有例子中都会有说明。

$ cd $HOME
$ mkdir -p ansible-nginx/tasks/
$ touch ansible-nginx/deploy.yml
$ touch ansible-nginx/tasks/install_nginx.yml

目录结构看起来是这样的。你可以使用 tree 命令来查看。

$ tree $HOME/ansible-nginx/
/home/kjones/ansible-nginx/
├── deploy.yml
└── tasks
    └── install_nginx.yml

1 directory, 2 files

如果你没有安装 tree 命令,使用以下命令去安装。

$ sudo yum install -y tree

创建主部署文件

接下来,我们在文本编辑器中打开 deploy.yml。我喜欢在命令行上使用 vim 来编辑配置文件,在整个教程中也都将使用它。

$ vim $HOME/ansible-nginx/deploy.yml

deploy.yml 文件是 Ansible 部署的主要文件,在“使用 Ansible 部署 NGINX”小节中,我们运行 ansible‑playbook 命令时会使用此文件。在这个文件中,我们指定 Ansible 运行时使用的库以及其它配置文件。

在这个例子中,我使用 include 模块来指定配置文件一步一步来安装NGINX。虽然可以创建一个非常大的 playbook 文件,我建议你将其分割为小文件,让它们更有条理。include 的示例中可以复制静态内容,复制配置文件,为更高级的部署使用逻辑配置设定变量。

在文件中输入以下行。我在顶部的注释包含了文件名用于参考。

# ./ansible-nginx/deploy.yml

- hosts: nginx
  tasks:
    - include: 'tasks/install_nginx.yml'

hosts 语句说明 Ansible 部署 nginx 组的所有服务器,服务器在 /etc/ansible/hosts 中指定。我们会在下面的“创建 NGINX 服务器列表”小节编辑此文件。

include 语句说明 Ansible 在部署过程中从 tasks 目录下读取并执行 install\_nginx.yml 文件中的内容。该文件包括以下几步:下载,安装,并启动 NGINX。我们将在下一节创建此文件。

为 NGINX 创建部署文件

现在,先保存 deploy.yml 文件,并在编辑器中打开 install\_nginx.yml

$ vim $HOME/ansible-nginx/tasks/install_nginx.yml

该文件包含有指令(使用 YAML 格式写的), Ansible 会按照指令安装和配置我们的 NGINX 部署过程。每个节(过程中的步骤)起始于一个描述此步骤的 name 语句(前面有连字符)。 name 后的字符串是 Ansible 部署过程中输出到标准输出的,可以根据你的意愿来修改。YAML 文件中的节的下一行是在部署过程中将使用的模块。在下面的配置中,使用了 yumservice 模块。yum 模块用于在 CentOS 上安装软件包。service 模块用于管理 UNIX 的服务。在这个节的最后一行或几行指定了几个模块的参数(在本例中,这些行以 namestate 开始)。

在文件中输入以下行。就像 deploy.yml,在我们文件的第一行是用于参考的文件名的注释。第一个节告诉 Ansible 在CentOS 7 上从 NGINX 仓库安装该 .rpm 文件。这让软件包管理器直接从 NGINX 仓库安装最新最稳定的版本。根据你的 CentOS 版本修改路径。所有可用的包的列表可以在 开源 NGINX 网站 上找到。接下来的两节告诉 Ansible 使用 yum 模块安装最新的 NGINX 版本,然后使用 service 模块启动 NGINX。

注意: 在第一个节中,CentOS 包中的路径名可能由于宽度显示为连着的两行。请在一行上输入其完整路径。

# ./ansible-nginx/tasks/install_nginx.yml

- name: NGINX | Installing NGINX repo rpm
  yum:
    name: http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

- name: NGINX | Installing NGINX
  yum:
    name: nginx
    state: latest

- name: NGINX | Starting NGINX
  service:
    name: nginx
    state: started

创建 NGINX 服务器列表

现在,我们设置好了 Ansible 部署的所有配置文件,我们需要告诉 Ansible 部署哪个服务器。我们需要在 Ansible 中指定 hosts 文件。先备份现有的文件,并新建一个新文件来部署。

$ sudo mv /etc/ansible/hosts /etc/ansible/hosts.backup
$ sudo vim /etc/ansible/hosts

在文件中输入(或编辑)以下行来创建一个名为 nginx 的组并列出安装 NGINX 的服务器。你可以通过主机名、IP 地址、或者在一个范围,例如 server[1-3].domain.com 来指定服务器。在这里,我通过 IP 地址指定一台服务器。

# /etc/ansible/hosts

[nginx]
172.16.239.140

设置安全性

接近完成了,但在部署之前,我们需要确保 Ansible 已被授权通过 SSH 访问我们的目标服务器。

首选并且最安全的方法是添加 Ansible 所要部署服务器的 RSA SSH 密钥到目标服务器的 authorized\_keys 文件中,这给予 Ansible 在目标服务器上的不受限制 SSH 权限。要了解更多关于此配置,请参阅 wiki.centos.org 上 安全加固 OpenSSH。这样,你就可以自动部署而无需用户交互。

另外,你也可以在部署过程中要求输入密码。我强烈建议你只在测试过程中使用这种方法,因为它是不安全的,没有办法跟踪目标主机的身份(fingerprint)变化。如果你想这样做,将每个目标主机 /etc/ssh/ssh\_config 文件中 StrictHostKeyChecking 的默认值 yes 改为 no。然后在 ansible-playbook 命令中添加 --ask-pass 参数来让 Ansible 提示输入 SSH 密码。

在这里,我将举例说明如何编辑 ssh\_config 文件来禁用在目标服务器上严格的主机密钥检查。我们手动连接 SSH 到我们将部署 NGINX 的服务器,并将 StrictHostKeyChecking 的值更改为 no。

$ ssh [email protected]
[email protected]'s password:***********

[kjones@nginx ]$ sudo vim /etc/ssh/ssh_config

当你更改后,保存 ssh\_config,并通过 SSH 连接到你的 Ansible 服务器。保存后的设置应该如下所示。

# /etc/ssh/ssh_config

StrictHostKeyChecking no

运行 Ansible 部署 NGINX

如果你一直照本教程的步骤来做,你可以运行下面的命令来使用 Ansible 部署 NGINX。(再次提示,如果你设置了 RSA SSH 密钥认证,那么 --ask-pass 参数是不需要的。)在 Ansible 服务器运行命令,并使用我们上面创建的配置文件。

$ sudo ansible-playbook --ask-pass $HOME/ansible-nginx/deploy.yml

Ansible 提示输入 SSH 密码,输出如下。recap 中显示 failed=0 这条信息,意味着部署成功了。

$ sudo ansible-playbook --ask-pass $HOME/ansible-nginx/deploy.yml
SSH password:

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [172.16.239.140]

TASK: [NGINX | Installing NGINX repo rpm] *************************************
changed: [172.16.239.140]

TASK: [NGINX | Installing NGINX] **********************************************
changed: [172.16.239.140]

TASK: [NGINX | Starting NGINX] ************************************************
changed: [172.16.239.140]

PLAY RECAP ********************************************************************
172.16.239.140             : ok=4    changed=3    unreachable=0    failed=0

如果你没有得到一个成功的 play recap,你可以尝试用 -vvvv 参数(带连接调试的详细信息)再次运行 ansible-playbook 命令来解决部署过程的问题。

当部署成功(假如我们是第一次部署)后,你可以在远程服务器上运行基本的 cURL 命令验证 NGINX 。在这里,它会返回 200 OK。Yes!我们使用 Ansible 成功安装了 NGINX。

$ curl -Is 172.16.239.140 | grep HTTP
HTTP/1.1 200 OK

创建 Ansible Playbook 来安装 NGINX Plus (CentOS)

现在,我已经展示了如何安装 NGINX 的开源版本,我将带你完成安装 NGINX Plus。这需要更改一些额外的部署配置,并展示了一些 Ansible 的其他功能。

复制 NGINX Plus 上的证书和密钥到 Ansible 服务器

使用 Ansible 安装和配置 NGINX Plus 时,首先我们需要将 NGINX Plus Customer Portal NGINX Plus 订阅的密钥和证书复制到 Ansible 部署服务器上的标准位置。

购买了 NGINX Plus 或正在试用的客户也可以访问 NGINX Plus Customer Portal。如果你有兴趣测试 NGINX Plus,你可以申请免费试用30天,点击这里。在你注册后不久你将收到一个试用证书和密钥的链接。

在 Mac 或 Linux 主机上,我在这里使用 scp 工具演示。在 Microsoft Windows 主机,可以使用 WinSCP。在本教程中,先下载文件到我的 Mac 笔记本电脑上,然后使用 scp 将其复制到 Ansible 服务器。密钥和证书的位置都在我的家目录下。

$ cd /path/to/nginx-repo-files/
$ scp nginx-repo.* user@destination-server:.

接下来,我们通过 SSH 连接到 Ansible 服务器,确保 NGINX Plus 的 SSL 目录存在,移动文件到这儿。

$ ssh user@destination-server
$ sudo mkdir -p /etc/ssl/nginx/
$ sudo mv nginx-repo.* /etc/ssl/nginx/

验证你的 /etc/ssl/nginx 目录包含了证书(.crt)和密钥(.key)文件。你可以使用 tree 命令检查。

$ tree /etc/ssl/nginx
/etc/ssl/nginx
├── nginx-repo.crt
└── nginx-repo.key

0 directories, 2 files

如果你没有安装 tree,可以使用下面的命令去安装。

$ sudo yum install -y tree

创建 Ansible 目录结构

以下执行的步骤和我们的“创建 Ansible Playbook 来安装 NGINX(CentOS)”小节中部署开源 NGINX 的非常相似。首先,我们建一个工作目录用于部署 NGINX Plus 使用。我喜欢将它创建为我主目录的子目录。

$ cd $HOME
$ mkdir -p ansible-nginx-plus/tasks/
$ touch ansible-nginx-plus/deploy.yml
$ touch ansible-nginx-plus/tasks/install_nginx_plus.yml

目录结构看起来像这样。

$ tree $HOME/ansible-nginx-plus/
/home/kjones/ansible-nginx-plus/
├── deploy.yml
└── tasks
└── install_nginx_plus.yml

1 directory, 2 files

创建主部署文件

接下来,像开源的 NGINX 一样,我们使用 vim 创建 deploy.yml 文件。

$ vim ansible-nginx-plus/deploy.yml

和开源 NGINX 的部署唯一的区别是,我们将包含文件的名称修改为 install\_nginx\_plus.yml。该文件告诉 Ansible 在 nginx 组中的所有服务器(/etc/ansible/hosts 中定义的)上部署 NGINX Plus ,然后在部署过程中从 tasks 目录读取并执行 install\_nginx\_plus.yml 的内容。

# ./ansible-nginx-plus/deploy.yml

- hosts: nginx
  tasks:
    - include: 'tasks/install_nginx_plus.yml'

如果你之前没有安装过的话,你需要创建 hosts 文件,详细说明在上面的“创建 NGINX 服务器的列表”小节。

为 NGINX Plus 创建部署文件

在文本编辑器中打开 install\_nginx\_plus.yml。该文件包含了使用 Ansible 来安装和配置 NGINX Plus 部署过程中的指令。这些命令和模块仅针对 CentOS,有些是 NGINX Plus 独有的。

$ vim ansible-nginx-plus/tasks/install_nginx_plus.yml

第一节使用 file 模块,告诉 Ansible 使用指定的pathstate参数为 NGINX Plus 创建特定的 SSL 目录,设置属主为 root,将权限 mode 更改为0700。

# ./ansible-nginx-plus/tasks/install_nginx_plus.yml

- name: NGINX Plus | 创建 NGINX Plus ssl 证书目录
  file: path=/etc/ssl/nginx state=directory group=root mode=0700

接下来的两节使用 copy 模块从 Ansible 部署服务器上将 NGINX Plus 的证书和密钥复制到 NGINX Plus 服务器上,再修改属主为 root,权限 mode 为0700。

- name: NGINX Plus | 复制 NGINX Plus repo 证书 
  copy: src=/etc/ssl/nginx/nginx-repo.crt dest=/etc/ssl/nginx/nginx-repo.crt owner=root group=root mode=0700

- name: NGINX Plus | 复制 NGINX Plus 密钥
  copy: src=/etc/ssl/nginx/nginx-repo.key dest=/etc/ssl/nginx/nginx-repo.key owner=root group=root mode=0700

接下来,我们告诉 Ansible 使用 get_url 模块在 url 参数指定的远程位置从 NGINX Plus 仓库下载 CA 证书,通过 dest 参数把它放在指定的目录 dest ,并设置权限 mode 为 0700。

- name: NGINX Plus | 下载 NGINX Plus CA 证书
  get_url: url=https://cs.nginx.com/static/files/CA.crt dest=/etc/ssl/nginx/CA.crt mode=0700

同样,我们告诉 Ansible 使用 get_url 模块下载 NGINX Plus repo 文件,并将其复制到 NGINX Plus 服务器上的 /etc/yum.repos.d 目录下。

- name: NGINX Plus | 下载 yum NGINX Plus 仓库
  get_url: url=https://cs.nginx.com/static/files/nginx-plus-7.repo dest=/etc/yum.repos.d/nginx-plus-7.repo mode=0700

最后两节的 name 告诉 Ansible 使用 yumservice 模块下载并启动 NGINX Plus。

- name: NGINX Plus | 安装 NGINX Plus
  yum:
    name: nginx-plus
    state: latest

- name: NGINX Plus | 启动 NGINX Plus
  service:
    name: nginx
    state: started

运行 Ansible 来部署 NGINX Plus

在保存 install\_nginx\_plus.yml 文件后,运行 ansible-playbook 命令来部署 NGINX Plus。同样在这里,我们使用 --ask-pass 参数使用 Ansible 提示输入 SSH 密码并把它传递给每个 NGINX Plus 服务器,并指定主配置文件路径 deploy.yml 文件。

$ sudo ansible-playbook --ask-pass $HOME/ansible-nginx-plus/deploy.yml

PLAY [nginx] ******************************************************************

GATHERING FACTS ***************************************************************
ok: [172.16.239.140]

TASK: [NGINX Plus | Creating NGINX Plus ssl cert repo directory] **************
changed: [172.16.239.140]

TASK: [NGINX Plus | Copying NGINX Plus repository certificate] ****************
changed: [172.16.239.140]

TASK: [NGINX Plus | Copying NGINX Plus repository key] ************************
changed: [172.16.239.140]

TASK: [NGINX Plus | Downloading NGINX Plus CA certificate] ********************
changed: [172.16.239.140]

TASK: [NGINX Plus | Downloading yum NGINX Plus repository] ********************
changed: [172.16.239.140]

TASK: [NGINX Plus | Installing NGINX Plus] ************************************
changed: [172.16.239.140]

TASK: [NGINX Plus | Starting NGINX Plus] **************************************
changed: [172.16.239.140]

PLAY RECAP ********************************************************************
172.16.239.140             : ok=8    changed=7    unreachable=0    failed=0

playbook 的 recap 成功完成。现在,使用 curl 命令来验证 NGINX Plus 是否在运行。太好了,我们得到的是 200 OK!成功了!我们使用 Ansible 成功地安装了 NGINX Plus。

$ curl -Is http://172.16.239.140 | grep HTTP
HTTP/1.1 200 OK

在 Ubuntu 上创建 Ansible Playbook 来安装 NGINX 和 NGINX Plus

Ubuntu 服务器 上部署 NGINX 和 NGINX Plus 的过程与 CentOS 很相似,我将一步一步的指导来完成整个部署文件,并指出和 CentOS 的细微差异。

首先和 CentOS 一样,创建 Ansible 目录结构和 Ansible 主部署文件。也按“创建 NGINX 服务器的列表”小节的描述创建 /etc/ansible/hosts 文件。对于 NGINX Plus,你也需要安装“复制 NGINX Plus 证书和密钥到 Ansible 服务器”小节的描述复制证书和密钥。

下面是开源 NGINX 的 install\_nginx.yml 部署文件。在第一节,我们使用 apt_key 模块导入 NGINX 的签名密钥。接下来的两节使用 lineinfile 模块来添加 Ubuntu 14.04 的软件包 URL 到 sources.list 文件中。最后,我们使用 apt 模块来更新缓存并安装 NGINX(apt 取代了我们在 CentOS 中部署时的 yum 模块)。

# ./ansible-nginx/tasks/install_nginx.yml

- name: NGINX | 添加 NGINX 签名密钥
  apt_key: url=http://nginx.org/keys/nginx_signing.key state=present

- name: NGINX | 为 NGINX 添加 sources.list deb url  
  lineinfile: dest=/etc/apt/sources.list line="deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx"

- name: NGINX Plus | 为 NGINX 添加 sources.list deb-src url  
  lineinfile: dest=/etc/apt/sources.list line="deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx"

- name: NGINX | 更新 apt 缓存
  apt:
    update_cache: yes

- name: NGINX | 安装 NGINX
  apt:
    pkg: nginx
    state: latest

- name: NGINX | 启动 NGINX
  service:
    name: nginx
    state: started

下面是 NGINX Plus 的部署文件 install\_nginx.yml。前四节设置了 NGINX Plus 密钥和证书。然后,我们像开源的 NGINX 一样用 apt_key 模块导入签名密钥,get_url 模块为 NGINX Plus 下载 apt 配置文件。shell 模块使用 printf 命令写下输出到 sources.list.d 目录中的 nginx-plus.list 文件。最终的 name 模块和开源 NGINX 一样。

# ./ansible-nginx-plus/tasks/install_nginx_plus.yml

- name: NGINX Plus | 创建 NGINX Plus ssl 证书 repo 目录
  file: path=/etc/ssl/nginx state=directory group=root mode=0700

- name: NGINX Plus | 复制 NGINX Plus 仓库证书
  copy: src=/etc/ssl/nginx/nginx-repo.crt dest=/etc/ssl/nginx/nginx-repo.crt owner=root group=root mode=0700

- name: NGINX Plus | 复制 NGINX Plus 仓库密钥
  copy: src=/etc/ssl/nginx/nginx-repo.key dest=/etc/ssl/nginx/nginx-repo.key owner=root group=root mode=0700

- name: NGINX Plus | 安装 NGINX Plus CA 证书
  get_url: url=https://cs.nginx.com/static/files/CA.crt dest=/etc/ssl/nginx/CA.crt mode=0700

- name: NGINX Plus | 添加 NGINX Plus 签名密钥
  apt_key: url=http://nginx.org/keys/nginx_signing.key state=present

- name: NGINX Plus | 安装 Apt-Get NGINX Plus 仓库
  get_url: url=https://cs.nginx.com/static/files/90nginx dest=/etc/apt/apt.conf.d/90nginx mode=0700

- name: NGINX Plus | 为 NGINX Plus 添加 sources.list url  
  shell: printf "deb https://plus-pkgs.nginx.com/ubuntu `lsb_release -cs` nginx-plus\n" >/etc/apt/sources.list.d/nginx-plus.list

- name: NGINX Plus | 运行 apt-get update
  apt:
    update_cache: yes

- name: NGINX Plus | 安装 NGINX Plus 通过 apt-get
  apt:
    pkg: nginx-plus
    state: latest

- name: NGINX Plus | 启动 NGINX Plus
  service:
    name: nginx
    state: started

现在我们已经准备好运行 ansible-playbook 命令:

$ sudo ansible-playbook --ask-pass $HOME/ansible-nginx-plus/deploy.yml

你应该得到一个成功的 play recap。如果你没有成功,你可以使用冗余参数,以帮助你解决出现的问题。

小结

我在这个教程中演示是什么是 Ansible,可以做些什么来帮助你自动部署 NGINX 或 NGINX Plus,这仅仅是个开始。还有许多有用的模块,包括从用户账号管理到自定义配置模板等。如果你有兴趣了解关于这些的更多信息,请访问 Ansible 官方文档


via: https://www.nginx.com/blog/installing-nginx-nginx-plus-ansible/

作者:Kevin Jones 译者:strugglingyouth 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

早些时候,我们发布了支持 HTTP/2 协议的 NGINX Plus R7。作为 HTTP 协议的最新标准,HTTP/2 的设计为现在的 web 应用程序带来了更高的性能和安全性。(LCTT 译注: 开源版本的 NGINX 1.95 也支持 HTTP/2 了。)

NGINX Plus 所实现的 HTTP/2 协议可与现有的网站和应用程序进行无缝衔接。只需要一点改变,不管用户选择什么样的浏览器,NGINX Plus 都能为用户同时提供 HTTP/1.x 与HTTP/2 的最佳体验。

要支持 HTTP/2 仅需通过可选的 nginx‑plus‑http2 软件包。nginx‑plusnginx‑plus‑extras 软件包支持 SPDY 协议,目前推荐用于生产站点,因为其被大多数浏览器所支持并且代码也是相当成熟了。

为什么要使用 HTTP/2?

HTTP/2 使数据传输更高效,对你的应用程序更安全。 HTTP/2 相比于 HTTP/1.x 有五个提高性能特点:

  • 完全复用 – 在一个保持激活(keepalive)的连接上,HTTP/1.1 强制按严格的顺序来处理请求。一个请求必须在下一个请求开始前结束。 HTTP/2 消除了这一要求,允许并行和乱序来处理请求。
  • 单一,持久连接 – 由于 HTTP/2 允许请求完全复用,所以可以通过单一连接并行下载网页上的所有对象。在 HTTP/1.x 中,使用多个连接来并行下载资源,从而导致使用底层 TCP 协议效率很低。
  • 二进制编码 – Header 信息使用紧凑的二进制格式发送,而不是纯文本格式,节省了传输字节。
  • Header 压缩 – Headers 使用专用的 HPACK 压缩算法来进行压缩,这进一步降低数据通过网络传输的字节。
  • SSL/TLS 加密 – 在 HTTP/2 中,强制使用 SSL/TLS。在 RFC 中并没有强制,其允许纯文本的 HTTP/2,但是当前所有实现 HTTP/2的 Web 浏览器都只支持加密。 SSL/TLS 可以使你的网站更安全,并且使用 HTTP/2 各项性能会有提升,加密和解密过程的性能损失就减少了。

要了解更多关于 HTTP/2:

NGINX Plus 如何实现 HTTP/2

我们的 HTTP/2 实现是基于 SPDY 支持的,它已经被广泛部署(使用了 NGINX 或 NGINX Plus 的网站近 75% 都使用了 SPDY)。使用 NGINX Plus 部署 HTTP/2 时,几乎不会改变你应用程序的配置。本节将讨论 NGINX Plus如何实现对 HTTP/2 的支持。

一个 HTTP/2 网关

NGINX Plus 作为一个 HTTP/2 网关。它与支持 HTTP/2 的客户端 Web 浏览器用 HTTP/2 通讯,而转换 HTTP/2 请求给后端服务器通信时使用 HTTP/1.x(或者 FastCGI, SCGI, uWSGI, 等等. – 取决于你目前正在使用的协议)。

向后兼容性

在一段时间内,你需要同时支持 HTTP/2 和 HTTP/1.x。在撰写本文时,超过50%的用户使用的 Web 浏览器已经支持 HTTP/2,但这也意味着近50%的人还没有使用。

为了同时支持 HTTP/1.x 和 HTTP/2,NGINX Plus 实现了 TLS 上的 Next Protocol Negotiation (NPN)扩展。当 Web 浏览器连接到服务器时,其将所支持的协议列表发送到服务器端。如果浏览器支持的协议列表中包括 h2 - 即 HTTP/2,NGINX Plus 将使用 HTTP/2 连接到浏览器。如果浏览器不支持 NPN 或在发送支持的协议列表中没有 h2,NGINX Plus 将继续回落到 HTTP/1.x。

转向 HTTP/2

NGINX 公司会尽可能帮助大家无缝过渡到使用 HTTP/2。本节介绍了通过对你应用进行改变来启用对 HTTP/2 支持,其中只需对 NGINX Plus 配置进行几个变化。

前提条件

使用 nginx‑plus‑http2 软件包升级到 NGINX Plus R7。注意现在还没有支持 HTTP/2 版本的 nginx‑plus‑extras 软件包。

重定向所有流量到 SSL/TLS

如果你的应用尚未使用 SSL/TLS 加密,现在启用它正是一个好的时机。加密你的应用程序可以保护你免受间谍以及来自其他中间人的攻击。一些搜索引擎甚至在搜索结果中对加密站点提高排名。下面的配置块重定向所有的普通 HTTP 请求到该网站的加密版本。

server {
    listen 80;
    location / {
        return 301 https://$host$request_uri;
    }
}

启用 HTTP/2

要启用对 HTTP/2 的支持,只需将 http2 参数添加到所有的 listen 指令中,也要包括 SSL 参数,因为浏览器不支持不加密的 HTTP/2 请求。

server {
    listen 443 ssl http2 default_server;

    ssl_certificate     server.crt;
    ssl_certificate_key server.key;
    …
}

如果有必要,重启 NGINX Plus,例如通过运行 nginx -s reload 命令。要验证 HTTP/2 是否正常工作,你可以在 Google ChromeFirefox 中使用 “HTTP/2 and SPDY indicator” 插件来检查。

注意事项

  • 在安装 nginx‑plus‑http2 包之前, 你必须删除配置文件中所有 listen 指令后的 SPDY 参数(使用 http2 和 ssl 参数来替换它以启用对 HTTP/2 的支持)。使用这个包后,如果 listen 指令后有 spdy 参数,NGINX Plus 将无法启动。
  • 如果你在 NGINX Plus 前端使用了 Web 应用防火墙(WAF),请确保它能够解析 HTTP/2,或者把它移到 NGINX Plus 后面。
  • 此版本不支持在 HTTP/2 RFC 中定义的 “Server Push” 特性。 NGINX Plus 以后的版本可能会支持它。
  • NGINX Plus R7 同时支持 SPDY 和 HTTP/2(LCTT 译注:但是你只能同时使用其中一种)。在以后的版本中,我们将弃用对 SPDY 的支持。谷歌在2016年初将 弃用 SPDY,因此同时支持这两种协议也非必要。
  • 如果 ssl\_prefer\_server\_ciphers 设置为 on 或者使用了定义在 Appendix A: TLS 1.2 Ciper Suite Black List 中的 ssl\_ciphers 列表时,浏览器会出现 handshake-errors 而无法正常工作。详细内容请参阅 section 9.2.2 of the HTTP/2 RFC

特别感谢

NGINX 公司要感谢 DropboxAutomattic,他们是我们软件的重度使用者,并帮助我们实现 HTTP/2。他们的贡献帮助我们加速完成这个软件,我们希望你也能支持他们。


via: https://www.nginx.com/blog/http2-r7/

作者:Faisal Memon 译者:strugglingyouth 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出