Nginx 下载文件不完整

通过 php readfile 输入一份文件,文件约 5.2MB 使用 wget 命令下载。
wget http://10.10.20.104:8084/api/h5/reports/file1
每一次得到的文件大小都不一样

1
2
3
4
5
6
#第一次
preview [ <=> ] 539.26K --.-KB/s in 0.002s
2018-07-03 11:12:45 (249 MB/s) - ‘preview’ saved [552206]
#再来一次
preview.1 [ <=> ] 791.23K --.-KB/s in 0.003s
2018-07-03 11:12:46 (281 MB/s) - ‘preview.1’ saved [810222]

发现每次开始下载,然后就结束了,中断了。第一感觉应该是文件长度没有返回,客户端不知道下多少。所以 php 代码补上。

1
header('Content-length:5498687');

再次执行 wget 下载,发现了有趣的现象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Connecting to 10.10.20.104:8084... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5498687 (5.2M) [application/pdf]
Saving to: ‘preview.7’

preview.7 10%[====> ] 539.39K --.-KB/s in 0.002s

2018-07-03 11:28:21 (303 MB/s) - Connection closed at byte 552340. Retrying.

--2018-07-03 11:28:22-- (try: 2) http://10.10.20.104:8084/api/h5/reports/17007/preview
Connecting to 10.10.20.104:8084... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5498687 (5.2M) [application/pdf]
Saving to: ‘preview.7’

preview.7 32%[=================> ] 1.73M --.-KB/s in 0.004s

2018-07-03 11:28:23 (415 MB/s) - Connection closed at byte 1809684. Retrying.

--2018-07-03 11:28:25-- (try: 3) http://10.10.20.104:8084/api/h5/reports/17007/preview
Connecting to 10.10.20.104:8084... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5498687 (5.2M) [application/pdf]
Saving to: ‘preview.7’

看到 wget 在循环断点下载。文件长度确实生效。但并没有达到预期。

此时使用 apache 做服务器,下载文件一气呵成,估计还是 nginx 的问题。

查看 nginx 的 error.log,发现大量的权限错误:

1
2
2018/07/03 11:25:39 [crit] 32747#0: *7 open() "/usr/local/var/run/nginx/fastcgi_temp/4/00/0000000004" failed (13: Permission denied) while reading upstream, client: 10.10.20.104, server: , request: "GET /api/h5/reports/17007/preview HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "10.10.20.104:8084"
2018/07/03 11:25:41 [crit] 32747#0: *9 open() "/usr/local/var/run/nginx/fastcgi_temp/5/00/0000000005" failed (13: Permission denied) while reading upstream, client: 10.10.20.104, server: , request: "GET /api/h5/reports/17007/preview HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "10.10.20.104:8084"

推测是文件比较大,需要缓冲,然后临时文件没有了写入权限产生的,改改式试吧。

1
sudo chmod -R 777 /usr/local/var/run/nginx/fastcgi_temp

果然,解决问题。

找了相关资料的一段描述:

nginx会使用fastcgi_buffer_size指定的大小的缓冲区用于缓存fastcgi流的内容。当大小超出此大小时会继续用fastcgi_buffers指定的数量和大小申请缓冲区。如果依然超出此大小,会将多出的内容写入临时文件。就导致了该问题。

问题解决了,面上的原因是权限错误,深层次,应该将 php-fpm 和 nginx 用户统一吧。