<?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>SqR`s Blog</title>
	<atom:link href="https://sqrs.ru/feed/" rel="self" type="application/rss+xml" />
	<link>https://sqrs.ru</link>
	<description></description>
	<lastBuildDate>Fri, 25 Apr 2025 14:18:41 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://sqrs.ru/wp-content/uploads/2025/04/android-chrome-512x512-1-150x150.png</url>
	<title>SqR`s Blog</title>
	<link>https://sqrs.ru</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Hover и IE6</title>
		<link>https://sqrs.ru/2009/06/17/hover-ie6/</link>
					<comments>https://sqrs.ru/2009/06/17/hover-ie6/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Wed, 17 Jun 2009 19:38:00 +0000</pubDate>
				<category><![CDATA[CSS]]></category>
		<guid isPermaLink="false">https://sqrs.ru/?p=26</guid>

					<description><![CDATA[1. Проблема использования Hover с window.document.location (IE6 поддерживает только тег A)2. Mozilla не понимает a:link:hover, если писать a:hover то не понимает осел3. Для тега А&#8230;]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">1. Проблема использования Hover с window.document.location (IE6 поддерживает только тег A)<br>2. Mozilla не понимает a:link:hover, если писать a:hover то не понимает осел<br>3. Для тега А невозможно выставить высоту и ширину в ИЕ (к примеру ссылка на всю длину TD)</p>



<h1 class="wp-block-heading">Решение</h1>



<p class="wp-block-paragraph">привожу чисто свои стили, которые применялись в проекте..</p>



<pre class="wp-block-code"><code>.right_menu1
{
	font-family:Arial;
	font-size: 14px;
	text-decoration: none;
	font-weight:bold;
}
 
.right_menu1 div
{
	padding-top: 5px;
	padding-bottom: 6px;
	padding-left: 36px;
 
	background-image:url(/project/templates/site/img/header21.triangle.gif);
	background-repeat:no-repeat;
 
	width:100%;
	height:100%;
	color: #575D6C;
}
 
.right_menu1 a:link:hover, .right_menu1 a:hover div
{
	text-decoration: none;
	background-color:white;
	cursor:hand;
	c\ursor:pointer;
}</code></pre>



<p class="wp-block-paragraph">1. понятно&nbsp;<img decoding="async" src="https://web.archive.org/web/20160710072225im_/http://sqrs.ru/wp-includes/images/smilies/icon_smile.gif" alt=":)"></p>



<p class="wp-block-paragraph">2. У станавливаем для дива паддинги и подсветку при наведении на пункт меню.</p>



<p class="wp-block-paragraph">3. Ставим стили ховера чтобы понимал и IE и Mozilla. Замечу, что стиль подсветки применяется к тегу А, а для мозиллы к Диву в теге А!</p>



<h1 class="wp-block-heading">Пример таблицы:</h1>



<pre class="wp-block-code"><code>&lt;table width="100%" cellspacing="0" cellpadding="0">
&lt;tr>
	&lt;td class="right_menu1" onclick="window.document.location='/';">&lt;a href="#">&lt;div>Модельный&amp;nbsp;ряд&lt;/div>&lt;/a>&lt;/td>
&lt;/tr>
&lt;/table></code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://sqrs.ru/2009/06/17/hover-ie6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Оптимизация nginx и другие полезности</title>
		<link>https://sqrs.ru/2009/05/26/optimization-nginx/</link>
					<comments>https://sqrs.ru/2009/05/26/optimization-nginx/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 26 May 2009 09:33:00 +0000</pubDate>
				<category><![CDATA[Nginx]]></category>
		<guid isPermaLink="false">https://sqrs.ru/?p=24</guid>

					<description><![CDATA[В прошлом посте я писал про то, что такое nginx и как его установить. Теперь же расскажу, как его оптимизировать под свои нужды. Failover и&#8230;]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">В прошлом посте я писал про то, что такое nginx и как его установить. Теперь же расскажу, как его оптимизировать под свои нужды.</p>



<h3 class="wp-block-heading">Failover и балансировка</h3>



<p class="wp-block-paragraph">Крупные проекты редко состоят из одного сервера приложений. Часто их два или больше, и возникает задача балансировки клиентов по этим серверам, а также выполнения failover — необходимо чтобы выход из строя одного из серверов не был заметен для клиентов.<br>Простейший способ рещить эту задачу — dns round-robin, т.е. назначение доменному имени нескольких ip-адресов. Но это решение имеет ряд недостатков, и гораздо лучше выглядит решение балансировки запросов по бакендам на фронтенде nginx. В конфигурационном файле выглядит это примерно так:<br># объявляем upstream — список бакендов</p>



<pre class="wp-block-code"><code>upstream  backend  {
  # перечисляем dns-имена или ip-адреса серверов и их «вес»
  server   web1                 weight=5;
  server   1.2.3.4:8080         weight=5;
  # а так можно подключаться к бакенду через unix-сокет
  server   unix:/tmp/backend3   weight=1;
}
# конфигурация виртуального сервера
server {
  listen &lt;...>;
  server_name myserver.com;
  # отправляем все запросы из локейшена / в апстрим
  location / {
    proxy_pass  http://backend;
  }
}</code></pre>



<p class="wp-block-paragraph">Запросы, приходящие к nginx, распределяются по бакендам соответственно указаному весу. Кроме того, можно сделать так, чтобы запросы с одних и тех же IP-адресов отправлялись на одни и те же серверы (для этого в upstream нужно указать директиву ip_hash). Так можно решить проблему с сессиями, но все же лучше найти какой-нибудь способ их репликации или (что еще лучше) использовать .<br>В случае, если один из серверов откажется принимать соединения или соединение к нему отвалится по таймауту, он на некоторое время будет исключен из upstream.</p>



<h3 class="wp-block-heading">Собственно оптимизация nginx</h3>



<p class="wp-block-paragraph"><strong>1. Увеличение количества и объема буферов</strong></p>



<p class="wp-block-paragraph">Для хранения принятых запросов и еще не отданных ответов nginx использует буферы в памяти, а если запрос или ответ не помещается в них, nginx записывает его во временный файл (и пишет при этом предупреждение в log-файл). Поэтому необходимо установить такие размеры, чтобы в большинстве случаев не требовалось обращаться к временному файлу, а с другой стороны — чтобы буферы не использовали слишком много памяти.</p>



<p class="wp-block-paragraph">Для этого используются следующие параметры:<br><strong>client_body_buffer_size</strong>&nbsp;(по умолчанию: 8k/16k — в зависимости от архитектуры) — задает размер буфера для чтения тела запроса клиента. Обычно стандартного значения хватает, его требуется повышать, только если ваше приложение устанавливает огромные cookies.<br><strong>proxy_buffer_size</strong>&nbsp;(по умолчанию: 4k/8k) — задает размер буфера, в который будет читаться первая часть ответа, получаемого от проксируемого сервера. В этой части ответа находится, как правило, небольшой заголовок ответа. Стандартного значения обычно хватает.<br><strong>proxy_buffers</strong>&nbsp;(по умолчанию: 8 4k/8k) — задает число и размер буферов для одного соединения, в которые будет читаться ответ, получаемый от проксируемого сервера. Установите этот параметр так, чтобы большинство ответов от бэкенда помещалось в буферы.</p>



<p class="wp-block-paragraph"><strong>2. Механизмы обработки соединений</strong></p>



<p class="wp-block-paragraph">Есть одна тонкость, касающаяся механизма обработки соединений, а именно — способ получения информации о событиях на сокетах. Существуют следующие методы:</p>



<p class="wp-block-paragraph">* select — стандартный метод. На большой нагрузке сильно нагружает процессор.<br>* poll — стандартный метод. Также сильно нагружает процессор.<br>* kqueue — эффективный метод, используемый в операционных системах FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 и Mac OS X. На 2-процессорных машинах под управлением Mac OS X использование kqueue может привести к kernel panic.<br>* epoll — эффективный метод, используемый в Linux 2.6+. В некоторых старых дистрибутивах есть патчи для поддержки epoll ядром 2.4.<br>* rtsig — real time signals, эффективный метод, используемый в Linux 2.2.19+. При больших количествах одновременных соединений (более 1024) с ним могут быть проблемы (их можно обойти, но на мой взгляд, лучше с этим не связываться).<br>* /dev/poll — эффективный метод, используемый в Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ и Tru64 UNIX 5.1A+.</p>



<p class="wp-block-paragraph">При компиляции nginx автоматически выбирается максимально эффективный найденый метод, однако скрипту configure можно насильно указать какой метод использовать. Если вы решили сделать это, то лучше использовать такие методы:<br>Linux 2.6: epoll;<br>FreeBSD: kqueue;<br>Solaris, HP/UX и другие: /dev/poll;<br>Linux 2.4 и 2.2: rtsig, не рекомендуется при больших нагрузках.</p>



<p class="wp-block-paragraph">Включение gzip позволяет сжимать ответ, отправляемый клиенту, что положительно сказывается на удовлетворенности пользователя, но требует больше времени CPU. Gzip включается директивой gzip (on|off). Кроме того, стоит обратить на следующие важные директивы модуля gzip:</p>



<p class="wp-block-paragraph"><strong>gzip_comp_level 1..9</strong>&nbsp;— устанавливает уровень сжатия. Опытным путем выявлено, что оптимальные значения лежат в промежутке от 3 до 5, большие значения дают маленький выигрыш, но создают существенно большую нагрузку на процессор, меньшие — дают слишком маленький коэффициент сжатия.<br><strong>gzip_min_length</strong>&nbsp;(по умолчанию, 0) — минимальный размер ответа, который будет сжиматься. Имеет смысл поставить этот параметр в 1024, чтобы слишком малеьнике файлы не сжимались (т.к. эффективность этого будет мала).<br><strong>gzip_types mime-тип</strong>&nbsp;[mime-тип &#8230;] — разрешает сжатие ответа методом gzip для указанных MIME-типов в дополнение к «text/html». «text/html» сжимается всегда. Имеет смысл добавить такие mime-типы как text/css, text/javascript и подобные. Разумеется, сжимать gif, jpg и прочие уже компрессированые форматы не имеет смысла.</p>



<p class="wp-block-paragraph">Кроме того, существует модуль gzip_static, который позволяет раздавать уже сжатые статические файлы. В конфигурационном файле это выглядит так:<br><strong><code>location /files/ {<br>gzip on;<br>gzip_min_length 1024;<br>gzip_types text/css text/javascript;<br>gzip_comp_level 5;<br>gzip_static on;<br>}</code></strong></p>



<p class="wp-block-paragraph">При использовании такой конфигурации в случае запроса «/files/test.html» nginx будет проверять наличие «/files/test.html.gz», и, если этот файл существует и дата его последнего изменения больше, чем дата последнего изменения файла test.html, будет отдан уже сжатый файл, что сохранит ресурсы процессора, которые потребовались бы для сжатия оригинального файла.</p>



<h3 class="wp-block-heading">Оптимизация приложений</h3>



<p class="wp-block-paragraph">Существует очень полезный трюк, который позволяет указать разработчикам приложений, какие страницы нужно оптимизировать в первую очередь. Для этого потребуется в конфиге nginx указать новый формат лога:</p>



<pre class="wp-block-code"><code>log_format  my_combined  '$remote_addr - $remote_user &#91;$time_local] '
    '"$request" $status $body_bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '$upstream_response_time "$host"'
 
access_log /var/log/nginx/access_log my_combined;</code></pre>



<p class="wp-block-paragraph">Переменная $upstream_response_time содержит время ответа бэкенда, поэтому в лог попадает время обработки каждого запроса бэкендом. Далее понадобятся два скрипта:</p>



<p class="wp-block-paragraph"><strong>1. /usr/local/bin/url_stats_report.sh:</strong></p>



<pre class="wp-block-code"><code>#!/bin/sh
 
echo "=== Requests which took most of the time ===" > /tmp/report.txt
echo "overall time - number of requests - average time - url" >> /tmp/report.txt
 
cat /var/log/nginx/*access.log | /usr/local/bin/url_stats.py >> /tmp/report.txt
cat /tmp/report.txt | mail -s "url performance report" root</code></pre>



<p class="wp-block-paragraph"><strong>2. /usr/local/bin/url_stats.py:<br></strong></p>



<pre class="wp-block-code"><code>#!/usr/bin/env python
 
import sys
 
urls = {}
 
try:
    while 1:
        line = raw_input()
        line_arr = line.split(" ")
        try:
            host = line_arr&#91;-1]
            host = host&#91;1:]
            host = host&#91;:-1]
            url = line_arr&#91;6]
            t = float(line_arr&#91;-2])
            #print host, url, t
 
            try:
                urls&#91;host + url] = (urls&#91;host + url]&#91;0] + t, urls&#91;host + url]&#91;1] + 1)
            except KeyError, e:
                urls&#91;host + url] = (t, 1)
        except ValueError, e:
            pass
 
 
except EOFError, e:
   pass
 
def sort_by_value(d):
    """ Returns the keys of dictionary d sorted by their values """
    items=d.items()
    backitems=&#91; &#91;v&#91;1],v&#91;0]] for v in items]
    backitems.sort(reverse=True)
    return &#91;backitems&#91;i]&#91;1] for i in range(0,len(backitems))]
 
if (len(sys.argv) > 1):
    f = open(sys.argv&#91;1], 'r')
    for k in f.readlines():
        k = k.strip()
        try:
             print urls&#91;k]&#91;0], urls&#91;k]&#91;1], urls&#91;k]&#91;0] / urls&#91;k]&#91;1], k
        except:
             print 0, 0, k
else:
    i = 0
    for k in sort_by_value(urls):
        print urls&#91;k]&#91;0], urls&#91;k]&#91;1], urls&#91;k]&#91;0] / urls&#91;k]&#91;1],  k
        i += 1
        if i > 100: break</code></pre>



<p class="wp-block-paragraph">Они не идеальны, но задачу выполняют: запуская /usr/local/bin/url_stats_report.sh (например, в postrotate утилиты logrotate), вы получаете наглядную картину, какие запросы занимают большую часть времени бэкенда.</p>



<h3 class="wp-block-heading">Кеширование</h3>



<p class="wp-block-paragraph">На данный момент существует версия nginx-0.7.59 которая поддерживает кеширование и является стабильной.. Я не могу проверить, так как использую более раннюю версию 0.7.26<br>Однако это все еще экспериментальная функция, но я решил рассказать о ней, т.к. ее одень давно ждали многое администраторы, да и лично для меня она очень полезна.<br>Сейчас nginx умеет кешировать на диске ответы от http и fastcgi запросов на бакенды, указывать ключ для кеширования, учитывать заголовки «X-Accel-Expires», «Expires» и «Cache-Control» и вручную устанавливать максимальне время жизни объекта в кеше.<br>Обслуживанием кеша (очиста старых файлов, наблюдение за размером и т.п.) занимается специальный процесс cache manager. Положительной особенностью реализации является то, что при старте nginx cache manager начинает проверку кеша в фоне, благодаря чему nginx не делает то что называется «дает сквида», т.е. он не висит несколько минут проверяя кеш перед стартом.<br>Я намеренно не указываю пример конфигурации, т.к. во-первых директивы могут еще поменяться, а во-вторых нужно глубокое понимание механизма кеширования, что требует вдумчивого чтения документации (http://sysoev.ru/nginx/docs/http/ngx_http_proxy_module.html#proxy_cache) и архивов рассылки nginx-ru.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqrs.ru/2009/05/26/optimization-nginx/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Массовая замена текста в MySQL</title>
		<link>https://sqrs.ru/2009/05/24/replace-mysql/</link>
					<comments>https://sqrs.ru/2009/05/24/replace-mysql/#comments</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 24 May 2009 10:34:00 +0000</pubDate>
				<category><![CDATA[Mysql]]></category>
		<guid isPermaLink="false">https://sqrs.ru/?p=22</guid>

					<description><![CDATA[Если встала необходимость заменить какой-либо текст в таблице MySQL, это можно сделать очень просто 1 Способ В этом коде заменяем table на название таблицы, column&#8230;]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Если встала необходимость заменить какой-либо текст в таблице MySQL, это можно сделать очень просто</p>



<h2 class="wp-block-heading">1 Способ</h2>



<pre class="wp-block-code"><code>UPDATE `table` SET `column` = REPLACE( column, 'search', 'replace' );</code></pre>



<p class="wp-block-paragraph">В этом коде заменяем table на название таблицы, column на название колонки, search — искомый текст, replace — текст, на который будем замещать.<br>Так же в запрос можно добавить какое-либо условие WHERE.</p>



<h2 class="wp-block-heading">2 Способ</h2>



<p class="wp-block-paragraph">Сделать дамп базы, сделать реплейс любой программой, например внутренним редактором менеджера Far или Notepad++, а потом залить базу обратно… Для безопасно быстрого бэкапа и восстановления базы рекомендую использовать Sypex Dumper бесплатную версию.</p>



<p class="wp-block-paragraph">И полный синтаксис команды REPLACE</p>



<pre class="wp-block-code"><code>  REPLACE &#91;LOW_PRIORITY | DELAYED]
        &#91;INTO] tbl_name &#91;(col_name,...)]
        VALUES (expression,...),(...),...
или REPLACE &#91;LOW_PRIORITY | DELAYED]
        &#91;INTO] tbl_name &#91;(col_name,...)]
        SELECT ...
или REPLACE &#91;LOW_PRIORITY | DELAYED]
        &#91;INTO] tbl_name
        SET col_name=expression, col_name=expression,...</code></pre>



<p class="wp-block-paragraph">Оператор REPLACE работает точно так же, как INSERT, за исключением того, что если старая запись в данной таблице имеет то же значение индекса UNIQUE или PRIMARY KEY, что и новая, то старая запись перед занесением новой будет удалена.</p>



<p class="wp-block-paragraph">Другими словами, команда REPLACE не предоставляет доступа к замещаемой записи. В некоторых старых версиях MySQL такой доступ иногда оказывался возможным, но это был дефект, который уже исправлен.</p>



<p class="wp-block-paragraph">Для использования REPLACE у вас должны быть привилегии INSERT и DELETE для таблицы.</p>



<p class="wp-block-paragraph">При использовании команды REPLACE функция mysql_affected_rows() вернет значение, равное 2, если старая строка была заменена новой. Объясняется это тем, что в таблицу вставляется строка после того, как удаляется дубликат.</p>



<p class="wp-block-paragraph">Это позволяет легко определять, какое действие произвела команда REPLACE — добавление или замещение строки. Достаточно просто проверить, какое число вернула функция mysql_affected_rows() — 1 (строка добавлена) или 2 (замещена).</p>



<p class="wp-block-paragraph">Следует учитывать, что, если не используются индексы UNIQUE или PRIMARY KEY, то применение команды REPLACE не имеет смысла, так как она работает просто как INSERT.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqrs.ru/2009/05/24/replace-mysql/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
		<item>
		<title>The Pirate Bay: к сожалению признаны виновными!</title>
		<link>https://sqrs.ru/2009/05/01/the-pirate-bay/</link>
					<comments>https://sqrs.ru/2009/05/01/the-pirate-bay/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Fri, 01 May 2009 12:37:00 +0000</pubDate>
				<category><![CDATA[Новости]]></category>
		<guid isPermaLink="false">https://sqrs.ru/?p=19</guid>

					<description><![CDATA[Несколько минут назад стал известен вердикт суда в отношении The Pirate Bay.Всех 4 подсудимых признали виновными.Peter Sunde: виновный. Fredrik Neij: виновный. Gottfrid Svartholm: виновный. Carl&#8230;]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Несколько минут назад стал известен вердикт суда в отношении The Pirate Bay.<br>Всех 4 подсудимых признали виновными.<br>Peter Sunde: виновный. Fredrik Neij: виновный. Gottfrid Svartholm: виновный. Carl Lundstro»m: виновный.&nbsp;Каждому дали по году и 905k$ — апиляция будет?</p>



<p class="wp-block-paragraph"><a href="http://torrentfreak.com/the-pirate-bay-trial-the-verdict-090417/" target="_blank" rel="noreferrer noopener">Подробнее тут.. (на английском)</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqrs.ru/2009/05/01/the-pirate-bay/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Смена стилей на ходу с использованием jQuery</title>
		<link>https://sqrs.ru/2009/04/17/style-jquery/</link>
					<comments>https://sqrs.ru/2009/04/17/style-jquery/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Fri, 17 Apr 2009 14:01:00 +0000</pubDate>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://sqrs.ru/?p=17</guid>

					<description><![CDATA[Переключатель таблиц стилей позволяет Вашим посетителям выбирать, с какой таблицей стилей они хотели бы просматривать Ваш сайт. СКрипт использует куки, поэтому если посетителей возвращается на&#8230;]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Переключатель таблиц стилей позволяет Вашим посетителям выбирать, с какой таблицей стилей они хотели бы просматривать Ваш сайт. СКрипт использует куки, поэтому если посетителей возвращается на сайт или посещают другую страницу, стили полностью сохраняться.</p>



<p class="wp-block-paragraph"><strong>Пример использования</strong></p>



<pre class="wp-block-code"><code>(function($)
{
   $(document).ready(function() {
      $('.styleswitch').click(function()
      {
         switchStylestyle(this.getAttribute("rel"));
         return false;
      });
      var c = readCookie('style');
      if (c) switchStylestyle(c);
   });

   function switchStylestyle(styleName)
   {
      $('link&#91;@rel*=style]&#91;title]').each(function(i)
      {
         this.disabled = true;
         if (this.getAttribute('title') == styleName) this.disabled = false;
      });
      createCookie('style', styleName, 365);
   }
})(jQuery);</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://sqrs.ru/2009/04/17/style-jquery/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Создание и установка SSL сертификата на Nginx или Apache, на сервере FreeBsd</title>
		<link>https://sqrs.ru/2009/04/17/ssl-freebsd/</link>
					<comments>https://sqrs.ru/2009/04/17/ssl-freebsd/#comments</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 16 Apr 2009 22:39:00 +0000</pubDate>
				<category><![CDATA[*nix]]></category>
		<guid isPermaLink="false">https://sqrs.ru/?p=14</guid>

					<description><![CDATA[Создание SSL сертификатов Рассказывать что это такое не буду… гугл Вам в помощь 🙂И так начнем: Генерация частного ключа и CSR Программный пакет openssl может&#8230;]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Создание SSL сертификатов</strong></p>



<p class="wp-block-paragraph">Рассказывать что это такое не буду… гугл Вам в помощь <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>И так начнем:</p>



<p class="wp-block-paragraph"><strong>Генерация частного ключа и CSR</strong></p>



<p class="wp-block-paragraph">Программный пакет openssl может быть использован для генерации приватного RSA ключа и создания CSR. Он так же может быть использован<br>для создания самоподписных сертификатов которые могут быть использованы для тестовых целей или внутреннего пользования. Программа, которая<br>обычно используется для решения этих задач, известна как openssl. Она должна быть установлена в директории /usr/local/ssl. Может быть, вам<br>придется добавить эту директорию в переменную PATH или же переместить эту программу в директорию, которая уже прописана в переменной PATH,<br>для того чтобы не писать полный путь. Дальнейшие примеры полагают, что openssl доступен вам без необходимости писать полный путь.</p>



<p class="wp-block-paragraph">В первую очередь надо создать ваш приватный ключ. Это будет 1024 битный ключ стандарта RSA зашифрованный с использованием алгоритма TripleDES и хранящийся в формате PEM, так что его можно будет читать как простой текст. Мы будем использовать несколько файлов для усиления<br>случайности и для того чтобы сделать наш ключ более секретным.<br>Текстовые файлы, которые были сжаты утилитой типа gzip . станут хорошим выбором. Ключ генерируется следующей командой, где file1:file2:etc представляют собой случайные сжатые файлы.</p>



<p class="wp-block-paragraph">Переходим в папку куда будем помещать сертификаты:</p>



<pre class="wp-block-code"><code># cd /usr/local/nginx/</code></pre>



<p class="wp-block-paragraph">Cоздаем ваш приватный ключ</p>



<pre class="wp-block-code"><code># openssl genrsa -des3 -rand file1:file2:file3 -out server.key</code></pre>



<p class="wp-block-paragraph">Программа предложит вам ввести пароль и сохранит ключ в файле server.key. Очень важно не забыть пароль. Если ключ будет утерян или пароль будет забыт сертификат станет бесполезен. Невозможно выразить как важен приватный ключ для сертификата. Если приватный ключ или пароль скомпрометированы сертификат должен быть отменен. Как минимум это будет стоить вам денег заплаченных за сертификат. Было бы хорошей идеей сделать резервную копию на безопасном носителе, таком как кассета или дискета.</p>



<p class="wp-block-paragraph">Один неприятный сторонний эффект ключа с паролем это то что Apache или nginx будет всякий раз спрашивать пароль при старте. Понятно что это не очень удобно если только кто-то не находится постоянно рядом на случай<br>перезагрузки или аварийной остановки. mod_ssl (Для апача) включает в себя возможность использования внешней программы вместо встроенного парольного диалога. Возможно убрать пароль из ключа. Если приватный ключ более не зашифрован, важно чтобы файл его содержащий, был доступен на чтение только пользователю root. Если ваша система скомпрометирована и третья сторона получила ваш незашифрованный приватный ключ, производный сертификат должен быть отменен. После того что мы сказали, используйте следующую команду для того чтобы убрать пароль из ключа.</p>



<pre class="wp-block-code"><code># openssl rsa -in server.key -out server.pem</code></pre>



<p class="wp-block-paragraph">Или же просто в первом шаге не используйте ключ -des3</p>



<p class="wp-block-paragraph">После того как приватный ключ сгенерирован может быть сгенерирован запрос на подпись сертификатов(CSR —). CSR может быть использован двояко. В идеале CSR должен быть послан к CA такому как Tawte или VeriSign, которые проверят подлинность запрашивающего и выдадут подписанный сертификат. Другой путь — подписать CSR самостоятельно, что будет продемонстрировано ниже.<br>Во время генерации CSR вас попросят ввести некоторое количество информации. Один из вопросов будет Common Name (eg, YOUR name) []:<br>Важно чтобы это поле содержало полностью квалифицированное имя домена вашего сервера. Если вебсайт имеет адрес www.zatusim.ru то вы должны написать именно www.zatusim.ru Команда для генерации CSR выглядит так.</p>



<pre class="wp-block-code"><code># openssl req -new -key server.key -out server.csr</code></pre>



<p class="wp-block-paragraph">Пример подстановки:</p>



<pre class="wp-block-code"><code>Country Name (2 letter code) &#91;AU]:RU
State or Province Name (full name) &#91;Some-State]:Moscow
Locality Name (eg, city) &#91;]:Moscow
Organization Name (eg, company) &#91;Internet Widgits Pty Ltd]:Zatusim Company
Organizational Unit Name (eg, section) &#91;]:.
Common Name (eg, YOUR name) &#91;]:www.zatusim.ru
Email Address &#91;]:webmaster@zatusim.ru
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password &#91;]:
An optional company name &#91;]:</code></pre>



<p class="wp-block-paragraph"><strong>Генерация самоподписанного сертификата</strong></p>



<p class="wp-block-paragraph">На этом этапе вам необходимо сгенерировать самоподписанный сертификат потому что вы или не планируете заводить сертификат подписанный CA, или хотите потестировать новую реализацию SSL пока CA подписывает ваш сертификат. Мой опыт общения с Tawte показывает, что получение сертификата занимает неделю и больше. Время которое занимает получение сертификата варьируется от того как быстро CA получит необходимые документы. Временный сертификат будет выдавать ошибку в клиентском броузере от того, что CA неизвестен и не проверен.</p>



<p class="wp-block-paragraph">Для того чтобы сгенерировать сертификат годный в течение 60 дней введите следующую команду.</p>



<pre class="wp-block-code"><code># openssl x509 -req -days 60 -in server.csr -signkey server.key -out server.crt</code></pre>



<p class="wp-block-paragraph"><strong>Установка ключа и сертификата</strong><br>У меня все виртуальные хоты грузятся из папки.. в прошлой статье я писал как это сделать…</p>



<p class="wp-block-paragraph">В конфиге хоста должно получиться примерно следующее:</p>



<pre class="wp-block-code"><code>    server {
        listen       443;
        server_name  zatusim.ru www.zatusim.ru;
 
    ssl on;
    ssl_certificate      /usr/local/nginx/server.crt;
    ssl_certificate_key  /usr/local/nginx/server.key;
 
    ssl_session_timeout  5m;
    ssl_prefer_server_ciphers on;
    ssl_session_cache    shared:SSL:1m;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL;</code></pre>



<p class="wp-block-paragraph">Заходим на свой домен с https в итоге, так как сертификат у нас не подписан «спец службами» <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> в ФФ мы получим что сертификат не подписан, считываем его и добавляем в доверенные. ИЕ скажет что не безопасно <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> мы то знаем что все пучком… заходим и видим что прекрасно соединились…</p>



<p class="wp-block-paragraph">ДЛя тех кто настраивает под apache + mod_ssl</p>



<p class="wp-block-paragraph">Когда Apache и mod_ssl установлены — создаются несколько поддиректорий в конфигурационной директории Apache. Их расположение зависит от того, как компилировался Apache. Если использовать мои инструкции, компилируя Apache, конфигурационная директория будет /usr/local/apache/etc Директории, которые создает mod_ssl содержат в себе файлы ssl.crt, ssl.csr, и ssl.key Это хорошее место для хранения сертификатов, запросов на подпись и приватных ключей. Если у вас будет несколько хостов с SSL хорошей практикой стать включение в имена этих файлов имен защищаемых хостов.</p>



<p class="wp-block-paragraph">Добавляя виртуальные хосты к веб-серверу, я обычно предпочитаю хранить их конфигурации в отдельном файле. Это дает уверенность, что все конфигурации могут быть быстро найдены, и, заодно, не позволяет основному конфигурационному файлу разрастаться. Если все виртуальные хосты сохранены в файле ssl.conf, то для того чтобы Apache нашел его и прочитал надо включить в основной конфиг следующюю строку:</p>



<pre class="wp-block-code"><code># Include /usr/local/apache/etc/ssl.conf</code></pre>



<p class="wp-block-paragraph"><strong>Конфигурирование виртуального хоста, использующего SSL.</strong></p>



<p class="wp-block-paragraph">Обширные примеры конфигурации SSL для виртуальных хостов включены в файл /usr/local/apache/etc/httpd.conf.default, который устанавливается вместе с mod_ssl. Ознакомьтесь с документацией на mod_ssl для того чтобы получить более подробную информацию о возможностях конфигурации. Простой хост использующий SSL в конфигурационном файле может быть прописан так. SSL Virtual Hosts</p>



<pre class="wp-block-code"><code>ServerAdmin webmaster@zatusim.ru
DocumentRoot /usr/local/apache/share/htdocs
ServerName www.zatusim.ru
ScriptAlias /cgi-bin/ /usr/local/apache/share/htdocs/cgi-bin/
SSLEngine on
SSLCertificateFile /usr/local/apache/etc/ssl.crt/server.crt
SSLCertificateKeyFile /usr/local/apache/etc/ssl.key/server.pem
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
CustomLog /usr/local/apache/var/log/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"</code></pre>



<p class="wp-block-paragraph">Не забудьте скопировать ваш сертификат туда куда указали путь в апаче или же пропишите свой.</p>



<p class="wp-block-paragraph">Этот пример создаст виртуальный хост с именем. который доступен через порт 443 (стандартный порт для протокола https) сайты с IP адресом вашего сервера. Можно создать столько дополнительных виртуальных хостов для вашего сервера сколько IP адресов он обслуживает. Просто добавьте дополнительные конфигурационные блоки между директивами.</p>



<p class="wp-block-paragraph">По архитектурным причинам протокол SSL не позволяет создавать name-based (HTTPS 1.1) виртуальные хосты. Для того чтобы создать новый виртуальный хост с поддержкой SSL на другом IP адресе просто замените _default_на новый IP.</p>



<p class="wp-block-paragraph">Посте добавления виртуального хоста к конфигурационному файлу Apache должен быть остановлен и вновь запущен для того чтобы новый виртуальный хост заработал. К несчастью это один из тех случаев когда простая отправка сигнала HUP не сработает. После перезапуска в зависимости от того какой (шифрованный или нет ) ключ был использован Apache может спросить у вас пароль или пароли. Введите пароль, и всё заработает.</p>



<p class="wp-block-paragraph">Теперь вы можете использовать ваш любимый броузер для просмотра содержимого только что созданного виртуального хоста защищённого SSL . Не забудьте использовать префикс https:// вместо http://. Вы получите окно с предупреждением, если вы использовали самоподписанный сертификат. Подтвердите согласие и страница продолжит загружаться уже защищенная с помощью SSL . Статусная строка вашего броузера должна содержать иконку в виде замка которая показывает что страница защищена. Вот и всё.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqrs.ru/2009/04/17/ssl-freebsd/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Как скрыть счетчики, без бана в поисковиках</title>
		<link>https://sqrs.ru/2009/04/16/hidecounters/</link>
					<comments>https://sqrs.ru/2009/04/16/hidecounters/#comments</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 16 Apr 2009 18:18:00 +0000</pubDate>
				<category><![CDATA[CSS]]></category>
		<guid isPermaLink="false">https://sqrs.ru/?p=10</guid>

					<description><![CDATA[Для тех, кто не хочет видеть на своем сайте счетчики посетителей, я знаю 3 простых способа, как их сделать невидимыми. При этом никакого бана от&#8230;]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Для тех, кто не хочет видеть на своем сайте счетчики посетителей, я знаю 3 простых способа, как их сделать невидимыми. При этом никакого бана от поисковиков вы не получите.</p>



<p class="wp-block-paragraph">Все три способа используют CSS.</p>



<p class="wp-block-paragraph">Предварительно заключите счетчики в теги</p>



<pre class="wp-block-code"><code>&lt;div class='counters'> код счетчиков &lt;/div></code></pre>



<p class="wp-block-paragraph">Назвать класс ‘counters’ можно по-другому.</p>



<p class="wp-block-paragraph">В стилях CSS пишем:</p>



<h3 class="wp-block-heading">Способ 1.</h3>



<pre class="wp-block-code"><code>.counters
{
display: none;
}</code></pre>



<h3 class="wp-block-heading">Способ 2.</h3>



<pre class="wp-block-code"><code>.counters
{
visibility: hidden;
}</code></pre>



<h3 class="wp-block-heading">Способ 3.</h3>



<pre class="wp-block-code"><code>{
position: absolute;
left: -1000px;
}</code></pre>



<p class="wp-block-paragraph">Всё. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqrs.ru/2009/04/16/hidecounters/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Открытие блога</title>
		<link>https://sqrs.ru/2009/04/15/hello/</link>
					<comments>https://sqrs.ru/2009/04/15/hello/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 14 Apr 2009 21:31:00 +0000</pubDate>
				<category><![CDATA[Новости]]></category>
		<guid isPermaLink="false">https://sqrs.ru/?p=1</guid>

					<description><![CDATA[Можно меня поздравить… буду писать заметочки и интересные новости.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Можно меня поздравить… буду писать заметочки и интересные новости.</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqrs.ru/2009/04/15/hello/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
