热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【译】Ngnix实现一个缓存和缩略处理的反向代理服务器

一两个月前,我决定从我的站点中移除Varnish,并用Nginx内置的缓存系统替代它。我本来已经在我的python站点上用了nginx来反向代理

一两个月前,我决定从我的站点中移除Varnish ,并用Nginx内置的缓存系统替代它。我本来已经在我的python站点上用了nginx来反向代理,所以摆脱Varnish意味着少了一个麻烦。我花了好几天时间阅读怎样配置nginx的缓存,翻遍了我的python站点的不同的配置文件(是的,很讽刺)。在阅读过程中我标记了一些有趣的nginx的模块,这中间就有 Image Filter module(图像过滤处理模块)。

我觉得结合nginx的反向代理,缓存和图像过滤处理三大模块来为我托管在S3上的图片来创建一个缩略图服务器会很优雅。如果你仔细的查看下面的(甚至整个站点的)标签,你就可以看到nginx实战了。

clipboard.png

在本文中,我将描述我是怎样配置nginx来有效安全的为S3上的图片产生缩略图。作为额外奖励,我也会描述我是怎样使用 Secure Links module (安全链接模块)来防止人们恶意使用该服务器产生缩略图。

准备开始

为了让不同部分能协同工作,你的nginx需要编译进图像滤波,代理和安全链接三个模块。你可以通过nginx –V 来检查你所具有的模块。如果你使用的Ubuntu(Debian也行),你可以很轻易的安装其它任意的nginx模块(apt-get install 命令)。

一旦nginx准备好了,我们可以开始配置nginx了。

配置

首先需要申明的是我们的代理缓存。这个申明位于nginx.conf文件的http部分并且描述了基于文件的缓存所在,该缓存将会存储我们产生的缩略图。因为一次缓存未命中即意味着要从S3服务器上获取完整的图并且改变它的大小,我们希望配置缓存足够大以使其能包含我们大部分的缩略图。对于我的站点,我估计200MB足够了。

为了确定你的缓存,把下面的代码添加到nginx配置文件的http部分的某个地方:

# Nginx will create a cache capable of storing 16MB of keys and 200MB of data.
proxy_cache_path /tmp/nginx-thumbnails levels=1:2 keys_zone=thumbnail_cache:16M inactive=60d max_size=200M;

现在我们需要说明两个服务器定义:一个缓存服务器和一个调整大小服务器。后者将作为S3的反向代理,产生并提供调整大小后的图像。缓存服务器位于调整大小服务器的前面,缓存并提供调整大小后的图像。虽然我不认为必须要两个服务器,因为我的站点访问量并不是特别大,但在谷歌了一下后,我看见的一些文章表明,就是应该这样。

缓存服务器

缓存服务器会暴露给公共访问(我的位于m.charlesleifer.com)。因为该服务器的唯一任务就是缓存从调整大小服务器获得的响应,所以配置相当简单。下面是我的配置:

server {listen 80;server_name m.charlesleifer.com;location / {proxy_pass http://localhost:10199;proxy_cache thumbnail_cache;proxy_cache_key "$host$document_uri$is_args$arg_key";proxy_cache_lock on;proxy_cache_valid 30d; # Cache valid thumbnails for 30 days.proxy_cache_valid any 15s; # Everything else gets 15s.proxy_cache_use_stale error timeout invalid_header updating;proxy_http_version 1.1;expires 30d;}
}

无论何时缓存服务器得到一个请求,“thumbnail_cache”将首先被检测。如果没找到匹配项,那就将请求转发至调整大小服务器(运行在本地localhost)。它返回有效的响应,缓存服务器将缓存该响应30天,其它任何东西都只缓存15秒。

调整大小的服务器

所有有趣的事情都在调整大小服务器。它的任务是从S3上获得图片并基于URL上的参数实时调整图片大小。另外,该服务器会检查每个请求的安全秘钥以防止其他人随意产生缩略图。

因为该服务器配置有几个不同的部分,所以让我们从我们已经见过的部分开始:代理

server {listen 10199;server_name localhost;set $backend 'your.s3.bucket_name.s3.amazonaws.com';resolver 8.8.8.8; # Use Google for DNS.resolver_timeout 5s;proxy_buffering off;proxy_http_version 1.1;proxy_pass_request_body off; # Not needed by AWS.proxy_pass_request_headers off;# Clean up the headers going to and from S3.proxy_hide_header "x-amz-id-2";proxy_hide_header "x-amz-request-id";proxy_hide_header "x-amz-storage-class";proxy_hide_header "Set-COOKIE";proxy_ignore_headers "Set-COOKIE";proxy_set_header Host $backend;proxy_method GET;
}

这里除了告诉我们该服务器如何与S3通讯外并没有多余的其他内容,所以我们继续看下一部分。接下来要配置的是nginx的图像滤波模块。只需要几个指令,其中一些我们会定义到服务器级别。

下面是代理设置,添加如下的图像滤波模块:

server {# ...image_filter_jpeg_quality 85; # Adjust to your preferences.image_filter_buffer 12M;image_filter_interlace on;
}

最后,我们定义一个代码块,完成如下功能:

  1. 检查形式合法的URL
  2. 校验请求的签名
  3. 从URL中提取图片大小参数
  4. 从S3获得图像并把它载入 image_filter_buffer
  5. 调整图片大小并响应

第二项相当有趣。一篇类似的文章的作者使用Lua来校验请求的签名,但那样好像步骤比较繁琐。 Nginx的 secure_link 扩展相当容易使用。

secure_link模块原理是:用被请求的图片的URL和只有你的app知道的密钥串连接起来的串来产生一个哈希(hash)。由于hash长度扩展,我们最后附加我们的密钥而不是预先考虑它。因为你知道秘钥,所以无论何时你想在你的应用中展示图片缩略图时你都可以产生有效的hash。

下面是配置的最后一部分:

server {# ...error_page 404 =404 /empty.gif;location ~ ^/t/([\d-]+)x([\d-]+)/(.*) {secure_link $arg_key; # The hash is stored in the `key` querystring arg.secure_link_md5 "$uri my-secret-key";if ($secure_link = "") {# The security check failed, invalid key!return 404;}set $image_path '$3';image_filter resize $1 $2;proxy_pass http://$backend/$3;}
}

这就是所有的。

产生hash

如果你使用python,下面是我写的代码用以在特定URI下产生hash:

import base64
import hashlibdef thumbnail_url(filename, width, height='-'):uri = '/t/%sx%s/%s' % (width, height, filename)md5_digest = hashlib.md5(uri + ' my-secret-key').digest()key = base64.b64encode(md5_digest)# Make the key look like Nginx expects.key = key.replace('+', '-').replace('/', '_').rstrip('=')return 'http://m.charlesleifer.com%s?key=%s' % (uri, key)

感谢阅读

感谢你花时间阅读这篇文章,我希望你找到了乐趣。请留下评论,我会尽力回答。如果你发现了我上面的说明有什么错误也请让我知道,我会更新本文。



推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • PHPMailer邮件类邮件发送功能的使用教学及注意事项
    本文介绍了使用国外开源码PHPMailer邮件类实现邮件发送功能的简单教学,同时提供了一些注意事项。文章涵盖了字符集设置、发送HTML格式邮件、群发邮件以及避免类的重定义等方面的内容。此外,还提供了一些与PHP相关的资源和服务,如传奇手游游戏源码下载、vscode字体调整、数据恢复、Ubuntu实验环境搭建、北京爬虫市场、进阶PHP和SEO人员需注意的内容。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • Windows 7 部署工具DISM学习(二)添加补丁的步骤详解
    本文详细介绍了在Windows 7系统中使用部署工具DISM添加补丁的步骤。首先需要将光驱中的安装文件复制到指定文件夹,并进行挂载。然后将需要的MSU补丁解压并集成到系统中。文章给出了具体的命令和操作步骤,帮助读者完成补丁的添加过程。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文介绍了在Ubuntu下制作deb安装包及离线安装包的方法,通过备份/var/cache/apt/archives文件夹中的安装包,并建立包列表及依赖信息文件,添加本地源,更新源列表,可以在没有网络的情况下更新系统。同时提供了命令示例和资源下载链接。 ... [详细]
author-avatar
KisS汐唲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有