我的小型服务器 (BeagleBoneBlack) 上有一个文件,我想将其下载到另一台机器上。因此,我尝试通过 nginx-web-server 上的 PHP 执行此操作。文件大小约为 1.2 GB,下载总是在 410MB 左右停止。
由于两台计算机都位于同一个交换机后面,因此我不会看到连接问题。此外,我可以排除软件问题的可能性,因为我用不同的 PHP 软件测试过,但出现了相同的问题。通过 SCP 下载没有问题。
在通过 PHP 下载过程中,我看到/proc/loadavg
类似的值
3.15 1.17 0.46 1/95 1163
3.15 1.17 0.46 1/95 1164
3.14 1.20 0.48 1/95 1165
3.14 1.20 0.48 1/95 1166
3.21 1.25 0.50 1/95 1167
3.21 1.25 0.50 1/95 1168
3.21 1.25 0.50 1/95 1169
3.44 1.43 0.57 1/95 1172
3.42 1.52 0.61 2/95 1175
3.42 1.52 0.61 1/95 1178
并假设负载相当高。因此我怀疑 nginx-config 并不适合它所运行的小型服务器。我的nginx.conf
配置如下:
user www-data;
worker_processes 1;
#worker_processes 4;
pid /var/run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
##
# nginx-naxsi config
##
# Uncomment it if you installed nginx-naxsi
##
#include /etc/nginx/naxsi_core.rules;
##
# nginx-passenger config
##
# Uncomment it if you installed nginx-passenger
##
#passenger_root /usr;
#passenger_ruby /usr/bin/ruby;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
有人能告诉我为什么我无法下载大文件?分别要改变什么?
更新:
由于我进入*466 writev() "/var/lib/nginx/fastcgi/1/00/0000000001" has written only 1498 of 8184 while reading upstream, client:
了 nginx 错误日志,因此我也粘贴了以下配置设置fastcgi_params
:
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param HTTPS $https;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
答案1
PHP 代码是否发送文件内容(而不是重定向到 nginx 直接提供的实际文件)?似乎是这样,因为您在下载过程中遇到了高负载,这表明您的服务器可能正在执行一些繁重的工作,而不仅仅是传递数据。
在这种情况下,您可能会达到通过以下方式设置的 PHP 执行限制:
- 这设置时间限制功能 (http://php.net/manual/en/function.set-time-limit.php) 或者
- 这最大执行时间php.ini 参数(http://php.net/manual/en/info.configuration.php#ini.max-execution-time)
请务必检查 PHP 错误日志和 nginx 日志,以查找可能发生的其他情况的线索。您可能需要增加 PHP 报告级别,设置错误报告php.ini 指令全部 并确保错误日志文件已设置。
还要记住,通过 nginx 提供文件服务总是比通过 PHP 发送字节更有效率。特别是当您在小型/受限的硬件上运行时。