location, backend, rewrites

pavel at pronskiy.ru pavel at pronskiy.ru
Fri Aug 15 15:50:48 MSD 2008


Sergej Kandyla пишет:
> Подскажите пожалуйста где я ошибаюсь.
> Есть сайт с DLE, бекенд апач. Хочу реализовать правильную схему 
> проксирования на бекенд исключительно php и динамики.
>
>        location /index.php {
>                rewrite / @backend ;
>        }
server {
    proxy_set_header            Host                    $host;
    proxy_set_header            X-Real-IP       $remote_addr;
    proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
    set $root /dir/dir/www;

location / {
    index index.php;
    #error_page 404 = @backend; # в случае если надо 404 статус 
перенаправлять на @backend (на мой взгляд такой способ не особо 
корректен (но работает), так как error_log придётся отключать ибо веб 
сервер будет флудить 404 статусом в логе на каждый файл)
    proxy_pass                  http://127.0.0.1:8000/;
}


>
>        location ~ \.php$ {
>                rewrite / @backend ;
>        }
# если php как fastcgi.sock (php-fpm) без апача:
 location \.php$ {
    fastcgi_pass unix:/var/run/domain.sock;
}


# если нужно ловить .php и передавать дальше апачу (так делать не 
рекомендуется, проще использовать location / {proxy_pass...})
 location \.php$ {
    proxy_pass                  http://127.0.0.1:8000;
}


# статика
location ~* 
^.+\.(swf|gif|jpg|jpeg|png|ico|js|css|xsl|txt|doc|rtf|pdf|rar|zip|gz|tgz|xls)$ 
{

    # если файла в root нет, происходит перенаправление.
    if (!-f $request_filename) {
        proxy_pass http://127.0.0.1:8000;
    }

    root $root;
    expires max;
}

root $root;

}


Любые запросы к статике будут обработаны фронтендом, а остальные запросы 
которые не фигурируют в location статики - проксируются на бекенд.
Со-но если даже в запросах присутствуют ЧПУшные урлы, то они тоже 
перенаправляются на бакенд.

Проверить работоспособность можно протестировав запросы к статике и 
динамике, в логах всё фиксируется и статика и динамика, так что 
отследить кто чем занимается очень просто.
Результатом изменений настроек должно быть следующее: в логах апача 
присутствовуют только запросы к динамическим страницам:
67.195.37.188 - - [15/Aug/2008:15:15:01 +0400] "GET 
/portfolio/print/p-1/ HTTP/1.0" 200 15040 "-" "Mozilla/5.0 (compatible; 
Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)"
67.195.37.188 - - [15/Aug/2008:15:27:31 +0400] "GET /portfolio/ 
HTTP/1.0" 200 21264 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp; 
http://help.yahoo.com/help/us/ysearch/slurp)"
74.6.18.216 - - [15/Aug/2008:15:32:32 +0400] "GET 
/portfolio/clients/trancemaster/ HTTP/1.0" 200 13907 "-" "Mozilla/5.0 
(compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)"

А на фронтенде полный лог всех запросов.


P.S Поправьте если где ошибся.

>
>        location / {
>                 root /home/vhosts/domain/public_html;
>                error_page 404 = @backend;
>                index index.php;
>        }
>
>        location @backend {
>                    proxy_set_header Host $host;
>                    proxy_set_header X-Real-IP $remote_addr;
>                    proxy_set_header X-Forwarded-For 
> $proxy_add_x_forwarded_for;
>                    proxy_pass http://IP;
>        }
>
> Но на запрос к сайту, браузер предлагает мне сохранить php страницу. 
> Тобиш запрос бекенду не передается.
> Пробовал конструкцию
>    if (!-e $request_filename) {proxy_pass http://IP;}
>
> но результат такой же. Также пробовал менять порядок задания локейшенов.
>
> PS. раньше была такая схема:
>
>        location / {
>                proxy_pass              http://IP;
>                .....
>        }
>
>        location ~* 
> ^.+.(nrg|htm|htf|chm|sisx|sis|flv|thm|bin|...<skip>..)$ {
>           root /home/_username_/domains/_default_/public_html/;
>        }
>
> Но она довольно ограниченная, хотелось бы узнать как следует делать 
> правильно (в случае использования бекендов типа апаче)
>






More information about the nginx-ru mailing list