Дмитрий Сергеевич (axshavan) wrote,
Дмитрий Сергеевич
axshavan

Линеечки для форумов

У нас в качестве бесплатного приложения к магазину игрушек есть линеечки для форумов (их можно вставлять в подпись). Когда-то давно эти линеечки запрограммировал для моего начальника какой-то парень, знакомые начальника и их родственники нарисовали фоны и бегунки, ну и всё типа работало. Но тот парень запрограммировать-то запрограммировал, но про высокую нагрузку он тогда, наверное, не слышал ещё, потому что линеечки реализованы так:
1) линеечка находится по адресу, скажем, /cache/123.png. На самом деле папки cache нет, и запрос обрабатывается директивой ErrorDocument в апаче, и редиректит его на скрипт cache.php.
2) скрипт берёт номер линеечки (123 в нашем случае), лезет в базу, смотрит, когда в последний раз линеечка была обновлена, если надо обновить, то перерисовывает её, файлик сохраняет в папку cacheimages, ну и потом отдаёт его.
Каждый раз лезет в базу, при каждом запросе каждой линеечки. Четыреста линеечек притормаживают сервер, восемьсот линеечек потребляют 90% процессорного времени, тысяча линеечек кладёт сервер :)

Линеечки я быстро соптимизировал - поставил перед апачем Nginx в качестве кэширующего фронтэнда и настроил его примерно так:
error_page 404 =200 /cache.php;
location /cache.php {
proxy_pass http://127.0.0.1:80$request_uri;
}
location /cache {
rewrite ^/cache/(.*).png$ /cacheimages/$1.png break;
}
То есть Nginx сначала пытается отдать файл с линеечкой. А если его его нет, то только тогда уже передаёт вызов апачу, чтоб тот со своим еррордокументом подцепил cache.php, тот слазил в базу, обновил линеечку... ну и каждый день в полночь всё содержимое папки cacheimages, в которой лежат сделанные за день линеечки, удаляется.

Всё работало прекрасно до тех пор, пока начальник не решил перенести линеечки на отдельный сервер вместе со всеми парсерами, и не арендовал под это дело серверок с FreeBSD на каком-то хостинге. Я там всё установил, но вот почему-то Nginx у меня не захотел настраиваться. И с такими настройками, и с сякими я его запускал - не работает так, как надо. У меня сложилось впечатление, что он игнорирует директиву error_page. Может, надо пересобрать его с какой-нибудь особенной опцией, или в конфиге где-нибудь какой-нибудь флажок включить или написать чего-нибудь? Апач, например, игнорирует RewriteRule, если не указать FollowSymLinks или ещё какой-то *SymLinks в Options. Может, Nginx тоже как-то так устроен?

Оригинал записи http://axshavan.blogspot.com/2010/11/lines.html
Tags: *nix, web, работа
Subscribe

  • Про незлых колдунов

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

  • Вчера перед сном пробило на лимерики

    Один человек из Америки От Пушкина бился в истерике: "Vot eto byl genij Onegin Evgenij", Но не понимал он лимерики. Один мужичок из Алеппо Под поезд…

  • DNWG/III

    В эту пятницу ребята снова перешли в свой любимый DNWG/III и пошли пить местное пиво в какой-то таверне. По большому счёту, это не было разрешено…

  • Post a new comment

    Error

    Comments allowed for friends only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 2 comments