forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общее (http://forum.boolean.name/forumdisplay.php?f=139)
-   -   nginx rewrite (http://forum.boolean.name/showthread.php?t=19651)

pax 20.01.2015 01:16

nginx rewrite
 
имеется
Код:

location /{

rewrite  /(res|scenes)/([0-9]+)/(.+\.swf)$  /$1/$3?$2  last;
rewrite  /([0-9]+)/(Web.swf)$  /$2?$1  last;
rewrite  /Web([0-9]+).swf$  /Web.swf?$1  last;
rewrite  /get/(.*)$  /get.php?url=$1  last;

        index  index.php index.html;
        location ~ \.php$ {
                fastcgi_keep_conn on;
                    fastcgi_pass  127.0.0.1:9000;
                    fastcgi_index  index.php;
                    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
                    include        fastcgi_params;
        }

        location ~* \.(jpg|jpeg|gif|png|ico|css|zip|rar|pdf|xml|js)$ {

                error_page 404 = 404;
        }
}

почему может не срабатывать вот это правило?
Код:

rewrite  /get/(.*)$  /get.php?url=$1  last;

moka 20.01.2015 03:08

Ответ: nginx rewrite
 
При каких ссылках конкретно не срабатывает, при всех?
Выглядят rewrite'ы грустно на самом деле, как буд-то кто-то писал endpoint'ы не думая..
Да и так понимаю ты сервишь всякие ресурсы и файлы используя php?
Если там скрипт тупо выдаёт файлы, то в разы лучше посмотреть в сторону try_files директивы в nginx, чтобы избежать не нужного стрима данных через php сокеты, что нагружает CPU и RAM зазря.

Также упрости:
Код:

rewrite /([0-9]+)/Web\.swf$ /$2?Web.swf last;

pax 20.01.2015 07:23

Ответ: nginx rewrite
 
Цитата:

Сообщение от moka (Сообщение 292048)
При каких ссылках конкретно не срабатывает, при всех?
Выглядят rewrite'ы грустно на самом деле, как буд-то кто-то писал endpoint'ы не думая..
Да и так понимаю ты сервишь всякие ресурсы и файлы используя php?
Если там скрипт тупо выдаёт файлы, то в разы лучше посмотреть в сторону try_files директивы в nginx, чтобы избежать не нужного стрима данных через php сокеты, что нагружает CPU и RAM зазря.

Я писал эти эндпоинты) Основная задача - сделать статические ссылки. Вся суть в том, что, когда я заливаю обновление на хостинг, то при не изменном названии файла меняется его crc сумма (ее выдает Unity). Чтобы избежать кеширования браузером, я передаю в ссылке эту crc сумму. Все мои файлы на хостинге лежат в папке /res сейчас.

По поводу не работающего. Не работает так:
Код:

https://steamcraft.landrays.com/get/http%3A%2F%2Fwww.biletomsk.ru%2F_files%2Fnews%2Fimages%2Fc67d52407cf4b16e95d41e7d59cb52a3.jpg
Работает так
Код:

https://steamcraft.landrays.com/get.php?url=http%3A%2F%2Fwww.biletomsk.ru%2F_files%2Fnews%2Fimages%2Fc67d52407cf4b16e95d41e7d59cb52a3.jpg
Скачиваю некоторые аватарки через кроссдомен используя php скрипт на своем сервере. статическая ссылка необходима, чтобы файл закешировала CDN (cloudflare у нас сейчас).

Цитата:

Сообщение от moka (Сообщение 292048)
Также упрости:
Код:

rewrite /([0-9]+)/Web\.swf$ /$2?Web.swf last;

Этот вариант я тоже пробовал и уже не использую как и свой, они создают одну проблему - смену адреса файла. Именно для этого файла это создает проблему с не сохранением PlayerPrefs при изменении файла.

ABTOMAT 20.01.2015 07:51

Ответ: nginx rewrite
 
Простейший способ избежать кеширования — каждый раз добавлять к ссылке какой-нибудь левый параметр типа &timestamp=нынешнеевремя

pax 20.01.2015 07:59

Ответ: nginx rewrite
 
Мне нужно кеширование и нужно перекачать изменившийся файл.

Igor 20.01.2015 14:37

Ответ: nginx rewrite
 
В игре чатика нет? А то в бою хочется написать что-нибудь булчанам, а нельзя :(

moka 20.01.2015 15:28

Ответ: nginx rewrite
 
Добавь ^ ко всем rewrite вначале строки.
PHP код:

rewrite ^/get/(.*)$ /get.php?url=$1 last

При изменении файла меняется его modified date в системе? Если да, то ты можешь сделать так:
PHP код:

location / {
    
try_files $uri $uri/ =404;
    
expires modified 365d;


Это будет учитывать кеш и обновленный файл, заголовки будут посланы таким образом, что броузер все равно будет делать запрос на файл с заголовком даты своего кеша, если сервер считает что кеш на клиенте идентичен то шлет 304 обрывая соединение (по сути запрос только обменяет заголовки), и клиент грузит файл с кеша.
Такой метод стабильно работает для кеша и решил мне много проблем с очень похожими ситуациями как у тебя.

Относительно аватарок, можно вообще сделать proxy на CDN, и если файл там не найден, но редиректнит обратно на ссылку с запросом генерации аватарки в твоем скрипте. Скрипт сгенерит аватарку выдаст клиенту и паралельно зальет ее на CDN. И следующий запрос получит ее с CDN сразу.

pax 20.01.2015 16:16

Ответ: nginx rewrite
 
Попробую с ^ спасибо, а по поводу заголовков и expires - я использую cloudflare, все запросы идут через него, его кэш может обновится через год, если я такой expires поставлю.

UPD: с ^ тоже не срабатывает

pax 20.01.2015 16:32

Ответ: nginx rewrite
 
Цитата:

Сообщение от Igor (Сообщение 292055)
В игре чатика нет? А то в бою хочется написать что-нибудь булчанам, а нельзя :(

Будет, вообще сейчас под окном игры есть окошко с комментами

moka 20.01.2015 16:49

Ответ: nginx rewrite
 
Цитата:

Сообщение от pax (Сообщение 292058)
Попробую с ^ спасибо, а по поводу заголовков и expires - я использую cloudflare, все запросы идут через него, его кэш может обновится через год, если я такой expires поставлю.

modified на то и создан, чтобы он все равно делал запрос и получал заголовок не смотря на наличие кеша, и только потом делал выводы - юзать кеш или грузить новый файл.
Также я не знаю как CloudFlare отвечает с заголовками, но думаю при заливке на него, ты можешь сам установить нужные Meta данные для Modified кеширования тоже.

pax 20.01.2015 17:16

Ответ: nginx rewrite
 
т.е. 1000 пользователей буду запускать игру и качать 100 файлов и на каждый будет идти запрос user=>cloudflare=>server=>cloudflare=>user пусть даже для валидации? Да нафиг надо. Мне всего то надо сделать статическую ссылку на скрипт.

moka 20.01.2015 22:33

Ответ: nginx rewrite
 
Цитата:

Сообщение от pax (Сообщение 292061)
т.е. 1000 пользователей буду запускать игру и качать 100 файлов и на каждый будет идти запрос user=>cloudflare=>server=>cloudflare=>user пусть даже для валидации? Да нафиг надо. Мне всего то надо сделать статическую ссылку на скрипт.

Сейчас, если нету картинки:
nginx > php (cpu, ram) > check file > API request > download > save > serve
Если есть картинка:
nginx > php (cpu, ram) > check file > serve
?

Я предлагаю:
Если нету картинки:
nginx > perm_redirect(cdn) > 404, temp_redirect(php) > php > API request > download > save > redirect_back
Если есть:
nginx > perm_redirect(cdn)

Таким образом у тебя php будет только качать картинку и заливать, и проверка будет не на php. Для того чтобы сервить картинку, что будет 99.8% запросов, у тебя вообще никакой нагрузки на сервер не будет.
А сейчас у тебя php должен проверять наличие файла, если он на cdn ты как проверяешь, запрос из php делаешь? Тогда у тебя IO и потоки из pool'а тупо отстаивают.

Такой подход имеет минимальную нагрузку на твой сервер, иначе у тебя пользы от CDN вообще никакой, т.к. ты все равно сервишь из PHP тем более через прокси. Вообще ноль пользы от php.
Используя Permanent редирект (если картинка под ID хранится и никогда не изменится ID картинки), то это ваще броузером будет resolve'ится, и даже сервер твой трогаться не будет для картинок. В таком случае есть реальная польза от CDN.

pax 21.01.2015 01:01

Ответ: nginx rewrite
 
Я если честно ничего не понял, придется много гуглить. Но наверное не в ближайшие дни. Потом к этой задаче вернусь.

Моя логика такая - я обращаюсь через CDN на свой сервер по url для скачки картинки. php скачивает картинку, отдает cdn. Если ссылка статическая, то cdn ее кеширует и отдает игроку. В следующий раз по этой ссылке cdn не будет запрашивать файл с моего сервера. Как-то так... Статической ссылку пока не вышло сделать. Не пойму почему не работает.

moka 21.01.2015 01:32

Ответ: nginx rewrite
 
Цитата:

Сообщение от pax (Сообщение 292085)
Я если честно ничего не понял, придется много гуглить. Но наверное не в ближайшие дни. Потом к этой задаче вернусь.

Моя логика такая - я обращаюсь через CDN на свой сервер по url для скачки картинки. php скачивает картинку, отдает cdn. Если ссылка статическая, то cdn ее кеширует и отдает игроку. В следующий раз по этой ссылке cdn не будет запрашивать файл с моего сервера. Как-то так... Статической ссылку пока не вышло сделать. Не пойму почему не работает.

Ты описал именно то что я и описал во втором варианте :D

pax 21.01.2015 09:10

Ответ: nginx rewrite
 
Ну так у меня и устроено. Осталось решить проблему со статической ссылкой. Вообще это можно настроить в панели cloudflare... наверное так и сделаю.

Cloudflare работает через dns, так что я просто указал для каких доменов включить трафик через него и все. Работаю со своим доменом как и работал, у него просто ip адрес сменился и весь трафик идет через cloudflare. Указал агрессивное кеширование на 1 год ))

UPD: неужели наконец счастье) Жаль на домен всего три правила можно на бесплатном аккаунте


Часовой пояс GMT +4, время: 21:50.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot