nginx实现php返回的图片内容缩放

研发的需求如下:用户访问的为一个带很多参数的jpg结尾的url,需要在nginx层rewrite为xxx.php?xxx形式,把参数传递给php处理。返回结果为一张图片,再根据此url中的参数做缩放,返回给用户。

实现过程中遇到几个问题,nginx如何实现proxy的缩放,各层缓存设置太小导致奇怪的413错误(图片很大,几M)。

第一次准备做到一个配置中,但是由于rewrite后缩放参数丢失,无法缩放,所以做了两层,一层代理一层缩放,清晰化整个配置文件。

第一层listen 80为缩放层:

server {
    server_name xxx.com;
    listen 80 ;

    proxy_buffer_size 64k;
    proxy_buffers 256 32k;
    #防止并发过大缓存不足,同时防止一次分配过多。
    proxy_busy_buffers_size 128k;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For  $remote_addr;

    location ~ /\w+/(\d+)_(\d+)_(\d+)x(\d+)_(\d+)_(\d+).jpg  {
         image_filter  resize - $6;        
         #resize支持以某一边缩放,不改变比例。另一边写“-”即可。
         image_filter_jpeg_quality 85;
         image_filter_buffer 20m;
         proxy_pass http://127.0.0.1:81;
    }
    location / {
         proxy_pass http://127.0.0.1:81;  
    }
}

第二层为listen 81端口,做rewrite

server {
    server_name xxx.com;
    listen 81 ;
    root  /home/www;

    fastcgi_buffer_size 128k;
    fastcgi_buffers 256 32k;  
    #同理,设置缓存

    rewrite /\w+/(\d+)_(\d+)_(\d+)x(\d+)_(\d+)_(\d+).jpg  /get_image.php?vid=$1&interval=$2&cell=$3x$4&no=$5 ;
    #参数一个一个按照预先的数据格式取出来,传入php

    location ~* \.php$ {
        include   fastcgi more information.conf;
        fastcgi_index  index.php;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_connect_timeout 3;
        fastcgi_send_timeout 3;
        fastcgi_read_timeout 3;
   }
}

需要注意一点:在nginx主配置中加入

client_max_body_size 30m;

使nginx接受大数据包,否则会出现奇怪的413错误。