Задать вопрос
@pavelole

Nginx FastCGI возвращает «испорченную» картинку, с другим Content-Length. Почему?

Сайта запущен на Nginx + PHP-FPM (на CMS Drupal 7).

В консоли браузера у большинства картинок появляется ошибка net::ERR_CONTENT_LENGTH_MISMATCH.

Конфиг nginx:
server {
    #сайт запущен на 8080 порту, перед ним стоит varnish на 80, картинка, отдаваемая друпалом "портится" уже на этапе PHP-FPM
    listen 212.***.***.***:8080;
    server_name mysite.ru;

    proxy_buffering off;

    client_max_body_size 10m;
    client_body_buffer_size 1024k;
    index index.php;
    charset UTF-8;
    disable_symlinks if_not_owner from=$root_path;
    include /etc/nginx/vhosts-includes/*.conf;
    include /etc/nginx/vhosts-resources/mysite.ru/*.conf;
    access_log /var/www/httpd-logs/mysite.ru.access.log ;
    error_log /var/www/httpd-logs/mysite.ru.error.log debug;
    ssi on;
    set $root_path /var/www/mysite/data/www/mysite.ru;
    root $root_path;

    location ~ \..*/.*\.php$ {
        return 403;
    }

    location / {
    try_files $uri /index.php?$query_string;
        expires 30d;
    }

    location @rewrite {
        rewrite ^/(.*)$ /index.php?q=$1;
    }

    location ~ '\.php$|^/update.php' {
        fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
        include fastcgi_params;
        fastcgi_param HTTP_PROXY "";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_intercept_errors on;
        fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f admin@mysite.ru";
        try_files $uri =404;
        fastcgi_pass unix:/var/www/php-fpm/mysite.sock;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        try_files $uri @rewrite;
        expires 30d;
    }

    gzip on;
    gzip_comp_level 5;
    gzip_disable "msie6";
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
}


В логах у nginx никаких ошибок, а если включить log debag, то при попытке загрузить картинку, записываются следующие логи error.log (при запросе картинки получается очень много логов, по этому я их укоротил, надеюсь, ничего полезного не задел):
логи nginx debag
2017/12/28 14:02:02 [notice] 3222#3222: *18 rewritten data: "/index.php", args: "q=sites/default/files/styles/large/public/inline/images/29/sochi_galechnyi_plyazh_25.jpg", client: 31.202.5.148, server: mysite.ru, request: "GET /sites/default/files/styles/large/public/inline/images/29/sochi_galechnyi_plyazh_25.jpg HTTP/1.1", host: "212.***.***.***:8080", referrer: "http://212.***.***.***:8080/pogoda-v-sochi-v-noyabre-2018-goda?amp"
......
2017/12/28 14:02:02 [debug] 3222#3222: *18 test location: ~ "\.php$|^/update.php"
2017/12/28 14:02:02 [debug] 3222#3222: *18 using configuration "\.php$|^/update.php"
......
2017/12/28 14:02:02 [debug] 3222#3222: *18 http fastcgi header: "Content-Length: 60023"
2017/12/28 14:02:02 [debug] 3222#3222: *18 http fastcgi parser: 1
2017/12/28 14:02:02 [debug] 3222#3222: *18 http fastcgi header done
2017/12/28 14:02:02 [debug] 3222#3222: *18 HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Thu, 28 Dec 2017 11:02:02 GMT
Content-Type: image/jpeg
Content-Length: 60023
Connection: keep-alive
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: no-cache, must-revalidate
X-Content-Type-Options: nosniff
2017/12/28 14:02:02 [debug] 3222#3222: *18 write new buf t:1 f:0 000055D5E4BF8F18, pos 000055D5E4BF8F18, size: 266 file: 0, size: 0
2017/12/28 14:02:02 [debug] 3222#3222: *18 http write filter: l:0 f:0 s:266
......
2017/12/28 14:02:02 [debug] 3222#3222: *18 http write filter 0000000000000000
2017/12/28 14:02:02 [debug] 3222#3222: *18 http copy filter: 0 "/index.php?q=sites/default/files/styles/large/public/inline/images/29/sochi_galechnyi_plyazh_25.jpg"
2017/12/28 14:02:02 [debug] 3222#3222: *18 pipe write downstream done
2017/12/28 14:02:02 [debug] 3222#3222: *18 event timer: 26, old: 1514458982606, new: 1514458982750
2017/12/28 14:02:02 [debug] 3222#3222: *18 http upstream exit: 0000000000000000
2017/12/28 14:02:02 [debug] 3222#3222: *18 finalize http upstream request: 0
2017/12/28 14:02:02 [debug] 3222#3222: *18 finalize http fastcgi request
2017/12/28 14:02:02 [debug] 3222#3222: *18 free rr peer 1 0
2017/12/28 14:02:02 [debug] 3222#3222: *18 close http upstream connection: 26
2017/12/28 14:02:02 [debug] 3222#3222: *18 free: 000055D5E4B26080, unused: 48
2017/12/28 14:02:02 [debug] 3222#3222: *18 event timer del: 26: 1514458982606
2017/12/28 14:02:02 [debug] 3222#3222: *18 reusable connection: 0
2017/12/28 14:02:02 [debug] 3222#3222: *18 http upstream temp fd: -1
2017/12/28 14:02:02 [debug] 3222#3222: *18 http output filter "/index.php?q=sites/default/files/styles/large/public/inline/images/29/sochi_galechnyi_plyazh_25.jpg"
2017/12/28 14:02:02 [debug] 3222#3222: *18 http copy filter: "/index.php?q=sites/default/files/styles/large/public/inline/images/29/sochi_galechnyi_plyazh_25.jpg"
2017/12/28 14:02:02 [debug] 3222#3222: *18 http postpone filter "/index.php?q=sites/default/files/styles/large/public/inline/images/29/sochi_galechnyi_plyazh_25.jpg" 00007FFE07D7C1D0
2017/12/28 14:02:02 [debug] 3222#3222: *18 write new buf t:0 f:0 0000000000000000, pos 0000000000000000, size: 0 file: 0, size: 0
2017/12/28 14:02:02 [debug] 3222#3222: *18 http write filter: l:1 f:0 s:0
2017/12/28 14:02:02 [debug] 3222#3222: *18 http copy filter: 0 "/index.php?q=sites/default/files/styles/large/public/inline/images/29/sochi_galechnyi_plyazh_25.jpg"
2017/12/28 14:02:02 [debug] 3222#3222: *18 http finalize request: 0, "/index.php?q=sites/default/files/styles/large/public/inline/images/29/sochi_galechnyi_plyazh_25.jpg" a:1, c:1
2017/12/28 14:02:02 [debug] 3222#3222: *18 set http keepalive handler
2017/12/28 14:02:02 [debug] 3222#3222: *18 http close request
2017/12/28 14:02:02 [debug] 3222#3222: *18 http log handler
2017/12/28 14:02:02 [debug] 3222#3222: *18 free: 0000000000000000
2017/12/28 14:02:02 [debug] 3222#3222: *18 free: 0000000000000000
2017/12/28 14:02:02 [debug] 3222#3222: *18 free: 000055D5E4BF9810
2017/12/28 14:02:02 [debug] 3222#3222: *18 free: 000055D5E4B37590, unused: 3
2017/12/28 14:02:02 [debug] 3222#3222: *18 free: 000055D5E4BF77F0, unused: 6
2017/12/28 14:02:02 [debug] 3222#3222: *18 free: 000055D5E4BF8800, unused: 649
2017/12/28 14:02:02 [debug] 3222#3222: *18 free: 000055D5E4BF30E0
2017/12/28 14:02:02 [debug] 3222#3222: *18 hc free: 0000000000000000
2017/12/28 14:02:02 [debug] 3222#3222: *18 hc busy: 0000000000000000 0
2017/12/28 14:02:02 [debug] 3222#3222: *18 tcp_nodelay
2017/12/28 14:02:02 [debug] 3222#3222: *18 reusable connection: 1
2017/12/28 14:02:02 [debug] 3222#3222: *18 event timer add: 25: 65000:1514458987750


Как видим, друпал возвращает header с Content-Length: 60023.

А лог access.log выглядит так:
31.202.5.148 - - [28/Dec/2017:14:02:02 +0300] "GET /sites/default/files/styles/large/public/inline/images/29/sochi_galechnyi_plyazh_25.jpg HTTP/1.1" 200 60021 "http://212.***.***.***:8080/pogoda-v-sochi-v-noyabre-2018-goda" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"

Тут уже почему-то размер файла 60021.

В консоли Chrome в Header размер файла 60023 (судя по всему, реальный размер картинки 60021, в этом и есть mismatch):
Cache-Control:no-cache, must-revalidate
Connection:keep-alive
Content-Length:60023
Content-Type:image/jpeg
Date:Thu, 28 Dec 2017 11:02:02 GMT
Expires:Sun, 19 Nov 1978 05:00:00 GMT
Server:nginx/1.12.2
X-Content-Type-Options:nosniff


В итоге, картинка сначала вроде как загружается, но немного испорчена внизу, потом картинка пропадает и появляется ошибка net::ERR_CONTENT_LENGTH_MISMATCH. Картинка выглядит вот так (обратите внимание - снизу полоса недогруженная):
картинка
5a4504386da0a991434152.png

Ошибка в консоли Chrome:
GET http://212.***.***.***:8080/sites/default/files/styles/large/public/inline/images/29/sochi_galechnyi_plyazh_25.jpg net::ERR_CONTENT_LENGTH_MISMATCH
http://212.***.***.***:8080/sites/default/files/styles/large/public/inline/images/29/sochi_galechnyi_plyazh_25.jpg​​​


Как видим, реально у картинки Content-Length: 60023, но потом почему-то nginx ее портит, и размер становится 60021. Подскажите, почему так происходит?
  • Вопрос задан
  • 563 просмотра
Подписаться 3 Простой 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы