昨晚和前21v的同事聊天,说到我离职后一些技术上的更新。其中有个给某大客户(游戏下载类)的特殊需求设计,因为文件大小差距很大——估计是大版本和补丁的区别——又走的是同一个域名,而squid在响应比较大的文件时,尤其是初次下载的时候,性能比较差,所以拆成两组服务器,squid服务于较小的文件,通过pull方式从peer层获取,nginx服务于较大的文件,通过push方式由peer层分发同步。外部发布域名一律解析到squid服务器组上,请求透传到peer层的nginx,nginx分析这个url的content-length,如果大于阈值,则不返回文件,而是302到nginx服务器组的独立域名下的相应url去。
这里要注意的是,nginx的内部变量里有一个$content-length,是不能用在这里的,官方wiki是这么解释这个变量的:”This variable is equal to line Content-Length in the header of request”。可见,这个变量是请求头的内容,一般见于POST请求用来限定POST信息的长度;而不是我们需要的响应头的内容。
老东家最后是修改了nginx的src完成的功能。不过我想,这里其实可以使用http_perl_module完成的。而且还可以扩展302跳转的功能,把独立域名改成直接通过remote_addr定向到最近IP上。
因为手头没有服务器,以下内容都是凭空想象,看官们注意…… 首先是nginx.conf里的配置:
http {
perl_modules perl;
perl_require SizeDiff.pm;
server {
listen 80;
server_name dl.gamedomain.com;
location / {
perl SizeDiff::handler;
}
}
}
然后是perl/SizeDiff.pm,如下:
package SizeDiff;
use Nginx::Simple;
sub main {
my $self = shift;
my $webroot = '/www/dl.gamedomain.com/'
return HTTP_NOT_ALLOWED unless $self->uri =~ m!^(/.+/)[^/]+$!;
my $file = $webroot . $1 . $self->filename;
my @filestat = stat($file) or return HTTP_NOT_FOUND;
my $filesize = $filestat[7];
if ( $filesize < 8 * 1024 * 1024 ) {
return OK;
} else {
$self->location('http://bigfile.cdndomain.com'.$self->uri);
}
};
1
大体应该就是上面这样。 之前还考虑过如果不是push方式,可以在perl里考虑使用LWP获取header,不过仔细想想:第一,万一源站开启了chunked获取不到content-length呢?第二,就算可以,如果一个文件是1个G,那再去下载这1个G的文件下来,这个perl进程肯定挂了——官方wiki里可是连DNS解析时间都认为太长……也就是说,这个设想不适合在peer层,而是在loadbalance的角色,通过lwp的header结果,小文件upstream到后端的squid,大文件location到另外的nginx。 另一个可改进的地方,就是self->location前面,可以结合Net::IP::Match::Regexp模块或者自己完成的类似功能,来针对self->remote_addr选择最近的服务器组IP,最后返回location(“http://$ip$uri”)这样。
相关推荐
nginx上传文件大小报错500的解决办法 采用nginx作反向代理,出现了一个诡异的问题,小文件可以提交,大文件会报500内部错误。这个是什么原因导致的呢? 查wiki可知,上传文件大小相关的有三个配置 client_body_...
配置Nginx以区分PC或手机访问不同的域名,是网站开发和运维中常见的需求,用于提供更为个性化的用户体验,尤其是在响应式网站设计和移动优先策略中具有重要意义。 本文首先介绍了基于HTTP_USER_AGENT来区分不同设备...
Nginx 报 415 调整文件下载大小限制nginx代理nginx时,前端用户请求下载文件, nginx代理会先从后端nginx拿到文件并缓存到本地,然后响应
通过以上步骤,我们成功地使用 OpenResty + Nginx + Lua 构建了一个支持文件上传和获取的文件服务器。这种架构不仅提高了服务器的响应速度,还极大地简化了开发过程,为后续扩展提供了良好的基础。
在本文中,我们将深入探讨如何配置Nginx以支持文件上传功能,特别是使用upload_module和upload_progress_module这两个第三方模块。Nginx是一个高效且灵活的HTTP服务器和反向代理,由Igor Sysoev开发,它支持模块化的...
本文将详细介绍如何使用Nginx实现本地文件的映射,并探讨其应用场景和配置方法。 ### 1. Nginx 的基本概念 Nginx 是一个异步事件驱动的Web服务器,它支持多种网络协议,如HTTP、HTTPS、SMTP、POP3和IMAP。Nginx...
Nginx 配置文件 nginx.conf 详解 Nginx 配置文件 nginx.conf 是 Nginx 服务器的核心配置文件,它控制着 Nginx 服务器的行为和性能。在这个配置文件中,我们可以设置服务器的用户和组、工作进程数、错误日志、进程...
Nginx和tomcat上传文件大小限制修改,Ngnix和tomcat默认对上传文件大小有限制。
在Windows平台上,使用Nginx作为Web服务器时,配置文件的管理和更新是日常运维工作的重要环节。当Nginx的配置文件被修改后,通常需要手动执行`nginx -s reload`命令来使改动生效,这在频繁调整配置时可能会显得繁琐...
Nginx日志描述 通过访问日志,你可以得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息;通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。因此,将日志好好利用,你可以得到很多有价值的...
【Nginx 文件资源下载详解】 Nginx 是一款高性能的 Web 和反向代理服务器,以其高并发、轻量级和稳定性的特点在 IT 行业中广泛应用。它不仅可以作为静态文件服务器,处理 HTML、CSS、JavaScript 等资源的下载请求,...
在`nginx.service`文件中,添加如下内容,确保路径和指令正确: ```ini [Unit] Description=Nginx HTTP Server After=network.target [Service] User=nginx Group=nginx ExecStart=/usr/local/nginx/sbin/nginx ...
确保 Nginx 知道静态文件的存储位置,可以在相应 `location` 中使用 `root` 指令: ```nginx location ~ .*\.(html)$ { default_type 'text/html'; root "/usr/local/openresty/nginx/html"; } ``` `root` 指令...
在标题“notepad++编辑nginx配置文件支持高亮”中,我们关注的是如何在Notepad++中实现对Nginx配置文件的语法高亮显示,这将极大提升开发者的阅读和编写效率。 Nginx是一款高性能的HTTP和反向代理服务器,其配置...
Nginx配置文件原始版本,这是刚下来的Nginx服务器最原始的版本内容,下载覆盖即可。
nginx配置 nginx配置文件参考 nginx配置文件参考
在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络. #运行用户 user www-data; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 error_log /var/log/...
创建一个处理文件上传的lua脚本,例如`upload_handler.lua`,这个脚本会接收Nginx传递的文件信息,并进行处理,如保存文件、验证文件大小和类型等。示例脚本可能如下: ```lua local function save_file(file) ...