小知识:Nginx中使用Lua脚本与图片的缩略图处理的实现

环境搭建

Ubuntu 16.04

安装环境的脚本

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash
aptget update
aptget install gcc g++ make wget openssl libssl-dev vim bzip2 -y
tar xzvf LuaJIT-2.0.4.tar.gz
cd LuaJIT-2.0.4
make install PREFIX=/usr/local/luajit
echo export LUAJIT_LIB=/usr/local/luajit/lib>>/etc/bashrc
echo export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0>>/etc/bashrc
source /etc/bashrc
cd /root/nginx_lua  # 注意你把文件文件放在哪里就去哪里!!!
tar xf LuaJIT-2.0.4.tar.gz
tar -xzvf v0.10.9rc7.tar.gz -C /usr/local/src   # lua-nginx-module-0.10.9rc7
tar -xzvf v0.3.0.tar.gz -C /usr/local/src
tar jxvf pcre-8.42.tar.bz2 -C /usr/local/src/
tar zxvf zlib-1.2.11.tar.gz -C /usr/local/src/
tar -xzvf nginx-1.16.1.tar.gz -C /usr/local/src
ln -s /usr/local/nginx/sbin/nginx   /usr/bin/nginx
cd  /usr/local/src/nginx-1.16.1
./configure –prefix=/usr/local/nginx –add-module=/usr/local/src/ngx_devel_kit-0.3.0 –add-module=/usr/local/src/lua-nginx-module-0.10.9rc7 –with-http_ssl_module –with-pcre=/usr/local/src/pcre-8.42 –with-zlib=/usr/local/src/zlib-1.2.11 –with-http_stub_status_module –without-http-cache –with-http_gzip_static_module
make -j2
make install
cp /usr/local/luajit/lib/libluajit-5.1.so.2 /usr/local/lib/
echo “/usr/local/lib”  >>/etc/ld.so.conf
/sbin/ldconfig
mv  /usr/local/nginx/conf/nginx.conf  /tmp
cd /root/nginx_lua   # 注意你把文件文件放在哪里就去哪里!!!
cp   nginx.conf     /usr/local/nginx/conf/
cp  -r  lua  /usr/local/nginx/conf/
nginx
#curl 127.0.0.1/hello
#curl 127.0.0.1/lua

nginx.conf

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
worker_processes  1;
events {
worker_connections  1024;
}
http {
include       mime.types;
default_type  application/octet-stream;
sendfile        on;
keepalive_timeout  65;
server {
listen       80;
server_name  localhost;
location / {
root   html;
index  index.html index.htm;
}
location /hello {
default_type text/plain;
content_by_lua ngx.say(“hello,lua”);
}
location /lua {
default_type text/html;
content_by_lua_file conf/lua/test.lua;
}
error_page   500 502 503 504  /50x.html;
location = /50x.html {
root   html;
}
}
}

test.lua

?
1
ngx.say(“hello lua”);

启动nginx:

?
1
nginx

%小知识:Nginx中使用Lua脚本与图片的缩略图处理的实现-猿站网-插图

%小知识:Nginx中使用Lua脚本与图片的缩略图处理的实现-1猿站网-插图

虽然都是hello lua ,但是我也不知道为什么字体显示的竟然不同

Ubuntu 18.04

在Ubuntu18.04中,其它的包不变,与上面16.04中一致,要变动 lua-nginx-module 包的版本,变动为lua-nginx-module-0.10.14rc7

?
1
2
3
4
5
6
tar -xzvf v0.10.14rc7.tar.gz -C /usr/local/src   # lua-nginx-module-0.10.14rc7
./configure –prefix=/usr/local/nginx –add-module=/usr/local/src/ngx_devel_kit-0.3.0 –add-module=/usr/local/src/lua-nginx-module-0.10.14rc7 –with-http_ssl_module –with-pcre=/usr/local/src/pcre-8.42 –with-zlib=/usr/local/src/zlib-1.2.11 –with-http_stub_status_module –without-http-cache –with-http_gzip_static_module

如果出现如下情况,那么就要替换 lua-nginx-module 的使用版本啦

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
devel_kit-0.3.0/src -I /home/usr/ngx_devel_kit-0.3.0/src -I /home/usr/ngx_devel_kit-0.3.0/objs -I objs/addon/ndk -I /usr/local/include/luajit-2.0 \
-o objs/addon/src/ngx_http_lua_req_body.o \
/home/usr/lua-nginx-module-0.10.8/src/ngx_http_lua_req_body.c
/home/usr/lua-nginx-module-0.10.8/src/ngx_http_lua_headers.c: In function ngx_http_lua_ngx_req_raw_header:
/home/usr/lua-nginx-module-0.10.8/src/ngx_http_lua_headers.c:151:15: error: incompatible types when assigning to type ngx_buf_t * {aka struct ngx_buf_s *} from type ngx_chain_t {aka struct ngx_chain_s}
b = hc->busy[i];
^
/home/usr/lua-nginx-module-0.10.8/src/ngx_http_lua_headers.c:227:15: error: incompatible types when assigning to type ngx_buf_t * {aka struct ngx_buf_s *} from type ngx_chain_t {aka struct ngx_chain_s}
b = hc->busy[i];
^
objs/Makefile:1465: recipe for target objs/addon/src/ngx_http_lua_headers.o failed
make[1]: *** [objs/addon/src/ngx_http_lua_headers.o] Error 1
make[1]: *** Waiting for unfinished jobs….
make[1]: Leaving directory /home/usr/nginx-1.17.10
make: *** [build] Error 2
Makefile:8: recipe for target build failed

%小知识:Nginx中使用Lua脚本与图片的缩略图处理的实现-2猿站网-插图

lua-nginx-module 各版本的下载地址,这个包的版本不同会导致各种错误,目前我调试啦16.04和18.04,这包如果实在装不上,就多试一下其它版本的有奇效

https://github.com/openresty/lua-nginx-module/tags

图片缩略图

图片缩略图的原理就是使用,操作系统的处理图片的convert命令

在调试图片缩略图前先在系统内测试一下如下命令
?
1
2
# /home/3.jpg  图片地址                          # /home/3_100x100.jpg  切割后的图片存放地址
convert /home/3.jpg -resize 100×100 +profile “*” /home/3_100x100.jpg

一般是有的这个命令, 但是也有部分会出现 bash: convert: command not found 出现这个也不要慌,使用如下命令进行安装

?
1
apt-get install imagemagick -y

好啦进入正题, 开始先编写lua脚本

ImageResizer.lua

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
local ext =  ngx.var.ext
local filepath_i = ngx.var.request_filepath
local filepath = filepath_i .. “.” .. ext
local width = ngx.var.width
local height = ngx.var.height
local command = “convert ” .. filepath .. ” -resize ” .. width .. “x” .. height .. ” +profile \”*\” ” .. filepath_i .. “_” .. width .. “x” .. height .. “.” .. ext;
os.execute(command);
— ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓   
–这个方法是在lua脚本里面直接读取切好的缩略图,读取完通过 ngx.say 返回二进制
local filename = filepath_i .. “_” .. width .. “x” .. height .. “.” .. ext;
local photo_size = io.open(filename,”rb”)
local photo_data_size = photo_size:read(“*a”);
photo_size:close();
ngx.say(photo_data_size);
— ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
— 如果不想在lua中读取图片的话,使用 ngx.exec(ngx.var.request_uri);
— 这个表示重新请求这个地址  /xxx/1_100x100.jpg
–ngx.exec(ngx.var.request_uri);

nginx.conf

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
user root; 
worker_processes  1;
events {
worker_connections  1024;
}
http {
include       mime.types;
default_type  application/octet-stream;
sendfile        on;
keepalive_timeout  65;
server {
listen       80;
server_name  localhost;
location / {
root   html;
index  index.html index.htm;
}
location /hello {
default_type text/plain;
content_by_lua ngx.say(“hello,lua”);
}
location /lua {
default_type text/html;
content_by_lua_file conf/lua/test.lua;
}
location ~* /photo/(.*)_(\d+)x(\d+)\.(jpg|png|jpeg|gif|JPG|PNG|JPEG|GIF)$ {
root /;
if (!-f $request_filename) {
lua_code_cache on;
set $request_filepath /$1;
set $width $2;
set $height $3;
set $ext $4;
# 加载外部 Lua 文件   注意!!! 这个文件因为要切割图片需要权限
# 加载外部 Lua 文件   注意!!! 这个文件因为要切割图片需要权限
# 加载外部 Lua 文件   注意!!! 这个文件因为要切割图片需要权限
content_by_lua_file conf/lua/ImageResizer.lua;  #加载外部 Lua 文件   注意!!! 这个文件需要权限
}
}
location /photo/ {
alias /;
}
error_page   500 502 503 504  /50x.html;
location = /50x.html {
root   html;
}
}
}

编写完之后

重启nginx

?
1
nginx -s reload

访问

http://127.0.0.1/photo/home/3.jpg   # 原图

http://127.0.0.1/photo/home/3_100x100.jpg   # 缩略图

文中使用的文件 nginx_lua.rar 

到此这篇关于Nginx中使用Lua脚本与图片的缩略图处理的实现的文章就介绍到这了,更多相关Nginx使用Lua脚本处理缩略图内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/lxb_wyf/article/details/123548400

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:Linux上创建、列出、删除Docker容器方法总结

2023-3-18 2:29:24

建站知识

小知识:电脑意外关机后VMware中linux不能联网问题的解决方法

2023-3-18 2:37:35

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索