我使用 Nginx 作为网络服务器来为我的网站提供服务。我向我的用户提供上传功能(允许他们提交最大 5Mb 的图片),因此我有指令:client_max_body_size 5M;在我的服务器配置中。我注意到,如果我尝试上传任何文件,网络服务器不会阻止上传更大的文件。举个例子,假设我尝试上传一个 700Mb 的大视频(电影)。服务器不会立即拒绝上传,但它会缓冲整个数据(花费很长时间并减慢服务器速度),并且仅在上传结束时才返回错误413 Request entity too large。
所以问题是:有没有办法正确配置Nginx,以在传输的数据开始超过我的client_max_body_size限制时阻止大文件上传?
我认为使用我的实际设置进行生产确实不安全,而且我在谷歌上找不到任何有用的东西。
编辑:
我使用 php 和 Symfony2 作为后端......
编辑(再次):
这是我的 error.log 中出现的内容:
2013/01/28 11:14:11 [error] 11328#0: *37 client intended to send too large body: 725207449 bytes, client: 33.33.33.1, server: www.local.example.com, request: "POST /app_dev.php/api/image/add/byuploader HTTP/1.1", host: "local.example.com", referrer: "http://local.example.com/app_dev.php/"`
Run Code Online (Sandbox Code Playgroud)
奇怪的是,我正在监视我的 nginx error.log,并且tail -f error.log在上传开始时(在结束之前)立即出现该消息。所以 nginx 会进行某种预防性检查,但它不会停止/分块上传请求......
我还尝试通过在处理上传的页面上发出 a 来验证 php 是否获得上传的控制权echo 'something'; die();,但它没有打印出任何内容,也没有停止上传请求。所以应该是nginx或一些php内部使整个上传继续,直到完全传输......
另一个编辑:这是我的视图top(监视 nginx 和 …
为了尽可能简短:最近我们的系统管理员(因为这种类型的事情应该是这样)引起了我们的注意,我们最新的基于 Web 的项目的要求之一是允许客户执行文件上传。特别是这些将主要是图像和可能的视频[,但我相信你知道,你不能保证上传的确切内容是什么,直到它在服务器上]。
系统管理员有点被推迟了,几乎没有公然地说“不!”。
我熟悉许多关于用户输入、处理上传等的最佳实践,所以我对这个项目的幕后/代码方面非常有信心。我的问题是,是否有任何特定的资源或对话要点可以让我的系统管理员放心?我应该重点向他解释这种事情,如何处理等?
一些问题是潜在的存储空间(我知道需要根据估计的“流行度”乘以估计的文件大小来计算)和托管上传内容的安全问题。
我在使用 Nginx 时遇到了奇怪的行为。就我而言,Nginx 充当 Jetty 的代理。配置如下:
server {
listen 80;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
client_max_body_size 5M;
server_name test.com www.test.com
location / {
auth_basic "Restricted area";
auth_basic_user_file /etc/nginx/htpasswd;
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto http;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
gzip on;
}
}
Run Code Online (Sandbox Code Playgroud)
上传大小大于 5M 的文件时,出现“网关超时”。CPU 使用率为 0%。我不知道出了什么问题。它与网络速度无关,因为我正在本地测试。
如果我跳过代理并尝试直接将文件上传到应用程序服务器(我的意思是:在端口 8080 上),一切都像魅力一样。
任何的想法 ??问候!
我已经使用以下教程在 debian 上设置和配置了 webdav:
http://www.unix-tutorials.com/go.php?id=3711
我希望能够使用 Web 浏览器将文件下载并上传到 webdav 共享。如果我将文件挂载到我的文件系统,我可以将文件下载并上传到 webdav 共享,但我们不希望其他访问它的人必须这样做。我们希望人们能够在他们的 Web 浏览器中访问 URL,进行身份验证,并在他们的浏览器中执行所有操作、下载、上传。
当我在浏览器中转到 webdav URL 并进行身份验证时,我会得到一个 webdav 共享内容列表,我可以下载文件,但看不到任何上传文件的方法?如何使用 Web 浏览器将文件上传到 webdav 共享?
提前致谢。
我是 2 人团队的首席开发人员。我的合作伙伴刚刚加入该项目,尽管使用 GIT 进行版本控制等,但在代码部署方面,我们仍然陷于黑暗时代。
目前,我使用 Filezilla 通过 FTP 进行所有站点更新(这样我可以控制/负责所有上线的内容)。
我已经这样做了多年,但我们现在有一些大型 PHP 类 (300KB) 和大量流量。
简而言之,例如,每次我上传关键类“常规”时,站点都会关闭,直到文件上传完成。这一次只有 5/6 秒,但这越来越令人无法接受。
我意识到我可以以不同的名称上传文件,然后重命名这两个文件......但真的必须有更好的方法吗?
我听说过从另一台服务器同步代码,但我不知道这如何防止在上传时切换到新文件。
我们只有一台服务器(用于 DB 和 Apache),但也使用了一些云服务器(以 openx 为例)。
我正在尝试让我的网站上传视频和图片。由于我制作了更多上传图片的网站,因此在这方面没有问题,但是当我出于某种原因尝试上传视频时,在$_FILES包含上传图像的数组中找不到它。
我已经在谷歌上搜索并找到了关于 php.ini 文件和包含最大上传大小的 IIS 7 的内容。这些都设置为 1024M:
在 php.ini 中:
max_execution_time = 1000
max_input_time = 1000
memory_limit = 256M
upload_max_filesize = 1024M
post_max_size = 1024M
Run Code Online (Sandbox Code Playgroud)
在 IIS 7 中:
maxAllowedContentLength = 1073741824
maxRequestLength = 1073741824
Run Code Online (Sandbox Code Playgroud)
经过一些测试,看起来很小的视频文件确实可以工作(192KB),但稍大的文件在 $_FILES 数组(11MB)中没有显示任何内容,但真正大的文件(80MB)给出了一个错误:The request filtering module is configured to deny a request that exceeds the request content length.. 问题是我已将其设置maxAllowedContentLength为 1GB。所以这不应该发生?!这张图片如下:

任何帮助或建议都非常感谢!
除了在我的客户机上安装 emacs 之类的应用程序外,我还想上传一些配置文件(例如,为 Clojure 开发配置 emacs)。可悲的是,Vagrant 的文档没有提供有关如何执行此操作的线索。我想我必须将配置文件放入共享文件夹,然后将它们从来宾计算机上的共享文件夹复制到所需位置?
我有两个本地用户需要扫描文档,然后让他们自动上传到远程终端服务器。我可以设置扫描软件将文件保存到某个文件夹,但我想自动将它们上传到 TS,这样他们就不必离开他们的会话来上传文件。 我可以用来自动上传这些文件的 xp 文件夹观察器是什么?
服务器是 Win 2000,我不确定在 Windows 上通常是如何完成的。我知道我可以将 WinSCP 用作可编写脚本的 ftp 客户端,但我不知道通常使用什么工具来监视文件夹的更改。直觉说Powershell,但我不知道。我的 Python 不够用,我不想在他们的计算机上安装它,但这可能是最后的选择。
---这是我环顾四周时发现的。--- 今天的这个及时线程显示了 Debian Linux 上的一个很好的实用程序(新用户的一个超链接)/questions/50127/how-to-automatically-run-a-script -when-the-contents-of-a-directory-changes-in-lin 这个线程是我在 serverFault 上找到的最接近的线程,但是走错了路。某种来自 FTP 站点的自动下载器?
(META ps 有没有办法删除标签。“上传”有一个标签,应该是“上传”。不需要复数。)
现在我们正在使用Aspera的企业产品。我们有一个许可证,每个连接仅涵盖 10 兆比特的吞吐量。我们正在考虑从 Aspera 迁移,因为他们的许可成本是让我们达到 100 兆位的杀手。我一直在环顾四周,找不到任何替代方案。现在我们每天传输 500GB 的数据。我更喜欢来自 FOSS 阵营的东西,但我不反对购买基于 Windows 的东西。
为您提供有关我们硬件配置的一些背景知识。
(2) BL495c 刀片服务器 - 2x 6 核 Opterons,128GB RAM,存储全部在 HP MSA2300 FC 阵列上,总共约 10TB 数据。一切都在 Hyper-V Server 2008r2 上运行。
因此,有了所有这些,问题确实是:
您使用什么软件/方法为您的客户提供高速文件上传/下载?
编辑:我主要与生活在 Windows 世界中的非技术最终用户打交道。所以我想要一些基于相当简单的用户前端的浏览器。后端可以根据需要提供技术支持。我认为我唯一真正的要求是大约 100 兆位文件传输的性能、用户配额和可能的连接限制。
我需要配置 nginx + gunicorn 才能在两台服务器中上传大于默认最大大小的文件。
我的 nginx .conf 文件如下所示:
server {
# ...
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 60;
proxy_pass http://localhost:8000/;
}
}
Run Code Online (Sandbox Code Playgroud)
这个想法是允许两个位置的 20M 请求:
/admin/path/to/upload?param=value/installer/other/path/to/upload?param=value我尝试添加location与我在此处粘贴的指令相同级别的指令(获取 404 错误),并尝试将它们添加到location /指令中(获取413 Entity Too Large错误)。
我的位置指令以最简单的形式如下所示:
location /admin/path/to/upload/ {
client_max_body_size 20M;
}
location /installer/other/path/to/upload/ {
client_max_body_size 20M;
}
Run Code Online (Sandbox Code Playgroud)
但它们不起作用(实际上我测试了很多组合,我很绝望地想着这个。
请帮助如果可以:我需要设置哪些设置才能使其工作?
非常感谢!
upload ×10
nginx ×3
ftp ×2
php ×2
automation ×1
debian ×1
deployment ×1
django ×1
files ×1
gunicorn ×1
iis-7 ×1
limitations ×1
provisioning ×1
timeout ×1
vagrant ×1
webdav ×1