分类 技术 下的文章

优化挂载参数

在 Linux 中挂载 SSD 上的 btrfs,可以采用各种参数进行优化:

# <file system> <mount point>   <type>  <options>  <dump>  <pass>
UUID=<略>  /  btrfs defaults,ssd,discard,noatime,compress=lzo,subvol=@ 0   1

这些参数各有优缺点,酌情添加。

ssd

btrfs 文件系统有对 SSD 进行优化,在挂载参数中加入 ssd 即可。该参数不会自动启用 TRIM/discard。

discard

可以通过以下命令确认 SSD 是否支持 TRIM

sudo hdparm -I /dev/sdX | grep TRIM
   * Data Set Management TRIM supported (limit 8 blocks)

若 SSD 支持 TRIM 命令,可以在 /etc/fstab 中启用 discard 参数。建议将 discard 挂载参数作为首选。据 debian wiki 所述,包括三星,镁光,英睿达在内的一些 SSD 在 discard/TRIM 上有问题,不能合适地处理 TRIM 命令。以下是 linux 内核相关处源代码 (2015/10/15):

/* devices that don't properly handle queued TRIM commands */
{ "Micron_M500_*",      NULL,    ATA_HORKAGE_NO_NCQ_TRIM |
                                 ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "Crucial_CT*M500*",   NULL,    ATA_HORKAGE_NO_NCQ_TRIM |
                                 ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "Micron_M5[15]0_*","  MU01",   ATA_HORKAGE_NO_NCQ_TRIM |
                                 ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "Crucial_CT*M550*",   "MU01",  ATA_HORKAGE_NO_NCQ_TRIM |
                                 ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "Crucial_CT*MX100*",  "MU01",  ATA_HORKAGE_NO_NCQ_TRIM |
                                 ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "Samsung SSD 8*",     NULL,    ATA_HORKAGE_NO_NCQ_TRIM |
                                 ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "FCCT*M500*",         NULL,    ATA_HORKAGE_NO_NCQ_TRIM |
                                 ATA_HORKAGE_ZERO_AFTER_TRIM, },

/* devices that don't properly handle TRIM commands */
{ "SuperSSpeed S238*",      NULL,   ATA_HORKAGE_NOTRIM, },

该参数不是必需的,也可以自定义周期性运行 fstrim 命令来取代该参数,使用该命令前要确认 SSD 支持 TRIM,否则可能造成数据丢失。当 SSD 有足够的空余空间或(未分配的)可用空间时不需要该参数。

noatime

挂载参数可以加入 noatime,通过禁止更新访问记录来减少不必要的写操作以提高性能。该选项对 HDD 同样有性能提升。btrfs 的默认配置为 relatime

compress

打开压缩功能在通常情况下有利于提高传输性能(并非绝对),也可以节省存储空间。加入以下挂载参数:

compress=lzo
或
compress=zlib

lzo 速度更快,zlib 压缩率更高。注意确认 SSD 主控是否是非压缩主控,若为压缩主控不建议加入该参数。

写缓存

若 SSD 带有缓存,启用 Write Cache 可以提高性能:Disks -> Drive Setting -> Enable Write Cache,但在突然断电的情况下可能造成数据丢失。

I/O 调度

SSD 结构不同于传统硬盘,寻址时间短,I/O 调度算法可选择 noop 以降低延迟。以下命令可查看与修改调度器:

cat /sys/block/sdX/queue/scheduler  # sdX 指你的设备
sudo tee /sys/block/sdX/queue/scheduler <<< noop

注意以上方法并不持久,重启后会重置。如果 SSD 是系统唯一的存储设备,可考虑通过 elevator=noop 内核参数设置 I/O 调度器。也可使用 udev 规则来修改调度器,对多存储设备同样有效:

/etc/udev/rules.d/60-ssd-scheduler.rules # 创建该文件

文件内容如下:

# set deadline scheduler for non-rotating disks
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"

参考:

  1. 关于在SSD上使用btrfs文件系统需要做的优化 - akarin.cn
  2. Solid State Drives - Arch wiki)
  3. SSD Optimization - debian wiki
  4. Btrfs wiki

Zorin OS 是一款基于 Ubuntu 的 Linux 发行版,特别为 Linux 新手而设计。它拥有类似 Windows 的图形用户界面,以及很多类似 Windows 下的应用软件。Zorin OS 还带有能让用户运行很多Windows 软件的程序。该发行版的终极目标是提供一份可作为 Windows 替换的 Linux 选择,并让 Windows 用户在避免烦琐的同时享受 Linux 的所有特性。

这一段话是几乎所有的中国的 Linux 网站上对 Zorin OS 的描述。

本人是 linux 新手,在 Linux 中国的新手群里得到各位大神的指点,安装了很多适合个人用的 linux 桌面系统(Ubuntu/fedora/麒麟,还有一些非常用的小众 linux 桌面系统),说实话,被折腾的够呛,主要原因是安装网卡驱动、显卡驱动、影音解码软件,然后出现各种问题,导致无法安心下来学习 linux 系统的相关知识和操作。无意之中看到 Zorin OS 的相关介绍,介绍比较动心,于是去官方下载了 Zorin OS 10 Ultimate(64位)版(官方下载地址:http://zorinos.com/download.html)。在虚拟机进行了安装,安装后感觉该系统的确适合我们新手使用,同时安装简单,安装后的系统各种程序齐全,功能强大。

具体步骤和情况如下:

安装Zorin OS 10 Ultimate(64位),需要10G左右的空间,建议分区15-20G左右,内存我虚拟机设定为1G。

安装过程

安装还是试用

安装类型

选择键盘布局

设置用户和密码

正在复制文件

安装完成后会进行必要的更新。

更新完成后会下载语言包(因为我选择的是中文安装)。

下载语言包

语言包安装完成后会进行硬件检测和硬件驱动安装。然后提示你重新启动,点击重新启动即可。

启动后状态栏会提示你进行软件更新和升级(包括内核)。

更新软件

这是游戏菜单的内容,很多吧:)。

游戏菜单

这是影音类软件大集合,基本所有的影音格式都支持,你无需安装解码器和软件了。

影音软件

这是办公类软件大集合,足够你用了。

办公软件

这是附件类的相关程序,计算器,哈哈哈。不错哦。

附件

这是系统工具类,很齐全,Linux 用户都需要的终端就在这里了。

系统工具

这是Zorin OS的软件商店(其实就是 Ubuntu 的软件中心),基本是无所不包了。

软件中心

安装完成后直接打开FireFox,浏览网站毫无问题。

FireFox 浏览器

再看看打开优酷网站的情况,你也无需安装flash插件,都给你搞定了,用就是了。

视频网站

全屏视频

打开输入法和LibreOffice,输入法已经自动安装好了,你怎么用都行。唯一的缺点是的是汉字的字体比较少,这个大家根据自己的需要下载即可。

LibreOffice Writer

我使用虚拟机安装zorin OS 大约20分钟左右,如果是实体机我认为最多半小时之内可以安装完成,除了分区一下硬盘之外,其他都是全自动完成安装,非常适合我们新手使用和安装。

假如你已经完全配好了你的 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 中。

大家好,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中国 荣誉推出

在生产环境中,我会更喜欢做与自动化相关的所有事情。如果计算机能完成你的任务,何必需要你亲自动手呢?但是,在不断变化并存在多种技术的环境中,创建和实施自动化是一项艰巨的任务。这就是为什么我喜欢 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中国 荣誉推出