在使用Nginx 1.10.1时,使用HTTP/2和TLS 1.2时,iOS无法发送POST请求!?

前提条件的汉语原生释义。

    • Ubuntu 16.04 LTS

 

    • Python 2.7.11

 

    • Nginx 1.10.1

 

    小学生に怒られる覚悟

环境

View <-> Nginx <-> gunicorn/Django

在这种关系下,应用程序运行。

当以简单的方式解释,Django本身可以通过以下命令启动:gunicorn PROJECT_NAME.wsgi:application –bind 0.0.0.0:8000 -D,并且可在Nginx中通过反向代理配置实现一些hogehoge的功能。

错误内容

在Xcode的控制台中,日志如下所示。

失败:错误域=NSURLErrorDomain 代码=-1004 “无法连接到服务器” UserInfo={NSUnderlyingError=0x137d39380 {错误域=kCFErrorDomainCFNetwork 代码=-1004 “(null)” UserInfo={NSErrorPeerAddressKey={length = 16, capacity = 16, bytes = 0x100201bb341a9f540000000000000000}, _kCFStreamErrorCodeKey=-2200, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=[FILTERED], NSErrorFailingURLKey=[FILTERED], _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2200, NSLocalizedDescription=无法连接到服务器。}

应用启动后的几秒钟内,收到 NSURLErrorDomain 错误代码 1004。

我忘记了保存错误日志。

这是什么意思?

スクリーンショット 2016-10-15 午後3.44.19.png

根据引用的回答,看起来是 Nginx 1.10.0 (和 1.9.15) 版本。即从Nginx支持HTTP/2的版本开始,出现了类似 “无法连接到服务器” 的错误,同时使用了HTTP/2和TLS 1.2。

应对措施

只需将Nginx升级到截止至2016年10月15日的最新版Mainline的1.11.5即可。

スクリーンショット 2016-10-15 午後3.44.25.png

看了下面的回答,好像需要进一步指定 http2_body_prepared_size。

*) 更改:HTTP/2客户端现在可以立即开始发送请求主体;”http2_body_preread_size”指令控制在nginx开始读取客户端请求主体之前使用的缓冲区的大小。

引用:http://nginx.org/zh_CN/CHANGES

看公式账号的更新资讯,就是这个感觉,所以还是需要1.11.5版本。

Nginx更新

请自行更改代号部分。另外,假设是基于Debian和Ubuntu。

$ echo "deb http://nginx.org/packages/mainline/ubuntu/ codename nginx" > /etc/apt/sources.list
$ echo "deb-src http://nginx.org/packages/mainline/ubuntu/ codename nginx" > /etc/apt/sources.list
$ sudo apt-get update
$ sudo apt-get upgrade -y
$ nginx -v
nginx version: nginx/1.11.5

配置文件

server {
    ・・・
    http2_body_preread_size 64k;
    ・・・
}

在上面提到的方式中增添。

适用

# 一応テスト
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo /etc/init.d/nginx restart
[ ok ] Restarting nginx (via systemctl): nginx.service.

这次我们在服务器上设置的文件是以下的链接:
https://github.com/nnsnodnb/django-mbaas/blob/master/nginx.conf

广告
将在 10 秒后关闭
bannerAds