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错误。