文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

大多数时候 Nginx 都是我的默认选择,其怪癖和奇怪的设计一点都不会妨碍我的选择。最近他们拒绝将开发版中修复的 Bug 同时应用到稳定版中,这才导致了一些问题。

具体来说就是“稳定版”的 Nginx 无法在不断开和重置连接的情况下让当前任何浏览器执行 HTTP/2 POST 操作的问题。

受影响网站例如 https://bugs.freebsd.org/ —— 如果你视图处理一个 Bug,就会出现连接重置的问题,这是由 Nginx 引起的。

第 1 段(可获 1.26 积分)

他们在目前的开发分支中已经修复了这个问题,你可以自行打这个补丁。这个问题和补丁的信息请看:https://trac.nginx.org/nginx/ticket/959#comment:18 。让我不可思议的是他们难道没发现在其稳定分支中也存在这个版本吗?关闭 HTTP/2 并退回到 SPDY 已经不可行了,因为 SPDY 的支持已经被移除。

幸运的是,可以通过一些新的 Nginx 补丁来处理这个问题。由 nghttp2 库所实现的前端 TLS/HTTP/2 代理服务器可以搞定这个问题。不像 Nginx,nghttp2 同时支持 SPDY 和 HTTP/2 ,而且还可以用合理的方式处理老的 pre-ALPN 客户端。

第 2 段(可获 1.8 积分)

这使用起来很简单,而且有个红利, 它可以和 Varnish 一起工作。这里是我如何使用的方法:

  • 移除 Nginx 中的 TLS/SSL/HTTP/2, 重新配置主 Nginx 服务器(或者 Varnish),使用 localhost:83 侦听端口。
  • 启动 nghttpx(前端代理)将来自互联网对 443 端口的请求代理到本地 83

nghttpx.conf 配置示例,就是这么简单:

# The basics
backend=127.0.0.1,83  
frontend=*,443

# TLS settings
ciphers=ECDHE-RSA-.... (I use mozilla's recommended cipher settings)  
private-key-file=/path/to/privkey.pem  
certificate-file=/path/to/fullchain.pem  
# weaken the defaults - re-enable tls-1.0
tls-proto-list=TLSv1.2,TLSv1.1,TLSv1.0

# Logs
accesslog-file=/var/log/nghttpx-access.log  
errorlog-file=/var/log/nghttpx-error.log

# and a few extra settings 
strip-incoming-x-forwarded-for=yes  
add-x-forwarded-for=yes  
strip-incoming-forwarded=yes  
add-forwarded=by,for,host,proto  
# Don't hash forwarded-for stuff, use the actual information
forwarded-by=ip  
forwarded-for=ip

# HSTS settings etc
add-response-header=Strict-Transport-Security:max-age=31536000; includeSubdomains  
# other security headers here
第 3 段(可获 0.83 积分)

对于 nginx.conf 配置文件来说,只需要让日志中记录正确的 IP 地址即可,如下:

set_real_ip_from 127.0.0.1;  
real_ip_header X-Forwarded-For;  
real_ip_recursive on;  

我已经能用 nghttp2 的 nghttpx 和 Varnish 一起来完全从管道中消除 Nginx。很好,Nginx 已经几乎被降级为支持 Let's Encrypt 的 Cookie,但我还有其他的选项来做这个。

它默认的实现 OCSP (Online Certificate Status Protocol) 装订并且通常包含一组合适的 TLS 设置。但是我想要一个更严格的开箱即用的配置。在关于是否放松 TLS 设置方面的选择上,这是一个很好的问题!

第 4 段(可获 1.3 积分)

需要注意的是 nghttpx 并不为极速性能而设计,当然它也不慢。但是它已经超越很多东西,可以满足多数需求。

如果有另外一个可靠、先进的 TLS/SPDY/HTTP2 的替代品作为终结当然是非常棒的事情。至少能给 Nginx 的团队敲响一记警钟,这样他们才能更仔细的思考如何修复这些影响到用户的 Bug。

nghttp2 项目网址是  https://nghttp2.org/ ,你会发现这个项目的文档非常详细,而且有一个可靠的 HTTP/2 客户端和服务器端开发包,值得一看!

第 5 段(可获 1.53 积分)

文章评论