为已安装的 Nginx 添加图片水印模块 时间: 2018-01-23 22:52 分类: 服务器 ####前言 之前给 Nginx 图片服务器做了简单的防盗链配置,但感觉还是不太靠谱,要是别人采集时是将图片也采集下载到本地,那么防盗链的做法将起不到作用了,所以想给图片服务器加一波水印功能。结果参照网上配置,很不幸的是模块未安装。 ####解决问题 自己编译安装过 Nginx 的的都知道,模块是在编译的时候以参数的时候添加的,也就是编译的过程中添加的,那么已经安装好的 Nginx 该如何添加模块? 好在前人早就遇到过这种问题了,网上一搜就能找到办法,在此我也只是记录一下自己动手操作的过程。 解决办法最终还是要下载 Nginx 源码重新编译,在编译的时候将要添加的模块添加进去,在这里我要加的模块是 `ngx_image_thumb`。下面一步一步地来动手操作: 1. 下载 Nginx 源码并解压 > /home\# wget http://nginx.org/download/nginx-1.9.6.tar.gz /home\# tar -zxvf nginx-1.9.6.tar.gz /home\# cd nginx-1.9.6 2. 下载`ngx_image_thumb`模块 > /home/nginx-1.9.6\# git clone https://github.com/oupula/ngx_image_thumb.git 3. 查看当前 Nginx 安装参数(确保重新编译的 Nginx 配置文件路径一致以及保留原先安装的模块) > /home/nginx-1.9.6\# nginx -V nginx version: nginx/1.4.6 (Ubuntu) built by gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) TLS SNI support enabled configure arguments: --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_spdy_module --with-http_sub_module --with-http_xslt_module --with-mail --with-mail_ssl_module 4. 如果之前一些依赖库没安装的话,可以先安装一下,在这里`ngx_image_thumb`模块需要的依赖库如下,以 Ubuntu 安装为例 > /home/nginx-1.9.6\# apt-get install libgd2-noxpm-dev libcurl4-openssl-dev libpcre3-dev 5. 添加`ngx_image_thumb`模块,编译 Nginx > /home/nginx-1.9.6\# ./configure --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_spdy_module --with-http_sub_module --with-http_xslt_module --with-mail --with-mail_ssl_module --add-module=ngx_image_thumb 注意最后面添加的`--add-module=ngx_image_thumb`这里就是我要添加的新的模块,由于我是在 Nginx 源码的目录里面 clone 的`ngx_image_thumb`模块,所以相当于和`configure`同级目录,所以直接写的`--add-module=ngx_image_thumb`,如果下载在其他地方,就用绝对路径。 在执行`./configure`的时候,可能会提示一些依赖库的错误: > ./configure: error: the HTTP XSLT module requires the libxml2/libxslt libraries. You can either do not enable the module or install the libraries. \# apt-get install libxml2 libxslt1-dev > ./configure: error: the HTTP image filter module requires the GD library. You can either do not enable the module or install the libraries. \# apt-get install libgd2-xpm libgd2-xpm-dev > ./configure: error: the GeoIP module requires the GeoIP library. You can either do not enable the module or install the library. \# apt-get install libgeoip-dev ...(其他的不一一列举了) 6. 接下来执行`make` > /home/nginx-1.9.6\# make 执行完毕后切记不要执行`make install`了,如果执行就将之前的 Nginx 覆盖了(有人可能会说,反正参数说明的都一样,覆盖就覆盖了吧,但如果配置文件覆盖了呢?这个我没测试,以防万一还是不要执行`make install`) 7. 此时编译完成,生成了 Linux 下的可执行文件 `nginx`,相当于 windows 上的 exe 文件,现在要做的就是替换掉原来的 `nginx` 可执行文件,和 windows 上面打补丁或者替换破解文件差不多,为确保安全,最好先备份下原先的 `nginx` > \# cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak \# cp ./objs/nginx /usr/local/nginx/sbin/ 如果是通过`apt-get install`或者`yum install`等命令安装的,可能上面的复制替换不起作用(当然了以绝对路径执行是没问题的,比如:`/usr/local/nginx/sbin/nginx`),因为通过这种方式安装的 Nginx,为了能够不用绝对路径执行 Nginx 命令,就会将`nginx`放置系统环境变量`PATH`中`/usr/sbin/`目录下,所以此时按照上面方法替换即可: > \# cp /usr/sbin/nginx /usr/sbin/nginx.bak \# cp ./objs/nginx /usr/sbin/ 如果 Nginx 正在运行,可能会提示: > cp: cannot create regular file ‘/usr/sbin/nginx’: Text file busy \# nginx -s stop \# cp ./objs/nginx /usr/local/nginx/sbin/ 先停止 Nginx 再执行即可。 8. 查看当前 Nginx 版本及模块信息: > \# nginx -V nginx version: nginx/1.9.6 built by gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) built with OpenSSL 1.0.1f 6 Jan 2014 TLS SNI support enabled configure arguments: --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_sub_module --with-http_xslt_module --with-mail --with-mail_ssl_module --add-module=ngx_image_thumb 可以看到 Nginx 版本已经升级成 1.9.6(之前做过一次对已安装的 Nginx 进行升级也是这个方法),并且`ngx_image_thumb`模块也成功安装。 ####总结 整个操作过程看起来比较麻烦,但思路还是比较清晰,记住如下几点即可:重新编译符合我们需求的 Nginx 版本,确保原先的 Nginx 配置不被替换,保留原先的功能模块。 ####补充 **`ngx_image_thumb`这个国产模块大家还是不要用得好,亲测水印无效果,issue 有人反映作者也没回答,最后改用`nginx-image-filter-watermark `成功添加水印。** 标签: nginx 图片水印
(๑•̀ㅁ•́ฅ) 看到后面笑喷了。。
我这想找个能调整水印透明度的,ngx_image_thumb 确实水印没效果,但就是不知道 nginx-image-filter-watermark 怎么调整透明度。这个透明度参数已经配置了image_filter_transparency on;╮(╯▽╰)╭