Отдача большого контента через fast_cgi

Igor Sysoev igor на sysoev.ru
Чт Ноя 26 20:22:05 MSK 2009


On Thu, Nov 26, 2009 at 12:54:43PM +0600, Peter A. Shevtsov wrote:

> server {
>         if ($host ~* www\.(.*)) {
>                 set $host_without_www $1;
>                 rewrite ^(.*)$ http://$host_without_www$1 permanent;
>         }
> 
>         if ($host !~* www\.(.*)) {
>                 set $host_without_www $host;
>         }
> 
>         if ($host !~*
> ^(mera.com.ru|www.mera.com.ru|m3ra.ru|www.m3ra.ru|mhra.ru|www.mhra.ru|mhera.ru|www.mhera.ru|time-to-live.net.ru|www.time-to-live.net.ru|dotu.ru|www.dotu.ru)$
> ) {
>                 return 444;
>         }
> 
>         access_log  /var/log/nginx/$host_without_www.access.log main;
>         error_log   /var/log/nginx/wpmu.error.log info;
> 
>         root         /var/www/html/default;
>         limit_conn   myzone  5;
>         listen       80;
>         server_name  mera.com.ru www.mera.com.ru m3ra.ru www.m3ra.ru
> mhra.ru www.mhra.ru mhera.ru www.mhera.ru time-to-live.net.ru
> www.time-to-live.net.ru dotu.ru www.dotu.ru;
>         client_max_body_size 40m;

Вышеприведённый кошмар нужно заменить на элегантное

error_log    /var/log/nginx/wpmu.error.log info;

server {
      listen  80;
      server_name  _;
      return   444;
}

server {
      listen 80;
      server_name  ~^www\.(?<name>.+)$;
      rewrite   ^  http://$name$request_uri? permanent;

      # медленно
      access_log   /var/log/nginx/$name.access.log main;
      # нужен для лога с переменными
      root         /var/www/html/default;
}

server {
      listent 80;
      server_name  mera.com.ru ...;

      location / {
      ...
}

Нужно понимать, что логи с переменнымии - это зло: при запросе
www.чего.то.там создаётся /var/log/nginx/чего.то.там.access.log.
Единственный способ это контролировать - через существование root'а
/var/www/html/default/чего.то.там. Лучше же создать кучу серверов с
нормальными логами.

>         location / {
>                 index  index.php;
>                 rewrite ^.*/files/(.*) /wp-content/blogs.php?file=$1;
>                 if (!-e $request_filename) {
>                         rewrite ^.+?(/wp-.*) $1 last;
>                         rewrite ^.+?(/.*\.php)$ $1 last;
>                         rewrite ^ /index.php last;
>                 }
>         }

Это не работает: /files/чего-то-там переписывается в
/wp-content/blogs.php?file=чего-то-там, а потом проверяется существование
/var/www/html/default/wp-content/blogs.php, а не /files/чего-то-там.

location /files/ {
     try_files  $uri   /wp-content/blogs.php?file=$uri;
}

Скрипт должен возвразать что-то вроде
     "X-Accel-Redirect: /protected/чего-то-там"

location /protected/ {
     internal;
     alias  /var/www/html/default/files/;
}

>         location = /favicon.ico {
>                 return 204;
>         }
> 
>         location ~ \.php$ {
>             include fastcgi_params;
>             fastcgi_pass   unix:/var/lib/php/php-fpm.sock;
>             fastcgi_index  index.php;
>             fastcgi_read_timeout 600;
>             fastcgi_intercept_errors on;
>         }
> 
>         # deny access to .htaccess files, if Apache's document root
>         # concurs with nginx's one
>         #
>         location ~ /\.ht {
>             deny  all;
>         }
> }
> 
> 25 ноября 2009 г. 18:54 пользователь Andrew Kopeyko <kaa at zvuki.ru> написал:
> > Peter A. Shevtsov wrote:
> >>
> >> В конфиге следующее:
> >> location / {
> >>    index  index.php;
> >>    rewrite ^.*/files/(.*) /wp-content/blogs.php?file=$1;
> >>    if (!-e $request_filename) {
> >>        rewrite ^.+?(/wp-.*) $1 last;
> >>        rewrite ^.+?(/.*\.php)$ $1 last;
> >>        rewrite ^ /index.php last;
> >>    }
> >> }
> >
> > Подозреваю, что это далеко не весь конфиг - в приведённом куске нет никаких
> > намёков на упоминаемый вами fast-cgi.
> >
> > Пожалуйста, приведите полный конфиг виртуального сервера.
> >
> >> Скрипт /wp-content/blogs.php раздаёт файлы из директории
> >> wp-content/blogs.dir/
> >>
> >> Для кого надо писать отдельный location, чтобы отдавать x-accel-redirect?
> >
> > Повторюсь - запросы на
> >  /files/19970604_Proses_mirivozzrencheskix_transformatsiy.pdf
> > не должны уходить на upstream
> >  "fastcgi://unix:/var/lib/php/php-fpm.sock:",
> >
> >
> >> 25 ноября 2009 г. 18:24 пользователь Andrew Kopeyko <kaa at zvuki.ru>
> >> написал:
> >>>
> >>> On Wed, 25 Nov 2009, Peter A. Shevtsov wrote:
> >>>
> >>>> В предыдущем письме я не точно выразился. Скрипт не генерит файл, а
> >>>> отдаеёт его через readfile(); Если это важно, то скрипт - blogs.php из
> >>>> Wordpress MU для раздачи файлов. И он даже сам может посылать
> >>>> заголовок x-accel-redirect. Но после "переключения" на
> >>>> x-accel-redirect получаю ошибки:
> >>>>
> >>>> 2009/11/25 14:58:52 [error] 3989#0: *222 rewrite or internal
> >>>> redirection cycle while processing "/wp-content/blogs.php", client:
> >>>> 65.55.106.232, server: mera.com.ru, request: "GET
> >>>> /files/19970604_Proses_mirivozzrencheskix_transformatsiy.pdf
> >>>> HTTP/1.0", upstream: "fastcgi://unix:/var/lib/php/php-fpm.sock:",
> >>>> host: "dotu.ru"
> >>>
> >>> Вероятно, и вас
> >>>  /files/19970604_Proses_mirivozzrencheskix_transformatsiy.pdf
> >>> тоже проксируется на fast-cgi.
> >>> А для того, чтобы работал x-accel-redirect, оно должно отдаваться
> >>> локально.
> >>>
> >>> Вам надо описать отдельный location для отдаваемых через x-accel-redirect
> >>> файлов - и наступит вам счастье.
> >>>
> >>>
> >>> 25 ноября 2009 г. 15:15 пользователь Alexandr Kutuzov
> >>> <alleteam at gmail.com> написал:
> >>>>
> >>>> правильно отгружать в статику и отдавать x-accel-redirect на
> >>>> сгенерированный
> >>>> файл.
> >>>>
> >>>> 25.11.2009, в 12:01, Пётр Шевцов написал(а):
> >>>>
> >>>>> Приветствую!
> >>>>>
> >>>>> Дано следующее: nginx+fast_cgi+php-fpm. Есть PHP скрипт, который
> >>>>> генерирует и отдаёт контент (pdf). Если размер отдаваемого контента
> >>>>> больше ~3Мб, то файлы получаются битые, то есть отдаётся 3 мегабайта и
> >>>>> всё. Как настроить, чтобы можно было отдавать больше контента?
> >>>>>
> >>>>> Спасибо.
> >>>>>
> >
> >
> > --
> > Best regards,
> > Andrew A. Kopeyko <kaa at zvuki.ru>
> > http://www.zvuki.ru/
> >
> > _______________________________________________
> > nginx-ru mailing list
> > nginx-ru at nginx.org
> > http://nginx.org/mailman/listinfo/nginx-ru
> >
> 
> 
> 
> -- 
> Пётр Шевцов
> _______________________________________________
> nginx-ru mailing list
> nginx-ru at nginx.org
> http://nginx.org/mailman/listinfo/nginx-ru

-- 
Игорь Сысоев
http://sysoev.ru



Подробная информация о списке рассылки nginx-ru