LINUX.ORG.RU
решено ФорумAdmin

Отправить из location в именованый location

 


1

1

Есть конфиг, в целом обычный, выглядит так

server {

	…

        location / {
            try_files $uri @fcgi;
        }

        # Тут отдаются генерируемые изображеньки
	location ~* ^/generated/[^/]+\.gif$ {						   
            fastcgi_pass unix:/var/run/php-fpm/default.socket;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root/index.php;
            fastcgi_param PATH_INFO $uri;
	}

	# А тут отдаётся статика
        location ~* \.(png|jpg|jpeg|gif)$ {
			valid_referers none blocked olala.com IP.IP.IP.IP;
			if ($invalid_referer) {
				rewrite ^(/images/gtfo.jpg)$ $1 break;
				rewrite ^.*$ /images/gtfo.jpg permanent;
			}
        }

	…

        location @fcgi {
            fastcgi_pass unix:/var/run/php-fpm/default.socket;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root/index.php;
            fastcgi_param PATH_INFO $uri;
        }

}
Как отправить nginx, попавший на URL, который должен отдавать генерируемое изображение, на @fcgi, чтобы не дублировать код вот так?

true_admin

Deleted

Я только не понял зачем тебе два одинаковых локейшена. По-моему, тебе нужно только два: один статика и второй который возьмёт на себя все остальные запросы.

Ну а так можно вынести fastcgi_param на уровень server. В локейшенах останется только fastcg_pass.

Возможно это можно ещё оптимизировать, я года 4 уже не слежу за nginx. Раньше проблему дублирования настроек рекомендовали решать путём выноса настроек в отдельный файл и его инклюдить. Типа как ты сделал с include fastcgi_params.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Я только не понял зачем тебе два одинаковых локейшена.

Потому что я не могу написать

	location ~* ^/generated/[^/]+\.gif$ {						   
		@fcgi
	}
А отправить как-то надо, иначе nginx выдаёт мне 404 на генерируемые, т. к. не находит их среди существующей статики. Хотя там где реджекспом перебираются изображения, там они не отдаются, отдаются они через общий / в самом начале. А там смысл такой, что если реферер кривой, то не давать.

Ну а так можно вынести fastcgi_param на уровень server. В локейшенах останется только fastcg_pass.

А это мысль, спасибо. Может, заодно и не на сервер, а именно что в конфиг? А получится обойти try_files таким образом? В смысле сказать «или ищи статику или вот тебе конфиг, инклюдь его»? Чтоб именованый location не использовать.

Deleted ()
Ответ на: комментарий от Deleted

ты можешь сделать error_page 404 = @fcgi . Т.е. попытайся generated через статику отдать, если файла нету то попытайся через fcgi отдать. Т.е. два локейшена и нет проблем.

Сорри, голова уже не варит, я может неправильно задачу понимаю. К сожалению я сейчас сильно занят, дождись пока кто-нить другой поможет.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

А я не буду так получать 404 на всё любое, что отправляется на @fcgi? Надо потестировать.

Deleted ()
Ответ на: комментарий от true_admin

Плюс нижнее правило будет иметь приоритет над верхним в случае отдельно взятой гифки. Или ты и имел ввиду доавить error_page 404 в этот location для изображенек?

Deleted ()
Ответ на: комментарий от Deleted

А я не буду так получать 404 на всё любое, что отправляется на @fcgi?

я не понял что ты имеешь в виду. Попробуй всё же в два локейшена сделать как я написал. Я так понимаю проверку на рефёрера можно вставить в основной локейшн (судя по докам должны работать вложенные локейшены).

true_admin ★★★★★ ()

Вот так не пашет?

server {

    ...

    location / {
        try_files $uri @fcgi;

        location ~* \.(png|jpg|jpeg|gif)$ {
            valid_referers none blocked olala.com IP.IP.IP.IP;
            if ($invalid_referer) {
                rewrite ^(/images/gtfo.jpg)$ $1 break;
                rewrite ^.*$ /images/gtfo.jpg permanent;
            }
        }
    }

    location @fcgi {
        fastcgi_pass unix:/var/run/php-fpm/default.socket;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        fastcgi_param PATH_INFO $uri;
    }

}

Только надо тщательно проверить как это всё работает.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

так, я там неправильные локейшены написал, но суть должна быть понятна.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

А error_page куда именно писать-то? Как есть оно в первый раз подвесило мне php-fpm и тот вышел по таймауту, во второй вернулось 404 от nginx. Что впрочем ожидаемо, когдаятестировал без специального location для генерируемых изображений, было то же самое.

Deleted ()
Ответ на: комментарий от Deleted

Потому что я не могу написать

	location ~* ^/generated/[^/]+\.gif$ {						   
		@fcgi
	}

А если через rewrite

	location ~* ^/generated/[^/]+\.gif$ {						   
		rewrite (.*) @fcgi
	}
или так:
        location ~* ^/generated/[^/]+\.gif$ {
            try_files $uri @fcgi;
        }
как это сделано в первом location?

На форумах nginxa очень распространен такой способ:

error_page 598 = @fcgi;

location ~* ^/generated/[^/]+\.gif$
{
    return 598;
}

fjoe ()
Ответ на: комментарий от fjoe

как это сделано в первом location?

Так поробуй :).

Вот так работает?

server {

    ...

    location / {

        location ~* \.(png|jpg|jpeg|gif)$ {
            valid_referers none blocked olala.com IP.IP.IP.IP;
            if ($invalid_referer) {
                rewrite ^(/images/gtfo.jpg)$ $1 break;
                rewrite ^.*$ /images/gtfo.jpg permanent;
            }
            try_files $uri @fcgi;
        }
    }

    location @fcgi {
        fastcgi_pass unix:/var/run/php-fpm/default.socket;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        fastcgi_param PATH_INFO $uri;
    }

}
true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Так, я сделал, только написать забыл, с error_page сразу после try_files оно работает как надо.

Deleted ()
Ответ на: комментарий от Deleted

покажи плиз рабочий вариант. Очень интересно зачем нужен error_page если есть try_files.

true_admin ★★★★★ ()
Ответ на: комментарий от fjoe

А если через rewrite
или так:
очень распространен такой способ

[error] 3218#0: *8 open() "/var/srv/olala.com/htdocs/generated/xqwzts.gif" failed (2: No such file or directory)

Это естессно при условии, что секция сама по себе как у меня в оппосте и предваряет location для валидации статики по рефёреру.

Deleted ()
Ответ на: комментарий от true_admin
server {
        …

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        fastcgi_param PATH_INFO $uri;
        #fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;

        location / {
            try_files $uri @fcgi;
            error_page 404 = @fcgi;
            location ~* \.(png|jpg|jpeg|gif)$ {
                valid_referers none blocked olala.com IP.IP.IP.IP;
                if ($invalid_referer) {
                    rewrite ^(/images/gtfo.jpg)$ $1 break;
                    rewrite ^.*$ /images/gtfo.jpg permanent;
                }
            }
            location ~ ^/(index\.php)$ {
                return 404;
            }
        }

        location @fcgi {
            fastcgi_pass unix:/var/run/php-fpm/default.socket;
        }

        …
}

Что удивительно, отчасти непонятно, но хорошо — это то, что nginx, пойдя error_page, не выставил код запроса, прописанный для error_page, и там всё идёт с HTTP 200.

Deleted ()
Ответ на: комментарий от Deleted

что nginx, пойдя error_page, не выставил код запроса, прописанный для error_page, и там всё идёт с HTTP 200.

угу, это чтобы можно было сделать recovery.

А если убрать error_page и location ~ ^/(index\.php)$ то не работает?

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

А если убрать

Как есть оно в первый раз подвесило мне php-fpm и тот вышел по таймауту, во второй вернулось 404 от nginx

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.