<?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>Ars Longa, Vita Brevis &#187; Apache</title>
	<atom:link href="http://blog.sjinks.pro/tag/apache/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Mon, 06 Feb 2012 17:56:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>mod_rewrite и content negotiation</title>
		<link>http://blog.sjinks.pro/administering/901-mod_rewrite-content-negotiation/</link>
		<comments>http://blog.sjinks.pro/administering/901-mod_rewrite-content-negotiation/#comments</comments>
		<pubDate>Fri, 25 Feb 2011 02:35:39 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[mod_negotiation]]></category>
		<category><![CDATA[mod_rewrite]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=901</guid>
		<description><![CDATA[Если mod_rewrite работает весьма избирательно Ситуация (из шедевров арабских программистов): есть файлы login.php, logout.php, somethinglese.php и в том же духе. Есть такие правила mod_rewrite: RewriteEngine On RewriteRule ^login$ login.php RewriteRule ^logout$ logout.php RewriteRule ^top-questions$ top.php?what=questions # и так далее При этом правила, для которых существует файл, имя которого без учёта расширения совпадает с запросом, не [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/901-mod_rewrite-content-negotiation/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Если <a href="http://blog.sjinks.pro/tag/mod_rewrite/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  mod_rewrite">mod_rewrite</a> работает весьма избирательно</em></h2>
<p>Ситуация (из шедевров арабских программистов): есть файлы <code>login.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a></code>, <code>logout.php</code>, <code>somethinglese.php</code> и в том же духе.</p>
<p>Есть такие правила mod_rewrite:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9012">
        <div class="code apache" id="p901code2">
<span class="kw1">RewriteEngine</span> <span class="kw2">On</span><br />
<span class="kw1">RewriteRule</span> ^login$ login.php<br />
<span class="kw1">RewriteRule</span> ^logout$ logout.php<br />
<span class="kw1">RewriteRule</span> ^top-questions$ top.php?what=questions<br />
<span class="co1"># и так далее</span>
        </div>
    </div>
</div>

<p>При этом правила, для которых существует файл, имя которого без учёта расширения совпадает с запросом, не выполняются.<br />
Например, запросы <span class="codebox"><code class="text">http://example.com/login</code></span>, <span class="codebox"><code class="text">http://example.com/logout</code></span> возвращают 404 ошибку, а <span class="codebox"><code class="text">http://example.com/top-questions</code></span> отрабатывает на ура.</p>
<p>Налицо некая избирательность mod_rewrite. В чём же дело?<span id="more-901"></span></p>
<p>Есть такая штука, называется <a href="http://en.wikipedia.org/wiki/Content_negotiation">Content Negotiation</a>. Её суть вкратце сводится к тому, что web-сервер отдаёт пользователю разные документы в зависимости от заголовков Accept. В <a href="http://blog.sjinks.pro/tag/apache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Apache">Apache</a> поддержка данного механизма реализована модулем <a href="http://httpd.apache.org/docs/2.2/mod/mod_negotiation.html">mod_negotiation</a>.</p>
<p>Работает оно так: когда сервер получает запрос на <code>/some/dir/foo</code>, при этом поддержка для <code>MultiViews</code> для каталога <code>/some/dir</code> включена, а ресурс <code>/some/dir/foo</code> не существует, сервер ищет в кталоге файлы по маске <code>foo.*</code> и выбирает тот, который клиенту подходит больше всего.</p>
<p>Проблема в том, что Content Negotiation происходит <em>до</em> включения <code>mod_rewrite</code> в обработку запроса. Как следствие, <code>/login</code> — это уже не <code>/login</code>, в результате чего правило не выполняется.</p>
<p>Решения проблемы два:</p>
<ol>
<li>Если content negotiation не нужен, его можно просто отключить: <span class="codebox"><code class="apache"><span class="kw1">Options</span> -MultiViews</code></span></li>
<li>Не использовать такие правила (и вообще с точки зрения производительности лучше обходиться минимумом правил — например, переписывая все запросы на <code>index.php</code>, который реализует всю эту логику внутри).</li>
</ol>
<p><a href="http://stackoverflow.com/questions/470880/rewriterule-checking-file-in-rewriten-file-path-exists">Аналогичный вопрос на Stack Overflow</a>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/901-mod_rewrite-content-negotiation/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/administering/901-mod_rewrite-content-negotiation/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Заголовки HTTP для обеспечения безопасности сайта</title>
		<link>http://blog.sjinks.pro/security/884-http-headers-to-secure-website/</link>
		<comments>http://blog.sjinks.pro/security/884-http-headers-to-secure-website/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 12:28:06 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[XSS]]></category>
		<category><![CDATA[атака]]></category>
		<category><![CDATA[безопасность]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=884</guid>
		<description><![CDATA[Активация средств защиты, встроенных в современные бразуеры, для обеспечения дополнительной безопасности пользователей Безопасность сайта — это бесконечная битва между веб-мастерами и хакерами. В &#60;/xssed&#62; зарегистрировано около 40,000 сайтов, подверженных атакам XSS. XSS-атаки позволяют злоумышленникам красть cookie, личную информацию, взламывать аккаунты и многие другие вещи. Существует множество способов для защиты сайта, но ни один из них не может гарантировать [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/884-http-headers-to-secure-website/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Активация средств защиты, встроенных в современные бразуеры, для обеспечения дополнительной безопасности пользователей</em></h2>
<p><a href="http://blog.sjinks.pro/tag/tag-security/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  безопасность">Безопасность</a> сайта — это бесконечная битва между веб-мастерами и хакерами. В <a href="http://xssed.com/">&lt;/xssed&gt;</a> зарегистрировано около 40,000 сайтов, подверженных атакам <a href="http://blog.sjinks.pro/tag/xss/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XSS">XSS</a>. <a href="http://blog.sjinks.pro/tag/xss/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XSS">XSS</a>-атаки позволяют злоумышленникам красть cookie, личную информацию, взламывать аккаунты и многие другие вещи.</p>
<p>Существует множество способов для защиты сайта, но ни один из них не может гарантировать абсолютную безопасность. Как следствие, нужно использовать многоуровневую эшелонную зашиту для обеспечения безопасности сайта.</p>
<p>В данной статье будет показан один из вариантов защиты — основанный на использовании заголовков HTTP.<span id="more-884"></span></p>
<p>Современные браузеры сами предоставляют довольно мощную защиту для своих пользователей… Единственное «но» — сайт должен попросить браузер включить эту защиту. К счастью, это довольно просто.</p>
<p>Для <a href="http://blog.sjinks.pro/tag/apache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Apache">Apache</a>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8846">
        <div class="code apache" id="p884code6">
<span class="co1"># Запретить всем сайтам загружать страницу через &lt;frame&gt;/&lt;iframe&gt;</span><br />
<span class="kw1">Header</span> set X-Frame-<span class="kw1">Options</span> <span class="kw1">DENY</span><br />
<br />
<span class="co1"># Разрешить выполнение JavaScript, загруженного только с нашего домена.</span><br />
<span class="co1"># Не выполнять встроенный (inline) JavaScript</span><br />
<span class="kw1">Header</span> set X-Content-Security-Policy <span class="st0">&quot;allow 'self';&quot;</span><br />
<br />
<span class="co1"># Включение предотвращения XSS-атак в IE 8</span><br />
<span class="kw1">Header</span> set X-XSS-Protection <span class="st0">&quot;1; mode=block&quot;</span>
        </div>
    </div>
</div>

<p>Для <a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</a>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8847">
        <div class="code nginx" id="p884code7">
<span class="kw1">add_header</span> X-Frame-Options DENY;<br />
<span class="kw1">add_header</span> X-Content-Security-Policy <span class="st0">&quot;allow 'self';&quot;</span>;<br />
<span class="kw1">add_header</span> X-XSS-Protection <span class="st0">&quot;1; mode=block&quot;</span>;
        </div>
    </div>
</div>

<p><strong>X-Frame-Options</strong></p>
<p>Данный заголовок указывает браузеру, можно ли загружать страницы сайта через <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">frame</span>&gt;</span></code></span>/<span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">iframe</span>&gt;</span></code></span>.</p>
<p>Значение <code>DENY</code> запретит загрузку через фреймы, значение <code>SAMEORIGIN</code> разрешит загрузку через фреймы, но только если и фрейм, и страница, его загружающая, находятся на одном домене (<a href="http://en.wikipedia.org/wiki/Same_origin_policy">Same Origin Policy</a>).</p>
<p>основная функция данной защиты — предотвращение <a href="http://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B8%D0%BA%D0%B4%D0%B6%D0%B5%D0%BA%D0%B8%D0%BD%D0%B3">кликджекинга</a>; в качестве дополнительного бонуса это позволит предотвратить атаку, описанную <a href="http://spareclockcycles.org/2010/12/19/d0z-me-the-evil-url-shortener/">Ben Schmidt</a>.</p>
<p>Заголовок воспринимается Internet Explorer 8.0+, Firefox 3.6.9+ (Gecko 1.9.2.9+), Opera 10.50+, Safari 4.0+, Chrome 4.1.249.1042+.</p>
<p>Подробное описание приведено <a href="https://developer.mozilla.org/en/the_x-frame-options_response_header">здесь</a>.</p>
<p><strong>X-Content-Security-Policy</strong></p>
<p>Данный заголовок указывает, как контент на сайте взаимодействует с самим сайтом. При помощи данного заголовка можно указывать, откуда можно загружать картинки, <a href="http://blog.sjinks.pro/tag/javascript/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  JavaScript">JavaScript</a>, фреймы, шрифты, объекты, таблицы стилей, медиаконтент и многое другое.</p>
<p>Приведённый в примере выше заголовок разрешает загрузку контента только с того же домена, на котором располагается загружаемая страница. При этом браузеру запрещается выполнение встроенного JavaScript (скрипты внутри блоков <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">script</span>&gt;</span>…<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">script</span>&gt;</span></code></span>, обработчики событий и т.п.), создание кода из строк (например, через функцию eval(), а также передача строк в функции <code>setTimeout()</code>, <code>setInterval()</code> и т.п.), использование протокола <code>data:</code>.</p>
<p>Данный заголовок можно использовать на HTTPS-страницах для запрета загрузки небезопасного контента:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8848">
        <div class="code text" id="p884code8">
X-Content-Security-Policy: allow https://*:443
        </div>
    </div>
</div>

<p>Подробнее о заголовке и поддерживаемых параметрах можно прочитать <a href="https://wiki.mozilla.org/Security/CSP/Specification">здесь</a>.</p>
<p><strong>X-XSS-Protection</strong></p>
<p>Данный заголовок работает исключительно в Internet Explorer: он включает встроенную в браузер защиту от XSS-атак (по умолчанию она отключена, так как может некорректно работать с некоторыми сайтами). Подробная информация о принципах работы защиты от XSS-атак в IE приведена в <a href="http://blogs.msdn.com/b/ie/archive/2008/07/01/ie8-security-part-iv-the-xss-filter.aspx">The Windows Internet Explorer Weblog</a>.</p>
<p>В заключение стоит отметить, что хоть данный способ и хорош, он должен использоваться вкупе с другими средствами защиты и быть частью комплексной системы безопасности. Безопасность лишней не бывает!</p>
<p><a href="http://community.developer.authorize.net/t5/The-Authorize-Net-Developer-Blog/HTTP-Headers-to-Help-Secure-Your-Website/ba-p/8604">Оригинал статьи</a>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/884-http-headers-to-secure-website/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/884-http-headers-to-secure-website/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FogBugz 7 и nginx</title>
		<link>http://blog.sjinks.pro/nginx/799-fogbugz-7-nginx/</link>
		<comments>http://blog.sjinks.pro/nginx/799-fogbugz-7-nginx/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 17:52:23 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[nginx]]></category>
		<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[FogBugz]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=799</guid>
		<description><![CDATA[Рабочая конфигурация nginx для FogBugz 7 На днях переводил один сервер с Apache 2 на nginx, хочу поделиться рабочей конфигурацией nginx для FogBugz 7. Предположим, что у нас имеется сайт sitename.com, на котором установлен FogBugz (в sitename.com/fogbugz). Конфигурация Apache будет выглядеть следующим образом: &#60;IfModule !proxy_module&#62; LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so &#60;/IfModule&#62; &#60;IfModule !proxy_http_module&#62; LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so &#60;/IfModule&#62; #FogBugz uses the SERVER_HOST [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/nginx/799-fogbugz-7-nginx/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Рабочая конфигурация <a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</a> для <a href="http://blog.sjinks.pro/tag/fogbugz/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  FogBugz">FogBugz</a> 7</em></h2>
<p>На днях переводил один сервер с <a href="http://blog.sjinks.pro/tag/apache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Apache">Apache</a> 2 на nginx, хочу поделиться рабочей конфигурацией nginx для FogBugz 7.<span id="more-799"></span></p>
<p>Предположим, что у нас имеется сайт <code>sitename.com</code>, на котором установлен FogBugz (в <code>sitename.com/fogbugz</code>).</p>
<p>Конфигурация Apache будет выглядеть следующим образом:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p79911">
        <div class="code apache" id="p799code11">
&lt;<span class="kw3">IfModule</span> !proxy_module&gt;<br />
<span class="kw1">LoadModule</span> proxy_module /usr/lib/apache2/modules/mod_proxy.so<br />
&lt;/<span class="kw3">IfModule</span>&gt;<br />
<br />
&lt;<span class="kw3">IfModule</span> !proxy_http_module&gt;<br />
<span class="kw1">LoadModule</span> proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so<br />
&lt;/<span class="kw3">IfModule</span>&gt;<br />
<br />
<span class="co1">#FogBugz uses the SERVER_HOST and SERVER_PORT headers to construct absolute redirect URLs for license install and page not found</span><br />
<span class="kw1">ProxyPreserveHost</span> <span class="kw2">On</span><br />
<br />
<span class="co1"># Always redirect to add trailing slash</span><br />
<span class="kw1">RedirectMatch</span> /fogbugz$ http://sitename.com/fogbugz/<br />
<br />
<span class="co1">#ProxyPass proxies the request, ProxyPassReverse adjusts the URLs of redirect responses</span><br />
<span class="kw1">ProxyPass</span> /fogbugz/ http://localhost:7066/fogbugz/<br />
<span class="kw1">ProxyPassReverse</span> /fogbugz/ http://localhost:<span class="nu0">7066</span>/fogbugz/<br />
<br />
<span class="co1">#The protocol in the following line should read 'http', even if you are proxying to FogBugz from https; please do not change it unless you know what you are doing.</span><br />
<span class="kw1">ProxyPassReverse</span> /fogbugz/ http://sitename.com/fogbugz/<br />
&lt;<span class="kw3">Proxy</span> http://localhost:7066/fogbugz* &gt;<br />
<span class="kw1">Order</span> <span class="kw1">deny</span>,<span class="kw1">allow</span><br />
<span class="kw1">Allow</span> from <span class="kw2">all</span><br />
&lt;/<span class="kw3">Proxy</span>&gt;<br />
<br />
<span class="co1">#Default proxy timeout of 21 minutes, 1 minute longer than the longest FogBugz page timeout</span><br />
<span class="kw1">ProxyTimeout</span> <span class="nu0">1260</span>
        </div>
    </div>
</div>

<p>Для nginx конфигурация будет проще:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p79912">
        <div class="code nginx" id="p799code12">
<span class="kw1">server</span> {<br />
<span class="co1"># ...</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">location</span> ~ /fogbugz$ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">rewrite</span> .* http://sitename.com/fogbugz/ redirect;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; <span class="kw1">location</span> ^~ /fogbugz/ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">proxy_set_header</span> Host $host;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">proxy_redirect</span> <span class="kw2">off</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">proxy_set_header</span> X-Forwarded-Host $host;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">proxy_set_header</span> X-Real-IP $remote_addr;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">proxy_set_header</span> X-Forwarded-For $proxy_add_x_forwarded_for;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">proxy_read_timeout</span> <span class="nu0">1260</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">proxy_pass</span> http://127.0.0.1:<span class="nu0">7066</span>;<br />
&nbsp; &nbsp; }<br />
}
        </div>
    </div>
</div>

<p>Надеюсь, кому-нибудь поможет.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/nginx/799-fogbugz-7-nginx/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/nginx/799-fogbugz-7-nginx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WP Super Cache vs MaxSite Cache: часть 1</title>
		<link>http://blog.sjinks.pro/wordpress/689-wp-super-cache-vs-maxsite-cache-part-1/</link>
		<comments>http://blog.sjinks.pro/wordpress/689-wp-super-cache-vs-maxsite-cache-part-1/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 23:17:34 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[MaxSite Cache]]></category>
		<category><![CDATA[WP Super Cache]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=689</guid>
		<description><![CDATA[Тест страничных кэшей на виртуальном сервере абсолютного чайника После того, как MAX’у не понравился тест с участием MaxSite Cache, я решил несколько видоизменить методику тестирования. На этот раз я тестировал только два кэша: WP Super Cache и MaxSite Cache Lite. Так как по словам MAX’а в реальности все ставится «из коробки», я взял виртуальный сервер [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/689-wp-super-cache-vs-maxsite-cache-part-1/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Тест страничных кэшей на виртуальном сервере абсолютного чайника</em></h2>
<p>После того, как MAX’у не понравился <a href="http://blog.sjinks.pro/wordpress/683-wp-supercache-vs-hypercache-vs-w3-total-cache-vs-maxsite-cache/">тест с участием MaxSite Cache</a>, я решил несколько видоизменить методику тестирования.</p>
<p>На этот раз я тестировал только два кэша: <a href="http://blog.sjinks.pro/tag/wp-super-cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WP Super Cache">WP Super Cache</a> и <a href="http://blog.sjinks.pro/tag/maxsite-cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  MaxSite Cache">MaxSite Cache</a> Lite.<span id="more-689"></span></p>
<p>Так как по словам <cite>MAX</cite>’а <q>в реальности все ставится «из коробки»</q>, я взял виртуальный сервер (512 MiB RAM, 10 GB HD, Intel Xeon X3320 (1 ядро), 2.5 GHz), на который поставил Ubuntu 8.04 LTS Server Edition. Затем поставил <a href="http://blog.sjinks.pro/tag/apache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Apache">Apache</a> (2.2.8-1ubuntu0), <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a> (5.2.4-2ubuntu5.6) и MySQL (5.0.51a-3ubuntu5.4). Конфигурационные файлы брались «из коробки» (только для Apache пришлось включить <a href="http://blog.sjinks.pro/tag/mod_rewrite/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  mod_rewrite">mod_rewrite</a>), в системной конфигурации абсолютно ничего не менялось. VDS абсолютного «чайника». Для мониторинга ресурсов системы установил munin (он рисует такие красивые графики).</p>
<p>Кому интересно, VDS конфигурировался так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p68914">
        <div class="code bash" id="p689code14">
<span class="kw2">wget</span> http:<span class="sy0">//</span>ubuntu-releases.eecs.wsu.edu<span class="sy0">/</span>hardy<span class="sy0">/</span>ubuntu-8.04.3-server-i386.iso<br />
VBoxManage registerimage dvd <span class="sy0">/</span>home<span class="sy0">/</span>user1<span class="sy0">/</span>ubuntu-8.04.3-server-i386.iso<br />
VBoxManage createhd <span class="re5">--filename</span> TestVDS-HD1 <span class="re5">--size</span> 10240 <span class="re5">--remember</span><br />
VBoxManage createvm <span class="re5">--name</span> TestVDS <span class="re5">--register</span><br />
VBoxManage modifyvm TestVDS \<br />
&nbsp; &nbsp; <span class="re5">--ostype</span> Ubuntu \<br />
&nbsp; &nbsp; <span class="re5">--memory</span> 512 <span class="re5">--vram</span> 1 \<br />
&nbsp; &nbsp; <span class="re5">--acpi</span> on <span class="re5">--ioapic</span> off <span class="re5">--pae</span> off <span class="re5">--hwvirtex</span> on <span class="re5">--nestedpaging</span> on \<br />
&nbsp; &nbsp; <span class="re5">--boot1</span> dvd \<br />
&nbsp; &nbsp; <span class="re5">--sata</span> on <span class="re5">--sataport1</span> TestVDS-HD1 \<br />
&nbsp; &nbsp; <span class="re5">--dvd</span> <span class="sy0">/</span>home<span class="sy0">/</span>user1<span class="sy0">/</span>ubuntu-8.04.3-server-i386.iso \<br />
&nbsp; &nbsp; <span class="re5">--floppy</span> disabled \<br />
&nbsp; &nbsp; <span class="re5">--nic1</span> nat \<br />
&nbsp; &nbsp; <span class="re5">--audio</span> none<br />
<br />
VBoxManage setextradata TestVDS <span class="st0">&quot;VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/Protocol&quot;</span> TCP<br />
VBoxManage setextradata TestVDS <span class="st0">&quot;VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/GuestPort&quot;</span> <span class="nu0">80</span><br />
VBoxManage setextradata TestVDS <span class="st0">&quot;VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/HostPort&quot;</span> <span class="nu0">8080</span>
        </div>
    </div>
</div>

<p>Затем я поставил <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> 2.8.5 с официального сайта, импортировал в блог порядка 800 статей среднего размера (авторство статей не моё, так что выложить не могу).</p>
<p>Вместо Apache Bench я использовал Siege, обращение производилось ко всем страницам сайта в случайном порядке (вероятность обращения к заданной странице задавалась количеством её повторений в файле с адресами). Тестирование каждого варианта (WP Super Cache и MaxSite Cache) проводилось по 45 минут — 30 минут при низкой нагрузке и 15 минут при высокой (увы, трафик не безлимитный, и раскидываться гигабайтами трафика для теста возможности пока нет). Это имитировало постепенный наплыв пользователей на сайт. Специфика теста такова, что новый запрос не выполнялся до тех пор, пока не завершался предыдущий.</p>
<p>Одновременно к страницам обращалось 30 пользователей (Apache просто больше не выдерживает). Между тестами системе перезагружалась (на всякий случай). Виртуальный сервер и сервер, с которого осуществлялось тестирование, были, естественно, разными; соединены гигабитным каналом.</p>
<p>Результаты получились очень интересными: MaxSite Cache Lite строит кэш несколько быстрее, чем WP Super Cache (у MaxSite Cache более простая логика работы). WP Super Cache создаёт более сильную нагрузку на диск (так как файлы разбрасываются по множеству каталогов, а не кидаются в один) и, за счёт этого, чуть большую нагрузку на процессор (если сравнивать по значению idle time). Но при этом у WP Super Cache больший коэффициент параллельности (обслуживает большее число запросов одновременно).</p>
<p>Но при отдаче кэша и с повышением нагрузки результат меняется: WP Super Cache отдаёт данные быстрее и, как результат, обслуживает большее количество клиентов. Потребление памяти при этом чуть меньше, но загрузка процессора чуть больше. Вообще картину очень сильно портил munin — нагрузка, им создаваемая, вносила существенные погрешности в измерения (было видно в <span class="codebox"><code class="bash">top</code></span>).</p>
<table class="bordered" cellspacing="0" cellpadding="0" rules="all">
<caption>Построение кэша</caption>
<thead>
<tr>
<th>&nbsp;</th>
<th><strong>WP Super Cache</strong></th>
<th><strong>MaxSite Cache</strong></th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Количество транзакций</th>
<td>91,755</td>
<td>95,028</td>
</tr>
<tr>
<th scope="row">Объём данных, МБ</th>
<td>2,160.51</td>
<td>2,240.59</td>
</tr>
<tr>
<th scope="row">Среднее время ответа, с</th>
<td>0.05</td>
<td>0.04</td>
</tr>
<tr>
<th scope="row">Частота транзакций в секунду</th>
<td>50.97</td>
<td>52.79</td>
</tr>
<tr>
<th scope="row">Пропускная способность, МБ/с</th>
<td>1.20</td>
<td>1.24</td>
</tr>
<tr>
<th scope="row">Коэффициент параллельности</th>
<td>2.58</td>
<td>2.21</td>
</tr>
<tr>
<th scope="row">Максимальная длина транзакции, с</th>
<td>20.93</td>
<td>19.10</td>
</tr>
<tr>
<th scope="row">Минимальная длина транзакции, с</th>
<td>0.00</td>
<td>0.00</td>
</tr>
</tbody>
</table>
<table class="bordered" cellspacing="0" cellpadding="0" rules="all">
<caption>Использование кэша</caption>
<thead>
<tr>
<th>&nbsp;</th>
<th><strong>WP Super Cache</strong></th>
<th><strong>MaxSite Cache</strong></th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Количество транзакций</th>
<td>219,761</td>
<td>206,949</td>
</tr>
<tr>
<th scope="row">Объём данных, МБ</th>
<td>5,129.06</td>
<td>4,880.30</td>
</tr>
<tr>
<th scope="row">Среднее время ответа, с</th>
<td>0.07</td>
<td>0.09</td>
</tr>
<tr>
<th scope="row">Частота транзакций в секунду</th>
<td>244.29</td>
<td>229.92</td>
</tr>
<tr>
<th scope="row">Пропускная способность, МБ/с</th>
<td>5.70</td>
<td>5.42</td>
</tr>
<tr>
<th scope="row">Коэффициент параллельности</th>
<td>27.89</td>
<td>21.58</td>
</tr>
<tr>
<th scope="row">Максимальная длина транзакции, с</th>
<td>21.96</td>
<td>21.58</td>
</tr>
<tr>
<th scope="row">Минимальная длина транзакции, с</th>
<td>0.00</td>
<td>0.00</td>
</tr>
</tbody>
</table>
<p><strong>Краткие выводы:</strong> в плане построения кэша производительность у MaxSite Cache Lite выше, что объясняется простотой его логики. Но при  нагрузке и построенном кэше WP Super Cache обладает более высокой производительностью, так как web-сервер способен отдавать закэшированные данные без привлечения PHP. При одинаковом количестве запросов в секунду <em>под нагрузкой</em> WP Super Cache демонстрирует меньшее потребление памяти и нагрузку на процессор. При <em>средней</em> нагрузке на систему оба кэша ведут себя примерно одинаково — разница в потреблении памяти и нагрузке незаметна.</p>
<p><strong>В следующей части: <a href="http://blog.sjinks.pro/wordpress/725-689-wp-super-cache-vs-maxsite-cache-part-2/">тест WP Super Cache и MaxSite Cache на грамотно настроенном сервере</a>.</strong></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/689-wp-super-cache-vs-maxsite-cache-part-1/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/689-wp-super-cache-vs-maxsite-cache-part-1/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Обновление PHP до 5.2.x в CentOS 5</title>
		<link>http://blog.sjinks.pro/administering/460-upgrading-php-in-centos-5/</link>
		<comments>http://blog.sjinks.pro/administering/460-upgrading-php-in-centos-5/#comments</comments>
		<pubDate>Sun, 21 Dec 2008 07:32:44 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=460</guid>
		<description><![CDATA[Просто, как раз-два-три На сервере с CentOS&#160;5.1 столкнулся с такой проблемой: Apache при открытии PHP-страниц с завидным постоянством писал в лог следующие ошибки: *** glibc detected *** /usr/sbin/httpd: corrupted double-linked list: 0x09a939f8 *** К сожалению, поиск в Google практических результатов не дал: ошибка могла случаться на любом железе и любой версии Linux. Больше всего жаловались [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/460-upgrading-php-in-centos-5/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Просто, как раз-два-три</em></h2>
<p>На сервере с <a href="http://blog.sjinks.pro/tag/centos/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  CentOS">CentOS</a>&nbsp;5.1 столкнулся с такой проблемой: <a href="http://blog.sjinks.pro/tag/apache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Apache">Apache</a> при открытии <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a>-страниц с завидным постоянством писал в лог следующие ошибки:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p46020">
        <div class="code text" id="p460code20">
*** glibc detected *** /usr/sbin/httpd: corrupted double-linked list: 0x09a939f8 ***
        </div>
    </div>
</div>

<p>К сожалению, поиск в Google практических результатов не дал: <a href="http://blog.sjinks.pro/tag/bug/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ошибка">ошибка</a> могла случаться на любом железе и любой версии <a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux">Linux</a>. Больше всего жаловались (не)счастливые обладатели Zend Optimizer.</p>
<p>Обновил CentOS до 5.2 (в обновлении пришёл новый <code>libc</code>), но это не помогло. Странно, я видел много серверов, работающих на CentOS без таких ошибок.</p>
<p>Пытаясь найти минимальную конфигурацию, на которой бы воспроизводились ошибки, я отключал один за одним модули Apache, модули PHP, но всё тщетно. Когда же я отключил mod_php, ошибка пропала&nbsp;&mdash;&nbsp;на статических страницах всё было прекрасно.<span id="more-460"></span></p>
<p>PHP оказался старым: 5.1.6 или около того. А с обновлением были проблемы: RedHat ES5, как и CentOS, не поддерживает PHP более новых версий. Установка из исходного кода тоже не выход: на живом сервере нарушать зависимости пакетов почему-то не хотелось.</p>
<p>К счастью, <a href="http://www.google.com/search?hl=en&amp;q=centos+php+5.2">выход</a> нашелся довольно быстро: использовать репозиторий <a href="http://blog.famillecollet.com/pages/Config-en">Remi Collet</a>. Детали по ссылке, а мне помогло такое решение:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p46021">
        <div class="code bash" id="p460code21">
<span class="kw2">wget</span> http:<span class="sy0">//</span>download.fedora.redhat.com<span class="sy0">/</span>pub<span class="sy0">/</span>epel<span class="sy0">/</span>5<span class="sy0">/</span>i386<span class="sy0">/</span>epel-release-5-2.noarch.rpm<br />
<span class="kw2">wget</span> http:<span class="sy0">//</span>rpms.famillecollet.com<span class="sy0">/</span>el5.i386<span class="sy0">/</span>remi-release-5-4.el5.remi.noarch.rpm<br />
rpm <span class="re5">-Uvh</span> remi-release-5<span class="sy0">*</span>.rpm epel-release-5<span class="sy0">*</span>.rpm<br />
yum <span class="re5">--enablerepo</span>=remi update php
        </div>
    </div>
</div>

<div style="color: red"><strong>Update:</strong> статья писалась почти год назад, и читатели говорят, что ссылки уже битые и рекомендуют такое:
          
<div class="codebox">
    <div class="the_code" style="" id="p46022">
        <div class="code bash" id="p460code22">
<span class="kw2">wget</span> http:<span class="sy0">//</span>download.fedora.redhat.com<span class="sy0">/</span>pub<span class="sy0">/</span>epel<span class="sy0">/</span>5<span class="sy0">/</span>i386<span class="sy0">/</span>epel-release-5-3.noarch.rpm<br />
<span class="kw2">wget</span> http:<span class="sy0">//</span>rpms.famillecollet.com<span class="sy0">/</span>el5.i386<span class="sy0">/</span>remi-release-5-7.el5.remi.noarch.rpm <br />
rpm <span class="re5">-Uvh</span> remi-release-5<span class="sy0">*</span>.rpm epel-release-5<span class="sy0">*</span>.rpm<br />
yum <span class="re5">--enablerepo</span>=remi update php
        </div>
    </div>
</div>

</div>
<p>После чего</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p46023">
        <div class="code bash" id="p460code23">
<span class="sy0">/</span>etc<span class="sy0">/</span>init.d<span class="sy0">/</span>httpd restart<br />
<span class="kw2">tail</span> <span class="re5">-f</span> <span class="sy0">/</span>var<span class="sy0">/</span>log<span class="sy0">/</span>httpd<span class="sy0">/</span>error_log
        </div>
    </div>
</div>

<p>Вуаля, ошибка исчезла! И не пришлось звать на помощь Мастерхост <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Для возврата к старой версии PHP (мало ли) нужно сделать так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p46024">
        <div class="code bash" id="p460code24">
yum <span class="re5">--disablerepo</span>=remi<br />
yum remove php php-cli php-common<br />
yum <span class="kw2">install</span> php
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/460-upgrading-php-in-centos-5/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/administering/460-upgrading-php-in-centos-5/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>WordPress: заменяем Apache nginx&#8217;ом</title>
		<link>http://blog.sjinks.pro/wordpress/398-wordpress-replacing-apache-with-nginx/</link>
		<comments>http://blog.sjinks.pro/wordpress/398-wordpress-replacing-apache-with-nginx/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 14:40:25 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[nginx]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[FastCGI]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=398</guid>
		<description><![CDATA[nginx + PHP + FastCGI + WordPress = рабочая конфигурация Update: статья писалась давным-давно, правильная конфигурация nginx для работы с WordPress описана здесь. Собственно, возникла идея: как заставить WordPress работать под другим web-сервером? Для начала я решил поэкспериментировать с nginx, если будет время — попробую и другие web-сервера. Предполагается, что PHP в режиме FastCGI прослушивает 9000 порт на [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/398-wordpress-replacing-apache-with-nginx/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em><a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</a> + <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a> + <a href="http://blog.sjinks.pro/tag/fastcgi/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  FastCGI">FastCGI</a> + <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> = рабочая конфигурация</em></h2>
<p><strong style="color: red">Update:</strong> <strong>статья писалась давным-давно, правильная конфигурация nginx для работы с WordPress описана <a href="http://blog.sjinks.pro/wordpress-plugins/nginx-compatibility/">здесь</a></strong>.</p>
<p>Собственно, возникла идея: как заставить WordPress работать под другим web-сервером? Для начала я решил поэкспериментировать с nginx, если будет время — попробую и другие web-сервера.<span id="more-398"></span></p>
<p>Предполагается, что PHP в режиме FastCGI прослушивает 9000 порт на 127.0.0.1.</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p39827">
        <div class="code nginx" id="p398code27">
<span class="kw1">server</span> {<br />
&nbsp; &nbsp; <span class="kw1">listen</span> <span class="nu0">80</span>;<br />
&nbsp; &nbsp; <span class="kw1">server_name</span> example.com;<br />
&nbsp; &nbsp; <span class="kw1">index</span> <span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; <span class="kw1">root</span> /var/www/example.com;<br />
<br />
&nbsp; &nbsp; <span class="kw1">access_log</span> /var/log/nginx/example.com-access.log;<br />
&nbsp; &nbsp; <span class="kw1">location</span> ~ \.php$ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_pass</span> 127.0.0.1:<span class="nu0">9000</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_index</span> <span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_FILENAME /var/www/example.com$fastcgi_script_name;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include</span> fastcgi_params;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; <span class="kw1">location</span> ~ /\.ht {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">deny</span> all;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> (!-e $request_filename) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">rewrite</span> ^(.+)$ &nbsp;/<span class="kw1">index</span>.php &nbsp; last;<br />
&nbsp; &nbsp; }<br />
}
        </div>
    </div>
</div>

<p><code>fastcgi_params</code>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p39828">
        <div class="code nginx" id="p398code28">
<span class="kw1">fastcgi_param</span> &nbsp;QUERY_STRING &nbsp; &nbsp; &nbsp; $query_string;<br />
<span class="kw1">fastcgi_param</span> &nbsp;REQUEST_METHOD &nbsp; &nbsp; $request_method;<br />
<span class="kw1">fastcgi_param</span> &nbsp;CONTENT_TYPE &nbsp; &nbsp; &nbsp; $content_type;<br />
<span class="kw1">fastcgi_param</span> &nbsp;CONTENT_LENGTH &nbsp; &nbsp; $content_length;<br />
<br />
<span class="kw1">fastcgi_param</span> &nbsp;SCRIPT_NAME &nbsp; &nbsp; &nbsp; &nbsp;$fastcgi_script_name;<br />
<span class="kw1">fastcgi_param</span> &nbsp;REQUEST_URI &nbsp; &nbsp; &nbsp; &nbsp;$request_uri;<br />
<span class="kw1">fastcgi_param</span> &nbsp;DOCUMENT_URI &nbsp; &nbsp; &nbsp; $document_uri;<br />
<span class="kw1">fastcgi_param</span> &nbsp;DOCUMENT_ROOT &nbsp; &nbsp; &nbsp;$document_root;<br />
<span class="kw1">fastcgi_param</span> &nbsp;SERVER_PROTOCOL &nbsp; &nbsp;$server_protocol;<br />
<br />
<span class="kw1">fastcgi_param</span> &nbsp;GATEWAY_INTERFACE &nbsp;CGI/<span class="nu0">1.1</span>;<br />
<span class="kw1">fastcgi_param</span> &nbsp;SERVER_SOFTWARE &nbsp; &nbsp;nginx/$nginx_version;<br />
<br />
<span class="kw1">fastcgi_param</span> &nbsp;REMOTE_ADDR &nbsp; &nbsp; &nbsp; &nbsp;$remote_addr;<br />
<span class="kw1">fastcgi_param</span> &nbsp;REMOTE_PORT &nbsp; &nbsp; &nbsp; &nbsp;$remote_port;<br />
<span class="kw1">fastcgi_param</span> &nbsp;SERVER_ADDR &nbsp; &nbsp; &nbsp; &nbsp;$server_addr;<br />
<span class="kw1">fastcgi_param</span> &nbsp;SERVER_PORT &nbsp; &nbsp; &nbsp; &nbsp;$server_port;<br />
<span class="kw1">fastcgi_param</span> &nbsp;SERVER_NAME &nbsp; &nbsp; &nbsp; &nbsp;$server_name;<br />
<br />
<span class="co1"># PHP only, required if PHP was built with --enable-force-cgi-redirect</span><br />
<span class="kw1">fastcgi_param</span> &nbsp;REDIRECT_STATUS &nbsp; &nbsp;<span class="nu0">200</span>;
        </div>
    </div>
</div>

<p>Как говорится, ничего сложного…</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/398-wordpress-replacing-apache-with-nginx/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/398-wordpress-replacing-apache-with-nginx/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Apache: устанавливаем редирект с www.domain.com на domain.com и наоборот</title>
		<link>http://blog.sjinks.pro/administering/352-apache-how-to-redirect-from-www-and-back/</link>
		<comments>http://blog.sjinks.pro/administering/352-apache-how-to-redirect-from-www-and-back/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 23:39:58 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[redirect]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=352</guid>
		<description><![CDATA[Заезженная до дыр тема, обсуждаемая на всех форумах про Apache и mod_rewrite, но, тем не менее, не потерявшая своей актуальности до сих пор. Правильное решение: Перенаправление с www.domain.com на domain.com: RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] RewriteRule ^(.*) http://%1/$1 [L,R=301] Всё просто: если имя хоста начинается на www., отрезаем www. и выполняем редирект. Я предпочитаю перенаправление с [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/352-apache-how-to-redirect-from-www-and-back/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<p>Заезженная до дыр тема, обсуждаемая на всех форумах про <a href="http://blog.sjinks.pro/tag/apache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Apache">Apache</a> и <a href="http://blog.sjinks.pro/tag/mod_rewrite/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  mod_rewrite">mod_rewrite</a>, но, тем не менее, не потерявшая своей актуальности до сих пор.<span id="more-352"></span></p>
<p><strong>Правильное решение:</strong></p>
<ol>
<li><strong>Перенаправление с <code>www.domain.com</code> на <code>domain.com</code>:</strong>
          
<div class="codebox">
    <div class="the_code" style="" id="p35231">
        <div class="code apache" id="p352code31">
<span class="kw1">RewriteCond</span> %{HTTP_HOST} &nbsp;^www\.(.+)$ &nbsp;[NC]<br />
<span class="kw1">RewriteRule</span> ^(.*) &nbsp; &nbsp; &nbsp; &nbsp; http://%1/$<span class="nu0">1</span> [L,R=<span class="nu0">301</span>]
        </div>
    </div>
</div>

Всё просто: если имя хоста начинается на <code>www.</code>, отрезаем <code>www.</code> и выполняем редирект. Я предпочитаю перенаправление с кодом 301, у Вас могут быть свои предпочтения.</li>
<li><strong>Перенаправление с <code>domain.com</code> на <code>www.domain.com</code>:</strong>
          
<div class="codebox">
    <div class="the_code" style="" id="p35232">
        <div class="code apache" id="p352code32">
<span class="kw1">RewriteCond</span> %{HTTP_HOST} &nbsp; !^$<br />
<span class="kw1">RewriteCond</span> %{HTTP_HOST} &nbsp; !^www\. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[NC]<br />
<span class="kw1">RewriteCond</span> %{HTTP_HOST} &nbsp; (.+)$<br />
<span class="kw1">RewriteRule</span> ^(.*) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;http://www.%1/$<span class="nu0">1</span> [L,R=<span class="nu0">301</span>]
        </div>
    </div>
</div>

Посложнее: проверяем, что имя хоста не пустое и <strong>не</strong> начинается на <code>www.</code>. Добавляем <code>www.</code> к имени хоста и выполняем редирект.
</li>
</ol>
<p>Разумеется, что mod_rewrite должен быть включен (<span class="codebox"><code class="apache"><span class="kw1">RewriteEngine</span> <span class="kw2">On</span></code></span>). В целях повышения производительности имеет смысл помещать код не в <code>.htaccess</code>, а непосредственно внутрь директивы <span class="codebox"><code class="apache">&lt;<span class="kw3">VirtualHost</span>&gt;</code></span> конфигурационного файла Apache.</p>
<p>Здесь рассмотрен простой случай: протокол HTTPS не используется. Реализация перенаправления с использованием HTTPS остаётся домашним заданием читателю <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/352-apache-how-to-redirect-from-www-and-back/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/administering/352-apache-how-to-redirect-from-www-and-back/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Настройка общих поддоменов (wildcard subdomains) в Apache</title>
		<link>http://blog.sjinks.pro/administering/107-setting-up-wildcard-subdomains-in-apache/</link>
		<comments>http://blog.sjinks.pro/administering/107-setting-up-wildcard-subdomains-in-apache/#comments</comments>
		<pubDate>Sun, 20 Apr 2008 09:23:00 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[BIND]]></category>
		<category><![CDATA[общий поддомен]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=107</guid>
		<description><![CDATA[Настройка общих поддоменов за 5 минут За последнюю неделю мне уже несколько раз приходилось рассказывать, как настраивать общие поддомены (известные как wildcard subdomains) в Apache и BIND/MaraDNS, поэтому решил написать статью, к которой можно будет отсылать интересующихся Общие поддомены используются в силу множества причин: создание многопользовательских инсталляций блогов/форумов, где каждый пользователь получает домен вида username.domain.tld [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/107-setting-up-wildcard-subdomains-in-apache/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Настройка общих поддоменов за 5 минут</em></h2>
<p>За последнюю неделю мне уже несколько раз приходилось рассказывать, как настраивать общие поддомены (известные как <em>wildcard subdomains</em>) в <a href="http://blog.sjinks.pro/tag/apache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Apache">Apache</a> и <a href="http://blog.sjinks.pro/tag/bind/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  BIND">BIND</a>/MaraDNS, поэтому решил написать статью, к которой можно будет отсылать интересующихся <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Общие поддомены используются в силу множества причин: создание многопользовательских инсталляций блогов/форумов, где каждый пользователь получает домен вида username.domain.tld (в качестве примера можно привести известный <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>&nbsp;&micro;), использование одной CMS для управления всеми поддоменами и т.п.</p>
<p>Для серверов на базе Apache процесс настройки общих поддоменов проходит в два этапа.<span id="more-107"></span></p>
<ol>
<li><strong>Создание wildcard-записи DNS</strong>
<p>Первый шаг состоит в создании wildcard-записи DNS. Для разных DNS-серверов это будет осуществляться по-разному (в смысле, принцип один и тот же, различия лишь в синтаксисе конфигурационного файла). Рассмотрим на примере BIND (так как BIND работает и под <a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux">Linux</a>/UNIX, и под Windows).</p>
<p>Создание wildcard-записи очень просто: всё, что нужно&nbsp;&mdash;&nbsp;это добавить A-запись, связывающую имя вида *.domain.tld с IP-aдресом сервера.</p>
<p>Рассмотрим на примере одного development-сервера:</p>
<pre>
$TTL        86400
$ORIGIN internetnetworkmarketer.org.ua.
@  1D  IN         SOA ns1.internetnetworkmarketer.org.ua.        sjinks.internetnetworkmarketer.org.ua. (
                              2008030500 ; serial
                              24H ; refresh
                              15 ; retry
                              90w ; expire
                              15 ; minimum
                             )
                        IN  NS     ns1
                        IN  NS     ns.secondary.net.ua.
                        IN  NS     ns2.trifle.net.
                        IN  MX  10 @
                        IN  A      195.10.218.132
                        IN  TXT    "v=spf1 a mx:internetnetworkmarketer.org.ua -all"
                        IN  SPF    "v=spf1 a mx:internetnetworkmarketer.org.ua -all"
ns1                     IN  A      195.10.218.132
www                     IN  A      195.10.218.132
</pre>
<p>Мы видим, что домен <code>internetnetworkmarketer.org.ua</code> "живёт" по адресу 195.10.218.132; там же находятся два его поддомена&nbsp;&mdash;&nbsp;<code>ns1.internetnetworkmarketer.org.ua</code> и <code>www.internetnetworkmarketer.org.ua</code> (технически <code>www.somesite.tld</code> является поддоменом <code>somesite.tld</code>; в общем случае <code>www.somesite.tld</code> и <code>somesite.tld</code> могут быть совершенно разными сайтами).</p>
<p>На сайт был поставлен WordPress&nbsp;&micro;, вследствие чего нужно было создать <a href="http://blog.sjinks.pro/tag/wildcard-subdomain/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  общий поддомен">общий поддомен</a>&nbsp;&mdash;&nbsp;чтобы каждый пользователь получал блог вида <code>username.internetnetworkmarketer.org.ua</code>.</p>
<p>Добавление общего поддомена сводится к добавлению A-записи в конец файла зоны:</p>
<pre>
*.internetnetworkmarketer.org.ua.	IN  A      195.10.218.132
</pre>
<p>После чего нужно было перезапустить BIND.</p>
После перезапуска придётся подождать некоторое время, пока новые настройки DNS "распространятся" через Internet (этот феномен называется <em>DNS propagation</em>).
</li>
<li>
<strong>Настройка виртуального хоста Apache</strong>
<p>После того, как мы успешно настроили DNS, нужно указать Apache, что он должен обрабатывать адреса вида <code>*.domain.tld</code> (<code>*.internetnetworkmarketer.org.ua</code> в нашем случае).</p>
<p>Пусть в файле конфигурации у нас есть такая запись о виртуальном хосте:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p10735">
        <div class="code apache" id="p107code35">
&lt;<span class="kw3">VirtualHost</span> *:80&gt;<br />
&nbsp; &nbsp; <span class="kw1">DocumentRoot</span> <span class="st0">&quot;/home/internetnetworkmarketer.org.ua&quot;</span><br />
&nbsp; &nbsp; <span class="kw1">ServerName</span> <span class="st0">&quot;internetnetworkmarketer.org.ua&quot;</span><br />
&nbsp; &nbsp; <span class="kw1">ServerAlias</span> <span class="st0">&quot;internetnetworkmarketer.org.ua&quot;</span> <span class="st0">&quot;www.internetnetworkmarketer.org.ua&quot;</span> <br />
&nbsp; &nbsp; <span class="kw1">ErrorLog</span> logs/internetnetworkmarketer.org.ua-error.log<br />
&nbsp; &nbsp; <span class="kw1">CustomLog</span> logs/internetnetworkmarketer.org.ua-access.log common<br />
&lt;/<span class="kw3">VirtualHost</span>&gt;
        </div>
    </div>
</div>

<p>Всё, что нам надо&nbsp;&mdash;&nbsp;это добавить еще один псевдоним (alias) в директиву ServerAlias:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p10736">
        <div class="code apache" id="p107code36">
<span class="kw1">ServerAlias</span> <span class="st0">&quot;internetnetworkmarketer.org.ua&quot;</span> <span class="st0">&quot;www.internetnetworkmarketer.org.ua&quot;</span> <span class="st0">&quot;*.internetnetworkmarketer.org.ua&quot;</span>
        </div>
    </div>
</div>

После внесения изменений Apache нужно перезапустить.
</li>
</ol>
<p>Вот так вот всё просто!</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/107-setting-up-wildcard-subdomains-in-apache/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/administering/107-setting-up-wildcard-subdomains-in-apache/feed/</wfw:commentRss>
		<slash:comments>38</slash:comments>
		</item>
	</channel>
</rss>

