在使用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。
我忘记了保存错误日志。
这是什么意思?

根据引用的回答,看起来是 Nginx 1.10.0 (和 1.9.15) 版本。即从Nginx支持HTTP/2的版本开始,出现了类似 “无法连接到服务器” 的错误,同时使用了HTTP/2和TLS 1.2。
应对措施
只需将Nginx升级到截止至2016年10月15日的最新版Mainline的1.11.5即可。

看了下面的回答,好像需要进一步指定 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