<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Apple Geek &#187; hosting</title>
	<atom:link href="http://theapplegeek.ru/archives/tag/hosting/feed" rel="self" type="application/rss+xml" />
	<link>http://theapplegeek.ru</link>
	<description>Чему ты научился сегодня?</description>
	<lastBuildDate>Thu, 02 Feb 2012 16:02:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Краткое сравнение производительности WordPress при различных конфигурациях софта</title>
		<link>http://theapplegeek.ru/archives/5722</link>
		<comments>http://theapplegeek.ru/archives/5722#comments</comments>
		<pubDate>Sat, 08 Oct 2011 17:43:03 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Linux & PC]]></category>
		<category><![CDATA[hosting]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=5722</guid>
		<description><![CDATA[Полгода назад проводил тестирование различных конфигураций от "голого" Apache до Nginx с кешированием. В статье привожу финальные данные без деталей о конфигурации.]]></description>
			<content:encoded><![CDATA[<p>По поводу <a href="http://theapplegeek.ru/archives/5719" >лирики о технической эволюции блога</a> только что нашёл заготовки детальной статьи об оптимизации WordPress, которую я писал в апреле, но потом отложил её и не опубликовал.</p>
<p>Не уверен, что выложу её &#8211; она требует повторных экспериментов, поэтому приведу выдержки, не подкрепляя их фрагментами конфигурации.</p>
<p>Итак, имеется сервер с Ubuntu Server 10.10. Сервер мощный &#8211; 2 x Xeon X5260@3.33GHz, 8 GB RAM, RAID 1 из двух дисков SAS 15K rpm на аппаратном RAID.</p>
<p>Дисковая производительность слабая по состоянию на текущий момент &#8211; всего 100 MBps:</p>
<pre>
$ sudo hdparm -t /dev/cciss/c0d0
/dev/cciss/c0d0:
 Timing buffered disk reads:  294 MB in  3.03 seconds =  96.98 MB/sec
</pre>
<p>Задача &#8211; максимизировать производительность WordPress на этом сервере.</p>
<p>Тесты проводил на сайте с 300 статей, запрашивая домашнюю страницу со 100 конкурентными запросами:</p>
<pre>
$ ab -n 20000 -c 100 http://benchmark.ctrld.me/
</pre>
<p>Результаты:</p>
<table cellspacing="1" cellpadding="4" border="0" id="kbtable">
<tbody>
<tr id="kbheader">
<td><b>Конфигурация</b></td>
<td><b>Requests per second</b></td>
<td><b>Load average</b></td>
</tr>
<tr id="odd">
<td>Apache, InnoDB, без APC</td>
<td>25.83</td>
<td>110.29</td>
</tr>
<tr id="even">
<td>Apache, MYISAM, с APC</td>
<td>120.47</td>
<td>103.54</td>
</tr>
<tr id="odd">
<td>Apache, INNODB, с APC</td>
<td>118.50</td>
<td>100.43</td>
</tr>
<tr id="even">
<td>Apache, InnoDB, APC, W3 Cache (file)</td>
<td>893.14</td>
<td>2.06</td>
</tr>
<tr id="odd">
<td>Apache, InnoDB, APC, W3 Cache (apc)</td>
<td>907.26</td>
<td>1.04</td>
</tr>
<tr id="even">
<td>Apache, InnoDB, APC, W3 Cache (memcached)</td>
<td>893.21</td>
<td>1.09</td>
</tr>
<tr id="odd">
<td>Nginx + Apache + APC + плагин кеширования</td>
<td>868.17</td>
<td>0.52</td>
</tr>
<tr id="even">
<td>Nginx + Apache + APC + плагин кеширования + Nginx Cache</td>
<td>6984.47</td>
<td>0.01</td>
</tr>
</tbody>
</table>
<p>P.S. На данный момент я отказался от Apache, оставил nginx fastcgi_cache, но не использую никаких плагинов кеширования. На повторных обращениях к одной странице выигрыш потрясающий, однако генерация новой страницы занимает сравнительно длительное время. Я решу этот вопрос и сделаю финальную статью. Текущие результаты не привожу, так как мощность тестового сервера и VPS очень разные.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/5722/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Техническая эволюция блога &#8211; от 2 до 5000 запросов в секунду. Лирика</title>
		<link>http://theapplegeek.ru/archives/5719</link>
		<comments>http://theapplegeek.ru/archives/5719#comments</comments>
		<pubDate>Sat, 08 Oct 2011 09:37:21 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Linux & PC]]></category>
		<category><![CDATA[hosting]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=5719</guid>
		<description><![CDATA[Технологии, которые использовались на сайте с момента запуска до текущего момента]]></description>
			<content:encoded><![CDATA[<p><b>Update от 10.12.2011:</b> 512 MB для комфортной работы сайта мало, периодически в кеш попадают пустые страницы. Поэтому отключил nginx cache.</p>
<p>Опыт системного и сетевого администрирования у меня достаточно большой. Ещё в 1994-м году я познакомился с Linux и FreeBSD, примерно в это же время починил считавшийся безнадёжно испорченным Silicon Graphics одного пафосного рекламного агентства, что придало мне сил и уверенности в нужности знания Unix. Занимался запуском и администрированием одного национального ISP, потом датацентра, занимаясь и серверным, и сетевым оборудованием.</p>
<p><span id="more-5719"></span>
<p>Четыре года назад благодаря <noindex><a rel="nofollow" href="https://twitter.com/kostiantyn" >@kostiantyn</a></noindex>&#8216;у приобщился к OS X, купив свой первый ноутбук Macbook.</p>
<p>Через два года у меня закономерно <a href="http://theapplegeek.ru/archives/99" >появился</a> Macbook Pro и на волне восторга ко мне пришла идея сделать нишевый блог, в котором я смогу на базе своего опыта в Unix рассказывать о Mac OS X.</p>
<p>20 августа 2009 года, когда MBP лежал, завёрнутый в подарочную упаковку, я поднял сайт и разместил первую статью &#8220;<a href="http://theapplegeek.ru/archives/1" >WWDC-2009&#8243;</a>, которая раньше лежала вроде бы на Tumbler&#8217;е.</p>
<p>Сайт работал на выделенном сервере моих друзей, находящемся в Германии. В качестве CMS я привычно выбрал WordPress, так как давно его использовал на проекте &#8220;<noindex><a rel="nofollow" href="http://traverse-team.org.ua" >Traverse Team</a></noindex>&#8220;. Движок работал на Apache практически &#8220;из коробки&#8221;, никакого тюнинга, кеширования, оптимизации я не делал. Конечно, скорость генерации страниц была низка, но меня это почти устраивало &#8211; сайт по скорости (вернее сказать &#8220;медленности&#8221;) не выделялся из множества других. Операционная система была FreeBSD, под сайт я сделал jail.</p>
<p>Сервер был не очень мощным, к тому же через пару месяцев он стал себя странно вести &#8211; из-за Kernel Panic он напрочь вис, помогала только перезагрузка по питанию. Можно было бы для начала обновить операционную систему, но там вертелись сервисы, завязанные на определённые версии PHP/MySQL, и обновиться было практически невозможно. Но скорее всего была проблема с модулем памяти.</p>
<p>Как раз в это время у меня появился <a href="http://theapplegeek.ru/archives/2476" >второй Macbook</a>. К тому же в моём доме кроме единственного ADSL-провайдера появился второй провайдер, предлагающий подключение по Ethernet, да ещё со статическим IP. Само собой, я воспользовался появившимися возможностями, и сделал из ноутбука сервер под Mac OS X для моего сайта (<a href="http://theapplegeek.ru/archives/2714" >часть 1</a>, <a href="http://theapplegeek.ru/archives/2735" >часть 2</a>, <a href="http://theapplegeek.ru/archives/2790" >часть 3</a>).</p>
<p>Сайт проработал на этом ноутбуке, перемещавшемся с кухонного шкафа на холодильник и обратно, три месяца с января по март 2010 года. Всё было бы хорошо, но вечерами люди в локальной сети занимались скачиванием, что ухудшало откликаемость сайта, а потом две недели подряд у провайдера были проблемы с маршрутизацией сети апстримам, что приводило к пропаданию анонсов на стыке Telia &#8211; Level3. Недоступность сайта по часу в день для блога некритична, но не реагировать было по крайней мере невежливо по отношению к читателям.</p>
<p>После анализа предложений я остановился на <noindex><a rel="nofollow" href="http://www.linode.com/" >Linode</a></noindex> и <a href="http://theapplegeek.ru/archives/3610" >перенёс сайт</a> на VPS. Полтора года пользуюсь сервисом и очень доволен. Взял VPS Linode 512 с 512 MB RAM (хочется больше, но денег жаль).</p>
<p>В процессе настройки я остановился на комбинации Nginx (фронтэнд) + Apache (бэкэнд) + привычный плагин кеширования <noindex><a rel="nofollow" href="http://wordpress.org/extend/plugins/w3-total-cache/" >W3 Total Cache</a></noindex>. В процессе настройки обращался к сайтам <a href="http://www.juev.ru/articles.html" >Juev</a> и <a href="http://snupt.com/" >Snupt</a> (конкретные статьи искать лень, почитайте сайты сами, не пожалеете).</p>
<p>Скорость генерации была нормальная, но хотелось большего. Через некоторое время стал использовать в nginx кеширование проксированных ответов от Apache с патчем выборочного очистки кеша и плагином под WordPress. Сайт стал носиться. От 2 запросов в секунду на голом Apache я пришёл к 5000 запросов. Неплохо.</p>
<p>Всё было бы хорошо, но 512 MB RAM маловато для того, чтобы держать два web-сервера, MySQL, да ещё и memcached для W3 Total Cache. На днях я &#8220;попал&#8221;. Из-за нехватки памяти я потерял все настройки темы (а их было много, включая кастомный CSS). Хорошо, что старые страницы были в кеше и я смог восстановить данные (бекап, конечно, есть, я делаю дамп MySQL раз в сутки и файлы раз в 4 часа, но восстанавливаться с нуля не хотел).</p>
<p>Поэтому сделал &#8220;ход конём&#8221;. Убрал memcached, W3 Total Cache, Apache. Оставил только nginx, php запустил в fastcgi и настроил nginx fastcgi_proxy. При concurrency level 100 при тестах с самого сервера получаю под 5000 запросов в секунду. К тому же избавился от нескольких лишних компонентов. Памяти хватает.</p>
<p>Статья была &#8220;лирикой&#8221;. Если хотите деталей, как всё сконфигурировано, пишите в комментариях &#8211; если будут желающие, то я напишу отдельную статью.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/5719/feed</wfw:commentRss>
		<slash:comments>34</slash:comments>
		</item>
		<item>
		<title>Модификация URL при проксировании в Apache</title>
		<link>http://theapplegeek.ru/archives/4813</link>
		<comments>http://theapplegeek.ru/archives/4813#comments</comments>
		<pubDate>Fri, 19 Nov 2010 11:55:31 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Linux & PC]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=4813</guid>
		<description><![CDATA[Я периодически использую в Apache модуль mod_proxy_http для проксирования трафика с одного frontend&#8217;а на различные backend&#8217;ы. Конфигурация, которая перебрасывает запросы с http://company.com/news/ на внутренний сервер http://internal.company.com/ такая: ProxyPass /news/ http://internal.company.com/ ProxyPassReverse /news/ http://internal.company.com/ Всё работает хорошо, до тех пор, пока на внутреннем сервере вместо относительных URL вида &#8220;/css/style.css&#8221; не появляются абсолютные URL &#8220;http://internal.company.com/css/style.css&#8221;. В этом [...]]]></description>
			<content:encoded><![CDATA[<p>Я периодически использую в Apache модуль mod_proxy_http для проксирования трафика с одного frontend&#8217;а на различные backend&#8217;ы. Конфигурация, которая перебрасывает запросы с http://company.com/news/ на внутренний сервер http://internal.company.com/ такая:</p>
<pre>
ProxyPass        /news/  http://internal.company.com/
ProxyPassReverse /news/  http://internal.company.com/
</pre>
<p><span id="more-4813"></span></p>
<p>Всё работает хорошо, до тех пор, пока на внутреннем сервере вместо относительных URL вида &#8220;/css/style.css&#8221; не появляются абсолютные URL &#8220;http://internal.company.com/css/style.css&#8221;. В этом случае html возвращается внешнему клиенту, он пытается взять css/js или перейти по внутреннему адресу http://internal.company.com, который недоступен из Интернет, и на этом всё заканчивается. Страницы не отображаются, ссылки не работают.</p>
<p>Приходилось выкручиваться с прописыванием внешних URL на внутренних серверах, это рождало проблемы доступа из внутренней сети. Они лечились <noindex><a rel="nofollow" href="http://www.bind9.net/manual/bind/9.3.1/Bv9ARM.ch04.html#AEN767" >Split DNS</a></noindex> (внутренним и внешним клиентам отдавались на один запрос разные имена). Всё это рождало дополнительные сложности, в итоге с трудом поддерживалось и диагностировалось.</p>
<p>Сегодня мне снова понадобилось решить эту задачу. Провёл изучение текущего состояния вопроса и нашёл отличное решение &#8211; <noindex><a rel="nofollow" href="http://httpd.apache.org/docs/2.2/mod/mod_substitute.html" >mod_substitute</a></noindex>, который к тому же входит в стандартную поставку Apache 2.2 и не требует компиляции из сторонних исходников.</p>
<p>Теперь конфигурация выглядит примерно так:</p>
<pre>
ProxyPass        /news/  http://internal.company.com/
ProxyPassReverse /news/  http://internal.company.com/

AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|http://internal.company.com/|http://company.com/news/|in"
</pre>
<p>Замечу &#8211; нагрузка на сервер минимальна, нужно переписывать только text/html. Для других случаев понадобится более расширенная конфигурация. Но направление решения вопроса я показал, от чего-то уже можно оттолкнуться.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/4813/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Отладка работы процессов в Linux с помощью strace</title>
		<link>http://theapplegeek.ru/archives/4712</link>
		<comments>http://theapplegeek.ru/archives/4712#comments</comments>
		<pubDate>Wed, 10 Nov 2010 12:26:58 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Linux & PC]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[system]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=4712</guid>
		<description><![CDATA[Уйду немного в сторону от Mac OS X. Не знаю, заметили ли вы, но в воскресенье я переключил блог на более мощный VPS. Я давно хотел провести оптимизацию, и наконец-то это сделал. Изначально я использовал чистый Apache, потом перешёл на чистый nginx, потом &#8211; на связку nginx как frontend и apache как backend. Но не [...]]]></description>
			<content:encoded><![CDATA[<p>Уйду немного в сторону от Mac OS X. Не знаю, заметили ли вы, но в воскресенье я переключил блог на более мощный VPS. Я давно хотел провести оптимизацию, и наконец-то это сделал.</p>
<p>Изначально я использовал чистый Apache, потом перешёл на чистый nginx, потом &#8211; на связку nginx как frontend и apache как backend. Но не остановился на этом и улучшил производительность за счёт применения nginx cache. Спасибо за рекомендации Денису (<a href="http://www.juev.ru/" >Juev</a>) и Диме (<a href="http://snupt.com/" >Snupt</a>). Детали я опишу в отдельной статье, указав конкретные статьи, мысли и проблемы. Теперь осталось закончить, проведя минификацию css и js &#8211; этим займусь, как только появится время.</p>
<p><span id="more-4712"></span></p>
<p>Мой сайт работает под Ubuntu Server. В процессе настройки возникали нюансы, которые было тяжело диагностировать, не понимая, что именно происходит. И если под Mac OS X я активно для этого использую <a href="http://theapplegeek.ru/archives/358" >dtrace</a>, а под FreeBSD когда-то запускал ktrace, то под Linux мне не доводилось ничего подобного делать.</p>
<p>Время пришло и мне помог <noindex><a rel="nofollow" href="https://wiki.ubuntu.com/Strace" >strace</a></noindex>.</p>
<p>Суть вопроса была в том, что я ставил дополнительный модуль ngx_cache_purge по рецепту, описываемом в статье &#8220;<noindex><a rel="nofollow" href="http://johnlevandowski.com/2010/10/05/wordpress-nginx-proxy-cache/" >WordPress nginx proxy cache</a></noindex>&#8220;, но при обращению к нужному URL вместо информации о выполненном действии я получал код 404. Я понятия не имел &#8211; вызвано это проблемой в конфигурации или же модуль попросту не работал. Был вариант вставлять директивы отладки в код модуля и перекомпилировать nginx, но это было трудоёмко и неоперативно.</p>
<p>Процесс отладки с помощью strace прост. Сначала нужно определить pid&#8217;ы интересующих процессов:</p>
<pre>
$ pidof nginx
<small>6029 6028 6027 6026</small>
</pre>
<p>А потом подключиться к этим процессам:</p>
<pre>
$ sudo strace -Ff -tt -p 6029 -p 6028 -p 6027 -p 6026
<small>[pid  6027] 18:16:17.711733 <... epoll_wait resumed> {{EPOLLIN, {u32=143765384, u64=290081331106393992}}}, 512, -1) = 1
[pid  6027] 18:16:17.711817 gettimeofday({1289146577, 711843}, NULL) = 0
[pid  6027] 18:16:17.711955 accept(9, {sa_family=AF_INET, sin_port=htons(36923), sin_addr=inet_addr("94.45.55.146")}, [16]) = 13
[pid  6027] 18:16:17.712135 ioctl(13, FIONBIO, [1]) = 0
[pid  6027] 18:16:17.712271 epoll_ctl(11, EPOLL_CTL_ADD, 13, {EPOLLIN|EPOLLET, {u32=143765568, u64=13827881989708034112}}) = 0
[pid  6027] 18:16:17.712409 epoll_wait(11, {{EPOLLIN, {u32=143765568, u64=13827881989708034112}}}, 512, 60000) = 1
[pid  6027] 18:16:17.712572 gettimeofday({1289146577, 712607}, NULL) = 0
[pid  6027] 18:16:17.712758 brk(0x898c000) = 0x898c000
[pid  6027] 18:16:17.712892 recv(13, "GET /purge/archives/4638 HTTP/1."..., 131072, 0) = 613
[pid  6027] 18:16:17.713240 open("/var/lib/nginx/cache/b/22/d2587efb52d796c83c14d80388e4322b", O_RDONLY|O_NONBLOCK|O_LARGEFILE) = -1 ENOENT (No such file or directory)
[pid  6027] 18:16:17.713696 writev(13, [{"HTTP/1.1 404 Not Found\r\nServer: "..., 202}, {"b4\r\n", 4}, {"\37\213\10\0\0\0\0\0\0\3", 10}, {"\355\216\261\16\3020\fDw$\376\301t\217\2R\307\220\5\201\304\0\v_\220\326&#038;\211\224\306(\4"..., 170}, {"\r\n0\r\n\r\n", 7}], 5) = 393
[pid  6027] 18:16:17.713926 write(5, "94.45.55.146 theapplegeek.ru - ["..., 243) = 243</small>
</pre>
<p>Виден процесс работы приложения и из него я увидел, что 404 возникает из-за отсутствия в кеше /var/lib/nginx/cache файла. Т.е. модуль работает, и после изучения конфигурации я нашёл опечатку в описании ключа кеширования. Польза налицо. Рекомендую.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/4712/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Затраты на сервис Amazon CloudFront</title>
		<link>http://theapplegeek.ru/archives/3669</link>
		<comments>http://theapplegeek.ru/archives/3669#comments</comments>
		<pubDate>Fri, 02 Apr 2010 20:14:27 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[hosting]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=3669</guid>
		<description><![CDATA[Для кеширования контента я использую плагин WordPress &#8220;W3 Total Cache&#8220;. Одна из очень ценных его функций кроме кеширования &#8211; вынесение статического контента (изображения, css, js-файлов) в Content Delivery Network Amazon CloudFront (о его настройке я уже рассказывал). Достоинства: Ускоряется загрузка сайта за счёт того, что контент располагается на ближайших серверах CDN. Уменьшается нагрузка на сайт, [...]]]></description>
			<content:encoded><![CDATA[<p>Для кеширования контента я использую плагин WordPress &#8220;<noindex><a rel="nofollow" href="http://wordpress.org/extend/plugins/w3-total-cache/" >W3 Total Cache</a></noindex>&#8220;. Одна из очень ценных его функций кроме кеширования &#8211; вынесение статического контента (изображения, css, js-файлов) в Content Delivery Network <noindex><a rel="nofollow" href="http://aws.amazon.com/cloudfront/" >Amazon CloudFront</a></noindex> (о его настройке <a href="http://theapplegeek.ru/archives/2960" >я уже рассказывал</a>).</p>
<p>Достоинства:</p>
<ul>
<li>Ускоряется загрузка сайта за счёт того, что контент располагается на ближайших серверах CDN.</li>
<li>Уменьшается нагрузка на сайт, так как не приходится раздавать множество изображений и других файлов, движок WordPress генерирует только страницу, а всё остальное подтягивается из CDN. Это снижает требования к хостингу.</li>
<li>Уменьшается трафик, ведь большинство трафика создают изображения. Это также приводит к экономии.</li>
</ul>
<p><span id="more-3669"></span></p>
<p>Стоимость сервиса очень демократичная. На текущий момент у блога 300 уникальных посетителей в день и 600 RSS-подписчиков с fullfeed. И за это я плачу порядка $2-$3 в месяц:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/04/01_cloudfront-full.png"  class="image-link" rel="lightbox"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/04/01_cloudfront-thumb.png" height="312" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/3669/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Переход на внешний хостинг</title>
		<link>http://theapplegeek.ru/archives/3610</link>
		<comments>http://theapplegeek.ru/archives/3610#comments</comments>
		<pubDate>Tue, 23 Mar 2010 10:20:50 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Linux & PC]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[hosting]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=3610</guid>
		<description><![CDATA[Три месяца я держал свой блог на ноутбуке MacBook, стоящем на кухне &#8211; он плавно перемещался под потолком с кухонного шкафа на холодильник и обратно. Процесс установки блога на Mac OS X я детально описал в статьях: &#8220;Часть 1, MySQL&#8220;, &#8220;Часть 2, Apache&#8221; и &#8220;Часть 3, кеширование&#8220;. Но в последние недели я стал замечать, что [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://images.theapplegeek.ru/wp-content/uploads/2010/03/00_linode-thumb1.png" height="126" align="right" width="160" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></p>
<p>Три месяца я держал свой блог на ноутбуке MacBook, стоящем на кухне &#8211; он плавно перемещался под потолком с кухонного шкафа на холодильник и обратно. Процесс установки блога на Mac OS X я детально описал в статьях: &#8220;<a href="http://theapplegeek.ru/archives/2714" >Часть 1, MySQL</a>&#8220;, &#8220;<a href="http://theapplegeek.ru/archives/2735" >Часть 2, Apache</a>&#8221; и &#8220;<a href="http://theapplegeek.ru/archives/2790" >Часть 3, кеширование</a>&#8220;.</p>
<p>Но в последние недели я стал замечать, что по какой-то непонятной для меня причины подсеть моего домашнего провайдера становится недоступной на переходе Telia &#8211; Level3. Если бы это был одинарный случай, то я бы не беспокоился. Но две недели подряд &#8211; это уже перебор.</p>
<p>В итоге я принял решение перейти на внешний хостинг.</p>
<p><span id="more-3610"></span></p>
<p>К хостингу, особенно местечковому, у меня отношение сугубо отрицательное. Хостинг-провайдеры зарабатывают деньги. И разместить 200 клиентов на сервере, который может нормально обслужить всего 100 клиентов &#8211; это нормальная ситуация. И начинаются войны &#8211; клиенты требуют от провайдера сервиса, а провайдер обвиняет клиентов в создании излишней нагрузки и заставляет переходить на другой тариф. Всё это сопровождается непродуманностью технических возможностей &#8211; даже WordPress проблематично запустить из-за искусственно заниженных ограничений по памяти. В итоге shared-хостингом и VPS недовольны все. Поэтому местных хостинг-провайдеров я даже не рассматривал.</p>
<p>Самый правильный вариант &#8211; это выделенный сервер. Но прямой прибыли мои проекты не приносят, и платить $100-$200 никакого желания у меня нет.</p>
<p>Пересматривая заметки в Google Reader, я наткнулся на <noindex><a rel="nofollow" href="http://journal.uggedal.com/vps-performance-comparison" >сравнительный анализ</a></noindex> сервисов VPS Amazon, Rackspace, Linode и ещё двух компаний. <noindex><a rel="nofollow" href="https://www.linode.com/" >Linode</a></noindex> по большинству параметров опередил, и я решил попробовать.</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/03/01_linode-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/03/01_linode-thumb.png" height="570" width="462" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Linode предлагает <noindex><a rel="nofollow" href="http://www.xen.org/" >Xen</a></noindex>-хостинг. Я взял минимальный пакет Linode 360 с 360 MB RAM.</p>
<p>Конечно, перенос блога об Apple с Mac OS X на Linux не совсем кошерно, и я не оправдываю часть названия &#8220;The Apple&#8221;. Зато &#8220;Geek&#8221;&#8216;овость не страдает. Мне ещё с времени экспериментов с Amazon нравится Ubuntu, поэтому я создал VPS на Ubuntu 9.10 в Лондонском датацентре:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/03/02_linode-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/03/02_linode-thumb.png" height="146" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Процесс установки и переноса прошёл практически гладко, я даже не заметил ограничения по памяти. Мне показалось, что сайт стал работать немного медленнее, но это можно списать на территориальную удалённость площадки. Сейчас всяческие локальные сети обмена трафиком вроде UA-IX, MSK-IX уже кажутся рудиментом, и я предпочитаю держать ресурсы подальше от родины, тем более, что цена вопроса &#8211; какие-то смешные 50 ms RTT.</p>
<p>Да и стоимость меня очень даже устраивает. Кстати, <noindex><a rel="nofollow" href="http://blog.myfreeweb.ru/" >@myfreeweb</a></noindex> порекомендовал сервис (dv) компании <noindex><a rel="nofollow" href="http://mediatemple.net/" >Media Temple</a></noindex>. Но я хочу пока побыть на Linode, тем более, что за месяц я уже заплатил.</p>
<p>Кроме всего прочего у Linode есть <noindex><a rel="nofollow" href="http://itunes.apple.com/us/app/linode-manager/id352861751?mt=8" >клиент под iPhone</a></noindex>:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/03/03_linode-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/03/03_linode-thumb.png" height="480" width="320" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Если вы заметили ухудшение работы сайта &#8211; пожалуйста, сообщите об этом мне в комментариях, я всегда готов улучшить сервис.</p>
<p>See you,<br />
Serdyukov Oleg</p>
<p><b>Update 17.08.2010.</b> Я по-прежнему на Linode и мне нравится. Если вы решите и сами воспользоваться Linode, то можете зарегистрироваться, используя мою <noindex><a rel="nofollow" href="http://www.linode.com/?r=dc1dd219d560a964281d777ad34a62af288a1de8" >реферальную ссылку</a></noindex>.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/3610/feed</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Вынесение статического контента в Amazon CloudFront</title>
		<link>http://theapplegeek.ru/archives/2960</link>
		<comments>http://theapplegeek.ru/archives/2960#comments</comments>
		<pubDate>Mon, 18 Jan 2010 15:20:12 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Linux & PC]]></category>
		<category><![CDATA[hosting]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=2960</guid>
		<description><![CDATA[Изображение из заголовка я взял с AllThingsDistributed. Для любого сайта важны контент, скорость и дизайн. Без качественного контента не будет посетителей, плохая скорость их рано или поздно отпугнёт, плохой дизайн тоже не придаст особой любви даже при хорошем контенте (но это на последнем месте, так как многие посетители читают обновления только через RSS). Контент и [...]]]></description>
			<content:encoded><![CDATA[<p><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/01_cloudfront-thumb1.png" height="80" align="right" width="160" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></p>
<p><i>Изображение из заголовка я взял с <noindex><a rel="nofollow" href="http://www.allthingsdistributed.com/2008/11/amazon_cloudfront.html" >AllThingsDistributed</a></noindex>.</i></p>
<p>Для любого сайта важны контент, скорость и дизайн. Без качественного контента не будет посетителей, плохая скорость их рано или поздно отпугнёт, плохой дизайн тоже не придаст особой любви даже при хорошем контенте (но это на последнем месте, так как многие посетители читают обновления только через RSS). Контент и дизайн &#8211; вещи творческие, а вот скорость технологична, её можно обеспечить за счёт применения некоторых рекомендаций и настройки софта. Самое качественное и полное руководство &#8211; это документ Yahoo &#8220;<noindex><a rel="nofollow" href="http://developer.yahoo.com/performance/rules.html" >Best Practices for Speeding Up Your Web Site</a></noindex>&#8220;. Если его выполнить, то можно добиться значительного ускорения работы своего сайта.</p>
<p>Для аудита есть плагин Firefox <noindex><a rel="nofollow" href="https://addons.mozilla.org/en-US/firefox/addon/5369" >YSlow</a></noindex>, разработанный Yahoo. Он работает совместно с <noindex><a rel="nofollow" href="https://addons.mozilla.org/en-US/firefox/addon/1843" >FireBug</a></noindex>. В этой части я не буду останавливаться на нём, расскажу в отдельной части.</p>
<p>Один из важных пунктов в оптимизации &#8211; это &#8220;Use a Content Delivery Network&#8221;. Все Content Delivery Network служат для быстрой и надёжной географически распределённой доставки статического контента. Вот как раз об этом и поговорим.</p>
<p><span id="more-2960"></span></p>
<p>У Amazon есть свой CDN &#8211; <noindex><a rel="nofollow" href="http://aws.amazon.com/cloudfront/" >CloudFront</a></noindex>. Описание и практические принципы работы расписаны в <noindex><a rel="nofollow" href="http://docs.amazonwebservices.com/AmazonCloudFront/latest/GettingStartedGuide/" >Getting Started Guide</a></noindex>, я не буду их здесь дублировать, а покажу, как практически разместить свои данные в CloudFront.</p>
<p><b>Предупреждение:</b> услуга Amazon CloudFront платная, тарифы есть на сайте Amazon.</p>
<p>Для начала активируем сервис, для чего идём на страницу <noindex><a rel="nofollow" href="http://aws.amazon.com/cloudfront/" >CloudFront</a></noindex>:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/02_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/02_cloudfront-thumb.png" height="329" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Sign Up For Amazon CloudFront. Будет запрошен логин/пароль:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/03_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/03_cloudfront-thumb.png" height="370" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Можно ознакомиться с ценами и проверить биллинговые данные, после чего нажать &#8220;Complete Sign Up&#8221;:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/04_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/04_cloudfront-thumb.png" height="372" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Сервис активирован:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/05_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/05_cloudfront-thumb.png" height="372" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Работать с CloudFront можно через <noindex><a rel="nofollow" href="http://aws.amazon.com/console/" >AWS Management Console</a></noindex>:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/06_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/06_cloudfront-thumb.png" height="346" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/07_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/07_cloudfront-thumb.png" height="404" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Но гораздо проще &#8211; через бесплатную утилиту <noindex><a rel="nofollow" href="http://cyberduck.ch/" >Cyberduck</a></noindex>. Я собирался привычно рассказывать о работе с системой через консоль, но в процессе создания S3 Bucket с удивлением увидел, что Cyberduck прекрасно работает не только с S3, но и с CloudFront. Желающих же продолжить с консолью я направляю на <noindex><a rel="nofollow" href="http://docs.amazonwebservices.com/AmazonCloudFront/latest/GettingStartedGuide/" >Getting Started Guide</a></noindex>, там всё прекрасно описано.</p>
<p>Предварительно находим и где-нибудь сохраняем AWS Access Key ID и Secret Access Key &#8211; они нам понадобятся немного позже. За ними идём на <noindex><a rel="nofollow" href="http://aws.amazon.com/" >AWS</a></noindex>, Your Account, Security Credentials:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/08_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/08_cloudfront-thumb.png" height="372" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/09_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/09_cloudfront-thumb.png" height="372" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Запускаем программу:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/11_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/11_cloudfront-thumb.png" height="399" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Создаём учётную запись S3:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/12_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/12_cloudfront-thumb.png" height="528" width="434" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Secondary click и Connect, либо просто Enter для подключения:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/13_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/13_cloudfront-thumb.png" height="157" width="356" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>В поле Username вводим AWS Access Key ID, в поле Password &#8211; Secret Access Key:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/14_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/14_cloudfront-thumb.png" height="280" width="434" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Зашли в S3:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/15_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/15_cloudfront-thumb.png" height="399" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Создаю новый каталог (bucket). Имя должно быть уникально для всей системы:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/16_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/16_cloudfront-thumb.png" height="449" width="387" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/17_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/17_cloudfront-thumb.png" height="163" width="426" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/18_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/18_cloudfront-thumb.png" height="399" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Вот информация по bucket&#8217;у (Cmd+I):</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/19_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/19_cloudfront-thumb.png" height="342" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>В Cyberduck есть возможность сразу разместить данные в CloudFront. Для этого выставляем права:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/20_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/20_cloudfront-thumb.png" height="211" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Включаем CloudFront Distribution и логирование</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/21_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/21_cloudfront-thumb.png" height="259" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Заходим в каталог и перетаскиваем туда нужный файл image.jpg:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/22_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/22_cloudfront-thumb.png" height="399" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Смотрим информацию по файлу, запоминаем URL (http://d2ggdqlo6oay4b.cloudfront.net/image.jpg):</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/23_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/23_cloudfront-thumb.png" height="259" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Всё, через минут 5 можно обращаться к файлу по указанному адресу.</p>
<p>Обратите внимание, что в свойствах S3 регион указан &#8220;US Standard&#8221;. Его можно поменять в настройках программы, но до создания bucket&#8217;а:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/24_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/24_cloudfront-thumb.png" height="224" width="415" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/25_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/25_cloudfront-thumb.png" height="250" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Логи по обращению к файлам в CloudFront находятся в каталоге logs в нашем Bucket&#8217;е:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/26_cloudfront-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/26_cloudfront-thumb.png" height="399" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Всё, данные размещены, URL получен, и его можно использовать у себя на сайте. Ждите следующую часть &#8211; я расскажу о потрясающем плагине <noindex><a rel="nofollow" href="http://wordpress.org/extend/plugins/w3-total-cache/" >W3 Total Cache</a></noindex> для WordPress, с ним я ускорил время загрузки страницы с 220 ms до 34 ms &#8211; согласитесь, это очень хороший результат.</p>
<p>Кстати, сейчас вы можете оценить работу и этого плагина, и Amazon CloudFront &#8211; они у меня активны. Один побочный эффект &#8211; пришлось отключить плагин адаптации сайта под iPhone, но я занимаюсь восстановлением его работы.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/2960/feed</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Настройка блога WordPress на Mac OS X. Часть 3, кеширование</title>
		<link>http://theapplegeek.ru/archives/2790</link>
		<comments>http://theapplegeek.ru/archives/2790#comments</comments>
		<pubDate>Wed, 13 Jan 2010 15:38:44 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Linux & PC]]></category>
		<category><![CDATA[hosting]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=2790</guid>
		<description><![CDATA[Для быстрой работы блог нужно всячески кешировать. Я использую комбинацию из нескольких способов &#8211; кеширование на уровне WordPress WP Super Cache, на уровне PHP &#8211; eAccelerator, Memcached и заодно кеширование запросов MySQL. По крайней мере хуже не становится, а улучшение производительности налицо. Один из полезнейших плагинов WordPress &#8211; это WP Super Cache. Он из категории [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/01_memca-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/01_memca-thumb1.png" height="161" align="right" width="150" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></a></noindex></p>
<p>Для быстрой работы блог нужно всячески кешировать. Я использую комбинацию из нескольких способов &#8211; кеширование на уровне WordPress <noindex><a rel="nofollow" href="http://wordpress.org/extend/plugins/wp-super-cache/" >WP Super Cache</a></noindex>, на уровне PHP &#8211; <noindex><a rel="nofollow" href="http://eaccelerator.net/" >eAccelerator</a></noindex>, <noindex><a rel="nofollow" href="http://memcached.org/" >Memcached</a></noindex> и заодно кеширование запросов MySQL. По крайней мере хуже не становится, а улучшение производительности налицо.</p>
<p>Один из полезнейших плагинов WordPress &#8211; это <noindex><a rel="nofollow" href="http://wordpress.org/extend/plugins/wp-super-cache/" >WP Super Cache</a></noindex>. Он из категории &#8220;must have&#8221;. Настройки:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/02_memca-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/02_memca-thumb.png" height="225" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p><span id="more-2790"></span></p>
<p>Есть некоторые проблемы с <noindex><a rel="nofollow" href="http://wordpress.org/extend/plugins/wptouch/" >WPTouch</a></noindex>, поэтому нужно отключить кеширование для мобильных устройств:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/03_memca-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/03_memca-thumb.png" height="307" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Список для копирования:</p>
<pre>
bot
ia_archive
slurp
crawl
spider
iphone
ipod
android
dream
cupcake
webos
incognito
webmate
opera
mini
blackberry9530
blackberry9500
</pre>
<p>Memcached. Я его раньше не использовал, но всегда хотел. Особой эффективности для небольшой нагрузки я не заметил, но он по крайней мере работает. Процесс установки:</p>
<pre>
$ sudo port install memcached
$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.memcached.plist
$ sudo port install php5-memcache
</pre>
<p>И перезапускаем apache.</p>
<p>Статус демона memcached можно посмотреть <noindex><a rel="nofollow" href="http://www.mysqlperformanceblog.com/2008/11/26/a-quick-way-to-get-memcached-status/" >таким образом</a></noindex>:</p>
<pre>
$ echo stats | nc 127.0.0.1 11211
</pre>
<p>Для того, чтобы Memcached использовался в WordPress, ставим плагин <noindex><a rel="nofollow" href="http://wordpress.org/extend/plugins/wp-memcached-manager/installation/" >WP Memcached Manager</a></noindex>. Настройки:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/04_memca-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/04_memca-thumb.png" height="421" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Статус работы:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/05_memca-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/05_memca-thumb.png" height="421" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>EAccelerator. Нужен. Однозначно. Теория &#8211; <noindex><a rel="nofollow" href="http://eaccelerator.net/" >на сайте разработчиков</a></noindex>. Процесс установки и <noindex><a rel="nofollow" href="http://eaccelerator.net/wiki/InstallFromSource" >настройки</a></noindex>:</p>
<pre>
$ sudo port install php5-eaccelerator
$ sudo vim /opt/local/var/db/php5/eaccelerator.ini

eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter="*.php"
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
</pre>
<p>И перезагружаем apache.</p>
<p>Включаем <noindex><a rel="nofollow" href="http://elliottback.com/wp/why-my-wordpress-site-is-so-much-faster-than-yours/" >кеширование запросов в MySQL</a></noindex>:</p>
<pre>
$ sudo vim /etc/my.cnf
query_cache_type = 1
query_cache_size = 26214400
</pre>
<p>И перезагружаем MySQL.</p>
<p>Статус работы:</p>
<pre>
$ mysql mysql
SHOW STATUS LIKE 'Qcache%';
SHOW STATUS LIKE 'Questions%';
</pre>
<p>И в завершение тестируем быстродействие сайта:</p>
<pre>
$ ab -n 1000 -c 1 http://theapplegeek.ru
</pre>
<p>Но и это ещё не всё. Продолжим оптимизацию уже на nginx, одно из направлений &#8211; выставление Expire для определённых типов файлов, а также компресирование ответов. Продолжение следует.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/2790/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Настройка блога WordPress на Mac OS X. Часть 2, Apache</title>
		<link>http://theapplegeek.ru/archives/2735</link>
		<comments>http://theapplegeek.ru/archives/2735#comments</comments>
		<pubDate>Tue, 12 Jan 2010 11:25:37 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Linux & PC]]></category>
		<category><![CDATA[hosting]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=2735</guid>
		<description><![CDATA[Для простоты следующим шагом в качестве web-сервера я запущу apache. Его большое преимущество в том, что php очень просто ставится, как модуль, и не требуется дополнительных ухищрений. Поэтому я запущу сайт именно под apache, а уже после этого переделаю всё под nginx, который мне нравится больше. В Mac OS X есть штатный apache, его можно [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/01_ap-thumb1.png" height="152" align="right" width="160" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></p>
<p>Для простоты следующим шагом в качестве web-сервера я запущу <noindex><a rel="nofollow" href="http://httpd.apache.org/" >apache</a></noindex>. Его большое преимущество в том, что php очень просто ставится, как модуль, и не требуется дополнительных ухищрений. Поэтому я запущу сайт именно под apache, а уже после этого переделаю всё под <noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/Nginx" >nginx</a></noindex>, который мне нравится больше.</p>
<p>В Mac OS X есть штатный apache, его можно запустить в System Preferences/Sharing/Web Sharing:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/02_ap-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/02_ap-thumb.png" height="419" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Это полноценный Apache/2.2.13, но для наших целей он не подходит &#8211; PHP в портах требует установленного apache, причём из портов. Ухищряться можно было бы, но особого желания у меня делать это не было. Поэтому я спокойно смиряюсь с мыслью, что в системе будет стоять Apache родной и Apache из портов.</p>
<p><span id="more-2735"></span></p>
<p>Установка Apache2 проста:</p>
<pre>
$ sudo port install apache2
</pre>
<p>Запуск (пока его запускать не нужно):</p>
<pre>
$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist
</pre>
<p>Остановка:</p>
<pre>
$ sudo launchctl unload -w /Library/LaunchDaemons/org.macports.apache2.plist
</pre>
<p>Я привык управлять apache через apachectl, и не собираюсь изменять своим привычкам. Но apachectl от штатного Apache находится в /usr/sbin/apachectl:</p>
<pre>
$ which apachectl
/usr/sbin/apachectl
</pre>
<p>Apachectl же свежеустановленного порта лежит в /opt/local/apache22/bin/apachectl, для простоты делаем симлинк в каталог, находящийся первее в путях, чем /usr/sbin:</p>
<pre>
$ sudo ln -s /opt/local/apache22/bin/apachectl /opt/local/bin/
</pre>
<p>Теперь очередь за PHP, ставим полный набор, который нужен для WordPress (некоторые модули не нужны, но я их использую все). В процессе установки читаем сообщения:</p>
<pre>
$ sudo port install php5-web
<small>To customize php, copy
/opt/local/etc/php5/php.ini-development (if this is a development server) or
/opt/local/etc/php5/php.ini-production (if this is a production server) to
/opt/local/etc/php5/php.ini and then make changes.</small>
</pre>
<pre>
$ sudo port install php5-mysql
<small>To use mysqlnd with a local MySQL server, edit /opt/local/etc/php5/php.ini and set
mysql.default_socket, mysqli.default_socket and pdo_mysql.default_socket
to /opt/local/var/run/mysql5/mysqld.sock</small>
</pre>
<p>Дальше полезных сообщений не будет:</p>
<pre>
$ sudo port install php5-mbstring
$ sudo port install php5-mcrypt
$ sudo port install php5-zip
$ sudo port install php5-gd
$ sudo port install php5-eaccelerator
$ sudo port install php5-openssl
$ sudo port install php5-sockets
$ sudo port install libssh2
</pre>
<p>Для eaccelerator создаю нужный каталог:</p>
<pre>
$ sudo mkdir /tmp/eaccelerator/
$ sudo chown www:www /tmp/eaccelerator/
</pre>
<p>Беру php.ini-production и делаю в нём базовые правки (тюнинг PHP-тема отдельная)</p>
<pre>
$ sudo cp /opt/local/etc/php5/php.ini-production \
	/opt/local/etc/php5/php.ini
$ sudo vim /opt/local/etc/php5/php.ini
date.timezone = Europe/Kiev
error_log = /var/log/php_errors.log
mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
</pre>
<p>Не забываю создать файл для логов, иначе они могут не писаться</p>
<pre>
$ sudo touch /var/log/php_errors.log
$ sudo chown www:www /var/log/php_errors.log
</pre>
<p>Для интересующихся модули PHP поставились в каталог:</p>
<pre>
$ ls -al /opt/local/lib/php/extensions/no-debug-non-zts-20090626/
<small>-rwxr-xr-x   2 root  admin    71880 Jan  9 22:29 eaccelerator.so
-rwxr-xr-x   2 root  admin   338560 Jan  9 22:32 gd.so
-rwxr-xr-x   2 root  admin  2031040 Jan  9 22:27 mbstring.so
-rwxr-xr-x   2 root  admin    38384 Jan  9 22:29 mcrypt.so
-rwxr-xr-x   2 root  admin    46648 Jan  9 22:26 mysql.so
-rwxr-xr-x   2 root  admin   111672 Jan  9 22:26 mysqli.so
-rwxr-xr-x   2 root  admin   117480 Jan 10 21:41 openssl.so
-rwxr-xr-x   2 root  admin    30496 Jan  9 22:26 pdo_mysql.so
-rwxr-xr-x   2 root  admin    45016 Jan 10 21:47 sockets.so
-rwxr-xr-x   2 root  admin    81680 Jan  9 22:29 zip.so</small>
</pre>
<p>Теперь приступаем к конфигурированию Apache. Я отключаю ненужные мне модули, убираю все комментарии и вычищаю мусор. Рассказывать об этом не буду подробно, могу сказать, что и в &#8220;дефолтовом&#8221; состоянии Apache работает хорошо, главное сделать несколько коррекций, которые я приведу ниже:</p>
<pre>
$ sudo vim /opt/local/apache2/conf/httpd.conf
</pre>
<p>В конце секции загрузки модулей добавляем:</p>
<pre>
LoadModule php5_module modules/libphp5.so
</pre>
<p>Меняем строку</p>
<pre>
DirectoryIndex index.html
</pre>
<p>на</p>
<pre>
DirectoryIndex index.html index.php
</pre>
<p>Раскомментариваем включаемые файлы</p>
<pre>
Include conf/extra/httpd-mpm.conf
Include conf/extra/httpd-vhosts.conf
Include conf/extra/httpd-default.conf
</pre>
<p>Добавляем конфиг для php (файл установился, я удивился, почему сам модуль не активировался в LoadModule):</p>
<pre>
Include conf/extra/mod_php.conf
</pre>
<p>httpd-mpm.conf можем не править, там всё в порядке.</p>
<p>В httpd-default.conf нужно подправить параметры, которые я выделил жирным. Если на сервер будет большое количество коннектов, и, например, база данных будет не справляться, то стоит выключить KeepAlive и размышлять о кешировании.</p>
<pre>
$ sudo vim /opt/local/apache2/conf/extra/httpd-default.conf
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
UseCanonicalName Off
AccessFileName .htaccess
<b>ServerTokens Prod</b>
<b>ServerSignature Off</b>
HostnameLookups Off
</pre>
<p>В httpd-vhosts.conf описываются виртуальные хосты. Я это делаю так:</p>
<pre>
$ sudo vim /opt/local/apache2/conf/extra/httpd-vhosts.conf
<small>NameVirtualHost *:80
&lt;VirtualHost *:80&gt;
    ServerAdmin webmaster@theapplegeek.ru
    ServerName theapplegeek.ru
    ErrorLog "logs/theapplegeek.ru-error_log"
    CustomLog "logs/theapplegeek.ru-access_log" common
    DocumentRoot "/Users/ctrld/Sites/theapplegeek/public_html"
    &lt;Directory "/Users/ctrld/Sites/theapplegeek/public_html"&gt;
        Options FollowSymLinks -Indexes
        AllowOverride All
        Order allow,deny
        Allow from all
     &lt;/Directory&gt;

    &lt;Location "/wp-content/uploads"&gt;
        php_admin_flag engine off
        AddType text/plain .html .htm .shtml
    &lt;/Location&gt;
&lt;/VirtualHost&gt;

&lt;VirtualHost *:80&gt;
    ServerName          www.theapplegeek.ru
    RedirectPermanent   /   "http://theapplegeek.ru/"
&lt;/VirtualHost&gt;</small>
</pre>
<p>Обратите внимание на запрет php для /wp-content/uploads. Также вы видите, что основное имя хоста у меня без www &#8211; этот рудимент меня удивлял ещё лет семь назад. Но так как есть некоторые посетители, пытающиеся вводить www, то переучивать их можно только с помощью Permanent Redirect на основной домен.</p>
<p>Всё, Apache сконфигурирован. Конечно же, путь /Users/ctrld/Sites/theapplegeek/public_html должен существовать. Делаем тестовый файл для проверки php:</p>
<pre>
$ vim /Users/ctrld/Sites/theapplegeek/public_html/info.php
&lt;?php
    phpinfo();
?&gt;
</pre>
<p>Проверим конфигурацию apache:</p>
<pre>
$ sudo /opt/local/apache2/bin/apachectl configtest
Syntax OK
</pre>
<p>Если всё в порядке, то запускаем его (в первый раз &#8211; через launchctl load -w, чтобы он смог стартовать после перезапуска системы):</p>
<pre>
$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist
</pre>
<p>А в дальнейшем можем использовать apachectl:</p>
<pre>
$ sudo apachectl start
$ sudo apachectl stop
$ sudo apachectl restart
$ sudo apachectl graceful
</pre>
<p>Последняя команда (graceful) позволяет рестартовать apache без обрыва соединений, что вежливо по отношению к посетителям.</p>
<p>Можно убедиться, что apache запущен:</p>
<pre>
$ ps ax | grep htt
<small>37877   ??  Ss     0:00.10 /opt/local/apache2/bin/httpd -k start
37878   ??  S      0:00.00 /opt/local/apache2/bin/httpd -k start
37879   ??  S      0:00.00 /opt/local/apache2/bin/httpd -k start
37880   ??  S      0:00.00 /opt/local/apache2/bin/httpd -k start
37881   ??  S      0:00.00 /opt/local/apache2/bin/httpd -k start
37882   ??  S      0:00.00 /opt/local/apache2/bin/httpd -k start</small>
</pre>
<p>Теперь небольшой &#8220;хинт&#8221;. Я описал виртуальный хост реального сайта theapplegeek.ru. Но я ещё ничего не переносил и контента там нет. Для того, чтобы оттестировать сайт и исправить ошибки, я направляю запросы на новое место, модифицируя /etc/hosts на том компьютере, с которого я тестирую сайт, но другие посетители будут ходить до переключения в DNS на старое место.</p>
<pre>
$ sudo vim /etc/hosts
94.45.55.146	theapplegeek.ru
94.45.55.146	www.theapplegeek.ru
</pre>
<p>Всё, подготовительные работы сделаны, можно проверять. Открываю в браузере URL http://theapplegeek.ru/info.php с тестовым скриптом PHP. Всё работает. Благодать. Если же есть какие-то проблемы, то нужно смотреть логи:</p>
<pre>
$ tail -f /opt/local/apache2/logs/theapplegeek.ru-error_log
$ tail -f /opt/local/apache2/logs/theapplegeek.ru-access_log
$ tail -f /opt/local/apache2/logs/error_log
$ tail -f /var/log/php_errors.log
</pre>
<p>Установка WordPress не отличается от установки на любом Unix, его можно поставить по отличной инструкции <noindex><a rel="nofollow" href="http://codex.wordpress.org/Установка_WordPress" >на русском языке</a></noindex>. Но если нужно, то напишите в комментариях, и я в отдельной части рассмотрю этот процесс.</p>
<p>Домашняя сеть у меня подключена через TimeCapsule, и проброс обращений извне к web-серверу, находящемся на адресе 192.168.98.2, я сделал через Port Mapping:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/03_ap-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/03_ap-thumb.png" height="371" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/04_ap-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/04_ap-thumb.png" height="362" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Внешний адрес я обычно смотрю через сервис <noindex><a rel="nofollow" href="http://whatismyip.com/" >WhatIsMyIP</a></noindex> (94.45.55.146). Как только я перенёс сайт и проверил его работу, я зашёл в панель управления моими DNS-зонами и переключил записи со старого места на новое:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/05_ap-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/05_ap-thumb.png" height="183" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>И затем начал следить за логами и корректировать проблемы, которые я пропустил. На помощь приходит в том числе такая конструкция, позволяющая искать 404/etc:</p>
<pre>
$ tail -1000 /opt/local/apache2/logs/theapplegeek.ru-access_log \
	| awk '$9 != 200 &#038;&#038; $9 != 304 {print $9, $7}' | sort | uniq -c
</pre>
<p>Вуаля.</p>
<p>Через несколько часов убираем из /etc/hosts добавленные ранее записи.</p>
<p>Следующим шагом я сконфигурирую nginx с использованием fastcgi для обработки PHP. Ещё (это больше памятка самому себе) нужно будет включить ежедневную ротацию логов. И сделать тюнинг PHP и сетевых параметров Mac OS X.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/2735/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Настройка блога WordPress на Mac OS X. Часть 1, MySQL</title>
		<link>http://theapplegeek.ru/archives/2714</link>
		<comments>http://theapplegeek.ru/archives/2714#comments</comments>
		<pubDate>Mon, 11 Jan 2010 07:04:52 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[hosting]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=2714</guid>
		<description><![CDATA[Недавно я подключился к провайдеру Интернет по Ethernet, да ещё с постоянным IP-адресом. Сервер, на котором у меня расположен сайт, периодически ведёт себя очень странно, я думаю, что вы могли это заметить. Иногда сервер перестаёт отвечать, я подозреваю вываливание в Kernel Panic (на сервере стоит FreeBSD 6.3). Подозреваю аппаратную проблему, но заменить сервер я пока [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/01_my-thumb1.png" height="84" align="right" width="160" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></p>
<p>Недавно я подключился к провайдеру Интернет по Ethernet, да ещё с постоянным IP-адресом. Сервер, на котором у меня расположен сайт, периодически ведёт себя очень странно, я думаю, что вы могли это заметить. Иногда сервер перестаёт отвечать, я подозреваю вываливание в Kernel Panic (на сервере стоит FreeBSD 6.3). Подозреваю аппаратную проблему, но заменить сервер я пока не могу, а обновить систему до 8.0, или установить Linux можно, но непросто, так как я использую для сайтов <noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/FreeBSD_Jail" >jail&#8217;ы</a></noindex>. В итоге я решил временно перенести сайты на MacBook, который у меня используется в виде сервера.</p>
<p>Подъём сервера для хостинга WordPress состоит из нескольких этапов, и я рассмотрю их в серии статей. В этой части я опишу установку MySQL, затем &#8211; настройку web-сервера на базе nginx с использованием PHP в виде Fastcgi (можно было бы использовать и Apache, но мне нужен легковесный и быстрый web-сервер, хорошо работающий под большой нагрузкой). Итак, приступим.</p>
<p>Поставить MySQL под Mac OS X можно несколькими методами. Самый неинтересный для меня &#8211; это <noindex><a rel="nofollow" href="http://www.mamp.info/en/index.html" >MAMP</a></noindex> (готовое решение, включающее MySQL, Apache, PHP с полным набором модулей). Объяснять почему мне это не нравится не буду, и так понятно.</p>
<p><span id="more-2714"></span></p>
<p>Второй &#8211; из бинарного пакета <noindex><a rel="nofollow" href="http://dev.mysql.com/downloads/" >с сайта MySQL</a></noindex> (выбираем версию MySQL 5.1—Generally Available (GA) release for production use). Вот <noindex><a rel="nofollow" href="http://dev.mysql.com/downloads/mysql/5.1.html#macosx-dmg" >более короткий линк</a></noindex> к нужному пакету, я ставлю из package format, Mac OS X 10.5 (x86_64), весь процесс описан <noindex><a rel="nofollow" href="http://dev.mysql.com/doc/refman/5.1/en/mysql-installation-macosx-pkg.html" >в документации</a></noindex>. Во многих случаях этот способ предпочтительный, так как MySQL здесь собран гарантированно нормально. Но есть некоторая сложность в обновлении &#8211; я предполагаю, что автообновлений нет, и придётся устанавливать новые версии вручную.</p>
<p>Третий метод, привычный для большинства системных администраторов Unix &#8211; это использование пакетного менеджера <a href="http://theapplegeek.ru/archives/1011" >MacPorts</a>, мне он нравится из-за предсказуемости обновлений, да и в любом случае мне понадобятся порты для дальнейших шагов по запуску сайта.</p>
<p>Есть, конечно же, и четвёртый метод, заключающийся в компиляции MySQL из исходных текстов с накладыванием различных патчей, оптимизирующих работу MySQL, но я не любитель стиля Gentoo, и мне важнее предсказуемость работы системы и простота обновлений, чем выигрыш производительности на 15%.</p>
<p>Сначала нужно поставить <noindex><a rel="nofollow" href="http://developer.apple.com/technology/xcode.html" >XCode</a></noindex>, в котором находятся средства разработки под Unix, необходимые для компиляции MySQL и других пакетов. Это просто, объяснять не буду.</p>
<p>Потом &#8211; <a href="http://theapplegeek.ru/archives/1011" >MacPorts</a>. <noindex><a rel="nofollow" href="http://distfiles.macports.org/MacPorts/" >Списывается пакет последней версии</a></noindex> под нужную версию Mac OS X, в моём случае MacPorts-1.8.2-10.6-SnowLeopard.dmg, и устанавливается. Сразу же обновим дерево портов:</p>
<pre>
$ . ~/.profile
$ sudo port selfupdate
</pre>
<p>Ставим MySQL Server (на MacBook 2.2 GHz пакет поставился за 22 минуты):</p>
<pre>
$ sudo port install mysql5-server
</pre>
<p>При установке выдалось сообщение о том, как установить файлы базы данных и как запустить mysql. Выполняем:</p>
<pre>
$ sudo -u _mysql mysql_install_db5
$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist
</pre>
<p>Проверим, что MySQL запустился:</p>
<pre>
$ ps ax | grep mysql | grep -v grep
<small> 2050   ??  Ss     0:00.00 /opt/local/bin/daemondo --label=mysql5 --start-cmd /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper start ; --stop-cmd /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper stop ; --restart-cmd /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper restart ; --pid=none
 2060   ??  S      0:00.02 /bin/sh /opt/local/lib/mysql5/bin/mysqld_safe --datadir=/opt/local/var/db/mysql5 --pid-file=/opt/local/var/db/mysql5/ceiling-cat.local.pid
 2110   ??  S      0:00.07 /opt/local/libexec/mysqld --basedir=/opt/local --datadir=/opt/local/var/db/mysql5 --user=_mysql --log-error=/opt/local/var/db/mysql5/ceiling-cat.local.err --pid-file=/opt/local/var/db/mysql5/ceiling-cat.local.pid</small>
</pre>
<p>Я привык к именам программ вида mysqladmin и mysql, а в каталоге /opt/local/bin описаны симлинки вида mysqladmin5/mysql5. Можно сделать нужные симлинки, но я сделаю универсальнее, прописав путь к нужным утилитам без суффикса &#8220;5&#8243;. Путь после модификации должен быть таков:</p>
<pre>
$ vim ~/.profile
<small>export PATH=/opt/local/lib/mysql5/bin:/opt/local/bin:/opt/local/sbin:$PATH</small>
</pre>
<p>Перечитываем путь с помощью &#8220;source&#8221;:</p>
<pre>
$ . ~/.profile
$ echo $PATH
<small>/opt/local/lib/mysql5/bin:/opt/local/bin:/opt/local/sbin:/opt/local/bin:/opt/local/sbin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin</small>
</pre>
<p>Теперь можем привычно запускать утилиты MySQL</p>
<pre>
$ which mysql
<small>/opt/local/lib/mysql5/bin/mysql</small>
</pre>
<p>Проверить, запустился ли MySQL, можно и так:</p>
<pre>
$ mysql
<small>Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.1.42 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql&gt;</small>
</pre>
<p>Сразу же устанавливаем пароль root (этот пароль я сразу же после написания статьи изменю):</p>
<pre>
$ mysqladmin -u root password 'fc97a2060ec0775ed3b6aa011ee27e88'
</pre>
<p>Для того, чтобы не вводить пароль каждый раз, прописываем его в конфиг-файле:</p>
<pre>
$ touch ~/.my.cnf
$ chmod 600 ~/.my.cnf
$ vim ~/.my.cnf
[mysql]
user    =   root
pass    =   fc97a2060ec0775ed3b6aa011ee27e88
</pre>
<p>Обязательно нужно или поменять пароль для доступа через сеть, или удалить записи для хостов &#8220;hostname.local&#8221; и 127.0.0.1. Когда мне понадобится, я создам нужных пользователей, поэтому буду удалять.</p>
<pre>
$ mysql mysql
mysql> select Host, User, Password from user where user = 'root';
<small>+-------------------+------+-------------------------------------------+
| Host              | User | Password                                  |
+-------------------+------+-------------------------------------------+
| localhost         | root | *769F25A82BD5CC256FA4D47499CE6026D89D72E6 |
| ceiling-cat.local | root |                                           |
| 127.0.0.1         | root |                                           |
+-------------------+------+-------------------------------------------+</small>
mysql> delete from user where User = "root" and Host = "127.0.0.1";
Query OK, 1 row affected (0.00 sec)

mysql> delete from user where User = "root" and Host = "ceiling-cat.local";
Query OK, 1 row affected (0.00 sec)

mysql> select Host, User, Password from user where user = 'root';
<small>+-----------+------+-------------------------------------------+
| Host      | User | Password                                  |
+-----------+------+-------------------------------------------+
| localhost | root | *769F25A82BD5CC256FA4D47499CE6026D89D72E6 |
+-----------+------+-------------------------------------------+</small>
</pre>
<p>Можно было бы на этом и закончить, но лучше донастроить MySQL через конфиг-файл /etc/my.cnf. По крайней мере нужно выставить использование по умолчанию UTF8, включить INNODB, ограничить количество коннектов, и включить slow_query_log.</p>
<p>Примеры конфиг-файлов поставляются вместе с MySQL:</p>
<pre>
$ ls -al /opt/local/share/mysql5/mysql/my*cnf
<small>-rw-r--r--  2 root  admin   4851 Jan  7 22:26 /opt/local/share/mysql5/mysql/my-huge.cnf
-rw-r--r--  2 root  admin  20232 Jan  7 22:26 /opt/local/share/mysql5/mysql/my-innodb-heavy-4G.cnf
-rw-r--r--  2 root  admin   4825 Jan  7 22:26 /opt/local/share/mysql5/mysql/my-large.cnf
-rw-r--r--  2 root  admin   4836 Jan  7 22:26 /opt/local/share/mysql5/mysql/my-medium.cnf
-rw-r--r--  2 root  admin   2474 Jan  7 22:26 /opt/local/share/mysql5/mysql/my-small.cnf</small>
</pre>
<p>Меня устраивает конфигурация medium:</p>
<pre>
$ head -5 /opt/local/share/mysql5/mysql/my-medium.cnf
<small># Example MySQL config file for medium systems.
#
# This is for a system with little memory (32M - 64M) where MySQL plays
# an important part, or systems up to 128M where MySQL is used together with
# other programs (such as a web server)</small>
</pre>
<p>Копирую её в /etc/my.cnf:</p>
<pre>
$ sudo cp /opt/local/share/mysql5/mysql/my-medium.cnf /etc/my.cnf
</pre>
<p>Корректирую конфиг (если интересно, то одна из первых версий доступна <noindex><a rel="nofollow" href="http://dl.dropbox.com/u/243759/Site/20100109/my.cnf" >для списывания</a></noindex>):</p>
<ul>
<li>Отключаю возможность доступа по сети: skip-networking</li>
<li>Выставляю везде default-character-set=utf8</li>
<li>Для mysqld включаю character-set-server = utf8 и default-character-set = utf8</li>
<li>Ограничиваю количество сессий max_connections=50</li>
<li>thread_cache_size = 16</li>
<li>query_cache_size  = 32M</li>
<li>Включаю секцию innodb</li>
<li>Выставляю логгирование (slow_query_log = 1, slow_query_log_file = /var/log/mysql-slow.log, log-error =  /var/log/mysql.log)</li>
</ul>
<p>Создаю нужные файлы логов, иначе они не воспримутся:</p>
<pre>
$ sudo touch /var/log/mysql-slow.log
$ sudo chown _mysql:_mysql /var/log/mysql-slow.log
$ sudo touch /var/log/mysql.log
$ sudo chown _mysql:_mysql /var/log/mysql.log
</pre>
<p>Перезагружаем сервер MySQL (-w отключает disable, т.е. MySQL загрузится при рестарте системы)</p>
<pre>
$ sudo launchctl unload -w /Library/LaunchDaemons/org.macports.mysql5.plist
$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist
</pre>
<p>Нужно посмотреть лог на предмет ошибок или проблем:</p>
<pre>
$ tail -100 /var/log/mysql.log
</pre>
<p>Очень важно сделать базовый аудит конфигурации MySQL, для этого я использую два скрипта. Первый &#8211; <noindex><a rel="nofollow" href="http://blog.mysqltuner.com/" >mysqltuner.pl</a></noindex>:</p>
<pre>
$ curl http://mysqltuner.com/mysqltuner.pl -o mysqltuner.pl
$ chmod +x mysqltuner.pl
$ ./mysqltuner.pl
</pre>
<p>Второй &#8211; <noindex><a rel="nofollow" href="https://launchpad.net/mysql-tuning-primer" >mysql-tuning-primer</a></noindex>:</p>
<pre>
$ curl http://launchpadlibrarian.net/36004840/tuning-primer.sh -o tuning-primer.sh
$ chmod +x tuning-primer.sh
$ ./tuning-primer.sh
</pre>
<p>Особых проблем скрипты не выявили. Если бы нашли, то нужно было бы подправить /etc/my.cnf и перезапустить MySQL.</p>
<p>Настройка закончена, осталось перезапустить Mac OS X для проверки, подымется ли MySQL после рестарта. У меня он поднялся.</p>
<p>Если вы хотите углубить свои знания по MySQL, то рекомендую ознакомиться с сайтом <noindex><a rel="nofollow" href="http://www.mysqlperformanceblog.com/" >MySQL Performance Blog</a></noindex> (этот сайт ведут специалисты широкоизвестной в узких кругах фирмы Percona).</p>
<h2>Использование GUI для работы с базой данных</h2>
<p>Я не разработчик, и мне хватает командно-строковой утилиты mysql. Но если вам нужен GUI, то можно будет или поставить <noindex><a rel="nofollow" href="http://www.phpmyadmin.net/home_page/index.php" >phpMyAdmin</a></noindex> (он будет доступен через web), или же утилиту под Mac OS X <noindex><a rel="nofollow" href="http://www.sequelpro.com/" >Sequel Pro</a></noindex> (она бесплатная, приветствуются пожертвования).</p>
<p>Sequel Pro мне нравится тем, что он позволяет соединяться через туннель SSH, и на хосте с MySQL достаточно открыть сетевой доступ через 127.0.0.1. Для того, чтобы это сделать, нужно в /etc/my.cnf закомментировать опцию &#8220;skip-networking&#8221; (конечно же, после этого нужно перезагрузить MySQL) и открыть доступ пользователю (например, root):</p>
<pre>
$ mysql mysql
<small>mysql> GRANT ALL ON *.* TO root@127.0.0.1 IDENTIFIED BY 'fc97a2060ec0775ed3b6aa011ee27e88';
mysql> FLUSH PRIVILEGES;</small>
</pre>
<p>Настройка туннелирования:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/02_my-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/02_my-thumb.png" height="478" width="410" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Интерфейс программы:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2010/01/03_my-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2010/01/03_my-thumb.png" height="370" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<h2>Проверка производительности MySQL</h2>
<p>Для того, чтобы знать, какую нагрузку выдержит MySQL, можно применить бенчмаркинг <noindex><a rel="nofollow" href="http://dev.mysql.com/doc/refman/5.1/en/mysql-benchmarks.html" >sql-bench</a></noindex> (это необязательно, раздел можно пропустить). К сожалению, в портах его я не нашёл, поэтому сделаю не совсем правильно, но действенно &#8211; поставлю бинарный package с сайта MySQL (это второй описанный метод), но не буду запускать сам MySQL.</p>
<p>Списываю <noindex><a rel="nofollow" href="http://dev.mysql.com/downloads/mysql/5.1.html#macosx-dmg" >package</a></noindex> Mac OS X 10.5 (x86_64) и устанавливаю его (только mysql-&#8230;..pkg, ни в коем случае не prefpane и не StartupItems). Система поставилась в /usr/local/mysql (это симлинк на каталог с установленной версией типа mysql-5.1.42-osx10.5-x86_64).</p>
<p>SQL-Bench использует Perl, для соединения с MySQL нужен DBD::mysql, поставим его (в ответ на предложение сконфигурировать CPAN нажимаем Enter или пишем &#8220;yes&#8221;):</p>
<pre>
$ sudo perl -MCPAN -eshell
<small>Would you like me to configure as much as possible automatically? [yes] <b>yes</b></small>
cpan[1]&gt; install DBD::mysql
<small>...
 CAPTTOFU/DBD-mysql-4.013.tar.gz
 /usr/bin/make install  -- OK</small>
cpan[2]&gt; quit
</pre>
<p>Запускаем бенчмаркинг. Сразу предупреждаю, что процесс длительный, у меня он занял 16 минут:</p>
<pre>
$ cd /usr/local/mysql/sql-bench/
$ <small>sudo ./run-all-tests --server=mysql --user=root -pass=fc97a2060ec0775ed3b6aa011ee27e88 --log</small>
</pre>
<p>Смотрим на результат, размышляем.</p>
<p>На этом заканчиваем, в следующей части приступим к настройке web-сервера.</p>
<h2>Замена паролей</h2>
<p>При необходимости меняем пароль (как я и обещал, я это сделал &#8211; лучше три лишние команды, чем потеря данных):</p>
<pre>
$ mysql mysql
mysql&gt; GRANT ALL ON *.* TO root@127.0.0.1 IDENTIFIED BY 'verysecretpassword';
mysql&gt; GRANT ALL ON *.* TO root@localhost IDENTIFIED BY 'verysecretpassword';
mysql&gt; FLUSH PRIVILEGES;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/2714/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

