将Nginx和ngx_small_light引入到Amazon EC2中,实时转换S3图片

画像转换通过在EC2上引入ngx_small_light来完成,实际图像是从在S3上进行网页托管并使用Nginx代理功能获取的(EC2作为反向代理和图像转换服务器工作)。如果已经在S3上通过网页托管提供图像服务,则可以通过将反向代理和图像转换服务器放置在S3的前端来增加图像转换功能。

由于我简单地尝试了一下,所以这篇文章是对该步骤的笔记。

ngx_small_light 的概述可以在这张幻灯片上更易懂。
⇒ 实战ngx_small_light入门 by Tatsuhiko Kubo【Speaker Deck】

环境搭建步骤

准备 EC2

这次我们使用了位于Quick Start页面顶部的这个Amazon Machine Image (AMI)。操作系统是Amazon Linux。

スクリーンショット 2015-11-19 14.27.43.png

关于创建实例的步骤,这里不再赘述。

安装 Nginx

由于之后需要集成ngx_small_light插件,因此Nginx将通过源代码安装而非yum。

创建用于Nginx的用户/组。

$ sudo useradd --shell /sbin/nologin nginx

应该在/etc/passwd和/etc/group文件中添加了nginx用户/组。

在构建Nginx时需要安装的软件

$ sudo yum install -y gcc
$ sudo yum install -y pcre pcre-devel
$ sudo yum install -y zlib zlib-devel

根据自己的情况,我证实以上的东西是可以的,但是我认为根据环境可能会有所不同,所以请根据Nginx构建时的错误信息安装所需的东西。顺便说一下,这次假设不使用SSL,因此没有安装openssl openssl-devel。

获取并安装Nginx软件包

在以下的链接中查找 Nginx 的稳定版本。目前版本是 1.8,在此进行安装。选择一个适当的目录进行操作(本例中选择 ~/work)。

$ cd ~
$ mkdir work
$ cd work
$ wget http://nginx.org/download/nginx-1.8.0.tar.gz
$ tar zxvf nginx-1.8.0.tar.gz
$ cd nginx-1.8.0
$ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx

如果成功配置,将显示如下摘要。

スクリーンショット 2015-11-19 15.17.01.png

进行编译和安装。

$ make 
$ sudo make install

Nginx的启动配置

创建一个新的/etc/init.d/nginx。

$ sudo touch /etc/init.d/nginx
$ sudo chmod +x /etc/init.d/nginx

在本次环境中,您可以通过打开上述的/etc/init.d/nginx文件并使用vi等编辑器,在https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/中复制和粘贴其中的内容后,进行如下编辑。

...

-nginx="/usr/sbin/nginx"
+nginx="/usr/local/nginx/sbin/nginx"

...

-NGINX_CONF_FILE="/etc/nginx/nginx.conf"
+NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

...

对Nginx的优化调整

考虑到 ngx_small_light,我建议还是做一下。我会创建一个新的 /etc/sysconfig/nginx 文件。

$ sudo touch /etc/sysconfig/nginx

我将写出下面的一句话。

export OMP_NUM_THREADS=1

我們也會增加工作進程的數量。

-worker_processes 1
+worker_processes 10

尝试启动Nginx。

$ sudo service nginx start

在浏览器中访问 EC2 的公共IP地址,如果显示如下内容,则表示操作正确。

undefined

顺便提一句,Nginx 的重新启动可以使用命令 $ sudo service nginx restart,停止可以使用命令 $ sudo service nginx stop,而要使配置文件的修改生效,则可以使用命令 $ sudo service nginx reload。

Nginx的自动启动配置

在启动 EC2 服务器时,自动启动 Nginx。

$ sudo chkconfig nginx on

以上就是Nginx安装完成的过程。

在安装 ngx_small_light 时需要重新构建 Nginx,但是先进行了 Nginx 单独的功能确认。

顺便提一下,Nginx的文档根目录、配置文件和日志都集中在 /usr/local/nginx 目录下。

安装ngx_small_light

ngx_small_light是用于图像转换的Nginx模块。它在GitHub上开源。
⇒ https://github.com/cubicdaiya/ngx_small_light
我使用的是最新版本v0.6.11进行编写。

由于假设本次只使用ImageMagic,因此不会安装Imlib2 GD,但如有需要,请参考上述Github的README或Wiki以及本帖末尾提供的参考文章进行安装。

获取和设置ngx_small_light

我会在适当的目录下工作(这次是 ~/work)。

$ cd ~/work
$ sudo yum install -y git
$ git clone https://github.com/cubicdaiya/ngx_small_light.git
$ sudo yum install -y ImageMagick ImageMagick-devel
$ cd ngx_small_light
$ ./setup

虽然已经安装了Git和ImageMagic,但是如果这些环境已经存在,则不需要执行这个步骤。另外,由于本次只使用ImageMagic,所以未安装Imlib2 GD。

一旦设置成功,将显示生成 config。

重新构建和重新安装Nginx。

$ cd ~/work/nginx-1.8.0
$ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/home/ec2-user/work/ngx_small_light/
$ make
$ sudo make install

请将 “/home/ec2-user/work/ngx_small_light/” 更改为已设置好 ngx_small_light 的目录路径。请根据您的环境进行调整。

如果以上没有问题,将重新启动Nginx。

$ sudo service nginx restart

让我们试着使用 ngx_small_light 来转换 S3 上的图像。

本次我们只是简单地尝试缩小JPEG图像。

我认为查阅维基百科可以找到关于 ngx_small_light 使用的详细方法。

我們將一個適當的圖像放在網頁主機的S3上。這次我們準備了一張1000×667像素大小的圖像。

undefined

假设S3上的URL如下所示。

请提供一张名为cat.jpg的照片,链接为http://hoge.s3-us-west-2.amazonaws.com/photo/cat.jpg。

我們打開 /usr/local/nginx/conf/nginx.conf 文件,並在處理 JPEG 圖像的請求時,設置圖片寬度縮小為 300 像素。

http {

    # ...

    server {

        # ...    

+        small_light on;
+        small_light_getparam_mode on;
+        small_light_pattern_define option dw=300,jpeghint=y;
+
+        location ~ ^/(photo/.+)$ {
+           set $path $1;
+
+           proxy_pass http://hoge.s3-us-west-2.amazonaws.com;
+
+           # jpeg 画像の場合のみ変換
+           if ($path ~ ".+\.jpg$") {
+               rewrite .* /$path?p=option break;
+           }
+
+           # jpeg 画像でない場合はそのまま流す
+           rewrite .* /$path break;
+        }

        # ...    

当进行修正后,需要重新加载Nginx配置。

$ sudo service nginx reload

我尝试在浏览器中访问EC2的公共IP。它被缩小了如下。

undefined

请留神。

如果使用ngx_small_light的查询模式(small_light_getparam_mode on)指定转换选项,则此Nginx服务器接收的所有HTTP请求都必须是图像(否则将返回HTTP 415错误即”不支持的媒体类型”)。

最后

我觉得 ngx_small_light 作为移动端图像转换工具,除了可以缩小图像,还可以进行图像合成以及转换为 WebP 格式,应用范围很广。我打算继续尝试一些其他方面的功能。

在实际运营中,由于担心图像转换所带来的负荷,我认为进一步使用类似于CloudFront或Akamai的内容分发网络(CDN)在前端上是一个好的选择。

我参考了一篇文章/幻灯片。

    • Nginxインストールメモ【Qiita】

 

    • Nginxをソースコードからインストール【Qiita】

 

    • ngx_small_light で動的に画像リサイズ【akishin999の日記】

 

    • [nginx]S3をバックエンドにngx_small_lightで画像を動的にリサイズ【Siguniang’s Blog】

 

    • 実践ngx_small_light入門 by Tatsuhiko Kubo【Speaker Deck】

 

    c2にngx_small_lightを使用して、画像のリサイズ(縮小・拡大)をする画像サーバを立てる的なお話【適当な感じでプログラミングとか!】
广告
将在 10 秒后关闭
bannerAds