Analitycs

суббота, 24 декабря 2011 г.

Как настроить сервер? или оптимизация сайтов на PHP (Nginx, PHP, MySQL, Memcache)

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

Если же вы еще и не профессиональный HighLoad Linux-админ, а, например, разработчик (как я), то в процессе настройки прийдется ловить много-много граблей...  ;-)

Хочу немного улучшить состояние вашего лба, рассказав про те шишки, что набивал самостоятельно или с помощью более "администых" друзей. Специальные оптимизации на уровне правок PHP-кода не рассматриваю, это отдельная тема, сейчас - только сервер, консоль и вы, ну может где пару PHP скриптов немного поправить понадобится - буду считать, что свою CMS вы чуть-чуть знаете.

Ниже рассматривается достаточно часто встречаемая комбинация для сайтов: nginx + php (nginx+apache c php немного отличается - вместо fastcgi_xxx будет proxy_xxx).

Да, и считаем, что сейчас все компоненты вашей системы (nginx, php, mysql, memcache) крутятся на одной машине - как оно обычно и бывает на частных ресурсах.

PHP


  • Пускаем как fastcgi через сокет
  • Pconnect к базе - спорно
  • Не забываем акселератор (моя юзает eAccelerator) - хотя тоже есть спорные моменты

eAccelerator


Только для production машин можно отключить проверку Modified time - это абсолютно не подходит, если на сервере идет отладка скриптов - иначе будете ловить постоянные глюки и проблемы - включать только после того как сайт стал стабилен.

eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="0"
eaccelerator.shm_only="1"

Временые диски

tmpfs для /tmp и сессий PHP - все это сносится в память, если ее достаточно. В /etc/fstab добавляем

tmpfs                   /tmp                    tmpfs   defaults        0 0
tmpfs /var/lib/php tmpfs size=200M,nr_inodes=1m,nosuid 0 0

MySQL

  • Проверяем, включен ли query кэш
  • Также используем сокет
  • Если в вашей CMS используется таблица сессий - ставим для них тип MEMORY (если нет текстовых полей) - это приведет к сбросу всех залогиненных пользователей при перезагрузке сервера, но добавит немного скорости. Ну или если это неприемлемо - то надеюсь, она уже переведена в InnoDB? ;-)
  • Определяем оптимальное количество коннектов - статистика хотя бы за месяц (я юзаю munin). Ставим в 1.5-2 раза больше среднего.
Более подробно про оптимизацию MySQL можно прочитать тут.

Memcache

Если вся солянка крутится на одной машине - то также используем коннект через сокеты (по умолчанию не используется - стоит ip адрес). В таком варианте работы memcache возможны проблемы с некоторыми средствами мониторинга memcache (которые работают также по IP).

Не забываем в PHP использовать сжатие при работе с MEMCACHE.

Nginx

Ограничиваем число коннектов и запросов, особенно на ресурсоемкие скрипты
http {
...
    limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
    limit_zone three $binary_remote_addr 10m;

Включаем кэширование для неавторизованных гостей

http {
...
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=wholepage:50m inactive=15d max_size=5000m;
        location ~ .*\.php$ {
            limit_conn three 20;
            include         /etc/nginx/fastcgi.conf;
            fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass    unix:/var/run/php-fastcgi/php.socket;
            #access_log  /var/log/nginx/domain.access.log  my_combined;
            fastcgi_cache wholepage_guest;
            fastcgi_cache_valid 301 302 304 10m;
            fastcgi_cache_valid 200 360m;
            fastcgi_cache_valid 404 5s;
            fastcgi_cache_key "$request_method|$host|$request_uri";
            fastcgi_pass_header "Set-Cookie";
            fastcgi_ignore_headers "Cache-Control" "Expires";
            fastcgi_cache_bypass $cookie_phpbb_session $arg_nocache $arg_PHPSESSID;
            fastcgi_no_cache $cookie_phpbb_session $arg_nocache $arg_PHPSESSID;
    }
Где phpbb_session - имя куки по которой идет авторизация

Все запросы с ?nocache=1 и PHPSESSID попадают на PHP-бэкенд сразу без кэша не забываем открыть скрипт, по которому идет авторизация (в том числе и всякие капчи - их можно переписать на ?nocache=1) - тут возможно прийдется немного поковыряться и в коде CMS тоже.

        location /register.php {
                limit_conn three 20;
                include         /etc/nginx/fastcgi.conf;
                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass    unix:/var/run/php-fastcgi/php.socket;
        }

Nginx - общие рекомендации

Очень нежелательно использовать location с регекспами - только простые префиксы вида
location /mymodule {}
Если от регекспов никак не избавится - то лучше их обрамлять простым location (Причина - сложноуловимые перехлесты в логике парсинга URL - кто за кем будет следовать)
location /mymodule {
  location ~ \/mymodule\/(.*)\.php$ {
    чего-то
  }

}

Отрубаем access лог для картинок

Разумеется - это только основные моменты оптимизации, на самом деле их гораздо больше. А какие трюки для уменьшения нагрузки на сервер знаете вы? Пишите в комментах.

пятница, 23 декабря 2011 г.

Как удалить MacPorts?

Недавно при миграции на новый макбук я допустил стратегическую ошибку - полностью восстановился из архива TimeMachine и наступил на грабли - старый-то ноут был 32-битный, а новый - уже 64 бита.

После 2 дней попыток обойти все баги перекомпиляции MacPort, решил их снести к чертовой матери и попробовать собрать все начисто.

Итак, как удалить MacPorts?


# port -f uninstall installed

После чего ставлю/собираю заново то, что нужно - пока "коробочка жужжит" (с) ;-)

Если же нужно вычистить всю жизнедеятельность MacPorts из системы, то


$ sudo rm -rf /opt/local \
    /Applications/DarwinPorts  /Applications/MacPorts \
    /Library/LaunchDaemons/org.macports.* /Library/Receipts/DarwinPorts*.pkg \
    /Library/Receipts/MacPorts*.pkg /Library/StartupItems/DarwinPortsStartup \
    /Library/Tcl/darwinports1.0 /Library/Tcl/macports1.0 \
    ~/.macports

Да, если у вас вторая версия - то удаляемые каталоги, разумеется, меняются на те, что у вас. 

Найдено тут, HomeBrew ставить не собираюсь. ПОКА не собираюсь, во всяком случае.

среда, 21 декабря 2011 г.

Как сохранить/восстановить настройки-сайты/Sites в Panic Coda под MacOS?

Вот всем хороша Coda, но при восстановлении данных из бекапа или переносе профиля на другую машину - часто теряются настройки проектов - Sites. А если их много... и там прошита куча паролей... то жить честному разработчику становиться совсем грустно;-(

В отличие от Transmit - в ней нет встроенного механизма бекапа/переноса, но как обычно - почти любую проблему можно решить и не "в лоб" - можно "ручками" перенести файл настроек, который находится в

~/Library/Preferences/com.panic.Coda.plist

Где ~/ ваш домашний каталог.

P.S. И да, принимаю поздравления с долгожданным новым Pro 13' (MD314RS/A). Теперь Aperture ведет себя вполне прилично - и даже матрица нормальная, без цветовых искажений ;-) ;-)

/me почти счастлив ;-)




воскресенье, 18 декабря 2011 г.

Skyrim: The Dragonborn Comes - Female Cover by Malukah

Уж на что я обычно спокойно отношусь ко всяким фэнартам и прочему user-generated контенту "по мотивам" чего-бы-то-не-было... но вот эта девушка сильно зацепила.



Our Hero, our Hero, claims a warrior's heart
I tell you, I tell you, the Dragonborn comes
With a Voice wielding power of the ancient Nord art
Believe, believe, the Dragonborn comes

It's an end to the evil of all Skyrim's foes
Beware, beware, the Dragonborn comes
For the darkness has passed and the legend yet grows
You'll know, you'll know, the Dragonborn comes

Dovahkiin, Dovahkiin
Naal ok zin los vahriin
Wah dein vokul mahfaeraak ahst vaal
Ahrk fin norok paal graan
Fod nust hon zindro zaan
Dovahkiin, fah hin kogaan mu draal

пятница, 16 декабря 2011 г.

Волшебный пендель

Решил ввязаться в небольшую сетевую авантюру - поучаствовать в блогоконкурсе "Волшебный пендель", но как известный скептик и циник - ничего хорошего от этого не жду ;-)

Цели блога на ближайший год

  • не потерять интерес и возможность вести блог;
  • писать в месяц по два более-менее приличных поста и несколько технических заметок;

Целевая аудитория блога

  • разработчики и админы, которым могут быть полезны те задачи, которые я решаю; 
  • люди, уставшие от копи-пасты в блогах;
  • мои знакомые и друзья;

Выполнение условий конкурса

Я участник самого полезного конкурса от Сергея Первушина "Волшебный Пендель для вашего блога"!. Благодаря этому конкурсу я могу стать успешным и известным блоггером. А еще я могу выиграть ценные призы:
1. 3 000 рублей и книга, единственная официальная биография Стива Джобса – “Стив Джобс. Биография“.
2. 2 000 рублей и книга, которая перевернет представления о бизнесе – “Rework. Бизнес без предрассудков“.
3. 1 000 рублей и книга, которая поможет вам потрясти воображение людей – “WOW-факторы. Пора потрясти воображение людей!“.
+ все победители получат "свежий" видеокурс от Александра Борисова "Как стать блоггером тысячником".

Определять победителей будет экспертное, независимое жюри:
1. Михаил Шакин (shakin.ru).
2. Дмитрий Голополосов (blog.dimok.ru).
3. Александр Борисов (isif-life.ru).

Ты тоже можешь принять участие в этом конкурсе. Узнай легко выполнимые условия и стань по-настоящему упешным блоггером.

Скептические комментарии

>Я участник самого полезного конкурса

Сильно сомневаюсь в его полезности, но посмотрим...

>Благодаря этому конкурсу я могу стать успешным и известным блоггером.

Не уверен, что именно об этом я мечтал всю свою жизнь ;-)

>А еще я могу выиграть ценные призы:

Вот воистину - "nobody cares" (с). Призы как таковые - неинтересны, интересен - процесс и полученный результат эксперимента.

>Михаил Шакин (shakin.ru)

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

>Дмитрий Голополосов (blog.dimok.ru).

Уважаю как человека, успешно ведущего бизнес в Интеренете, но вот блог - увы - стал абсолютно неинтересен. Давно отписался. 

>Александр Борисов (isif-life.ru).

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

>все победители получат "свежий" видеокурс от Александра Борисова "Как стать блоггером тысячником".

Почему "свежий" написано в кавычках?  Не самый лучший способ анонса своего продукта - подобное написание эпитета вопринимается как сарказм.

Ладно, посмотрим что из этого получится...

пятница, 9 декабря 2011 г.

HeadHunt: нужны Highload Python, AppManager и тестеры

Мы ищем несколько человек - специалистов по highload Python, один application manager и хороших тестировщиков в СПб.

"Мы" - это ООО «Стрим», дочерняя компания ОАО «МТС»

Разработчик платформенных решений ( Python, Highload)

Обязанности:

  • разработка и дальнейшее сопровождение серверной части медийных сервисов для проекта Омлет.ру (в первую очередь сервиса управления и распространения легального видео-контента);
  • консультирование по вопросам высоконагруженных систем.
Требования:
  • опыт разработки на Python от 2 лет;
  • хорошее знание SQL, опыт работы, а так же оптимизации и тюнинга СУБД PostgreSQL или MySQL;
  • опыт работы с no-SQL решениями,  в проектах по запуску высоконагруженных веб-сервисов (от 500 тыс показов в сутки);
  • аналитический склад ума, коммуникабельность, знание основ ООП, хорошая математическая база;
  • дополнительными плюсами являются: знание и опыт применения различных языков программирования, новейших технологий, самообучение и саморазвитие, английский язык, опыт создания несложных UI
Если будет практический опыт Tornado/Twisted - вам большой такой плюс.

Специалист по передаче в эксплуатацию (application manager)

позиция подразумевает деятельность на стыке разработка ПО – эксплуатация, т.е. задачи связанные с передачей в эксплуатацию после разработки и тестирования. Подразумевает навыки системного администрирования, навыки написания документации, разумную дотошность.

Задачи:
  • написание скриптов деплоя приложений или настройка специализированной среды развертывания приложений;
  • приемка серверных приложений после тестирования;
  • передача приложения в эксплуатацию;
  • валидация документации по установке приложений;
  • написание документации по эксплуатации;
  • анализ поведения приложений при эксплуатации, выявление сложностей эксплуатации приложений; 
Требования к кандидату:
  • владение linux на уровне базового администрирования;
  • владение windows на уровне продвинутого пользователя;
  • опыт написания скриптов на shell;
  • знание одного из языков: php, ruby, python;
  • опыт написания документации;
  • аналитический склад ума;

Специалист по тестированию

Обязанности:
  • тестирование серверных компонент видео-сервиса и всего сервиса в целом, в том числе - автоматизация тестирования и нагрузочное тестирование
Требования:
  • образование в сфере ИТ, желательно понимание основ программирования;
  • опыт функционального и нагрузочного тестирования от 2 лет;
  • хорошее знание SQL;
  • опыт работы в проектах по запуску высоконагруженных веб-сервисов (от 500 тыс. показов в сутки);
  • аналитический склад ума, коммуникабельность, знание основ ООП;
  • владение инструментами JMeter или аналогичными;
  • дополнительными плюсами являются: знание и опыт применения различных языков программирования, знание английского языка.
Условия для всех вакансий:
  • вся белая ЗП, оформление по ТК;
  • ненормированный рабочий день;
  • 31 день оплачиваемого отпуска;
  • испытательный срок 3 мес.
  • ДМС после прохождения испытательного срока;
  • корпоративная мобильная связь;
  • квартальные и годовые бонусы;

Если ваше резюме удовлетворяет требованиям на 3/4 - смело шлите его на michael(dot)neradkov(dog)gmail(dot)com. 

Буду признателен, если поделитесь информацией со своими знакомыми.

Заранее спасибо!



четверг, 8 декабря 2011 г.

Итоги 2.5 месяцев отдыха...

В сентябре я понял, что уже года 4 практически не отдыхал - и устроил себе 2.5 месяца отдыха от работы.

Итоги этого мероприятия - ниже
  • 4 заказных гараж кита
     
  •  2 самолета, один - из них заказной
     
  • Значительное количество доработок на сайте,
  • Два проекта на подработке - увы, никуда от них не получилось деться ;-)
А теперь - снова работать.