2015年12月

我如何在自己的服务器上找出哪些端口是开放的?如何使用 nc 命令进行端口扫描来替换 Linux 或类 Unix 中的 nmap 命令

nmap (“Network Mapper”)是一个用于网络探测和安全审核的开源工具。如果 nmap 没有安装或者你不希望使用 nmap,那你可以用 netcat/nc 命令进行端口扫描。它对于查看目标计算机上哪些端口是开放的或者运行着服务是非常有用的。你也可以使用 nmap 命令进行端口扫描

如何使用 nc 来扫描 Linux,UNIX 和 Windows 服务器的端口呢?

如果未安装 nmap,试试 nc/netcat 命令,如下所示。-z 参数用来告诉 nc 报告开放的端口,而不是启动连接。在 nc 命令中使用 -z 参数时,你需要在主机名/ip 后面限定端口的范围和加速其运行:

### 语法 ###
### nc -z -v {host-name-here} {port-range-here}
nc -z -v host-name-here ssh
nc -z -v host-name-here 22
nc -w 1 -z -v server-name-here port-Number-her

### 扫描 1 to 1023 端口 ###
nc -zv vip-1.vsnl.nixcraft.in 1-1023

输出示例:

Connection to localhost 25 port [tcp/smtp] succeeded!
Connection to vip-1.vsnl.nixcraft.in 25 port [tcp/smtp] succeeded!
Connection to vip-1.vsnl.nixcraft.in 80 port [tcp/http] succeeded!
Connection to vip-1.vsnl.nixcraft.in 143 port [tcp/imap] succeeded!
Connection to vip-1.vsnl.nixcraft.in 199 port [tcp/smux] succeeded!
Connection to vip-1.vsnl.nixcraft.in 783 port [tcp/*] succeeded!
Connection to vip-1.vsnl.nixcraft.in 904 port [tcp/vmware-authd] succeeded!
Connection to vip-1.vsnl.nixcraft.in 993 port [tcp/imaps] succeeded!

你也可以扫描单个端口:

nc -zv v.txvip1 443
nc -zv v.txvip1 80
nc -zv v.txvip1 22
nc -zv v.txvip1 21
nc -zv v.txvip1 smtp
nc -zvn v.txvip1 ftp

### 使用1秒的超时值来更快的扫描 ###
netcat -v -z -n -w 1 v.txvip1 1-1023

输出示例:

Fig.01: Linux/Unix: Use Netcat to Establish and Test TCP and UDP Connections on a Server

图01:Linux/Unix:使用 Netcat 来测试 TCP 和 UDP 与服务器建立连接

  1. -z : 端口扫描模式即零 I/O 模式。
  2. -v : 显示详细信息 [使用 -vv 来输出更详细的信息]。
  3. -n : 使用纯数字 IP 地址,即不用 DNS 来解析 IP 地址。
  4. -w 1 : 设置超时值设置为1。

更多例子:

$ netcat -z -vv www.cyberciti.biz http
www.cyberciti.biz [75.126.153.206] 80 (http) open
 sent 0, rcvd 0
$ netcat -z -vv google.com https
DNS fwd/rev mismatch: google.com != maa03s16-in-f2.1e100.net
DNS fwd/rev mismatch: google.com != maa03s16-in-f6.1e100.net
DNS fwd/rev mismatch: google.com != maa03s16-in-f5.1e100.net
DNS fwd/rev mismatch: google.com != maa03s16-in-f3.1e100.net
DNS fwd/rev mismatch: google.com != maa03s16-in-f8.1e100.net
DNS fwd/rev mismatch: google.com != maa03s16-in-f0.1e100.net
DNS fwd/rev mismatch: google.com != maa03s16-in-f7.1e100.net
DNS fwd/rev mismatch: google.com != maa03s16-in-f4.1e100.net
google.com [74.125.236.162] 443 (https) open
 sent 0, rcvd 0
$ netcat -v -z -n -w 1 192.168.1.254 1-1023
(UNKNOWN) [192.168.1.254] 989 (ftps-data) open
(UNKNOWN) [192.168.1.254] 443 (https) open
(UNKNOWN) [192.168.1.254] 53 (domain) open

也可以看看 :


via: http://www.cyberciti.biz/faq/linux-port-scanning/

作者:Vivek Gite 译者:strugglingyouth 校对:wxy

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

大约一年前,微软宣布开源了 .NET 框架的大部分。当时,Scott Hanselman 使用微软 Power BI 对代码库做了一个漂亮的分析。 现在一年过去了,我想要试试对以下问题做个解答:

微软开源了 .NET 框架的大部分之后,社区参与贡献了多少?

我着眼于以下三个项目做了分析,它们是 .NET 生态系统中最主要部分之一,也是 .NET 基金会内 最活跃/收藏/分支的项目之一:

  • Roslyn – .NET 编译器平台,提供了开源的 C# 和 Visual Basic 编译器,以及丰富的代码分析 API。
  • CoreCLR – .NET Core 运行时环境和底层库(mscorlib),它包括垃圾回收、JIT 编译器、基本的 .NET 数据类型和许多底层类。
  • CoreFX – .NET Core 基础库,包括 collections、文件系统、console、XML、异步以及其它方面的类。

数据来自哪里?

GitHub 自身已经内建了很多漂亮的图表了,你可以看看这一年来每月提交数的图表:

Commits Per Month

还可以看看每月动态

github stats - monthly pulse

但是要回答上面的问题,我需要更多的数据。幸运的是, GitHub 提供了非常全面的 API, 再配合上出色的 Octokit.net 库以及 brilliant LINQPad,我就很容易的得到了我所需的全部数据。如果你想要自己试试这些 API ,这儿有个示例的 LINQPad 脚本

然而,仅仅知道它的每月 “ 问题 issue 数量” 或 “接受的PR( 拉取请求 Pull Request )”并没有太大用处,这并不能告诉我们是谁提交了这些问题或 PR。 幸运的是, GitHub 典型的用户是有分类的,比如下图来自 Roslyn 第 670 号问题 ,我们可以看到是哪种类型的用户提交的备注:“ 拥有者 Owner ”、 “ 协作者 Collaborator ” 或者为空——这就是“社区”成员,比如下面的某人(我觉得)并没有在微软工作。

owner collaborator or community

结果呢?

现在我们可以得到我们所需的数据,也就可以生成结果了。

全部问题 - 按提交者分组

项目拥有者协作者社区全部
Roslyn481186715963944
CoreCLR86298487871
CoreFX3349117351980
全部90130762818

这里你可以看到拥有者和协作者在某些情况下占有主导地位,比如,在 Roslyn 项目中 60% 的问题是他们汇报的。但是在另外的例子中社区非常活跃,特别是在 CoreCLR 项目中社区成员汇报的问题超过了拥有者/协作者之和。造成这种情况的部分原因是项目的不同, CoreCLR 是 .NET 框架中最引人注目的部分,因为它包含了 .NET 开发者日常使用的大部分库,所以并不用对社区提交了很多改进建议和错误修复的事情感到惊奇。 另外, CoreCLR 已经出现了较长时间,社区已经使用了一段时间,也能找到它的一些不足的部分。而 Roslyn 则相对较新一些,还没有被太多的使用过,而且找到一个编译器的 bug 显然会更难。

全部已接受的 PR - 按提交者分组

项目拥有者协作者社区全部
Roslyn46520931182676
CoreCLR3785672011146
CoreFX51614094642389
全部13594069783

但是,如果我们来看一下已接受的 PR ,可以看到在这三个项目中社区的贡献量非常低,仅仅只有 12% 左右。不过,这并不令人吃惊,因为 PR 需要达到相当高的水准才能被接受。如果项目采用这种机制,首先你必须找到一个 “需要解决” up for grabs 的问题,然后如果你要改变 API 就必须通过代码审查,最后你必须在代码审查中符合可比性/性能提升/正确性等。所以,实际上 12% 是个相当不错的结果,接受的 PR 解决了不少的问题,特别是考虑到大部分贡献都是社区成员在工作之余完成的。

更新:关于对“需要解决”的要求,参见 David Kean这个评论,以及这条推来了解更多信息。“需要解决”是一个准则,旨在帮助新手,但是并不是必需的,你可以提交一个解决问题的 PR 而不打上这个标签。

最后,如果你看一下每月的数量(参见下面的两张图,点击放大),很难找到特定的趋势,或者说,社区肯定会随着时间的变化或多或少的做出贡献。不过,你也可以说,过去一年来社区一直在做贡献,而且看起来还会继续贡献下去。这不是仅仅出现在项目刚刚开源后的一次性喷发,而是一整年以来的贡献的持续水平。

每月的问题数 - 按提交者分组

Issues Per Month - By Submitter (Owner, Collaborator or Community)

每月接受的 PR - 按提交者分组

Merged Pull Requests Per Month - By Submitter (Owner, Collaborator or Community)

前 20 的问题标签

最后一件我想对我拥有的这些数据所做的事情是找到那些最流行的问题标签,这可以揭示从三个项目开源以来哪种类型的工作不断出现。

Top 20 Issue Labels

以下是关于这些结果的一些看法:

Copyright (C) 2015 greenbytes GmbH

刚发布的 Apache httpd 2.4.17 终于支持 HTTP/2 了。这个页面给出了一些如何构建/部署/配置的建议。目的是为了大家发现 bugs 时能升级它,或者给一些能更好工作的建议。

最后,这会归并回到官方 Apache 文档,这里只会留下一个到那里的链接。暂时我们还没做到。

源码

你可以从这里得到 Apache 版本。Apache 2.4.17 及其更高版本都支持 HTTP/2。我不会再重复介绍如何构建该服务器的指令。在很多地方有很好的指南,例如这里

(有任何这个试验性软件包的相关链接?在 Twitter 上告诉我吧 @icing)

编译支持 HTTP/2

在你编译版本之前,你要进行一些配置。这里有成千上万的选项。和 HTTP/2 相关的是:

  • --enable-http2

启用在 Apache 服务器内部实现该协议的 ‘http2’ 模块。

  • --with-nghttp2=

指定 http2 模块需要的 libnghttp2 模块的非默认位置。如果 nghttp2 是在默认的位置,配置过程会自动采用。

  • --enable-nghttp2-staticlib-deps

很少用到的选项,你可能想将 nghttp2 库静态链接到服务器里。在大部分平台上,只有在找不到共享 nghttp2 库时才有用。

如果你想自己编译 nghttp2,你可以到 nghttp2.org 查看文档。最新的 Fedora 以及其它版本已经附带了这个库。

TLS 支持

大部分人想在浏览器上使用 HTTP/2, 而浏览器只在使用 TLS 连接(https:// 开头的 url)时才支持 HTTP/2。你需要一些我下面介绍的配置。但首先你需要的是支持 ALPN 扩展的 TLS 库。

ALPN 用来 协商 negotiate 服务器和客户端之间的协议。如果你服务器上 TLS 库还没有实现 ALPN,客户端只能通过 HTTP/1.1 通信。那么,可以和 Apache 链接并支持它的是什么库呢?

  • OpenSSL 1.0.2 及其以后。
  • ??? (别的我也不知道了)

如果你的 OpenSSL 库是 Linux 版本自带的,这里使用的版本号可能和官方 OpenSSL 版本的不同。如果不确定的话检查一下你的 Linux 版本吧。

配置

另一个给服务器的好建议是为 http2 模块设置合适的日志等级。添加下面的配置:

# 放在某个地方的这样一行
LoadModule http2_module modules/mod_http2.so

<IfModule http2_module>
    LogLevel http2:info
</IfModule>

当你启动服务器的时候,你可以在错误日志中看来类似的一行:

[timestamp] [http2:info] [pid XXXXX:tid numbers] 
  mod_http2 (v1.0.0, nghttp2 1.3.4), initializing...

协议

那么,假设你已经编译部署好了服务器, TLS 库也是最新的,你启动了你的服务器,打开了浏览器。。。你怎么知道它在工作呢?

如果除此之外你没有添加其它的服务器配置,很可能它没有工作。

你需要告诉服务器在哪里使用该协议。默认情况下,你的服务器并没有启动 HTTP/2 协议。因为这样比较安全,也许才能让你已有的部署可以继续工作。

你可以用新的 Protocols 指令启用 HTTP/2 协议:

# 对于 https 服务器
Protocols h2 http/1.1
...

# 对于 http 服务器
Protocols h2c http/1.1

你可以给整个服务器或者指定的 vhosts 添加这个配置。

SSL 参数

对于 TLS (SSL),HTTP/2 有一些特殊的要求。阅读下面的“ https:// 连接”一节了解更详细的信息。

http:// 连接 (h2c)

尽管现在还没有浏览器支持,但是 HTTP/2 协议也工作在 http:// 这样的 url 上, 而且 mod\_h[ttp]2 也支持。启用它你唯一所要做的是在 Protocols 配置中启用它:

# 对于 http 服务器
Protocols h2c http/1.1

这里有一些支持 h2c 的客户端(和客户端库)。我会在下面介绍:

curl

Daniel Stenberg 维护的用于访问网络资源的命令行客户端 curl 当然支持。如果你的系统上有 curl,有一个简单的方法检查它是否支持 http/2:

sh> curl -V
curl 7.43.0 (x86_64-apple-darwin15.0) libcurl/7.43.0 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets 

不好了。这些功能中没有 'HTTP2'。你想要的是下面这样:

sh> curl -V
url 7.45.0 (x86_64-apple-darwin15.0.0) libcurl/7.45.0 OpenSSL/1.0.2d zlib/1.2.8 nghttp2/1.3.4
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets

如果你的 curl 支持 HTTP2 功能,你可以用一些简单的命令检查你的服务器:

sh> curl -v --http2 http://<yourserver>/
...
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAAQAAP__
> 
< HTTP/1.1 101 Switching Protocols
< Upgrade: h2c
< Connection: Upgrade
* Received 101
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
...
<the resource>

恭喜,如果看到了有 ...101 Switching... 的行就表示它正在工作!

有一些情况不会发生 HTTP/2 的 升级切换 Upgrade 。如果你的第一个请求有 请求数据 body ,例如你上传一个文件时,就不会触发升级切换。h2c 限制部分有详细的解释。

nghttp

nghttp2 可以一同编译它自己的客户端和服务器。如果你的系统中有该客户端,你可以简单地通过获取一个资源来验证你的安装:

sh> nghttp -uv http://<yourserver>/
[  0.001] Connected
[  0.001] HTTP Upgrade request
...
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: AAMAAABkAAQAAP__
...
[  0.005] HTTP Upgrade response
HTTP/1.1 101 Switching Protocols
Upgrade: h2c
Connection: Upgrade

[  0.006] HTTP Upgrade success
...

这和我们上面 curl 例子中看到的 Upgrade 输出很相似。

有另外一种在命令行参数中不用 -u 参数而使用 h2c 的方法。这个参数会指示 nghttp 进行 HTTP/1 升级切换过程。但如果我们不使用呢?

sh> nghttp -v http://<yourserver>/
[  0.002] Connected
[  0.002] send SETTINGS frame 
...
[  0.002] send HEADERS frame 
          ; END_STREAM | END_HEADERS | PRIORITY
          (padlen=0, dep_stream_id=11, weight=16, exclusive=0)
          ; Open new stream
          :method: GET
          :path: /
          :scheme: http
...

连接马上使用了 HTTP/2!这就是协议中所谓的 直接 direct 模式,当客户端发送一些特殊的 24 字节到服务器时就会发生:

0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a

用 ASCII 表示是:

PRI * HTTP/2.0

SM


支持 h2c 的服务器在一个新的连接中看到这些信息就会马上切换到 HTTP/2。HTTP/1.1 服务器则认为是一个可笑的请求,响应并关闭连接。

因此,直接模式只适合于那些确定服务器支持 HTTP/2 的客户端。例如,当前一个升级切换过程成功了的时候。

直接模式的魅力是零开销,它支持所有请求,即使带有请求数据部分(查看h2c 限制)。

对于 2.4.17 版本,明文连接时默认启用 H2Direct 。但是有一些模块和这不兼容。因此,在下一版本中,默认会设置为off,如果你希望你的服务器支持它,你需要设置它为:

H2Direct on

https:// 连接 (h2)

当你的 mod\_h[ttp]2 可以支持 h2c 连接时,那就可以一同启用 h2 兄弟了,现在的浏览器仅支持它和 https: 一同使用。

HTTP/2 标准对 https:(TLS)连接增加了一些额外的要求。上面已经提到了 ALNP 扩展。另外的一个要求是不能使用特定黑名单中的加密算法。

尽管现在版本的 mod\_h[ttp]2 不增强这些算法(以后可能会),但大部分客户端会这么做。如果让你的浏览器使用不恰当的算法打开 h2 服务器,你会看到不明确的警告 INADEQUATE\_SECURITY,浏览器会拒接连接。

一个可行的 Apache SSL 配置类似:

SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK
SSLProtocol All -SSLv2 -SSLv3
...

(是的,这确实很长。)

这里还有一些应该调整,但不是必须调整的 SSL 配置参数:SSLSessionCacheSSLUseStapling 等,其它地方也有介绍这些。例如 Ilya Grigorik 写的一篇超赞的博客: 高性能浏览器网络

curl

再次回到 shell 使用 curl(查看上面的“curl h2c”章节了解要求),你也可以通过 curl 用简单的命令检测你的服务器:

sh> curl -v --http2 https://<yourserver>/
...
* ALPN, offering h2
* ALPN, offering http/1.1
...
* ALPN, server accepted to use h2
...
<the resource>

恭喜你,能正常工作啦!如果还不能,可能原因是:

  • 你的 curl 不支持 HTTP/2。查看上面的“检测 curl”一节。
  • 你的 openssl 版本太低不支持 ALPN。
  • 不能验证你的证书,或者不接受你的算法配置。尝试添加命令行选项 -k 停用 curl 中的这些检查。如果可以工作,就重新配置你的 SSL 和证书。

nghttp

我们已经在 h2c 讨论过 nghttp。如果你用它来进行 https: 连接,你会看到类似下面的信息:

sh> nghttp https://<yourserver>/
[ERROR] HTTP/2 protocol was not selected. (nghttp2 expects h2)

这有两种可能,你可以通过添加 -v 来检查。如果是:

sh> nghttp -v https://<yourserver>/
[  0.034] Connected
[ERROR] HTTP/2 protocol was not selected. (nghttp2 expects h2)

这意味着你服务器使用的 TLS 库没有实现 ALPN。有时候正确安装有点困难。多看看 Stackoverflow 吧。

你看到的也可能是:

sh> nghttp -v https://<yourserver>/
[  0.034] Connected
The negotiated protocol: http/1.1
[ERROR] HTTP/2 protocol was not selected. (nghttp2 expects h2)

这表示 ALPN 能正常工作,但并没有用 h2 协议。你需要像上面介绍的那样检查你服务器上的 Protocols 配置。如果一开始在 vhost 部分设置不能正常工作,试着在通用部分设置它。

Firefox

更新: Apache Lounge 的 Steffen Land 告诉我 Firefox 上有个 HTTP/2 指示插件。你可以看到有多少地方用到了 h2(提示:Apache Lounge 用 h2 已经有一段时间了...)

你可以在 Firefox 浏览器中打开开发者工具,在那里的网络标签页查看 HTTP/2 连接。当你打开了 HTTP/2 并重新刷新 html 页面时,你会看到类似下面的东西:

在响应头中,你可以看到奇怪的 X-Firefox-Spdy 条目中列出了 “h2”。这表示在这个 https: 连接中使用了 HTTP/2。

Google Chrome

在 Google Chrome 中,你在开发者工具中看不到 HTTP/2 指示器。相反,Chrome 用特殊的地址 chrome://net-internals/#http2 给出了相关信息。(LCTT 译注:Chrome 已经有一个 “HTTP/2 and SPDY indicator” 可以很好的在地址栏识别 HTTP/2 连接)

如果你打开了一个服务器的页面,可以在 Chrome 中查看那个 net-internals 页面,你可以看到类似下面这样:

如果你的服务器在上面的列表中,就表示它正在工作。

Microsoft Edge

Windows 10 中 Internet Explorer 的继任者 Edge 也支持 HTTP/2。你也可以在开发者工具的网络标签页看到 HTTP/2 协议。

Safari

在 Apple 的 Safari 中,打开开发者工具,那里有个网络标签页。重新加载你的服务器上的页面,并在开发者工具中选择显示了加载的那行。如果你启用了在右边显示详细视图,看 Status 部分。那里显示了 HTTP/2.0 200,像这样:

重新协商

https: 连接重新协商是指正在运行的连接中特定的 TLS 参数会发生变化。在 Apache httpd 中,你可以在 directory 配置中改变 TLS 参数。如果进来一个获取特定位置资源的请求,配置的 TLS 参数会和当前的 TLS 参数进行对比。如果它们不相同,就会触发重新协商。

这种最常见的情形是算法变化和客户端证书。你可以要求客户访问特定位置时需要通过验证,或者对于特定资源,你可以使用更安全的、对 CPU 压力更大的算法。

但不管你的想法有多么好,HTTP/2 中都不可以发生重新协商。在同一个连接上会有 100 多个请求,那么重新协商该什么时候做呢?

对于这种配置,现有的 mod\_h[ttp]2 还没有办法。如果你有一个站点使用了 TLS 重新协商,别在上面启用 h2!

当然,我们会在后面的版本中解决这个问题,然后你就可以安全地启用了。

限制

非 HTTP 协议

实现除 HTTP 之外协议的模块可能和 mod\_http2 不兼容。这在其它协议要求服务器首先发送数据时无疑会发生。

NNTP 就是这种协议的一个例子。如果你在服务器中配置了 mod\_nntp\_like\_ssl,那么就不要加载 mod\_http2。等待下一个版本。

h2c 限制

h2c 的实现还有一些限制,你应该注意:

在虚拟主机中拒绝 h2c

你不能对指定的虚拟主机拒绝 h2c 直连。连接建立而没有看到请求时会触发直连,这使得不可能预先知道 Apache 需要查找哪个虚拟主机。

有请求数据时的升级切换

对于有数据的请求,h2c 升级切换不能正常工作。那些是 PUT 和 POST 请求(用于提交和上传)。如果你写了一个客户端,你可能会用一个简单的 GET 或者 OPTIONS * 来处理那些请求以触发升级切换。

原因从技术层面来看显而易见,但如果你想知道:在升级切换过程中,连接处于半疯状态。请求按照 HTTP/1.1 的格式,而响应使用 HTTP/2 帧。如果请求有一个数据部分,服务器在发送响应之前需要读取整个数据。因为响应可能需要从客户端处得到应答用于流控制及其它东西。但如果仍在发送 HTTP/1.1 请求,客户端就仍然不能以 HTTP/2 连接。

为了使行为可预测,几个服务器在实现上决定不在任何带有请求数据的请求中进行升级切换,即使请求数据很小。

302 时的升级切换

有重定向发生时,当前的 h2c 升级切换也不能工作。看起来 mod\_http2 之前的重写有可能发生。这当然不会导致断路,但你测试这样的站点也许会让你迷惑。

h2 限制

这里有一些你应该意识到的 h2 实现限制:

连接重用

HTTP/2 协议允许在特定条件下重用 TLS 连接:如果你有带通配符的证书或者多个 AltSubject 名称,浏览器可能会重用现有的连接。例如:

你有一个 a.example.org 的证书,它还有另外一个名称 b.example.org。你在浏览器中打开 URL https://a.example.org/,用另一个标签页加载 https://b.example.org/

在重新打开一个新的连接之前,浏览器看到它有一个到 a.example.org 的连接并且证书对于 b.example.org 也可用。因此,它在第一个连接上面发送第二个标签页的请求。

这种连接重用是刻意设计的,它使得使用了 HTTP/1 切分 sharding 来提高效率的站点能够不需要太多变化就能利用 HTTP/2。

Apache mod\_h[ttp]2 还没有完全实现这点。如果 a.example.orgb.example.org 是不同的虚拟主机, Apache 不会允许这样的连接重用,并会告知浏览器状态码 421 Misdirected Request。浏览器会意识到它需要重新打开一个到 b.example.org 的连接。这仍然能工作,只是会降低一些效率。

我们期望下一次的发布中能有合适的检查。

Münster, 12.10.2015,

Stefan Eissing, greenbytes GmbH

Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. See LICENSE for details.


该项目由 icing 维护。


via: https://icing.github.io/mod_h2/howto.html

作者:icing 译者:ictlyh 校对:wxy

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

大家好,本文的主题是 Redis,我们将要在 CentOS 7 上安装它。编译源代码,安装二进制文件,创建、安装文件。在安装了它的组件之后,我们还会配置 redis ,就像配置操作系统参数一样,目标就是让 redis 运行的更加可靠和快速。

Runnins Redis

Redis 服务器

Redis 是一个开源的多平台数据存储软件,使用 ANSI C 编写,直接在内存使用数据集,这使得它得以实现非常高的效率。Redis 支持多种编程语言,包括 Lua, C, Java, Python, Perl, PHP 和其他很多语言。redis 的代码量很小,只有约3万行,它只做“很少”的事,但是做的很好。尽管是在内存里工作,但是数据持久化的保存还是有的,而redis 的可靠性就很高,同时也支持集群,这些可以很好的保证你的数据安全。

构建 Redis

redis 目前没有官方 RPM 安装包,我们需要从源代码编译,而为了要编译就需要安装 Make 和 GCC。

如果没有安装过 GCC 和 Make,那么就使用 yum 安装。

yum install gcc make

官网下载 tar 压缩包。

curl http://download.redis.io/releases/redis-3.0.4.tar.gz -o redis-3.0.4.tar.gz

解压缩。

tar zxvf redis-3.0.4.tar.gz

进入解压后的目录。

cd redis-3.0.4

使用Make 编译源文件。

make

安装

进入源文件的目录。

cd src

复制 Redis 的服务器和客户端到 /usr/local/bin。

cp redis-server redis-cli /usr/local/bin

最好也把 sentinel,benchmark 和 check 复制过去。

cp redis-sentinel redis-benchmark redis-check-aof redis-check-dump /usr/local/bin

创建redis 配置文件夹。

mkdir /etc/redis

/var/lib/redis 下创建有效的保存数据的目录

mkdir -p /var/lib/redis/6379

系统参数

为了让 redis 正常工作需要配置一些内核参数。

配置 vm.overcommit_memory 为1,这可以避免数据被截断,详情见此

sysctl -w vm.overcommit_memory=1

修改 backlog 连接数的最大值超过 redis.conf 中的 tcp-backlog 值,即默认值511。你可以在kernel.org 找到更多有关基于 sysctl 的 ip 网络隧道的信息。

sysctl -w net.core.somaxconn=512

取消对透明巨页内存(transparent huge pages)的支持,因为这会造成 redis 使用过程产生延时和内存访问问题。

echo never > /sys/kernel/mm/transparent_hugepage/enabled

redis.conf

redis.conf 是 redis 的配置文件,然而你会看到这个文件的名字是 6379.conf ,而这个数字就是 redis 监听的网络端口。如果你想要运行超过一个的 redis 实例,推荐用这样的名字。

复制示例的 redis.conf 到 /etc/redis/6379.conf

cp redis.conf /etc/redis/6379.conf

现在编辑这个文件并且配置参数。

vi /etc/redis/6379.conf

daemonize

设置 daemonize 为 no,systemd 需要它运行在前台,否则 redis 会突然挂掉。

daemonize no

pidfile

设置 pidfile/var/run/redis_6379.pid

pidfile /var/run/redis_6379.pid

port

如果不准备用默认端口,可以修改。

port 6379

loglevel

设置日志级别。

loglevel notice

logfile

修改日志文件路径。

logfile /var/log/redis_6379.log

dir

设置目录为 /var/lib/redis/6379

dir /var/lib/redis/6379

安全

下面有几个可以提高安全性的操作。

Unix sockets

在很多情况下,客户端程序和服务器端程序运行在同一个机器上,所以不需要监听网络上的 socket。如果这和你的使用情况类似,你就可以使用 unix socket 替代网络 socket,为此你需要配置 port 为0,然后配置下面的选项来启用 unix socket。

设置 unix socket 的套接字文件。

 unixsocket /tmp/redis.sock

限制 socket 文件的权限。

unixsocketperm 700

现在为了让 redis-cli 可以访问,应该使用 -s 参数指向该 socket 文件。

redis-cli -s /tmp/redis.sock

requirepass

你可能需要远程访问,如果是,那么你应该设置密码,这样子每次操作之前要求输入密码。

requirepass "bTFBx1NYYWRMTUEyNHhsCg"

rename-command

想象一下如下指令的输出。是的,这会输出服务器的配置,所以你应该在任何可能的情况下拒绝这种访问。

CONFIG GET *

为了限制甚至禁止这条或者其他指令可以使用 rename-command 命令。你必须提供一个命令名和替代的名字。要禁止的话需要设置替代的名字为空字符串,这样禁止任何人猜测命令的名字会比较安全。

rename-command FLUSHDB "FLUSHDB_MY_SALT_G0ES_HERE09u09u"
rename-command FLUSHALL ""
rename-command CONFIG "CONFIG_MY_S4LT_GO3S_HERE09u09u"

Access Redis through unix with password and command changes

使用密码通过 unix socket 访问,和修改命令

快照

默认情况下,redis 会周期性的将数据集转储到我们设置的目录下的 dump.rdb 文件。你可以使用 save 命令配置转储的频率,它的第一个参数是以秒为单位的时间帧,第二个参数是在数据文件上进行修改的数量。

每隔15分钟并且最少修改过一次键。

save 900 1

每隔5分钟并且最少修改过10次键。

save 300 10

每隔1分钟并且最少修改过10000次键。

save 60 10000

文件 /var/lib/redis/6379/dump.rdb 包含了从上次保存以来内存里数据集的转储数据。因为它先创建临时文件然后替换之前的转储文件,这里不存在数据破坏的问题,你不用担心,可以直接复制这个文件。

开机时启动

你可以使用 systemd 将 redis 添加到系统开机启动列表。

复制示例的 init\_script 文件到 /etc/init.d,注意脚本名所代表的端口号。

cp utils/redis_init_script /etc/init.d/redis_6379

现在我们要使用 systemd,所以在 /etc/systems/system 下创建一个单位文件名字为 redis_6379.service

vi /etc/systemd/system/redis_6379.service

填写下面的内容,详情可见 systemd.service。

[Unit]
Description=Redis on port 6379

[Service]
Type=forking
ExecStart=/etc/init.d/redis_6379 start
ExecStop=/etc/init.d/redis_6379 stop

[Install]
WantedBy=multi-user.target

现在添加我之前在 /etc/sysctl.conf 里面修改过的内存过量使用和 backlog 最大值的选项。

vm.overcommit_memory = 1

net.core.somaxconn=512

对于透明巨页内存支持,并没有直接 sysctl 命令可以控制,所以需要将下面的命令放到 /etc/rc.local 的结尾。

echo never > /sys/kernel/mm/transparent_hugepage/enabled

总结

这样就可以启动了,通过设置这些选项你就可以部署 redis 服务到很多简单的场景,然而在 redis.conf 还有很多为复杂环境准备的 redis 选项。在一些情况下,你可以使用 replicationSentinel 来提高可用性,或者将数据分散在多个服务器上,创建服务器集群。

谢谢阅读。


via: http://linoxide.com/storage/install-redis-server-centos-7/

作者:Carlos Alberto 译者:ezio 校对:wxy

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

测试管理 Test Management 指测试人员所需要的任何的所有东西。测试管理工具用来记录测试执行的结果、计划测试活动以及汇报质量控制活动的情况。在这篇文章中我们会向你介绍如何配置 Zephyr 测试管理工具,它包括了管理测试活动需要的所有东西,不需要单独安装测试活动所需要的应用程序从而降低测试人员不必要的麻烦。一旦你安装完它,你就看可以用它跟踪 bug 和缺陷,和你的团队成员协作项目任务,因为你可以轻松地共享和访问测试过程中多个项目团队的数据。

Zephyr 要求

安装和运行 Zephyr 要求满足以下最低条件。可以根据你的基础设施提高资源。我们会在 64 位 CentOS-7 系统上安装 Zephyr,几乎在所有的 Linux 操作系统中都有可用的 Zephyr 二进制发行版。

注:表格

Zephyr test management tool
Linux OSCentOS Linux 7 (Core), 64-bit
PackagesJDK 7 或更高 , Oracle JDK 6 update没有事先安装的 Tomcat 和 MySQL
RAM4 GB推荐 8 GB
CPU2.0 GHZ 或更高
Hard Disk30 GB , 至少 5GB

安装 Zephyr 要求你有超级用户(root)权限,并确保你已经正确配置了网络的静态 IP ,默认端口必须可用并允许通过防火墙。其中 tomcat 会使用 80/443、 8005、 8009、 8010 端口, Zephyr 内部使用 RTMP 协议的 flex 会使用 443 和 2099 号端口。

安装 Java JDK 7

安装 Zephyr 首先需要安装 Java JDK 7,如果你的系统上还没有安装,可以按照下面的方法安装 Java 并设置 JAVA\_HOME 环境变量。

输入以下的命令安装 Java JDK 7。

[root@centos-007 ~]# yum install java-1.7.0-openjdk-1.7.0.79-2.5.5.2.el7_1

[root@centos-007 ~]# yum install java-1.7.0-openjdk-devel-1.7.0.85-2.6.1.2.el7_1.x86_64

安装完 java 和它的所有依赖后,运行下面的命令设置 JAVA\_HOME 环境变量。

[root@centos-007 ~]# export JAVA_HOME=/usr/java/default
[root@centos-007 ~]# export PATH=/usr/java/default/bin:$PATH

用下面的命令检查 java 版本以验证安装。

[root@centos-007 ~]# java –version

java version "1.7.0_79"
OpenJDK Runtime Environment (rhel-2.5.5.2.el7_1-x86_64 u79-b14)
OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)

输出显示我们已经正确安装了 1.7.0\_79 版本的 OpenJDK Java。

安装 MySQL 5.6.x

如果的机器上有其它的 MySQL,建议你先卸载它们并安装这个版本,或者升级它们的 模式 schemas 到指定的版本。因为 Zephyr 前提要求这个指定的 5.6.x 版本的 MySQL ,要有 root 用户名。

可以按照下面的步骤在 CentOS-7.1 上安装 MySQL 5.6 :

下载 rpm 软件包,它会为安装 MySQL 服务器创建一个 yum 库文件。

[root@centos-007 ~]# yum install wget
[root@centos-007 ~]# wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

然后用 rpm 命令安装下载下来的 rpm 软件包。

[root@centos-007 ~]# rpm -ivh mysql-community-release-el7-5.noarch.rpm

安装完这个软件包后你会有两个和 MySQL 相关的新的 yum 库。然后使用 yum 命令安装 MySQL Server 5.6,它会自动安装所有需要的依赖。

[root@centos-007 ~]# yum install mysql-server

安装过程完成之后,运行下面的命令启动 mysqld 服务并检查它的状态是否激活。

[root@centos-007 ~]# service mysqld start
[root@centos-007 ~]# service mysqld status

对于全新安装的 MySQL 服务器,MySQL root 用户的密码为空。为了安全起见,我们应该重置 MySQL root 用户的密码。用自动生成的空密码连接到 MySQL 并更改 root 用户密码。

[root@centos-007 ~]# mysql
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('your_password');
mysql> flush privileges;
mysql> quit;

现在我们需要在 MySQL 默认的配置文件中配置所需的数据库参数。打开 "/etc/" 目录中的文件并按照下面那样更新。

[root@centos-007 ~]# vi /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
max_allowed_packet=150M
max_connections=600
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_unicode_ci

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_unicode_ci

[mysql]
max_allowed_packet = 150M
[mysqldump]
quick

保存配置文件中的更新并重启 mysql 服务。

[root@centos-007 ~]# service mysqld restart

下载 Zephyr 安装包

我们已经安装完了安装 Zephyr 所需要的软件包。现在我们需要获取 Zephyr 二进制发布包和它的许可证密钥。到 Zephyr 官方下载链接 http://download.yourzephyr.com/linux/download.php 输入你的电子邮件 ID 并点击下载。

下载 Zephyr

然后确认你的电子邮件地址,你会获得 Zephyr 下载链接和它的许可证密钥链接。点击提供的链接从服务器中选择和你操作系统合适的版本下载二进制安装包以及许可证文件。

我们把它下载到 home 目录并更改它的权限为可执行。

Zephyr 二进制包

开始安装和配置 Zephyr

现在我们通过执行它的二进制安装脚本开始安装 Zephyr。

[root@centos-007 ~]# ./zephyr_4_7_9213_linux_setup.sh –c

一旦你运行了上面的命令,它会检查是否正确配置了 Java 环境变量。如果配置不正确,你可能会看到类似下面的错误。

testing JVM in /usr ...
Starting Installer ...
Error : Either JDK is not found at expected locations or JDK version is mismatched.
Zephyr requires Oracle Java Development Kit (JDK) version 1.7 or higher.

如果你正确配置了 Java,它会开始安装 Zephyr 并要求你输入 “o” 继续或者输入 “c” 取消安装。让我们敲击 “o” 并输入回车键开始安装。

安装 zephyr

下一个选项是检查安装 Zephyr 所有的要求,输入回车进入下一个选项。

zephyr 要求

输入 “1” 并回车同意许可证协议。

I accept the terms of this license agreement [1], I do not accept the terms of this license agreement [2, Enter]

我们需要选择安装 Zephyr 合适的目标位置以及默认端口,如果你想用默认端口之外的其它端口,也可以在这里配置。

installation folder

然后自定义 mysql 数据库参数并给出配置文件的正确路径。在这一步你可能看到类似下面的错误。

Please update MySQL configuration. Configuration parameter max_connection should be at least 500 (max_connection = 500) and max_allowed_packet should be at least 50MB (max_allowed_packet = 50M).

要消除这个错误,你要确保在 mysql 配置文件中正确配置了 "max\_connection" 和 "max\_allowed\_packet" 参数。运行所示的命令连接到数据库确认这些设置。

连接 mysql

当你正确配置了 mysql 数据库,它会提取配置文件并完成安装。

配置 mysql

安装过程在你的计算机上成功的安装了 Zephyr 4.7。要启动 Zephyr 桌面,输入 “y” 完成 Zephyr 安装。

启动 zephyr

启动 Zephyr 桌面

打开你的 web 浏览器并用你的本机 IP 地址启动 Zephyr 桌面,你会被导向 Zephyr 桌面。

http://your_server_IP/zephyr/desktop/

Zephyr 桌面

从 Zephyr 仪表盘点击 "Test Manager" 并用默认的用户名和密码 "test.manager" 登录。

Test Manage 登录

你登录进去后你就可以配置你的管理设置了。根据你的环境选择你想要的设置。

Test Manage 管理

完成管理设置后保存设置,资源管理和项目配置也类似,然后开始使用 Zephyr 作为你的测试管理工具吧。如图所示在 Department Dashboard Management 中检查和编辑管理设置状态。

zephyr 仪表盘

总结

好了! 我们已经在 CentOS 7.1 上安装完了 Zephyr。我们希望你能更加深入了解 Zephyr 测试管理工具,它提供简化测试流程、允许快速访问数据分析、协作工具以及多个项目成员之间交流。如果在你的环境中遇到任何问题,欢迎和我们联系。


via: http://linoxide.com/linux-how-to/setup-zephyr-tool-centos-7-x/

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

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

Linus 上个月骂了一个 Linux 开发者,原因是他向 kernel 提交了一份不安全的代码。

Linus 是个 Linux 内核项目非官方的“ 仁慈的独裁者 benevolent dictator ”(LCTT译注:英国《卫报》曾将乔布斯评价为‘仁慈的独裁者’),这意味着他有权决定将哪些代码合入内核,哪些代码直接丢掉。

在10月28号,一个开源开发者提交的代码未能符合 Torvalds 的要求,于是遭来了一顿臭骂。Torvalds 在他提交的代码下评论道:“你提交的是什么东西。”

接着他说这个开发者是“毫无能力的神经病”。

Torvalds 为什么会这么生气?他觉得那段代码可以写得更有效率一点,可读性更强一点,编译器编译后跑得更好一点(编译器的作用就是将让人看的代码翻译成让电脑看的代码)。

Torvalds 重新写了一版代码将原来的那份替换掉,并建议所有开发者应该像他那种风格来写代码。

Torvalds 一直在嘲讽那些不符合他观点的人。早在1991年他就攻击过 Andrew Tanenbaum——那个 Minix 操作系统的作者,而那个 Minix 操作系统被 Torvalds 描述为“脑残”。

但是 Torvalds 在这次嘲讽中表现得更有战略性了:“我想让每个人都知道,像他这种代码是完全不能被接收的。”他说他的目的是提醒每个 Linux 开发者,而不是针对那个开发者。

Torvalds 也用这个机会强调了烂代码的安全问题。现在的企业对安全问题很重视,所以安全问题需要在开源开发者心中得到足够重视,甚至需要在代码中表现为最高等级(LCTT 译注:操作系统必须权衡许多因素:安全、处理速度、灵活性、易用性等,而这里 Torvalds 将安全提升为最高优先级了)。骂一下那些提交不安全代码的开发者可以帮助提高 Linux 系统的安全性。


via: http://thevarguy.com/open-source-application-software-companies/110415/linus-torvalds-lambasts-open-source-programmers-over-inse

作者:Christopher Tozzi 译者:bazz2 校对:wxy

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