Приложение фото не показывает оригинал Есть решение

Добрый день!

После загрузки нескольких фотографий в приложении Фото, во фронтенде качество оригиналов не улучшается: отображается промежуточный вариант низкого качества. В логе сервера nginx запись:

2015/09/13 21:51:27 [error] 17073#0: *390 open() "/var/www/wa_framework/wa-data/public/photos/15/00/15/15.970x0.jpg" failed (2: No such file or directory), client: 93.123.193.152, server: xn--80ae$

Похоже на проблему с правами. Но все остальные действия выполняются на этом сервере. Вот проблема - http://xn--80aerinib2e.xn--p1ai/photos/photo/15541...

7 ответов

  • 1
    Владимир 14 сентября 2015 12:43 #

    Проблему локализовал. Сервер изначально был настроен на связку NGINX + Apache2, соответственно статику отдавал nginx, все остальное - апач.

    В конфиге первого убрал обработку статики, передав все в Апач:

    #        location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
    #           expires max;
    #        }

    Проблема с фото решилась. Но хочется разобраться, почему nginx не создает фото, к которому потом обращается клиент.

    • +2
      Владислав Горлов Владислав Горлов Webasyst 14 сентября 2015 14:19 #

      У вас не хватает директивы проксирования несуществующих ресурсов на Apache (очень часто это упускается при самостоятельной настройке, иногда и на хостингах):

      error_page  404 = @fallback;

      Для нормальной работы стоит настроить location @fallback надо с указанием времен кеширования (чтобы лишний раз не нагружать не существующими ресурсами)

      proxy_cache_valid  404	  5m;
    • +2

      Nginx и не обязан ничего создавать -)
      Создаёт php с помощью скрипа thumbs.php в папках
      wa-data/public/shop/products
      wa-data/public/photos
      wa-data/public/contacts/photos
      из-за этих thumbs-ов конфиг nginx-а для фрэймворка выглядит как стих Пушкина А.С.

      кстати, разработчики, если вы это прочитаете, то вот то, что ниже, сильно облегчит жизнь пользователям:


      в index.php:

      require_once __DIR__ . "/prerouter.php";
      $path = dirname(__FILE__).'/wa-config/SystemConfig.class.php';

      в prerouter.php

      <?php
      
      PreRouter::getThumbs();
      
      class PreRouter
      {
      
      	/**
      	 * Путь к сайту.
      	 * Если сайт открывается непосредственно по адресу доменного имени - указать "/" или оставить пустым
      	 * Если сайт открывается из папки, например domain.com/site, тогда нужно указать /site
      	 * (Конечный слэш можно указывать, а можно и не указывать. Начальный слэш, в случае если сайт в папке - указывать обязательно)
      	 * @var string
      	 */
      	public static $siteRoot = "/";
      
          /**
           * Проверим, не запрос ли это файла с из папки с превьюшками картинок.
      	 * Если да, то подключим соответствующий thumb.php и пусть он занимается генерацией превьюшки.
           * @return void
           */
          public static function getThumbs()
          {
      		//Массив путей где лежат файлы превьюшек и файлы thumb.php
              $paths = array(
                          '/wa-data/public/shop/products',
                          '/wa-data/public/photos',
                          '/wa-data/public/contacts/photos',
              );
      
      		$root = rtrim(self::$siteRoot, "/");
      
      		$file = 'thumb.php';
      
      		$request_uri = filter_input(INPUT_SERVER, 'REQUEST_URI');
      
      		foreach ($paths as $path)
              {
                  if (substr($request_uri, 0, strlen($root . $path)) == $root . $path)
                  {
                      $thumb = __DIR__ . $path. "/" . $file;
      				$_SERVER['REQUEST_URI'] = preg_replace("#^" . $root . $path . "#","", $request_uri);
                      if( file_exists( $thumb ) )
                      {
                          require_once $thumb;
                          die();
                      }else{
                          return;
                      }
                  }
              }
              return;
          }
      
          private static function log($message)
          {
              $fh = fopen(__DIR__."/wa-log/preroute.log",'a+');
              fwrite($fh, $message);
              fclose($fh);
              return;
          }
      }
      

      Копи-паста из рабочего проекта. Понятно что это не универсальный вариант. Нужно пару вещей адаптировать(массив,siteroot)....но конфиг ngixa, после этого становится как японские хокку.



      • +1
        Владислав Горлов Владислав Горлов Webasyst 15 сентября 2015 06:14 #

        Код помогает при использовании nginx-fpm (не надо настраивать все правила маршрутизации) и nginx-apache (если почему-то не сработали .htaccess из соответствующих директорий), при условии, что в обоих случаях настроен проброс 404 ошибки на apache/fpm, которые собственно и обработают запрос. Не панацея, но дополнительная перестраховка (еще осталось проверить работу этого под IIS и можно ли это там просто настроить %))

  • 1
    Владимир 15 сентября 2015 05:35 # Решение

    Спасибо. А есть пример рабочего конфига nginx в связке с apache, чтобы корректро работал с webasyst?

    • +1
      Владислав Горлов Владислав Горлов Webasyst 15 сентября 2015 06:22 #

      Почти как ваш конфиг (основное отличие — указание директивы error_page и location (который надо настроить в соответствии с вашим окружением)

      	# Check 404 errors via Apache
      	location @fallback {
      		proxy_pass http://127.0.0.1:8080;
      		proxy_cache_valid  200 302  10m;
      		proxy_cache_valid  404	  5m;
      		proxy_hide_header "Set-Cookie";
      		proxy_ignore_headers "Cache-Control" "Expires";
      
      		proxy_redirect     off;
      		#include templates/proxy.dynamic.conf;
      	}
      		
      	# Static files location
      	location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz2|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js)(\?.*)?$ 
      	{
      		error_page  404 = @fallback;
      		#root /home/${subdomain_host}${subdomain};
      		#access_log   on;
      		expires  max;
      		#gzip             on;
      		#gzip_min_length  1000;
      		#gzip_proxied     any;
      	}
      • +1
        Владимир Владимир 15 сентября 2015 06:47 #

        Спасибо, уже разобрался. Сейчас все заработало. Вопрос только все ли, или есть еще какие-то моменты, которые могут выплыть в будущем?

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите