分类 默认分类 下的文章

文章来源:https://blog.csdn.net/revitalizing/article/details/55505853

必要工具库
一、libgd的安装
export LD_LIBRARY_PATH=/Path/to/libgd.so:$LD_LIBRARY_PATH
当然也还有更简单的方法,直接yum安装也行,自己配置好yum源,然后:
yum install gd-devel pcre-devel libcurl-devel
因为libcurl也是需要的一部分,所以一起安装。

二、nginx with-http_image_filter_module模块安装
编辑安装nginx的时候需要加上这些参数
--with-http_image_filter_module --with-pcre=../pcre-8.36

使用:
一般情况下,nginx一般都需要用到正则表达式,所以对于图片处理器pcre就更不能少了,如果有pcre,我们的配置就可以写成下面这样:

    #图片处理,固定返回最大长边尺寸
    location ~* /(.+)\.(jpg|gif|png)$ {
        access_log   off;
        expires      30d;
#根据给定的长宽生成缩略图
        image_filter resize 800 800;
#原图最大2M,要裁剪的图片超过2M返回415错误,需要调节参数image_filter_buffer 
        image_filter_buffer 8M;  
        image_filter_interlace on;
        image_filter_jpeg_quality 95;
        image_filter_sharpen 100;
        image_filter_transparency on;
#error_page  415      /images/notfound.jpg;
        try_files /$1.$2  /notfound.jpg; 
    }

    #图片处理,支持_1x1.jpg这样的自定义尺寸
    location ~* /(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ {
        access_log   off;
        expires      30d;
        set $w $2;
        set $h $3;
        if ($h = "0") {
            rewrite /(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ /$1 last;
        }
        if ($w = "0") {
            rewrite /(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ /$1 last;
        }
        #根据给定的长宽生成缩略图
        image_filter resize $w $h;
        #原图最大2M,要裁剪的图片超过2M返回415错误,需要调节参数image_filter_buffer 
        image_filter_buffer 8M;  
        image_filter_interlace on;
        image_filter_jpeg_quality 95;
        image_filter_sharpen 100;
        image_filter_transparency on;
        #error_page  415      /images/notfound.jpg;
        try_files /$1  /notfound.jpg; 
    }

访问处理后的图片:
http://xxxx.xxx.xxx/test.jpg >> http://xxxx.xxx.xxx/test.jpg_500x200.jpg

各参数的注释:

image_filter off;
#关闭模块

image_filter test;
#确保图片是jpeg gif png否则返415错误

image_filter size;
#输出有关图像的json格式:如下显示{ "img" : { "width": 100, "height": 100, "type": "gif" } } 出错显示:{}

image_filter rotate 90|180|270;
#旋转指定度数的图像,参数可以包括变量,单独或一起与resize crop一起使用。

image_filter resize width height;
#按比例减少图像到指定大小,公减少一个可以另一个用"-"来表示,出错415,参数值可包含变量,可以与rotate一起使用,则两个一起生效。

image_filter crop width height;
#按比例减少图像比较大的侧面积和另一侧多余的载翦边缘,其它和rotate一样。没太理解

image_filter_buffer 10M;
#设置读取图像缓冲的最大大小,超过则415错误。

image_filter_interlace on;
#如果启用,最终的图像将被交错。对于JPEG,最终的图像将在“渐进式JPEG”格式。

image_filter_jpeg_quality 95;
#设置变换的JPEG图像的期望质量。可接受的值是从1到100的范围内。较小的值通常意味着既降低图像质量,减少传输数据,推荐的最大值为95。参数值可以包含变量。

image_filter_sharpen 100;
#增加了最终图像的清晰度。锐度百分比可以超过100。零值将禁用锐化。参数值可以包含变量。

image_filter_transparency on;
#定义是否应该透明转换的GIF图像或PNG图像与调色板中指定的颜色时,可以保留。透明度的损失将导致更好的图像质量。在PNG的Alpha通道总是保留透明度。

Nginx图片处理的优缺点

优点
操作简单。通过简单配置,省去了后端裁剪程序的复杂性。
实时裁剪。可以实时访问在线裁剪图片。
灵活性强。后端程序裁剪图片时需要知道裁剪图片的尺寸和质量,使用nginx裁剪可以实时裁剪任意尺寸的图片。
不占用硬盘空间。

缺点
消耗CPU和内存,访问量大的时候就会给服务器带来很大的负担。(可以通过使用Nginx缓存和缓存服务器来解决)

功能不是很强大,支持的处理图片类型只包括JPEG, GIF, PNG, or WebP

PC:宝塔用户nginx是安装了以上模块的,所以可以直接增加配置代码就可以使用了

遇到这个问题的时候在网上找资料,修改配置,重启。。。搞了大半天。

add_header 的使用有些坑你一定会踩到。。。

add_header 之后每遇到{}的时候,在{}之前的所有add_header都会无效,另外,如果最终响应是返回4xx的错误时,所有的add_header均无效。

记录一下,最终的配置,Access-Control-Allow-Headers 的值是每个人的不一样的,看你自己需要允许哪些http_参数都需要添加到这个里面。

error_page   405 =200 $uri;

location / {
        add_header Access-Control-Allow-Origin $http_origin;
        add_header Access-Control-Allow-Credentials 'true';
        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
        add_header Access-Control-Allow-Headers 'Content-Type,Auth-Role,Auth-Client,Auth-Token';
        add_header Access-Control-Expose-Headers 'Content-Length,Content-Range';
        if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin $http_origin;
                add_header Access-Control-Allow-Credentials 'true';
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Allow-Headers 'Content-Type,Auth-Role,Auth-Client,Auth-Token';
                add_header Access-Control-Expose-Headers 'Content-Length,Content-Range';
                add_header Content-Length 0;
                return 204;
        }
        if (!-e $request_filename) {
                rewrite  ^(.*)$  /index.php?route=$1  last;
                break;

        }
}

常见的 MySQL 数据备份方式有,直接打包复制对应的数据库或表文件(物理备份)、mysqldump 全量逻辑备份、xtrabackup 增量逻辑备份等。

常见的数据存储方式有,本机存储、FTP 上传到远程服务器、云存储(如阿里云OSS、七牛云存储等)、甚至本地也行。

我们可能不想每次都手动去备份,也不想每次都那么耗时间的去下载,也不想就放在服务器上丢了,因为我们需要异地备份。那我们可以尝试,写个脚本定时备份数据库,然后自动上传到指定服务器或云存储。

这里,我们说说 Linux 服务器下备份 MySQL 并上传到七牛云存储的方式。

准备工作

•Linux 系统

•crontab 服务

需保证 crond 服务处于启动&自启动状态。

•gzip 命令

需系统能正常执行 gzip 命令,用于压缩文件。

•mysqldump 命令

需系统能正常执行 mysqldump 命令,用于逻辑备份数据。mysqldump 备份的数据,系由可执行的 SQL 组成,不存在版本不兼容的问题。

•qshell 工具

qshell 是七牛云官方利用七牛文档上公开的 API 实现的一个方便开发者测试和使用七牛 API 服务的命令行工具。

具体文档和下载地址: https://developer.qiniu.com/kodo/tools/1302/qshell

•七牛云账号

存储数据的前提当然是先有一个七牛的账号,七牛对个人提供10G的免费存储空间,可供我们个人使用。注册地址:
https://portal.qiniu.com/signup?code=3looatwobaxci

•七牛存储空间

有了七牛云的账号后,还需在控制台手动创建一个空间(bucket)来存放数据。

qshell 配置

我们从官方地址中下载的 qshell 是个包含支持多个系统平台的压缩包,选择我们对应系统的那个二进制文件,赋予其可执行权限。也可以放置到 /usr/local/bin/ 等目录下,方便直接调用 qshell 命令。

配置七牛账号,ak、sk 在七牛云控制台 > 个人中心 > 密钥管理内。
qshell account ak sk

该命令会将 ak/sk 账号写入 ~/.qshell/account.json,此后就不用再配置了。

我们这里用的 qshell 命令是 rput,即以分片上传的方式上传一个文件,使用文档:

https://github.com/qiniu/qshell/blob/master/docs/rput.md
qshell rput true

qshell 的其他详细功能使用,可自行参考其文档。

#!/bin/sh
# mysql data backup script
#
# use mysqldump --help,get more detail.
dbname=your_dbname
user=your_db_username
password=your_db_password
bakDir=/opt/backup/sql
logFile=/opt/backup/mysqlbak.log
datetime=`date +%Y%m%d%H%M%S`
keepDay=7
echo "-------------------------------------------" >> $logFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $logFile
echo "--------------------------" >> $logFile
cd $bakDir
bakFile=$dbname.$datetime.sql.gz
mysqldump -u$user -p$password $dbname | gzip > $bakFile
echo "数据库 [$dbname] 备份完成" >> $logFile
echo "$bakDir/$bakFile" >> $logFile
echo "开始上传备份文件至七牛云存储" >> $logFile
/usr/local/bin/qshell rput <Bucket> database/$bakFile $bakFile -w | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" >> $logFile 2>&1
echo "删除${keepDay}天前的备份文件" >> $logFile
find $bakDir -ctime +$keepDay >> $logFile
find $bakDir -ctime +$keepDay -exec rm -rf {} \;
echo " " >> $logFile
echo " " >> $logFile

每天凌晨2点执行备份脚本

* 2 * * * /opt/backup/baksql.sh