将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。
关于创建实例的步骤,这里不再赘述。
安装 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
如果成功配置,将显示如下摘要。
进行编译和安装。
$ 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地址,如果显示如下内容,则表示操作正确。
顺便提一句,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像素大小的圖像。
假设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。它被缩小了如下。
请留神。
如果使用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を使用して、画像のリサイズ(縮小・拡大)をする画像サーバを立てる的なお話【適当な感じでプログラミングとか!】