Nginx 와 Lua 를 사용 하여 그림 webp 압축 처리
7987 단어 건설 의 길
다음은 본론 으로 들 어 갑 니 다.
libwebp 설치
wget "http://downloads.webmproject.org/releases/webp/libwebp-0.6.0-linux-x86-64.tar.gz"
tar --strip-components 1 -xzvf libwebp*.gz -C /usr/local
설치 성공 여부 테스트
cwebp -q 75 test.png -o test.png.webp
nginx 에 lua 모듈 추가
나 는 원래 nginx 를 설 치 했 기 때문에 사용 을 중단 하기 도 불편 하기 때문에 nginx 에 lua 모듈 을 추가 할 수 밖 에 없다.nginx 를 새로 설치 한 학생 이 라면 OpenResty 를 직접 설치 하 는 것 을 권장 합 니 다. 그 안에 nginx 와 lua 가 통합 되 어 있 습 니 다.다음 설치 시작:
cd /root
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.11.zip
unzip v0.10.11.zip
wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.zip
unzip v0.3.0.zip
wget http://luajit.org/download/LuaJIT-2.0.5.zip
unzip LuaJIT-2.0.5.zip
cd LuaJIT-2.0.5
make
make install PREFIX=/usr/local/luajit
cat > /etc/ld.so.conf.d/luajit.conf<
저 는 yum 으로 설 치 된 nginx 이기 때문에 현재 nginx 버 전 을 보고 다시 컴 파일 합 니 다.
nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
그래서 1.14.0 버 전 다운로드:
$ wget http://nginx.org/download/nginx-1.14.0.tar.gz
$ tar xvzf nginx-1.14.0.tar.gz
그리고 다시 컴 파일 합 니 다.
cd nginx-1.14.0
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-module=/root/lua-nginx-module-0.10.11 --add-module=/root/ngx_devel_kit-0.3.0
$ make # make install,
# nginx
$ cp /usr/sbin/nginx /usr/sbin/nginx.bak
# nginx
$ cp objs/nginx /usr/sbin/nginx
# nginx
$ sudo systemctl restart nginx.service
그림 압축 설정
새 웹 p. lua 파일
function file_exists(name)
local f=io.open(name,"r")
if f~=nil then io.close(f) return true else return false end
end
local newFile = ngx.var.request_filename;
local originalFile = newFile:sub(1, #newFile - 5); -- .webp
if not file_exists(originalFile) then --
ngx.exit(404);
return;
end
local cmdstr = "cwebp -q 20 " .. originalFile .. " -o " .. newFile; -- webp , 20, 90%
cmdstr = string.gsub(cmdstr,"%$","\\$"); -- dollar
os.execute(cmdstr);
if file_exists(newFile) then -- ( )
ngx.exec(ngx.var.uri) -- Internal Redirect
else
ngx.exit(404)
end
파일 이름 에 $기호 가 있 으 면
img. conf 설정 을 수정 하여 server 에 추가 합 니 다.
# webp
location ~* ^(.+\.(jpg|jpeg|gif|png))\.webp$ {
set $webp_root /mnt/www/img;
root $webp_root;
set $filename $webp_root$uri;
if (!-f $filename) {
set $request_filepath $webp_root$1;
content_by_lua_file "/etc/nginx/conf.d/webp.lua";
}
}
nginx 를 다시 시작 하면 접근 할 수 있 습 니 다.
후속
위의 조작 을 통 해 우 리 는 마침내 웹 p 압축 을 사용 할 수 있 게 되 었 다.그러나 안 타 깝 게 도 webp 의 google 기준 은 우리 의 그림 이 위 챗 애플 릿 에 사용 되 어야 하기 때문에 아이 폰 의 위 챗 애플 릿 에 내 장 된 브 라 우 저 는 webp 형식 을 지원 하지 않 습 니 다.그래서 웹 p 를 포기 할 수 밖 에 없 었 습 니 다. 다음은 Graphics Magick 압축 방식 으로 대 체 했 습 니 다.
GraphicsMagick 설치
wget https://nchc.dl.sourceforge.net/project/graphicsmagick/graphicsmagick/1.3.31/GraphicsMagick-1.3.31.tar.xz
xz -d GraphicsMagick-1.3.31.tar.xz
tar -xvf GraphicsMagick-1.3.31.tar
cd GraphicsMagick-1.3.31
./configure
make
make install
lua 파일 수정
function file_exists(name)
local f=io.open(name,"r")
if f~=nil then io.close(f) return true else return false end
end
local gmReqFile = ngx.var.request_filename; --
local originalFile = string.gsub(gmReqFile, "gm/",""); -- gm
local gmDir = string.match(originalFile, "(.+)/[^/]*%.%w+$") .. "/gm"; -- gm
--local imgName = string.match(originalFile, ".+/([^/]*%.%w+)$"); --
local imgName = string.match(originalFile, ".+/([^/]*)%.%w+$"); -- ,
local gmFile = gmDir .. "/" .. imgName .. ".jpg"; -- , jpg
if file_exists(gmFile) then --
ngx.exec(string.gsub(ngx.var.uri, "png","jpg"))
--ngx.exec(ngx.var.uri)
end
if not file_exists(originalFile) then --
ngx.exit(404);
return;
end
local response = os.execute("cd " .. gmDir) -- gm
if response ~= 0 then
os.execute("mkdir -p " .. gmDir);
end
local cmdstr = "gm convert -quality 75% " .. originalFile .. " " .. gmFile; -- 75 % , , ,30% 90%
cmdstr = string.gsub(cmdstr,"%$","\\$"); -- dollar
os.execute(cmdstr);
if file_exists(gmFile) then -- ( )
ngx.exec(string.gsub(ngx.var.uri, "png","jpg"))
--ngx.exec(ngx.var.uri)
else
ngx.exit(404)
end