<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Путь юниксоида]]></title>
  <link href="http://nixway.org/atom.xml" rel="self"/>
  <link href="http://nixway.org/"/>
  <updated>2017-04-16T14:53:36+06:00</updated>
  <id>http://nixway.org/</id>
  <author>
    <name><![CDATA[nihi1ist]]></name>
    <email><![CDATA[nihi1ist@nixway.org]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Установка PureFTPd с поддежкой MySQL на Debian&nbsp;8&nbsp;&laquo;Jessie&raquo;]]></title>
    <link href="http://nixway.org/2016/11/15/ustanovka-pure-ftpd-mysql-na-debian-jessie/"/>
    <updated>2016-11-15T10:11:27+06:00</updated>
    <id>http://nixway.org/2016/11/15/ustanovka-pure-ftpd-mysql-na-debian-jessie</id>
    <content type="html"><![CDATA[<p><img src="http://nixway.org/images/posts/2016-11-15/debian+pure-ftpd+mysql.png" alt="Установка и настройка PureFTPd с поддежкой MySQ" />
В один прекрасный день мне понадобился FTP-сервер. Для начала попробовал ProFTPd, но он мне не подошел. Требовался простой в настройке и обслуживании и вместе с тем безопасный FTP-сервер. Также требовалась возможность работы через веб-интрефейс и поддержка виртуальных пользователей. Тогда то я и решил попробовать PureFTPd.</p>

<!--more-->


<h3>Установка PureFTPd</h3>

<p>На выбор в репозитории предлагается 4 варианта возможной конфигурации:<br/>
-&nbsp;<code>pure-ftpd</code> - FTP-сервер, с аутентификацией через системных пользователей,<br/>
-&nbsp;<code>pure-ftpd-ldap</code> - FTP-сервер, с аутентификацией через пользователей LDAP,<br/>
-&nbsp;<code>pure-ftpd-mysql</code> - FTP-сервер, с аутентификацией через пользователей хранимых в СУБД MySQL,<br/>
-&nbsp;<code>pure-ftpd-postgresql</code> - FTP-сервер, с аутентификацией через пользователей хранимых в СУБД PostgreSQL.</p>

<p>Небольшие пояснения:<br/>
-&nbsp;символ <code>#</code> (решётка)&nbsp;-&nbsp;означает выполнение команды от <strong>root</strong> (суперпользователя),<br/>
-&nbsp;<code>cat /path/to/some.file</code>&nbsp;-&nbsp;означает что ниже приведено полное содержимое файла <code>some.file</code>, расположенного в директории <code>/path/to</code>,<br/>
-&nbsp;<code>echo no &gt; /path/to/some.file</code>&nbsp;-&nbsp;означает, что в <code>some.file</code> будет вставлен текст <code>no</code>, с заменой содержимого. Если файл не существует, он будет создан.</p>

<p>Я выбрал вариант с поддержкой MySQL:</p>

<pre><code># apt-get install pure-ftpd-common pure-ftpd-mysql
</code></pre>

<h3>Настройка PureFTPd</h3>

<p>Одной из особеннойстей PureFTPd является то, что каждый параметр конфигурации хранится в отдельном файле. И каждый файл имеет имя параметра, а в самом файле хранятся значения этих параметров. Файлы эти расположены в директории:</p>

<pre><code>/etc/pure-ftpd/conf
</code></pre>

<p>Рассмотрим наиболее интересные файлы конфигурации предоставленные нам мейнтейнерами по умолчанию.</p>

<p>Указан файл для логов трансфера, в формате Apache:</p>

<pre><code># cat /etc/pure-ftpd/conf/AltLog
clf:/var/log/pure-ftpd/transfer.log
</code></pre>

<p>Указан файл конфигурации для MySQL:</p>

<pre><code># cat /etc/pure-ftpd/conf/MySQLConfigFile
/etc/pure-ftpd/db/mysql.conf
</code></pre>

<p>Анонимным пользователям доступ запрещен:</p>

<pre><code># cat /etc/pure-ftpd/conf/NoAnonymous
yes
</code></pre>

<p>Теперь необходимо дополнить конфигурацию. Для начала запретим UNIX-аутентификацию:</p>

<pre><code># echo no &gt; /etc/pure-ftpd/conf/UnixAuthentication
</code></pre>

<p>Затем запретим PAM-аутентификацию:</p>

<pre><code># echo no &gt; /etc/pure-ftpd/conf/PAMAuthentication
</code></pre>

<p>Ограничим пользоватей их домашним каталогом:</p>

<pre><code># echo "yes" &gt; /etc/pure-ftpd/conf/ChrootEveryone
</code></pre>

<p>Укажем диапазон портов для пассивных соединений:</p>

<pre><code># echo "40110 40210" &gt; /etc/pure-ftpd/conf/PassivePortRange
</code></pre>

<p>Не забудьте потом открыть необходимые порты в брандмауэре.</p>

<p>По <a href="http://nixway.org/pureftpd-config-params/index.html">ссылке</a> доступна таблица со всеми возможными параметрами которые я нашел.</p>

<h3>Установка веб-интерфейса PureFTP WebUI.</h3>

<p>Есть два веб-интерфейса, которые я нашел. Это <a href="https://pure-ftpd-webui.org">PureFTPd WebUI</a> и <a href="http://machiel.generaal.net/index.php?subject=user_manager_pureftpd">User Manager</a>. Для себя я выбрал PureFTPd WebUI. Ну-с, приступим к установке.</p>

<p>Переходим в директорию файлов веб-сервера:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># cd /var/www/sitename</span></code></pre></td></tr></table></div></figure>


<p>Где <code>sitename</code> - директория веб-сервера с уже настроенным сайтом.</p>

<p>Скачаем файлы веб-интерфейса с гитхаба:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ git clone https://github.com/mazay/pure-ftpd-webui.git</span></code></pre></td></tr></table></div></figure>


<p>Переходим в скачаный каталог <code>pure-ftpd-webui</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># cd pure-ftpd-webui</span></code></pre></td></tr></table></div></figure>


<p>В одном из файлов я нашел ошибку в функции <code>create_table_settings()</code>. Неверно указано значение параметра <code>pureftpd_init_script_path</code> и отсутствует параметр <code>pureftpwho_path</code>. Надо заменить строку:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>('pureftpd_init_script_path','/etc/init.d/pure-ftpd');";</span></code></pre></td></tr></table></div></figure>


<p>На</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>('pureftpd_init_script_path','/etc/init.d/pure-ftpd-mysql'),
</span><span class='line'>('pureftpwho_path','/usr/sbin/pure-ftpwho');";</span></code></pre></td></tr></table></div></figure>


<p>Для нормального доступа у вас уже должен быть настроен веб-сервер. После того как откроете страницу <code>http://sitename/pure-ftpd-webui</code>, вам будет доступна страница настройки:</p>

<p><img src="http://nixway.org/images/posts/2016-11-15/pureftpd-webui-install-page.png" alt="Страница настройки PureFTPd" /></p>

<p>Где <code>sitename</code> - доменное имя сервера или его IP-адрес.</p>

<p>После того как вы нажмете кнопку <kbd>Install</kbd> вы попадете на страницу настройки подключения к СУБД MySQL:</p>

<p><img src="http://nixway.org/images/posts/2016-11-15/pureftpd-webui-install-preferences-1.png" alt="Настройки подключения PureFTPd к MySQL" /></p>

<p>На следующем шаге, вам предложат указать параметры пользователя для подключения к веб-интерфейсу:</p>

<p><img src="http://nixway.org/images/posts/2016-11-15/pureftpd-webui-install-preferences-2.png" alt="Настройки подключения PureFTPd к MySQL" /></p>

<p>После завершения настройки, вам будет доступен интерфейс для управления PureFTPd:</p>

<p><img src="http://nixway.org/images/posts/2016-11-15/pureftpd-webui-config-page.png" alt="Настройки подключения PureFTPd к MySQL" /></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Установка и настройка phpPgAdmin]]></title>
    <link href="http://nixway.org/2016/11/09/ustanovka-i-nastoika-phppgadmin/"/>
    <updated>2016-11-09T13:17:09+06:00</updated>
    <id>http://nixway.org/2016/11/09/ustanovka-i-nastoika-phppgadmin</id>
    <content type="html"><![CDATA[<p><img src="http://nixway.org/images/posts/2016-11-09/phpPgAdmin.png" alt="Установка и настройка phpPgAdmin" /></p>

<p>Искал альтернативу <a href="https://www.pgadmin.org/">pgAdmin3</a> поддерживающую работу через веб-интерфейс и наткнулся phpPgAdmin. На мой взгляд очень удобный иструмент для работы с PostgreSQL. Хотя и отстает в функционале от pgAdmin3, но мне вполне хватает. Так же для меня важно, что phpPgAdmin достаточно установить и настроить один раз. В качестве веб-сервера используется Apache 2.4.</p>

<!--more-->


<p>Процесс установки phpPgAdmin, для Debian и других ОС основанных на нем будет выглядеть так:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># apt-get install phppgadmin</span></code></pre></td></tr></table></div></figure>


<p>В случае CentOS должен быть установлен репозиторий <a href="https://fedoraproject.org/wiki/EPEL">EPEL</a>, а команда на установку будет выглядеть так:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># yum -y install phpPgAdmin</span></code></pre></td></tr></table></div></figure>


<p>И всё бы было замечательно, но конфигурация в пакете для Apache 2.2, а у меня Apache 2.4. Потому надо подправить конфигурационный файл.</p>

<p>Конфигурационный файл в Debian:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>/etc/apache2/conf-available/phppgadmin.conf</span></code></pre></td></tr></table></div></figure>


<p>Конфигурационный файл в CentOS:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>/etc/httpd/conf.d/phpPgAdmin.conf</span></code></pre></td></tr></table></div></figure>


<p>К следующему виду:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Alias /phppgadmin /usr/share/phppgadmin
</span><span class='line'>
</span><span class='line'>&lt;Directory /usr/share/phppgadmin&gt;
</span><span class='line'>
</span><span class='line'>DirectoryIndex index.php
</span><span class='line'>AllowOverride None
</span><span class='line'>
</span><span class='line'># Only allow connections from localhost:
</span><span class='line'>Require ip 192.168.1
</span><span class='line'>#Require all granted
</span><span class='line'>
</span><span class='line'>&lt;IfModule mod_php5.c&gt;
</span><span class='line'>  php_flag magic_quotes_gpc Off
</span><span class='line'>  php_flag track_vars On
</span><span class='line'>  #php_value include_path .
</span><span class='line'>&lt;/IfModule&gt;
</span><span class='line'>&lt;IfModule !mod_php5.c&gt;
</span><span class='line'>  &lt;IfModule mod_actions.c&gt;
</span><span class='line'>    &lt;IfModule mod_cgi.c&gt;
</span><span class='line'>      AddType application/x-httpd-php .php
</span><span class='line'>      Action application/x-httpd-php /cgi-bin/php
</span><span class='line'>    &lt;/IfModule&gt;
</span><span class='line'>    &lt;IfModule mod_cgid.c&gt;
</span><span class='line'>      AddType application/x-httpd-php .php
</span><span class='line'>      Action application/x-httpd-php /cgi-bin/php
</span><span class='line'>    &lt;/IfModule&gt;
</span><span class='line'>  &lt;/IfModule&gt;
</span><span class='line'>&lt;/IfModule&gt;
</span><span class='line'>
</span><span class='line'>&lt;/Directory&gt;</span></code></pre></td></tr></table></div></figure>


<p>В параметре <code>Require</code> мы задаем правила доступа к phpPgAdmin. В вышеуказанном примере, доступ разрешается по маске <code>192.168.1</code>, остальные доступа не имеют. Потому, если вы планируете подключатся например из дома, то закомментируйте строку <code>Require ip 192.168.1</code> и раскомментируйте строку <code>Require all granted</code>, это позволит открывать страницу phpPgAdmin с любого IP-адреса. Но, если вы разрешили подключение из-за пределов вашей локальной сети, стоит включить обязательную проверку пароля в PostgreSQL.</p>

<p>Ну и напоследок следует отключить дополнительную защиту при авторизации. Для этого нужно в конфигурационном файле phpPgAdmin в параметре <code>$conf['extra_login_security']</code> выставить значение <code>false</code>.</p>

<p>Конфигурационный файл phpPgAdmin в Debian:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>/etc/phppgadmin/config.inc.php</span></code></pre></td></tr></table></div></figure>


<p>Конфигурационный файл phpPgAdmin в CentOS:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>/etc/phpPgAdmin/config.inc.php</span></code></pre></td></tr></table></div></figure>


<p>Если вы настроили все правильно, то по IP-адресу или доменному имени (если вы <a href="http://nixway.org/2015/05/01/ustanovka-i-nastroika-bind9-na-debian-jessie/">настроили</a> его) сервера вам будет доступен веб-интерфейс phpPgAdmin:</p>

<p><img src="http://nixway.org/images/posts/2016-11-09/phppgadmin_index_page.png" alt="phpPgAdmin index page" /></p>

<p>На главной странице, вы можете выбрать подходящий язык интерфейса и тему оформления.</p>

<p><span style="color:#cd0021;"><strong>ПРИМЕЧАНИЕ!</strong></span> Недавно вышел pgAdmin4, в котором реализовали поддержку веб-интерфейса. Постараюсь на</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Установка и настройка Octopress 2.0 с помощью RVM]]></title>
    <link href="http://nixway.org/2016/08/23/ustanovka-i-nastroika-octopress-2.0-s-pomocshyu-rvm/"/>
    <updated>2016-08-23T16:23:31+06:00</updated>
    <id>http://nixway.org/2016/08/23/ustanovka-i-nastroika-octopress-2.0-s-pomocshyu-rvm</id>
    <content type="html"><![CDATA[<p><img src="http://nixway.org/images/posts/2016-08-23/octopress-install-and-configuring.png" alt="Octopress Install" /></p>

<p>По просьбе знакомого выкладываю инструкцию по установке и настройке <a href="http://octopress.org/">Octopress</a>. Octopress - это простой и удобный генератор статичных сайтов. Он поддерживает выгрузку на <a href="https://ru.wikipedia.org/wiki/GitHub">GitHub</a>, <a href="https://ru.wikipedia.org/wiki/Bitbucket">Bitbucket</a>, <a href="https://ru.wikipedia.org/wiki/Heroku">Heroku</a> или на ваш сервер с помощью <a href="https://ru.wikipedia.org/wiki/Rsync">Rsync</a>.</p>

<!-- more -->


<h3>Формирование рабочей среды для Octopress. <a name="ruby"></a></h3>

<p>В документации на официальном сайте указано, что для корректной работы Octopress требуется Ruby версии 1.9.3. Но у абсолютного большинства, в репозиториях предлагается версия от 2.1 и выше. В той же документации для того, чтобы установить версию&nbsp;1.9.3 предлагается использовать <a href="http://octopress.org/docs/setup/rbenv/">rbenv</a> или <a href="http://octopress.org/docs/setup/rvm">RVM</a>. Для себя я выбрал RVM <em>(Ruby Version Manager)</em>. На его примере мы и рассмотрим установку Octopress.</p>

<p>Для начала установим в систему необходимые пакеты:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># apt-get install nodejs git curl</span></code></pre></td></tr></table></div></figure>


<p><span style="color:#cd0021;"><strong>ПРИМЕЧАНИЕ!</strong></span> Для наглядности, перед каждой командой будет указан определенный символ, если это <code>#</code> - значит команда выполняется от имени суперпользователя <strong>root</strong>, если символ <code>$</code> - то команда выполняется от имени текущего пользователя.</p>

<p>После чего установим RVM:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ curl -L https://get.rvm.io | bash -s stable</span></code></pre></td></tr></table></div></figure>


<p>Подскажем системе, где искать RVM:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ source "$HOME/.rvm/scripts/rvm"</span></code></pre></td></tr></table></div></figure>


<p>Чтобы в дальнейшем каждый раз не указывать путь до каталога с RVM, добавим путь до него в <em>.bashrc:</em></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"' &gt;&gt; ~/.bashrc</span></code></pre></td></tr></table></div></figure>


<p>Установим необходимую версию Ruby:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rvm install 1.9.3</span></code></pre></td></tr></table></div></figure>


<p>Перезапускаем RVM, и выбираем версию 1.9.3. С помощью ключа <code>--default</code> мы указываем, что будем использовать эту версию по умолчанию:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rvm reload
</span><span class='line'>RVM reloaded!
</span><span class='line'>$ rvm use --default 1.9.3
</span><span class='line'>Using /home/nihi1ist/.rvm/gems/ruby-1.9.3-p551</span></code></pre></td></tr></table></div></figure>


<p>Смотрим какая версия Ruby используется в данный момент:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ ruby -v
</span><span class='line'>Using /home/nihi1ist/.rvm/gems/ruby-1.9.3-p551</span></code></pre></td></tr></table></div></figure>


<p>Отлично! Нужная версия Ruby установна и готова к использованию. Можно приступить к установке Octopress. Скачиваем с GitHub необходимые файлы:</p>

<p><span style="color:#cd0021;"><strong>ПРИМЕЧАНИЕ!</strong></span> Установщик может в процессе установки может затребовать пароль, для того чтобы установить в систему необходимые зависимости.</p>

<h3>Установка Octopress.</h3>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ git clone git://github.com/imathis/octopress.git octopress
</span><span class='line'>$ cd octopress</span></code></pre></td></tr></table></div></figure>


<p>Установим gem с названием <strong>bundler</strong>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ gem install bundler</span></code></pre></td></tr></table></div></figure>


<p>Вышеупомянутый gem позволит нам установить другие gem'ы, указанные в файле <em>Gemfile</em>. Запустим команду установки:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ bundle install
</span><span class='line'>Fetching gem metadata from https://rubygems.org/.........
</span><span class='line'>Fetching version metadata from https://rubygems.org/..
</span><span class='line'>Fetching dependency metadata from https://rubygems.org/.
</span><span class='line'>Installing rake 10.4.2
</span><span class='line'>Installing RedCloth 4.2.9 with native extensions
</span><span class='line'>Installing blankslate 2.1.2.4
</span><span class='line'>Installing chunky_png 1.3.5
</span><span class='line'>...
</span><span class='line'>Installing listen 3.0.5
</span><span class='line'>Installing sinatra 1.4.6
</span><span class='line'>Installing jekyll-watch 1.3.0
</span><span class='line'>Installing jekyll 2.5.3
</span><span class='line'>Installing octopress-hooks 2.6.1
</span><span class='line'>Installing octopress-date-format 2.0.2
</span><span class='line'>Bundle complete! 14 Gemfile dependencies, 48 gems now installed.
</span><span class='line'>Use `bundle show [gemname]` to see where a bundled gem is installed.
</span><span class='line'>Post-install message from compass:
</span><span class='line'>    Compass is charityware. If you love it, please donate on our behalf at http://umdf.org/compass Thanks!
</span><span class='line'>Post-install message from haml:
</span><span class='line'>
</span><span class='line'>HEADS UP! Haml 4.0 has many improvements, but also has changes that may break
</span><span class='line'>your application:
</span><span class='line'>
</span><span class='line'>* Support for Ruby 1.8.6 dropped
</span><span class='line'>* Support for Rails 2 dropped
</span><span class='line'>* Sass filter now always outputs &lt;style&gt; tags
</span><span class='line'>* Data attributes are now hyphenated, not underscored
</span><span class='line'>* html2haml utility moved to the html2haml gem
</span><span class='line'>* Textile and Maruku filters moved to the haml-contrib gem
</span><span class='line'>
</span><span class='line'>For more info see:
</span><span class='line'>
</span><span class='line'>http://rubydoc.info/github/haml/haml/file/CHANGELOG.md</span></code></pre></td></tr></table></div></figure>


<p>Выхлоп сокращен.</p>

<p>Установим стандартную тему:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rake install</span></code></pre></td></tr></table></div></figure>


<p>Если вас не устраивает стандартная тема, то вы можете выбрать тему по вкусу <a href="https://github.com/imathis/octopress/wiki/3rd-Party-Octopress-Themes">здесь</a>. Процесс установки альтернативной темы несложен. Переходим в каталог Octopress:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ cd octopress</span></code></pre></td></tr></table></div></figure>


<p>Скачиваем нужную тему:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ git submodule add GIT_URL .themes/THEME_NAME</span></code></pre></td></tr></table></div></figure>


<p>Где <code>GIT_URL</code> - имя репозитория темы, а <code>THEME_NAME</code> - имя темы. Теперь тема доступна для установки:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rake install['THEME_NAME']</span></code></pre></td></tr></table></div></figure>


<p>После чего заново генерируем сайт:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rake generate</span></code></pre></td></tr></table></div></figure>


<h3>Подготовка к развертыванию сайта на базе GitHub.</h3>

<p>В качестве платформы для сайта я решил выбрать GitHub, тому есть два аргумента, которые оказались лично для меня важными:<br/>
- бесплатный,<br/>
- поддерживает <code>CNAME</code>*</p>

<p>* Поддежка <code>CNAME</code> позволяет прикреплять произвольный домен к репозиторию.</p>

<p>Описывать <a href="https://github.com/join?source=header-home">регистрацию</a> на GitHub я не буду. Но опишу процесс создания репозитория. После того как вы зарегистрируетесь, создайте репозиторий (рис. 1):</p>

<p><a name="img1"></a><img src="http://nixway.org/images/posts/2016-08-23/octopress-github-repository-create.png" alt="Create GitHub repository" />
<strong><em><center>Рисунок 1.</center></em></strong></p>

<p>Хочу обратить ваше внимание, что имя сайта должно быть идентично имени пользователя.</p>

<p><a name="img2"></a><a href="http://nixway.org/images/posts/2016-08-23/octopress-github-repository-create-options.png"><img src="http://nixway.org/images/posts/2016-08-23/octopress-github-repository-create-options-preview.png" alt="GitHub repository options" /></a>
<strong><em><center>Рисунок 2.</center></em></strong></p>

<p>После того как вы создадите репозиторий, система перенаправит вас на страницу с репозиторием. Так как репозиторий пуст, система покажет небольшую инструкцию с вариантами заполнения репозитория. В случае с Octopress, процессом выгрузки управляет специальный скрипт. Потому мы можем переходить к следующему шагу.</p>

<p><a name="img3"></a><a href="http://nixway.org/images/posts/2016-08-23/octopress-github-repository-create-finish.png"><img src="http://nixway.org/images/posts/2016-08-23/octopress-github-repository-create-finish-preview.png" alt="GitHub repository created" /></a>
<strong><em><center>Рисунок 3.</center></em></strong></p>

<p>Для выгрузки в репозиторий используется публичный SSH-ключ. Его можно добавить как в настройках репозитория (рис. 3, рис. 4), так и в настроках профиля. Если вы добавите ключ только для репозитория, он будет использоватся лишь для работы с указанным репозиторием.</p>

<p><a name="img4"></a><a href="http://nixway.org/images/posts/2016-08-23/octopress-github-repository-ssh-key-add.png"><img src="http://nixway.org/images/posts/2016-08-23/octopress-github-repository-ssh-key-add-preview.png" alt="Add SSH-key to repository" /></a>
<strong><em><center>Рисунок 4.</center></em></strong></p>

<p>Если у вас ещё нет публичного SSH-ключа, самое время создать его. Как это сделать, вы можете посмотреть <a href="https://community.nixway.org/viewtopic.php?pid=694">здесь</a>.</p>

<p>Теперь свяжем созданный выше репозиторий с каталогом Octopress. Для этого запустим команду <code>setup_github_pages</code>. В&nbsp;процессе команда запросит адрес репозитория, пример адреса показан на <a href="#img3">рис. 3</a>.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rake setup_github_pages
</span><span class='line'>Enter the read/write url for your repository
</span><span class='line'>(For example, 'git@github.com:your_username/your_username.github.io.git)
</span><span class='line'>           or 'https://github.com/your_username/your_username.github.io')
</span><span class='line'>Repository url: git@github.com:nihi1ist/nihi1ist.github.io.git</span></code></pre></td></tr></table></div></figure>


<p>Если вы все сделали верно, значит у вас настроена выгрузка в ваш репозиторий на GitHub.</p>

<h3>Настройка блога.</h3>

<p>Основные настройки хранятся в файле <em>_config.yml</em>. Сам файл расположен в корневой папке Octopress. Ниже приведу содержимое этого файла с комментариями.</p>

<div class="spoiler">
<input id="spoilerid_1" type="checkbox"><label for="spoilerid_1">
Пример файла конфигурации
</label><div class="spoiler_body">
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># ----------------------- #
</span><span class='line'>#      Main Configs       #
</span><span class='line'># ----------------------- #
</span><span class='line'>
</span><span class='line'>url: http://yoursite.com
</span><span class='line'>title: Название вашего блога
</span><span class='line'>subtitle: Описание вашего блога
</span><span class='line'>author: Ваш Ник/Имя
</span><span class='line'>simple_search: https://www.google.com/search            # Поисковая система блога
</span><span class='line'>description:
</span><span class='line'>
</span><span class='line'># Формат даты по умолчанию "ordinal" (Пример: "July 22nd 2007")
</span><span class='line'># Как настроить формат даты показано на странице 
</span><span class='line'># http://www.ruby-doc.org/core-1.9.2/Time.html#method-i-strftime
</span><span class='line'># Кроме того, %o даст вам порядковый номер дня
</span><span class='line'>date_format: "ordinal"
</span><span class='line'>
</span><span class='line'># RSS / Email (необязательно) ссылки для подписки
</span><span class='line'># (изменится если использовать что нибудь вроде Feedburner)
</span><span class='line'>subscribe_rss: /atom.xml
</span><span class='line'>subscribe_email:
</span><span class='line'># RSS feeds can list your email address if you like
</span><span class='line'>email:
</span><span class='line'>
</span><span class='line'># ----------------------- #
</span><span class='line'>#    Jekyll & Plugins     #
</span><span class='line'># ----------------------- #
</span><span class='line'>
</span><span class='line'># Если вы хотите публиковать контент в подкаталог, например http://site.com/project
</span><span class='line'># тогда установите параметре корня сайта - 'root: /project'
</span><span class='line'>root: /
</span><span class='line'># С помощью параметра ниже можно задать формат пути для статьи
</span><span class='line'># можно так же использовать переменные :category 
</span><span class='line'>permalink: /blog/:year/:month/:day/:title/
</span><span class='line'>source: source
</span><span class='line'>destination: public
</span><span class='line'>plugins: plugins
</span><span class='line'>code_dir: downloads/code
</span><span class='line'>category_dir: blog/categories
</span><span class='line'>markdown: rdiscount
</span><span class='line'>rdiscount:
</span><span class='line'>  extensions:
</span><span class='line'>    - autolink
</span><span class='line'>    - footnotes
</span><span class='line'>    - smart
</span><span class='line'>highlighter: pygments # default python pygments have been replaced by pygments.rb
</span><span class='line'>
</span><span class='line'>paginate: 10                    # Количество сообщений на главной странице
</span><span class='line'>paginate_path: "posts/:num"     # Directory base for pagination URLs eg. /posts/2/
</span><span class='line'>recent_posts: 5                 # Количество сообщений в разделе Recent Posts
</span><span class='line'>excerpt_link: "Read on &rarr;"  # "Continue reading" Текст ссылки 
</span><span class='line'>excerpt_separator: "&lt;!--more--&gt;"# Разделитель для статьи
</span><span class='line'>
</span><span class='line'>titlecase: true                 # Converts page and post titles to titlecase
</span><span class='line'>
</span><span class='line'># Перечислите модули которые вы хотите добавить на боковую панель, в том порядке который вам нужен
</span><span class='line'># Для того чтобы добавить свой asides, создайте файл в директории /source/_includes/custom/asides/
</span><span class='line'># И добавьте их к списку ниже как 'asides/custom_aside_name.html'
</span><span class='line'>default_asides: [asides/recent_posts.html, asides/github.html, asides/delicious.html, asides/pinboard.html, asides/googleplus.html]
</span><span class='line'>
</span><span class='line'># Each layout uses the default asides, but they can have their own asides instead. Simply uncomment the lines below
</span><span class='line'># and add an array with the asides you want to use.
</span><span class='line'># blog_index_asides:
</span><span class='line'># post_asides:
</span><span class='line'># page_asides:</span></code></pre></td></tr></table></div></figure>

</div></div>


<p>Комментарии переведены не до конца. Пользуюсь машинным переводом, но он не всегда может помочь. Со временем перевод конечно же будет закончен. Но если найдутся желающие помочь с переводом, буду рад.</p>

<h3>Создание страниц и сообщений.</h3>

<p>Процедура создания новых сообщений/страниц, достаточна проста. Вы можете указывать имя на кириллице, скрипт автоматически переведет название в транслит и укажет полученное название в имени файла. Если в имени нового сообщения/статьи есть пробелы, необходимо использовать кавычки. Несмотря на то, что в справке это не упоминается.</p>

<p>Новые сообщения создаются в каталоге <code>octopress/source/_posts</code> и имеют формат имени <code>YYYY-MM-DD-post-name.markdown</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rake new_post["Новое сообщение"]
</span><span class='line'>mkdir -p source/_posts
</span><span class='line'>Creating new post: source/_posts/2016-11-02-novoie-soobshchieniie.markdown</span></code></pre></td></tr></table></div></figure>


<p>Созданный файл имеет следующую структуру:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>---
</span><span class='line'>layout: post
</span><span class='line'>title: "Новое сообщение"
</span><span class='line'>date: 2016-11-02 12:58:46 +0600
</span><span class='line'>comments: true
</span><span class='line'>categories:
</span><span class='line'>---</span></code></pre></td></tr></table></div></figure>


<p>Это каркас сообщения. Настройки интуитивно понятны, можно разрешить/запретить комментарии, указать категорию (можно указать несколько категорий), функционал аналогичен функционалу тегов. Для разделения короткого и полного текста используется тег <code>&lt;!-- more --&gt;</code>.</p>

<p>Для новых страниц создается новый каталог с именем создаваемой страницы. К примеру создаем новую страницу:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rake new_page["Новая страниц"]
</span><span class='line'>mkdir -p source/novaia-stranitsa
</span><span class='line'>Creating new page: source/novaia-stranitsa/index.markdown</span></code></pre></td></tr></table></div></figure>


<p>В результате будет создан каталог, а уже в этом каталоге будет создан файл <code>index.markdown</code> со следующим содержимым:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>---
</span><span class='line'>layout: page
</span><span class='line'>title: "Новая страница"
</span><span class='line'>date: 2016-11-02 12:55
</span><span class='line'>comments: true
</span><span class='line'>sharing: true
</span><span class='line'>footer: true
</span><span class='line'>---</span></code></pre></td></tr></table></div></figure>


<p>Для создаваемых страниц я обычно отключаю комментарии, подвал и прочее. Для форматирования текста используется <a href="https://ru.wikipedia.org/wiki/Markdown">markdown</a>.</p>

<h3>Справка по rake.</h3>

<p>В документации Octopress на сайте разработчиков перечислены лишь несколько команд для rake: <code>generate</code>, <code>deploy</code>, <code>new_post</code>, <code>new_page</code> и др. На самом деле у <code>rake</code> для Octopress команд больше, посмотреть их список можно с помощью - <code>rake list</code>, а получить список с описанием команд можно вот так - <code>rake -T</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rake -T
</span><span class='line'>rake clean                     # Очищает кэши: .pygments-cache, .gist-cache, .sass-cache
</span><span class='line'>rake copydot[source,dest]      # Копирует dot-файлы для развертывания
</span><span class='line'>rake deploy                    # Развертывает сгенерированный сайт на вашу платформу
</span><span class='line'>rake gen_deploy                # Генерирует и развертывает сайт
</span><span class='line'>rake generate                  # Генерирует сайт
</span><span class='line'>rake install[theme_name]       # Устанавливает тему для сайта
</span><span class='line'>rake integrate                 # Перемещает все посты, помещенные в stash командой isolate, обратно в
</span><span class='line'>                               # posts-директорию, сайт при этом готов к генерации 
</span><span class='line'>rake isolate[filename]         # Перемещает все посты, кроме того, над которым сейчас ведется работа,
</span><span class='line'>                               # во временную директорию stash, что приводит к существенному ускорению
</span><span class='line'>                               # генерации сайта
</span><span class='line'>rake list                      # Показывает список доступных задач
</span><span class='line'>rake new_page[filename]        # Создает новую страницу сайта в source/[filename]/index.markdown
</span><span class='line'>rake new_post[title]           # Создает новый пост для сайта в source/_posts
</span><span class='line'>rake preview                   # Предпросмотр сайта в браузере на локальной машине
</span><span class='line'>rake push                      # Развертывает public-директорию через Git
</span><span class='line'>rake rsync                     # Развертывает сайт через Rsync
</span><span class='line'>rake set_root_dir[dir]         # Обновляет настройки для поддержки публикации в root или вложенную директорию
</span><span class='line'>rake setup_github_pages[repo]  # Настраивает директорию _deploy и развертывает ветвь в Github Pages
</span><span class='line'>rake update_source[theme]      # Перемещает source в source.old, устанавливает source theme updates,
</span><span class='line'>                               # замещает source/_includes/navigation.html навигацией из source.old
</span><span class='line'>rake update_style[theme]       # Перемещает sass в sass.old, устанавливает sass theme updates, заменяет
</span><span class='line'>                               # sass/custom файлом sass.old/custom
</span><span class='line'>rake watch                     # Предпросмотр сайта и автоматическая генерация при изменении файлов
</span><span class='line'>                               # (не работает, хотя может я неправильно использую...)</span></code></pre></td></tr></table></div></figure>


<p>Перевел в меру своих сил, если встретите неточность, пишите в комментариях.</p>

<h3>Локализация на русский язык</h3>

<p>К сожалению, Octopress не имеет локализации на русском языке. Но этот недостаток легко можно исправить вручную. Я ищу текст который нужно перевести с помощью команды <code>grep</code>.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ grep -irl "comments" source</span></code></pre></td></tr></table></div></figure>


<p>Где <code>comments</code> - слово которое надо перевести, а <code>source</code> - каталог поиска.
Поиск должен проводиться в каталоге с файлами Octopress. Вы так же можете
переделать саму тему. И при последующей установке темы у вас уже будет сайт на
русском языке.</p>

<p>Для локализации дат, надо заменить содержимое файла:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>octopress/plugin/date.rb</span></code></pre></td></tr></table></div></figure>


<p>на <a href="http://nixway.org/files/date.rb.txt">это</a>. А содержимое файла:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>octopress/source/_includes/post/date.html</span></code></pre></td></tr></table></div></figure>


<p>на <a href="http://nixway.org/files/date.html.txt">это</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Резервное копирование баз данных PostgreSQL]]></title>
    <link href="http://nixway.org/2015/12/06/postgresql-backup-script/"/>
    <updated>2015-12-06T17:07:29+06:00</updated>
    <id>http://nixway.org/2015/12/06/postgresql-backup-script</id>
    <content type="html"><![CDATA[<p><img src="http://nixway.org/images/posts/2015-12-06/postgresql-backup.png" alt="Резервное копирование баз данных PostgreSQL" /></p>

<p>Перед всеми системными администраторами возникает задача резервного копирования баз данных (<em>БД</em>). Поэтому хочу поделится с вами скриптом для резервного копирования БД&nbsp;PostgreSQL. И его довольно просто переделать для любой другой СУБД. Данный скрипт неплохо подойдет новичкам. На нашем <a href="https://community.nixway.org/viewtopic.php?id=78">форуме</a> есть вариант скрипта для резерного копирования БД&nbsp;MySQL.</p>

<!-- more -->




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>#!/bin/bash
</span><span class='line'>
</span><span class='line'>HOST="hostname"                         # Имя хоста на котором будем выполнять скрипт, можно и не использовать
</span><span class='line'>DUMPER="/usr/bin/pg_dump"               # Указываем утилиту резервного копирования (дампа).
</span><span class='line'>#DUMPPARAM1="-Q -c -e"                  # -Q оборачивает имена обратными кавычками,
</span><span class='line'>                                        # -c делает полную вставку, включая имена колонок,
</span><span class='line'>                                        # -e делает расширенную вставку.
</span><span class='line'>                                        # Итоговый файл получается меньше и создается он чуть быстрее.
</span><span class='line'>
</span><span class='line'>#DBUSER="dbuser"                        # Внутренний пользователь сервера БД от имени которого будет выполнятся бэкап
</span><span class='line'>#DBPASS="passwd"                        # Пароль внутреннего пользователя mysql
</span><span class='line'>DBNAME="dbname"                         # Имя БД с которой будет создана резервная копия
</span><span class='line'>DATE=`date +%F_%H.%M`                   # Задаем дату и время бекапа
</span><span class='line'>FIND="/usr/bin/find"                    # Указываем утилиту для поиска
</span><span class='line'>FINDPARAM1="-type f -ctime +7"          # Где +7 - архивы старше семи дней
</span><span class='line'>FINDPARAM2="-delete"                    # Параметры удаления
</span><span class='line'>BACKUPDIR="/var/backups/psql/"          # Директория, где будут хранится резервные копии
</span><span class='line'>
</span><span class='line'># Дамп БД, где DBUSER - имя пользователя, DBNAME - имя базы данных, архив имеет следующий формат.
</span><span class='line'># Имя базы данных, имя хоста, дата и время, расширение gz: $DBNAME-2016-02-29_14.30.sql.gz
</span><span class='line'>$DUMPER $DBNAME | gzip &gt; $BACKUPDIR$DBNAME.$HOST-$DATE.sql.gz
</span><span class='line'>
</span><span class='line'># Пауза
</span><span class='line'>sleep 3
</span><span class='line'>
</span><span class='line'># Удаляем старые архивы, а точней файлы старше 7 дней, так же удаляем  пустые каталоги.
</span><span class='line'>eval $FIND $BACKUPDIR $FINDPARAM1 $FINDPARAM2
</span><span class='line'>
</span><span class='line'>exit 0</span></code></pre></td></tr></table></div></figure>


<p>Хочу напомнить, что данный скрипт нужно выполнять от имени пользователя <strong>postgres</strong>. Неиспользуемые переменные закомментированы, при желании можно их удалить.</p>

<p>Восстановить дамп можно командой:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ gunzip &lt; /var/backups/psql/archname.sql.gz | psql dbname</span></code></pre></td></tr></table></div></figure>


<p>Где <code>archname</code> - имя резервной копии (дампа), а <code>dbname</code> - имя существующей БД в PostgreSQL. Если хотите восстановить дамп в новую БД, то создать ее можно командой:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ createdb dbname</span></code></pre></td></tr></table></div></figure>


<p>Опять же, команду необходимо выполнять от имени <strong>postgres</strong>.</p>

<p>Теперь осталось настроить время запуска скрипта. В этом нам поможет <a href="https://ru.wikipedia.org/wiki/Cron">cron</a>. Мне необходимо чтобы скрипт запускался:<br/>
-&nbsp;ежедневно в 22:30, с понедельника по пятницу,<br/>
-&nbsp;ежемесячно в 23:30, в первую субботу месяца.</p>

<p>Кроме того, ежедневные и ежемесячные копии должны хранится отдельно. Соответственно нам потребуются две копии скрипта, в каждной укажем необходимый путь для резерных копий:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>/var/backups/psql/dayli
</span><span class='line'>/var/backups/psql/monthly</span></code></pre></td></tr></table></div></figure>


<p>С помощью команды <code>crontab</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># crontab -e</span></code></pre></td></tr></table></div></figure>


<p>Добавим в список заданий пару строк в самый конец файла:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>30 22 * * 1-5 postgres /path/psql_dayli-backup.sh                                  # Ежедневно, с пн. по пт.
</span><span class='line'>30 23 1-7 * [ "$(date '+\%u')" -eq 6 ] && /path/psql_monthly-backup.sh postgres    # Ежемесячно, в первую сб.</span></code></pre></td></tr></table></div></figure>


<p>Где <code>postgres</code> - пользователь, от имени которого будет запускаться скрипт, <code>path</code> - путь до каталога со скриптами, а <code>psql_dayli-backup.sh</code> и <code>psql_monthly-backup.sh</code> - имена файлов со скриптом.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Оптимизация PostgreSQL под сервер 1С:Предприятия]]></title>
    <link href="http://nixway.org/2015/12/06/optimizacija-postgresql-pod-server-1c-predpriyatiya/"/>
    <updated>2015-12-06T13:31:30+06:00</updated>
    <id>http://nixway.org/2015/12/06/optimizacija-postgresql-pod-server-1c-predpriyatiya</id>
    <content type="html"><![CDATA[<p><img src="http://nixway.org/images/posts/2015-12-06/postgresql_for_1c.png" alt="Оптимизация PostgreSQL под сервер 1С:Предприятие" /></p>

<p>На данный момент производительность PostgreSQL в связке с сервером 1С:Предприятия в сравнении с тем же MS&nbsp;SQL оставляет желать лучшего. Эта статья продолжение попыток добиться достойной производительности на PostgreSQL. Хотя на данный момент у меня не получилось добиться производительности сопоставимой MS&nbsp;SQL, но думаю в недалеком будущем эта проблема будет решена.</p>

<p>Далее в статье перечислены основные параметы и особенности, на  которые следует обратить внимание при оптимизации PostgreSQL.</p>

<!-- more -->


<h2><span style="color:#cd0021;">Основные параметры PostgreSQL.</span></h2>

<h3>shared_buffers</h3>

<p>Объём совместно используемой памяти, выделяемой PostgreSQL для кэширования данных, определяется числом страниц <code>shared_buffers</code> по 8 килобайт каждая. Следует учитывать, что операционная система сама кэширует данные, поэтому нет необходимости отводить под кэш всю наличную оперативную память. Размер <code>shared_buffers</code> зависит от многих факторов, для начала можно принять следующие значения:</p>

<ul>
<li><strong>8–16&nbsp;Мб</strong>&nbsp;–&nbsp;Обычный настольный компьютер с 512&nbsp;Мб и небольшой базой данных,</li>
<li><strong>80–160&nbsp;Мб</strong>&nbsp;–&nbsp;Небольшой сервер, предназначенный для обслуживания базы данных с объёмом оперативной памяти 1&nbsp;Гб и базой данных около 10&nbsp;Гб,</li>
<li><strong>400&nbsp;Мб</strong>&nbsp;–&nbsp;Сервер с несколькими процессорами, с объёмом памяти в 8&nbsp;Гб и базой данных занимающей свыше 100&nbsp;Гб обслуживающий несколько сотен активных соединений одновременно.</li>
</ul>


<h3>work_mem</h3>

<p>Под каждый запрос выделяется ограниченный объём памяти. Этот объём используется для сортировки, объединения и других подобных операций. При превышении этого объёма сервер начинает использовать временные файлы на диске, что может существенно снизить производительность. Оценить необходимое значение для <code>work_mem</code> можно разделив объём доступной памяти (физическая память минус объём занятый под другие программы и под совместно используемые страницы <code>shared_buffers</code>) на максимальное число одновременно используемых активных соединений.</p>

<h3>maintenance_work_mem</h3>

<p>Эта память используется для выполнения операций по сбору статистики <code>ANALYZE</code>, сборке мусора <code>VACUUM</code>, создания индексов <code>CREATE INDEX</code> и добавления внешних ключей. Размер памяти выделяемой под эти операции должен быть сравним с физическим размером самого большого индекса на диске.</p>

<h3>effective_cache_size</h3>

<p>PostgreSQL в своих планах опирается на кэширование файлов, осуществляемое операционной системой. Этот параметр соответствует максимальному размеру объекта, который может поместиться в системный кэш. Это значение используется только для оценки. <code>effective_cache_size</code> можно установить в &frac12;&nbsp;- 2/3 от объёма имеющейся в наличии оперативной памяти, если вся она отдана в распоряжение PostgreSQL.</p>

<p><span style="color:#cd0021;"><strong>ВНИМАНИЕ!</strong></span> Следующие параметры могут существенно увеличить производительность работы PostgreSQL. Однако их рекомендуется использовать только если имеются надежные <a href="https://ru.wikipedia.org/wiki/%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%80%D0%B5%D0%B1%D0%BE%D0%B9%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D0%B8%D1%82%D0%B0%D0%BD%D0%B8%D1%8F">ИБП</a> и программное обеспечение, завершающее работу системы при низком заряде батарей.</p>

<h3>fsync</h3>

<p>Данный параметр отвечает за сброс данных из кэша на диск при завершении транзакций. Если установить в этом параметре значение <code>off</code>, то данные не будут записываться на дисковые накопители сразу после завершения операций. Это может существенно повысить скорость операций <code>insert</code> и <code>update</code>, но есть риск повредить базу, если произойдет сбой (неожиданное отключение питания, сбой ОС, сбой дисковой подсистемы).</p>

<p>Отрицательное влияние включенного <code>fsync</code> можно уменьшить отключив его и положившись на надежность вашего оборудования. Или правильно подобрав параметр <code>wal_sync_method</code> - метод, который используется для принудительной записи данных на диск.</p>

<p><strong>Возможные значения:</strong></p>

<ul>
<li><strong>open_datasync</strong>&nbsp;–&nbsp;запись данных методом <code>open()</code> с параметром <code>O_DSYNC</code>,</li>
<li><strong>fdatasync</strong>&nbsp;–&nbsp;вызов метода <code>fdatasync()</code> после каждого <code>commit</code>,</li>
<li><strong>fsync_writethrough</strong>&nbsp;–&nbsp;вызывать <code>fsync()</code> после каждого <code>commit</code> игнорирую параллельные процессы,</li>
<li><strong>fsync</strong>&nbsp;–&nbsp;вызов <code>fsync()</code> после каждого <code>commit</code>,</li>
<li><strong>open_sync</strong>&nbsp;–&nbsp;запись данных методом <code>open()</code> с параметром <code>O_SYNC</code>.</li>
</ul>


<p><span style="color:#cd0021;"><strong>ПРИМЕЧАНИЕ!</strong></span> Не все методы доступны на определенных платформах. Выбор метода зависит от операционной системы под управлением, которой работает PostgreSQL.</p>

<p>В состав PostgreSQL входит утилита <strong>pg_test_fsync</strong>, с помощью которой можно определить оптимальное значение параметра <code>wal_sync_method</code>.</p>

<p>Она выполняет серию дисковых тестов с использованием различных методов синхронизации. В результате этого теста получаются оценки производительности дисковой системы, по которым можно определить оптимальный метод синхронизации для данной операционной системы.</p>

<p>Я решил провести вышеуказанный тест на своем рабочем компьютере, имеющем следующие характеристики:</p>

<ul>
<li><strong>CPU:</strong> Intel Core i3-3220 @ 3.30GHz x 2</li>
<li><strong>RAM:</strong> 4GB</li>
<li><strong>HDD:</strong> Seagate ST3320418AS 320GB</li>
</ul>


<p><strong>Тест на Windows:</strong></p>

<ul>
<li><strong>ОС:</strong> Windows 7 Максимальная x64</li>
<li><strong>ФС:</strong> NTFS</li>
<li><strong>СУБД:</strong> PostgreSQL 9.4.2-1.1C x64</li>
</ul>


<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>C:\PROGRA~1\POSTGR~1\9.4.2-1.1C\bin&gt;pg_test_fsync
</span><span class='line'>5 seconds per test
</span><span class='line'>O_DIRECT supported on this platform for open_datasync and open_sync.
</span><span class='line'>
</span><span class='line'>Compare file sync methods using one 8kB write:
</span><span class='line'>(in wal_sync_method preference order, except fdatasync
</span><span class='line'>is Linux's default)
</span><span class='line'>        open_datasync                     48817.440 ops/sec      20 usecs/op
</span><span class='line'>        fdatasync                                       n/a
</span><span class='line'>        fsync                                79.688 ops/sec   12549 usecs/op
</span><span class='line'>        fsync_writethrough                   80.072 ops/sec   12489 usecs/op
</span><span class='line'>        open_sync                                       n/a
</span><span class='line'>
</span><span class='line'>Compare file sync methods using two 8kB writes:
</span><span class='line'>(in wal_sync_method preference order, except fdatasync
</span><span class='line'>is Linux's default)
</span><span class='line'>        open_datasync                     24713.634 ops/sec      40 usecs/op
</span><span class='line'>        fdatasync                                       n/a
</span><span class='line'>        fsync                                78.690 ops/sec   12708 usecs/op
</span><span class='line'>        fsync_writethrough                   79.073 ops/sec   12646 usecs/op
</span><span class='line'>        open_sync                                       n/a
</span><span class='line'>
</span><span class='line'>Compare open_sync with different write sizes:
</span><span class='line'>(This is designed to compare the cost of writing 16kB
</span><span class='line'>in different write open_sync sizes.)
</span><span class='line'>         1 * 16kB open_sync write                       n/a
</span><span class='line'>         2 *  8kB open_sync writes                      n/a
</span><span class='line'>         4 *  4kB open_sync writes                      n/a
</span><span class='line'>         8 *  2kB open_sync writes                      n/a
</span><span class='line'>        16 *  1kB open_sync writes                      n/a
</span><span class='line'>
</span><span class='line'>Test if fsync on non-write file descriptor is honored:
</span><span class='line'>(If the times are similar, fsync() can sync data written
</span><span class='line'>on a different descriptor.)
</span><span class='line'>        write, fsync, close                  76.493 ops/sec   13073 usecs/op
</span><span class='line'>        write, close, fsync                  77.676 ops/sec   12874 usecs/op
</span><span class='line'>
</span><span class='line'>Non-Sync'ed 8kB writes:
</span><span class='line'>        write                              1800.319 ops/sec     555 usecs/op</span></code></pre></td></tr></table></div></figure>


<p>По результатам теста мы видим, что для Windows оптимальным решением будет использование <code>open_datasync</code>.</p>

<p><strong>Тест на Linux:</strong></p>

<ul>
<li><strong>ОС:</strong> Debian 8.6 Jessie</li>
<li><strong>Ядро:</strong> x86_64 Linux 3.16.0-4-amd64</li>
<li><strong>ФС:</strong> ext4</li>
<li><strong>СУБД:</strong> PostgreSQL 9.4.2-1.1C amd64</li>
</ul>


<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>/usr/lib/postgresql/9.4/bin# ./pg_test_fsync
</span><span class='line'>5 seconds per test
</span><span class='line'>O_DIRECT supported on this platform for open_datasync and open_sync.
</span><span class='line'>
</span><span class='line'>Compare file sync methods using one 8kB write:
</span><span class='line'>(in wal_sync_method preference order, except fdatasync
</span><span class='line'>is Linux's default)
</span><span class='line'>        open_datasync                        80.215 ops/sec   12467 usecs/op
</span><span class='line'>        fdatasync                            80.349 ops/sec   12446 usecs/op
</span><span class='line'>        fsync                                39.384 ops/sec   25391 usecs/op
</span><span class='line'>        fsync_writethrough                              n/a
</span><span class='line'>        open_sync                            40.013 ops/sec   24992 usecs/op
</span><span class='line'>
</span><span class='line'>Compare file sync methods using two 8kB writes:
</span><span class='line'>(in wal_sync_method preference order, except fdatasync
</span><span class='line'>is Linux's default)
</span><span class='line'>        open_datasync                        40.033 ops/sec   24980 usecs/op
</span><span class='line'>        fdatasync                            77.264 ops/sec   12943 usecs/op
</span><span class='line'>        fsync                                36.325 ops/sec   27529 usecs/op
</span><span class='line'>        fsync_writethrough                              n/a
</span><span class='line'>        open_sync                            19.659 ops/sec   50866 usecs/op
</span><span class='line'>
</span><span class='line'>Compare open_sync with different write sizes:
</span><span class='line'>(This is designed to compare the cost of writing 16kB
</span><span class='line'>in different write open_sync sizes.)
</span><span class='line'>         1 * 16kB open_sync write            38.697 ops/sec   25842 usecs/op
</span><span class='line'>         2 *  8kB open_sync writes           17.356 ops/sec   57616 usecs/op
</span><span class='line'>         4 *  4kB open_sync writes            8.996 ops/sec  111156 usecs/op
</span><span class='line'>         8 *  2kB open_sync writes            4.552 ops/sec  219686 usecs/op
</span><span class='line'>        16 *  1kB open_sync writes            2.218 ops/sec  450930 usecs/op
</span><span class='line'>
</span><span class='line'>Test if fsync on non-write file descriptor is honored:
</span><span class='line'>(If the times are similar, fsync() can sync data written
</span><span class='line'>on a different descriptor.)
</span><span class='line'>        write, fsync, close                  34.341 ops/sec   29120 usecs/op
</span><span class='line'>        write, close, fsync                  35.753 ops/sec   27970 usecs/op
</span><span class='line'>
</span><span class='line'>Non-Sync'ed 8kB writes:
</span><span class='line'>        write                            484193.516 ops/sec       2 usecs/op</span></code></pre></td></tr></table></div></figure>


<p>По результатам теста мы видим, что наилучшую скорость выдают методы <code>fdatasync</code> и <code>open_datasync</code>. Так же можно заметить, что на же оборудовании Linux выдал скорость записи почти в половину больше, чем на Windows.</p>

<p>Следует учитывать, что в данных тестах использовалась дисковая система, состоящая из одного диска. При использовании RAID массива с большим количеством дисков картина может быть другой.</p>

<h3>wal_buffers</h3>

<p>Количество памяти используемое в <code>SHARED MEMORY</code> для ведения транзакционных логов. При доступной памяти 1-4&nbsp;Гб рекомендуется устанавливать 256-1024&nbsp;Кб. Этот параметр стоит увеличивать в системах с большим количеством модификаций таблиц базы данных.</p>

<h3>checkpoint_segments</h3>

<p>Oпределяет количество сегментов (каждый по 16&nbsp;МБ) лога транзакций между контрольными точками.  Для баз данных с множеством модифицирующих данные транзакций рекомендуется увеличение этого параметра. Критерием достаточности количества сегментов является отсутствие в логе  предупреждений (warning) о том, что контрольные точки происходят слишком часто.</p>

<h3>full_page_writes</h3>

<p>Включение этого параметра гарантирует корректное восстановление, ценой увеличения записываемых данных в журнал транзакций. Отключение этого параметра ускоряет работу, но может привести  к повреждению базы данных в случае системного сбоя или отключения питания.</p>

<h3>synchronous_commit</h3>

<p>Включает/выключает синхронную запись в лог-файлы после каждой транзакции. Включение синхронной записи защищает от возможной потери данных. Но, накладывает ограничение на пропускную способность сервера. Вы можете отключить синхронную запись, если вам необходимо обеспечить более высокую производительность по количеству транзакций. А&nbsp;потенциально низкая возможность потери небольшого количества изменений при крахе системы не критична. Для отключения синхронной записи установите значение <code>off</code> в этом параметре.</p>

<p>Еще одним способом увеличения производительности работы PostgreSQL является перенос журнала транзакций (pg_xlog) на другой диск. Выделение для журнала транзакций  отдельного дискового ресурса позволяет получить получить при этом существенный выигрыш в производительности  10%-12% для нагруженных <a href="https://ru.wikipedia.org/wiki/OLTP">OLTP</a> систем.</p>

<p>В Linux это делается с помощью создания символьной ссылки на новое положение каталога с журналом транзакций.</p>

<p>В Windows можно использовать для этих целей утилиту <strong><a href="https://technet.microsoft.com/en-us/bb896768">Junction</a></strong>. Для этого надо:</p>

<ol>
<li>Остановить PostgreSQL.</li>
<li>Сделать бэкап <code>C:\Program Files\PostgreSQL\X.X.X\data\pg_xlog</code>.</li>
<li>Скопировать <code>C:\Program Files\PostgreSQL\X.X.X\data\pg_xlog</code> в <code>D:\pg_xlog</code> и удалить <code>C:\Program Files\PostgreSQL\X.X.X\data\pg_xlog</code>.</li>
<li>Распаковать программу <strong>Junction</strong> в <code>C:\Program Files\PostgreSQL\X.X.X\data</code>.</li>
<li>Открыть окно <strong>CMD</strong>, перейти в <code>C:\Program Files\PostgreSQL\X.X.X\data</code> и выполнить <code>junction -s pg_xlog D:\pg_xlog</code>.</li>
<li>Установить права на папку <code>D:\pg_xlog</code> пользователю postgres.</li>
<li>Запустить PostgreSQL.<br/>
Где <code>X.X.X</code> - версия используемой PostgreSQL.</li>
</ol>


<h2><span style="color:#cd0021;"> Особенности и ограничения в 1С:Предприятие при работе с PostgreSQL.</span></h2>

<h3>Использование конструкции ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ.</h3>

<p>В СУБД PostgreSQL реализована только частичная поддержка  <code>FULL OUTER JOIN</code> (ERROR: &ldquo;FULL JOIN is only supported with mergejoinable join conditions&rdquo;). Для реализации полной поддержки <code>FULL OUTER JOIN</code> при работе 1С:Предприятия 8 с PostgreSQL подобный запрос трансформируется в другую форму с эквивалентным результатом, однако эффективность использования конструкции <code>ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ</code> снижается.</p>

<p>В связи с этим не рекомендуется использовать <code>ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ</code> при работе с PostgreSQL. В большинстве случаев без использования этой конструкции можно обойтись, переписав исходный запрос.</p>

<h3>Оптимизация использования виртуальной таблицы СрезПоследних при работе с PostgreSQL.</h3>

<p><strong>Проблема:</strong> При работе с PostgreSQL использование соединения с виртуальной таблицей <code>СрезПоследних</code> может приводить к существенному снижению производительности. Из-за ошибки оптимизатора может быть выбран неоптимальный план выполнения запроса.</p>

<p><strong>Решение:</strong> Если в запросе используется соединение с виртуальной таблицей языка запросов 1С:Предприятия <code>СрезПоследних</code> и запрос работает с неудовлетворительной производительностью, то рекомендуется вынести обращение к виртуальной таблице в отдельный запрос с сохранением результатов во временной таблице.</p>

<h3>Решение проблемы с зависанием PostgreSQL.</h3>

<p>При выполнения некоторых регламентных операций (Закрытие месяца, Расчет себестоимости и т.п.), где используются сложные запросы с большим количеством соединений больших таблиц, возможно существенное увеличение времени выполнения операции. В основном, эти проблемы связаны с работой оптимизатора PostgreSQL и отсутствием актуальной статистики по таблицам, участвующим в запросе.</p>

<p><strong>Варианты решения проблемы:</strong></p>

<ul>
<li>Увеличить количество записей, просматриваемых при сборе статистики по таблицам. Большие значения могут повысить время выполнения команды <code>ANALYZE</code>, но улучшат построение плана запроса:

<ul>
<li>Файл <em>postgresql.conf</em> - <code>default_statistics_target = 1000 -10000</code>.</li>
</ul>
</li>
<li>Отключение оптимизатору возможности использования <code>NESTED LOOP</code> при выборе плана выполнения запроса в конфигурации PostgreSQL:

<ul>
<li>Файл <em>postgresql.conf</em> - <code>enable_nestloop = off</code>.</li>
<li>Отрицательным эффектом этого способа является возможное замедление некоторых запросов, поскольку при их выполении будут использоваться другие, более затратные, методы соединения (<code>HASH JOIN</code>).</li>
</ul>
</li>
<li>Отключение оптимизатору возможности изменения порядка соединений таблиц в запросе:

<ul>
<li>Файл <em>postgresql.conf</em> - <code>join_collapse_limit=1</code>.</li>
<li>Следует использовать этот метод, если вы уверены в правильности порядка соединений таблиц в проблемном запросе.</li>
</ul>
</li>
<li>Изменение параметров настройки оптимизатора:

<ul>
<li>Файл <em>postgresql.conf:</em>

<ul>
<li><code>seq_page_cost = 0.1</code></li>
<li><code>random_page_cost = 0.4</code></li>
<li><code>cpu_operator_cost = 0.00025</code></li>
</ul>
</li>
</ul>
</li>
<li>Использование версии PostgreSQL 9.1.2-1.1.C и выше, в которой реализован независимый от <code>AUTOVACUUM</code> сбор статистики, на основе информации об изменении данных в таблице. По умолчанию включен сбор статистики только для временных таблиц и во многих ситуациях этого достаточно. При возникновении проблем с производительностью выполнения регламентных операций, можно включить сбор статистики для всех  или отдельных проблемных таблиц изменив значение параметра конфигурации PostgreSQL (файл <em>postgresql.conf</em>) <code>online_analyze.table_type = "temporary"</code>  на <code>online_analyze.table_type = "all"</code>.</li>
</ul>


<p>После изменения этих параметров, следует оценить возможное влияние этих изменений на работу системы и выбрать наиболее приемлимый вариант для ваших задач.</p>

<h2><span style="color:#cd0021;">Послесловие.</span></h2>

<p>Ко всему вышеперечисленному можно так же добавить:</p>

<ul>
<li>Необходимость использования <a href="http://v8.1c.ru/overview/Term_000000642.htm">управляемых блокировок</a> при разработке прикладного решения. Если же у вас типовая конфигурация, то по возможности ее так же необходимо переводить на управляемые блокировки.</li>
<li>Рекомендацию реализовать для PostgreSQL кэширование на <a href="https://ru.wikipedia.org/wiki/SSD">SSD-накопитель</a>. Сделать это можно с помощью <a href="https://ru.wikipedia.org/wiki/Flashcache">Flashcache</a> или <a href="https://en.wikipedia.org/wiki/Bcache">Bcache</a>. Подробнее вопрос организации системы кэширования я рассмотрю в другой статье.</li>
<li>Довольно удобный <a href="http://pgtune.leopard.in.ua/">веб-сервис</a> для начальной настройки PostgreSQL. Его <a href="http://nixway.org/how-to/1c-predpriyatie-8-3+postgresql-na-baze-debian-8-jessie/#comment-2612892713">порекомендовал</a> мне товарищ Vasiliy P. Melnik. Несмотря на то, что интерфейс на английском, он простой и интуитивно понятный. Думаю каждый желающий сможет с ним разобраться.</li>
</ul>


<p><em>Статья обновлена 8 октября 2016 года. Добавлены сравнительные тесты</em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[1С:Предприятие 8.3 + PostgreSQL 9.4 на базе Debian&nbsp;8&nbsp;&laquo;Jessie&raquo;]]></title>
    <link href="http://nixway.org/2015/11/10/1c-predpriyatie-8-3+postgresql-na-baze-debian-8-jessie/"/>
    <updated>2015-11-10T16:33:46+06:00</updated>
    <id>http://nixway.org/2015/11/10/1c-predpriyatie-8-3+postgresql-na-baze-debian-8-jessie</id>
    <content type="html"><![CDATA[<p><img src="http://nixway.org/images/posts/2015-11-10/debian+1c+postgresql.png" alt="Debian + 1C + PostgreSQL" /></p>

<p>В конце мая 2013 года компания 1С представила первый стабильный релиз платформы 1С:Предприятие версии&nbsp;8.3. Главная особенность ветки&nbsp;8.3 - это выпуск нативного клиента под *nix-подобные операционные системы. И вот спустя два года я решил написать новую статью посвященную этой теме. Я помню, что большая часть тех, кому была интересна моя <a href="https://linuxforum.tech/viewtopic.php?id=11116">прошлая статья</a> просили и дальше брать в основу Ubuntu. Тем не менее, я решил взять за основу Debian&nbsp;8&nbsp;&laquo;Jessie&raquo;. Основная причина в том, что производительность серверов 1С:Предприятие на Ubuntu оставляет желать лучшего. В то время как Debian и CentOS показывают более высокую производительность <span style="color:gray;font-style:italic">(CentOS даже опережает Debian, но я постараюсь исправить это положение)</span>. Сравнительные таблицы производительности серверов 1С:Предприятие вы можете поискать в интернете. Сам я пока ничего толкового не нашел.</p>

<!--more-->


<h2>Содержание<a name="content"></a></h2>

<ol>
<li><a href="#introduction">Предисловие.</a></li>
<li><a href="#lead-up">Подготовка сервера.</a></li>
<li><a href="#postgre">Установка PostgreSQL 9.4.</a></li>
<li><a href="#server">Установка сервера 1С:Предприятие 8.3.</a></li>
<li><a href="#hasp">Установка драйвера для аппаратной лицензии 1С (HASP).</a></li>
<li><a href="#client">Установка клиента 1С:Предприятие 8.3.</a></li>
<li><a href="#apache24">Публикация ИБ на веб-сервере Apache 2.4.</a></li>
<li><a href="#afterword">Послесловие.</a></li>
</ol>


<h2>Предисловие.<a name="introduction"></a> <a href="#content" title="К содержанию">↑</a></h2>

<p>Новичкам в *nix рекомендую выполнять установку по порядку и согласно инструкции. Статья специально разбита на главы, чтобы читатели могли пошагово проходить процесс установки. Вопросы любителей сделать &laquo;по своему&raquo; в большинстве своем будут проигнорированы. Если же вы всё делали согласно статье, но тем не менее у вас возникла проблема, внимательно проверьте все свои действия. Скорее всего, вы допустили ошибку. В случае если проверка не выявила ошибок, то вы можете описать возникую проблему в комментариях или в <a href="https://community.nixway.org/viewtopic.php?id=55">теме</a> на нашем форуме, где форумчане постараются вам помочь. При этом рекомендую подробно описывать возникшую у вас проблему.</p>

<h2>Подготовка сервера.<a name="lead-up"></a> <a href="#content" title="К содержанию">↑</a></h2>

<p>Основное отличие Debian от Ubuntu с которым очень часто сталкиваются пользователи Ubuntu, это отсутствие в стандартной конфигурации команды повышения привилегий <code>sudo</code>. Операции требующие прав <strong>root</strong>, выполняются от суперпользователя <strong>root</strong>. Тем же кто не хочет изменять своей привычке работать с <code>sudo</code>, достаточно при установке ОС не задавать пароль суперпользователю <strong>root</strong> и пакет <strong><em>sudo</em></strong> будет установлен и настроен. Для наглядности, перед каждой командой будет указан определенный символ, если это <code>#</code> - значит команда выполняется от имени суперпользователя <strong>root</strong>, если символ <code>$</code> - то команда выполняется от имени текущего пользователя.</p>

<p>1. Итак у вас имеется установленный Debian 8. Если установка только предстоит, рекомендую выбрать пункты:</p>

<ul>
<li>Сервер SSH</li>
<li>Стандартные системные утилиты</li>
</ul>


<p>Как это указано на скриншоте:</p>

<p><a href="http://nixway.org/images/posts/2015-11-10/debian_preinstall_options.png"><img src="http://nixway.org/images/posts/2015-11-10/debian_preinstall_options_preview.png" alt="Компоненты сервера" /></a></p>

<p>Остальные пункты на ваше усмотрение.</p>

<p>2. Сразу же поставим последние обновления, предварительно получив права <strong>root</strong>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ su
</span><span class='line'># apt-get update
</span><span class='line'># apt-get upgrade
</span><span class='line'># apt-get dist-upgrade</span></code></pre></td></tr></table></div></figure>


<p>3. Архивы с установочными пакетами можно скачать из интернета сразу на сервер или скопировать заранее скачанные установочные пакеты в расшаренный каталог <a href="https://ru.wikipedia.org/wiki/Samba">samba</a>. Предположу, что samba настроена не у всех, потому воспользуемся USB-накопителем (<em>флешкой</em>). Создаем в корне флешки каталоги:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>1с
</span><span class='line'>postgre
</span><span class='line'>hasp</span></code></pre></td></tr></table></div></figure>


<p>Раскидываем пакеты по каталогам, предварительно распаковав их.</p>

<p>4. Создаем директорию, к которой будем монтировать флешку:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># mkdir /mnt/1cinstall</span></code></pre></td></tr></table></div></figure>


<p>5. Подключаем флешку к серверу, просматриваем как она подключилась:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># fdisk -l
</span><span class='line'>
</span><span class='line'>Disk /dev/sdb: 14,9 GiB, 16013852672 bytes, 31277056 sectors
</span><span class='line'>Units: sectors of 1 * 512 = 512 bytes
</span><span class='line'>Sector size (logical/physical): 512 bytes / 512 bytes
</span><span class='line'>I/O size (minimum/optimal): 512 bytes / 512 bytes
</span><span class='line'>Disklabel type: dos
</span><span class='line'>Disk identifier: 0xcad4ebea
</span><span class='line'>
</span><span class='line'>Device     Boot Start      End  Sectors  Size Id Type
</span><span class='line'>/dev/sdb4  *       63 31277055 31276993 14,9G  7 HPFS/NTFS/exFAT</span></code></pre></td></tr></table></div></figure>


<p>У меня это <code>sdb4</code>, теперь монтируем флешку сразу в каталог <em>1сinstall</em>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># mount /dev/sdb4 /mnt/1cinstall</span></code></pre></td></tr></table></div></figure>


<p>6. Проверяем что намонтировали:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># ls -l /mnt/1cinstall</span></code></pre></td></tr></table></div></figure>


<p>Т.к. на моей флешке ничего не было кроме папок с установочными пакетами, отобразились только они:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>1с
</span><span class='line'>postgres
</span><span class='line'>hasp</span></code></pre></td></tr></table></div></figure>


<p><span style="color:#cd0021;"><strong>ПРИМЕЧАНИЕ!</strong></span> Если вы ставите 1С:Предприятие на удаленную машину, то для передачи файлов можете воспользоваться утилитой <a href="http://ru.wikipedia.org/wiki/SCP">SCP</a>, которая входит в состав пакета <strong>openssh-client</strong>.</p>

<h2>Установка PostgreSQL 9.4.<a name="postgre"></a> <a href="#content" title="К содержанию">↑</a></h2>

<p>Для корректной работы PostgreSQL в связке с 1С:Предприятие, необходимо провести ряд подготовительных процедур.</p>

<p>1. Для начала надо установить необходимые локали. Это <code>en_US.UTF-8</code> и <code>ru_RU.UTF-8</code>. При этом локаль <code>ru_RU.UTF-8</code> должна быть выбрана по умолчанию. Отредактировать список локалей можно командой:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># dpkg-reconfigure locales</span></code></pre></td></tr></table></div></figure>


<p>2. Затем надо установить зависимости:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># apt-get install ssl-cert libossp-uuid16 libxslt1.1</span></code></pre></td></tr></table></div></figure>


<p>3. К сожалению, мейнтейнеры работающие на 1С, не следят за порядком в зависимостях своих пакетов. По этой простой причине, нам надо скачать и установить пакет <strong><em>libicu48</em></strong>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># wget http://ftp.ru.debian.org/debian/pool/main/i/icu/libicu48_4.8.1.1-12+deb7u3_amd64.deb
</span><span class='line'># dpkg -i libicu48*.deb</span></code></pre></td></tr></table></div></figure>


<p>4. Так же необходимо увеличить максимальный размер сегмента памяти до 64&nbsp;Мб:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># echo kernel.shmmax = `echo 64*1024*1024 | bc` &gt;&gt; /etc/sysctl.conf</span></code></pre></td></tr></table></div></figure>


<p>Дабы необходимые изменения вступили в силу, вводим:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># sysctl -p</span></code></pre></td></tr></table></div></figure>


<p>Тут товарищ Vasiliy P. Melnik в своем <a href="http://nixway.org/2015/11/10/1c-predpriyatie-8-3+postgresql-na-baze-debian-8-jessie/#comment-2612897528">комментарии</a> пишет, что в данной процедуре необходимости нет. Я его утверждение не проверял, но вы можете попробовать пропустить 4 пункт. А если всё таки процедура потребуется, вы можете выполнить её позже.</p>

<p>5. В этой статье я решил использовать версию PostgreSQL от 1С. Переходим в каталог с пакетами PostgreSQL:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># cd /mnt/1cinstall/postgres</span></code></pre></td></tr></table></div></figure>


<p>Проверяем что есть в каталоге:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># ls -l
</span><span class='line'>итого 5424
</span><span class='line'>drwxr-xr-x 2 nihi1ist nihi1ist    4096 окт  6 09:50 addons
</span><span class='line'>-rwxr-xr-x 1 nihi1ist nihi1ist  120250 июн  2 12:41 libpq5_9.4.2-1.1C_amd64.deb
</span><span class='line'>-rwxr-xr-x 1 nihi1ist nihi1ist 3657036 июн  2 12:42 postgresql-9.4_9.4.2-1.1C_amd64.deb
</span><span class='line'>-rwxr-xr-x 1 nihi1ist nihi1ist 1069692 июн  2 12:42 postgresql-client-9.4_9.4.2-1.1C_amd64.deb
</span><span class='line'>-rwxr-xr-x 1 nihi1ist nihi1ist   72172 авг 11 19:47 postgresql-client-common_154.1.1C_all.deb
</span><span class='line'>-rwxr-xr-x 1 nihi1ist nihi1ist  163684 авг 11 19:47 postgresql-common_154.1.1C_all.deb
</span><span class='line'>-rwxr-xr-x 1 nihi1ist nihi1ist  457782 июн  2 12:42 postgresql-contrib-9.4_9.4.2-1.1C_amd64.deb</span></code></pre></td></tr></table></div></figure>


<p>Всего 6 пакетов, которые и нужно установить. В каталоге <em>addons</em>, находятся дополнительные пакеты, их я ставить не буду.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># dpkg -i *.deb</span></code></pre></td></tr></table></div></figure>


<p>После установки проверим, запустился ли сервис PostgreSQL:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># service postgresql status</span></code></pre></td></tr></table></div></figure>


<p>Если пакеты были установлены правильно, то вы получите примерно следующее сообщение (выхлоп):</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>● postgresql.service - LSB: PostgreSQL RDBMS server
</span><span class='line'>   Loaded: loaded (/etc/init.d/postgresql)
</span><span class='line'>   Active: active (running) since Вт 2015-11-10 20:52:32 ALMT; 16s ago
</span><span class='line'>  Process: 14225 ExecStop=/etc/init.d/postgresql stop (code=exited, status=0/SUCCESS)
</span><span class='line'>  Process: 14274 ExecReload=/etc/init.d/postgresql reload (code=exited, status=0/SUCCESS)
</span><span class='line'>  Process: 14235 ExecStart=/etc/init.d/postgresql start (code=exited, status=0/SUCCESS)
</span><span class='line'>   CGroup: /system.slice/postgresql.service
</span><span class='line'>           ├─14249 /usr/lib/postgresql/9.4/bin/postgres -D /var/lib/postgresql/9.4/main -c config_file=/etc/postgresql/9.4/main/postgresql...
</span><span class='line'>           ├─14251 postgres: checkpointer process   
</span><span class='line'>           ├─14252 postgres: writer process   
</span><span class='line'>           ├─14253 postgres: wal writer process   
</span><span class='line'>           ├─14254 postgres: autovacuum launcher process   
</span><span class='line'>           └─14255 postgres: stats collector process   
</span><span class='line'>
</span><span class='line'>ноя 10 20:52:32 as1 postgresql[14235]: Starting PostgreSQL 9.4 database server: main.</span></code></pre></td></tr></table></div></figure>


<p>Если же вы получите сообщение похожее на это:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>● postgresql.service - LSB: PostgreSQL RDBMS server
</span><span class='line'>   Loaded: loaded (/etc/init.d/postgresql)
</span><span class='line'>   Active: active (exited) since Вт 2015-11-10 20:28:40 ALMT; 10min ago
</span><span class='line'>
</span><span class='line'>ноя 10 20:28:40 as1 postgresql[11850]: No PostgreSQL clusters exist; see "man pg_createcluster" ... (warning).</span></code></pre></td></tr></table></div></figure>


<p>Нас интересует последняя строчка, где  сообщается, что кластер PostgreSQL не обнаружен. Чтобы исправить эту ситуацию, достаточно просто перезапустить сервис PostgreSQL:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># service postgresql restart</span></code></pre></td></tr></table></div></figure>


<p>После чего снова проверьте статус сервиса. В итоге вы должны получить что-то похожее на первое сообщение.</p>

<p>6. После установки нужно еще немного подправить конфигурационный файл. Как ни странно PostgreSQL будучи установленным из пакетов 1С, содержит неправильные настройки для обработки экранирующих символов, и при создании базы выдает ошибку:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>syntax error at or near "SECOND" at character 127</span></code></pre></td></tr></table></div></figure>


<p>или</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>syntax error at or near "SECOND" at character 227</span></code></pre></td></tr></table></div></figure>


<p>Чтобы избежать вышеуказанных ошибок нужно отредактировать настройки PostgreSQL:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># vim /etc/postgresql/9.4/main/postgresql.conf</span></code></pre></td></tr></table></div></figure>


<p>Приведя нижеуказанные параметры к следующему виду:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>backslash_quote = on
</span><span class='line'>escape_string_warning = off
</span><span class='line'>standard_conforming_strings = off</span></code></pre></td></tr></table></div></figure>


<p>Обновим конфигурацию, не перезапуская сервис:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># service postgresql reload</span></code></pre></td></tr></table></div></figure>


<p>7. Зададим пароль внутреннему пользователю PostgreSQL, предварительно авторизировавшись под системным пользователем <strong>postgres</strong>. Итак, авторизация:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># su postgres</span></code></pre></td></tr></table></div></figure>


<p>Переход в домашний каталог текущего пользователя:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># cd</span></code></pre></td></tr></table></div></figure>


<p>Смена пароля у внутреннего пользователя PostgreSQL:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ psql -U postgres -c "alter user postgres with password '123456';"</span></code></pre></td></tr></table></div></figure>


<p>Где <code>-U postgres</code> - системный пользователь от имени которого будет запущен <code>psql</code>, <code>user postgres</code> - внутренний пользователь БД, ну а <code>123456</code> - <em>произвольный</em> пароль который будет задан внутреннему пользователю БД.</p>

<p>Если смена пароля прошла успешно, вы должны получить сообщение:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>ALTER ROLE</span></code></pre></td></tr></table></div></figure>


<p>Выход из окружения системного пользователя <strong>postgres</strong>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ exit</span></code></pre></td></tr></table></div></figure>


<p>8. Напоследок зафиксируем пакеты PostgreSQL, чтобы они не обновлялись из стандартных репозиториев:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># apt-mark hold libpq5 postgresql-9.4 postgresql-client-9.4 postgresql-client-common postgresql-common postgresql-contrib-9.4</span></code></pre></td></tr></table></div></figure>


<p>Если команда выполнена правильно, вы должны получить следующее сообщение:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>libpq5 помечен как зафиксированный.
</span><span class='line'>postgresql-9.4 помечен как зафиксированный.
</span><span class='line'>postgresql-client-9.4 помечен как зафиксированный.
</span><span class='line'>postgresql-client-common помечен как зафиксированный.
</span><span class='line'>postgresql-common помечен как зафиксированный.
</span><span class='line'>postgresql-contrib-9.4 помечен как зафиксированный.</span></code></pre></td></tr></table></div></figure>


<p>На этом установка PostgreSQL закончена. Вопросы настройки и оптимизации будут рассмотрены в отдельных статьях.</p>

<h2>Установка сервера 1С:Предприятие 8.3.<a name="server"></a> <a href="#content" title="К содержанию">↑</a></h2>

<p>Теперь нам предстоит установка сервера 1С:Предприятие. Как и в случае с PostgreSQL нам предстоит ряд подготовительных работ необходимых для штатного функционирования сервера 1С:Предприятие.</p>

<p>1. Переходим в из каталога <em>postgres</em> в каталог <em>1c</em>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># cd ../1c</span></code></pre></td></tr></table></div></figure>


<p>2. Устанавливаем дополнительные пакеты, которые необходимы для работы сервера:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># apt-get install imagemagick libglib2.0-0 libgsf-1-114 ttf-mscorefonts-installer t1utils unixodbc --no-install-recommends</span></code></pre></td></tr></table></div></figure>


<p>3. Так как я не нашел достойной альтернативы пакету <strong><em>ttf2pt1</em></strong>, который не тянет кучу зависимостей. То я буду ставить его. В репозиториях его нету, скачаем из архива Debian:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># wget http://archive.debian.org/debian/pool/main/t/ttf2pt1/ttf2pt1_3.4.4-1.4_amd64.deb</span></code></pre></td></tr></table></div></figure>


<p>Докачиваем <strong><em>libt1-5</em></strong> от которого зависит <strong><em>ttf2pt1</em></strong>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># wget http://ftp.ru.debian.org/debian/pool/main/t/t1lib/libt1-5_5.1.2-3.6_amd64.deb</span></code></pre></td></tr></table></div></figure>


<p>Устанавливаем пакеты:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># dpkg -i ttf2pt1*.deb libt1*.deb</span></code></pre></td></tr></table></div></figure>


<p>Кстати, жду предложений по возможной альтернативе пакету <strong><em>ttf2pt1</em></strong>.</p>

<p>4. Посмотрим, какие пакеты есть у нас в каталоге:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># ls -l
</span><span class='line'>итого 628420
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist 206202908 ноя 19 05:45 1c-enterprise83-client_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist  19879626 ноя 19 05:45 1c-enterprise83-client-nls_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist  33830518 ноя 19 05:45 1c-enterprise83-common_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist   1607830 ноя 19 05:45 1c-enterprise83-common-nls_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist 174945770 ноя 19 05:45 1c-enterprise83-server_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist  60668720 ноя 19 05:45 1c-enterprise83-server-nls_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist 135750258 ноя 19 05:45 1c-enterprise83-thin-client_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist   9980106 ноя 19 05:45 1c-enterprise83-thin-client-nls_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist    190046 ноя 19 05:45 1c-enterprise83-ws_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist     11986 ноя 19 05:46 1c-enterprise83-ws-nls_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxr-xr-x 1 nihi1ist nihi1ist    173740 фев 24  2013 libt1-5_5.1.2-3.6_amd64.deb
</span><span class='line'>-rwxr-xr-x 1 nihi1ist nihi1ist    236970 июн  8  2008 ttf2pt1_3.4.4-1.4_amd64.deb</span></code></pre></td></tr></table></div></figure>


<p>Всего 8 пакетов, из которых нам для функционирования сервера 1С:Предприятия необходимы 3 пакета: <strong><em>1c-enterprise83-common</em></strong>, <strong><em>1c-enterprise83-server</em></strong>, <strong><em>1c-enterprise83-ws</em></strong>.</p>

<h5>Небольшая таблица с пояснениями по назначению пакетов:</h5>

<table>
<thead>
<tr>
<th> Название пакета </th>
<th> Описание пакета </th>
</tr>
</thead>
<tbody>
<tr>
<td> <em>1c_enterprise83-client…</em> </td>
<td> Компоненты клиента 1С Предприятие 8.3 для Linux </td>
</tr>
<tr>
<td> <em>1c_enterprise83-thin-client…</em> </td>
<td> Компоненты тонкого клиента 1С Предприятие 8.3 для Linux </td>
</tr>
<tr>
<td> <em>1c_enterprise83-common…</em> </td>
<td> Общие компоненты 1С Предприятие 8.3 для Linux </td>
</tr>
<tr>
<td> <em>1c_enterprise83-server…</em> </td>
<td> Сервер 1С Предприятие 8.2 для Linux </td>
</tr>
<tr>
<td> <em>1c_enterprise83-ws…</em> </td>
<td> Компоненты интернет-сервисов 1С Предприятие 8.3 для Linux </td>
</tr>
<tr>
<td> <em>1c_enterprise83-…-nls&hellip;</em> </td>
<td> Компоненты необходимые для ОС не поддерживающих кириллическую кодировку </td>
</tr>
</tbody>
</table>


<p>&nbsp;</p>

<p>5. Устанавливаем необходимые пакеты:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># dpkg -i 1c-enterprise83-common_8*.deb 1c-enterprise83-server_8*.deb 1c-enterprise83-ws_8.3*.deb</span></code></pre></td></tr></table></div></figure>


<p>6. Даем пользователю <strong>usr1cv8</strong> и группе <strong>grp1cv8</strong> права на установочную директорию 1С:Предприятия:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># chown -R usr1cv8:grp1cv8 /opt/1C</span></code></pre></td></tr></table></div></figure>


<p>7. В выхлопе установщика вы можете заметить предупреждение:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>update-rc.d: using dependency based boot sequencing
</span><span class='line'>insserv: warning: script 'K01srv1cv83' missing LSB tags and overrides
</span><span class='line'>insserv: warning: script 'srv1cv83' missing LSB tags and overrides</span></code></pre></td></tr></table></div></figure>


<p>Начиная с версий 8.3.7, данная проблема исправлена. Потому, если вышеуказанного сообщения вы не получали, можете пропустить пункты&nbsp;8&nbsp;и&nbsp;9.</p>

<p>8. Сообщение описанное в пункте 7 мы получаем из-за отсутствия в скрипте запуска LSB-тегов. Ошибка не критична и никак не повлияет на работу сервера 1С:Предприятие. Но её легко можно решить, для этого добавим LSB-теги в сценарий сервиса 1С:Предприятие:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># vim /etc/init.d/srv1cv83</span></code></pre></td></tr></table></div></figure>


<p>Находим строки:</p>

<pre><code>#!/bin/bash
#------------------------------------------------------------
# 1C:Enterprise server configuration parameters
#------------------------------------------------------------

# 1C:Enterprise server keytab file.
</code></pre>

<p>Приводим к следующему виду:</p>

<pre><code>#!/bin/bash
#------------------------------------------------------------
# 1C:Enterprise server configuration parameters
#------------------------------------------------------------

### BEGIN INIT INFO
# Provides:          srv1cv83
# Required-Start:    $remote_fs $network $syslog $named
# Required-Stop:     $remote_fs $network $syslog $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Description:       1C:Enterprise 83 server.
### END INIT INFO

# 1C:Enterprise server keytab file.
</code></pre>

<p>После изменения сценария, запускаем:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># systemctl daemon-reload</span></code></pre></td></tr></table></div></figure>


<p>9. Перезапускаем службу сервера 1С:Предприятие:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># service srv1cv83 restart</span></code></pre></td></tr></table></div></figure>


<p>10. Проверяем запускаются ли при старте системы сервер 1С:Предприятие:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># netstat -atn|grep 0.0.0.0:15</span></code></pre></td></tr></table></div></figure>


<p>Вы должны получить примерно такое сообщение:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>tcp        0      0 0.0.0.0:1560            0.0.0.0:*               LISTEN
</span><span class='line'>tcp        0      0 0.0.0.0:1540            0.0.0.0:*               LISTEN
</span><span class='line'>tcp        0      0 0.0.0.0:1541            0.0.0.0:*               LISTEN</span></code></pre></td></tr></table></div></figure>


<p>11. Так же для профилактики можно проверить, все ли процессы сервера запущены:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># ps aux|grep 1c</span></code></pre></td></tr></table></div></figure>


<p>От имени пользователя <strong>usr1cv8</strong> должно быть запущено три процесса: <em>ragent</em>, <em>rmngr</em> и <em>rphost</em>. После имен процессов идут номера портов, через которые они работают:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>usr1cv8  16832  0.3  1.8 357780 35668 ?        Ssl  21:39   0:01 /opt/1C/v8.3/x86_64/ragent -daemon
</span><span class='line'>usr1cv8  16835  0.8  5.4 955616 104104 ?       Sl   21:39   0:04 /opt/1C/v8.3/x86_64/rmngr -port 1541 -host as1 -range 1560:1591 -clstid 96f2358c-87be-11e5-049f-080027e1f738
</span><span class='line'>usr1cv8  16862  0.3 10.6 848588 204580 ?       Sl   21:39   0:01 /opt/1C/v8.3/x86_64/rphost -range 1560:1591 -reghost as1 -regport 1541 -pid 97c8c4c6-87be-11e5-049f-080027e1f738
</span><span class='line'>root     16940  0.0  0.1  13968  2220 pts/0    S+   21:48   0:00 grep 1c</span></code></pre></td></tr></table></div></figure>


<h2>Установка драйвера для аппаратной лицензии 1С (HASP).<a name="hasp"></a> <a href="#content" title="К содержанию">↑</a></h2>

<p>Большая часть новичков впервые столкнувшиеся с процессом установки 1С:Предприятие не могут понять о какой лицензии, ключе, <a href="https://ru.wikipedia.org/wiki/HASP">HASP</a> идет речь. Итак, лицензия&nbsp;1С необходима для запуска продуктов 1С:Предприятие. Лицензии&nbsp;1С можно разделить на аппаратные и программные. Мы рассмотрим аппаратную лицензию (<a href="https://ru.wikipedia.org/wiki/%D0%A2%D0%BE%D0%BA%D0%B5%D0%BD_(%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8"><em>USB-токен</em></a>)). Аппаратные ключи&nbsp;1С делятся на 3 вида и их можно отличить по цвету:</p>

<ul>
<li><span style="color:green">зеленый</span> - серверный ключ&nbsp;1С (сервер&nbsp;1С:Предприятия),</li>
<li><span style="color:blue">синий</span> (<span style="color:purple">фиолетовый</span>) - ключ&nbsp;1С, который поставляется вместе с конфигурацией и является однопользовательским,</li>
<li><span style="color:red">красный</span> - лицензии на пользователей, данный ключ&nbsp;1С может приобретаться отдельно в том случае, если у Вас уже есть в наличие какая-либо конфигурация 1С:Предприятие.</li>
</ul>


<p><strong>Клиентское приложение допускает использование следующих ключей HASP:</strong></p>

<ul>
<li>локальный клиентский ключ серии ORGL8 на 1 пользователя,</li>
<li>сетевой клиентский ключ серии ORGL8 на 5, 10, 20, 50, и 100 пользователей,</li>
<li>сетевой клиентский ключ серии ORGLА на 300 пользователей,</li>
<li>сетевой клиентский ключ серии ORGLВ на 500 пользователей.</li>
</ul>


<p>Причём на одном компьютере может быть установлено не более одного ключа одной серии. Подробнее о видах лицензии и ключей вы можете прочитать <a href="http://www.1service.ru/price/litsenzii_klyuchi_1s.php">здесь</a>.</p>

<p>Из вышеуказанного следует - нам нужны два типа лицензий. <em>Лицензия для сервера</em> 1С:Предприятие и <em>лицензия для клиента</em> 1С:Предприятие. После того как мы выяснили какие ключи нам необходимы, можно перейти к установке драйвера. Свежий драйвер можно <a href="http://safenet-sentinel.ru/helpdesk/download-space/">скачать</a> на официальном сайте. Большинству подойдет HASP 4, его и скачивайте.</p>

<p>1. Как вы помните, всё необходимое я уже скачал, потому просто переходим из каталога <em>1с</em>, в каталог <em>hasp</em>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># cd ../hasp</span></code></pre></td></tr></table></div></figure>


<p>Проверим, что есть в каталоге:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># ls -l
</span><span class='line'>итого 2872
</span><span class='line'>-rw-r--r-- 1 nihi1ist nihi1ist 2918898 авг 26 14:08 aksusbd_7.40-1_i386.deb
</span><span class='line'>-rw-r--r-- 1 nihi1ist nihi1ist   16851 авг 26 14:08 readme.html</span></code></pre></td></tr></table></div></figure>


<p>Установочный пакет есть, осталось установить его:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># dpkg -i aksusbd*.deb</span></code></pre></td></tr></table></div></figure>


<p>2. После установки сервис не запустился, запустим его:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># service aksusbd start</span></code></pre></td></tr></table></div></figure>


<p>Если сервис запустился штатно, команда просто отработает не выдав сообщений. Проверить запущен ли сервис можно командой:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># service aksusbd status</span></code></pre></td></tr></table></div></figure>


<p>Вы должны получить сообщение:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>● aksusbd.service - LSB: Sentinel LDK RTE
</span><span class='line'>   Loaded: loaded (/etc/init.d/aksusbd)
</span><span class='line'>   Active: active (exited) since Чт 2015-12-03 19:37:12 ALMT; 10s ago
</span><span class='line'>  Process: 3848 ExecStart=/etc/init.d/aksusbd start (code=exited, status=0/SUCCESS)
</span><span class='line'>
</span><span class='line'>дек 03 19:37:12 hst1 aksusbd[3848]: Starting AKSUSB daemon: .
</span><span class='line'>дек 03 19:37:12 hst1 aksusbd[3848]: Starting WINEHASP daemon: .
</span><span class='line'>дек 03 19:37:12 hst1 aksusbd[3848]: Starting HASPLM daemon: .</span></code></pre></td></tr></table></div></figure>


<p><span style="color:#cd0021;"><strong>ПРЕДУПРЕЖДЕНИЕ!</strong></span> Для 64-битного сервера 1С:Предприятие, нужен 64-битный серверный HASP-ключ. 32-битный серверный HASP-ключ с 64-битным сервером 1С:Предприятие работать не будет!</p>

<p><span style="color:#cd0021;"><strong>ПРИМЕЧАНИЕ!</strong></span> Сервер 1С:Предприятие под *nix-подобные операционные системы не требует наличия серверного ключа, если число пользользователей не превышает 12. В этом случае требуется наличие только клиентских лицензий. Тем не менее, согласно правилам лицензирования, организация должна приобрести серверный ключ.</p>

<p>На этом установка драйвера закончена.</p>

<h2>Установка клиента 1С:Предприятие 8.3.<a name="client"></a> <a href="#content" title="К содержанию">↑</a></h2>

<h3>Установка клиента.</h3>

<p>Итак, дано: рабочая станция с Debian&nbsp;8&nbsp;&laquo;Jessie&raquo; + DE Cinnamon на борту. Я предпочел Cinnamon, но каждый может выбрать <a href="https://ru.wikipedia.org/wiki/%D0%A1%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B1%D0%BE%D1%87%D0%B5%D0%B3%D0%BE_%D1%81%D1%82%D0%BE%D0%BB%D0%B0">окружение</a> <em>(DE)</em> себе по вкусу. Можно приступить к установке клиента 1С:Предприятие.</p>

<p>1. По уже заведенной традиции, устанавливаем дополнительные пакеты, необходимые для работы 1С:Предприятие:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># apt-get install libwebkitgtk-1.0-0 imagemagick libglib2.0-0 libgsf-1-114 ttf-mscorefonts-installer t1utils unixodbc --no-install-recommends</span></code></pre></td></tr></table></div></figure>


<p>2. На памятной флешке, имеются также пакеты клиента. Подключим флешку как указано в пунктах 4 и 5, главы <a href="#lead-up">Подготовка сервера</a> и сразу перейдем в каталог с пакетами 1С:Предприятие:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># cd /mnt/1cinstall/1c</span></code></pre></td></tr></table></div></figure>


<p>Посмотрим, что имеется в каталоге:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># ls -l
</span><span class='line'>итого 628420
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist 206202908 ноя 19 05:45 1c-enterprise83-client_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist  19879626 ноя 19 05:45 1c-enterprise83-client-nls_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist  33830518 ноя 19 05:45 1c-enterprise83-common_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist   1607830 ноя 19 05:45 1c-enterprise83-common-nls_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist 174945770 ноя 19 05:45 1c-enterprise83-server_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist  60668720 ноя 19 05:45 1c-enterprise83-server-nls_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist 135750258 ноя 19 05:45 1c-enterprise83-thin-client_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist   9980106 ноя 19 05:45 1c-enterprise83-thin-client-nls_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist    190046 ноя 19 05:45 1c-enterprise83-ws_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxrwxrwx 1 nihi1ist nihi1ist     11986 ноя 19 05:46 1c-enterprise83-ws-nls_8.3.7-1776_amd64.deb
</span><span class='line'>-rwxr-xr-x 1 nihi1ist nihi1ist    173740 фев 24  2013 libt1-5_5.1.2-3.6_amd64.deb
</span><span class='line'>-rwxr-xr-x 1 nihi1ist nihi1ist    236970 июн  8  2008 ttf2pt1_3.4.4-1.4_amd64.deb
</span></code></pre></td></tr></table></div></figure>


<p>3. Есть два варианта установки клиента. <em>Первый вариант</em> - установка полноценного клиента (включает толстый и тонкий клиенты), <em>второй вариант</em> - установка тонкого клиента. В случае с установкой полноценного клиента, необходимо также устанавливать и серверную часть.</p>

<p>3.1. Сначала рассмотрим установку полноценного клиента:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># dpkg -i 1c-enterprise83-client_8*.deb 1c-enterprise83-common_8*.deb 1c-enterprise83-server_8*.deb ttf2pt1*.deb libt1*.deb</span></code></pre></td></tr></table></div></figure>


<p>После чего надо выполнить процедуры указанные в пунктах с 6 по 9, главы <a href="#server">Установка сервера 1С:Предприятие 8.3</a>.</p>

<p>3.2. Тонкий клиент, можно устанавливать на те машины, где не планируется использование толстого клиента. Преимущество тонкого клиента, это отсутствие зависимостей от компонентов сервера 1С:Предприятие, а также возможность работать через интернет. Итак, установка тонкого клиента:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># dpkg -i 1c-enterprise83-thin-client_8*.deb</span></code></pre></td></tr></table></div></figure>


<p><strong> В каких случаях нам необходим толстый клиент?</strong><br/>
- Работа с конфигуратором,<br/>
- Создание информационных баз,<br/>
- Проведение объемных вычислений (в случае толстого клиента, все вычисления проводятся на стороне клиента).</p>

<p>Подробнее о тонких и толстых клиентах можно почитать <a href="http://v8.1c.ru/overview/Term_000000121.htm">здесь</a>.</p>

<p>4. Теперь нам необходимо выбрать каким способом мы будем взаимодействовать с сервером. В зависимости от обстоятельств и предпочтений, вы можете <a href="http://nixway.org/how-to/ustanovka-i-nastroika-bind9-na-debian-jessie/">установить DNS-сервер</a>, или прописывать имя сервера на каждой клиентской машине вручную:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># vim /etc/hosts</span></code></pre></td></tr></table></div></figure>


<p>Надо добавить строку:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>192.168.1.1      as1     as1.nixway.loc</span></code></pre></td></tr></table></div></figure>


<p>Где <code>192.168.1.1</code> - IP-адрес сервера, <code>as1</code> - имя сервера, <code>as1.nixway.loc</code> - имя сервера в локальном домене, его указывать не обязательно.</p>

<p>5. После того как вы добавили вышеуказанную строку, проверьте, доступен ли сервер по указанному имени:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># ping -c4 as1.nixway.loc</span></code></pre></td></tr></table></div></figure>


<p>Вы должны получить примерно такой ответ:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>PING as1.nixway.loc (192.168.56.101) 56(84) bytes of data.                                                                                   
</span><span class='line'>64 bytes from as1.nixway.loc (192.168.56.101): icmp_seq=1 ttl=64 time=0.212 ms
</span><span class='line'>64 bytes from as1.nixway.loc (192.168.56.101): icmp_seq=2 ttl=64 time=0.309 ms
</span><span class='line'>64 bytes from as1.nixway.loc (192.168.56.101): icmp_seq=3 ttl=64 time=0.315 ms
</span><span class='line'>64 bytes from as1.nixway.loc (192.168.56.101): icmp_seq=4 ttl=64 time=0.258 ms
</span><span class='line'>
</span><span class='line'>--- as1.nixway.loc ping statistics ---
</span><span class='line'>4 packets transmitted, 4 received, 0% packet loss, time 3000ms
</span><span class='line'>rtt min/avg/max/mdev = 0.212/0.273/0.315/0.045 ms</span></code></pre></td></tr></table></div></figure>


<p>Установка клиента закончена, можно приступать к созданию информационной базы.</p>

<h3>Создание информационной базы.</h3>

<p>Для начала можно (но совсем необязательно) установить демонстрационную конфигурацию. Дабы продемострировать работую так называемого &laquo;Управляемого приложения&raquo;. Демонстрационная конфигурация идет в комплекте с 1С:Предприятие 8.3. Установщик конфигурации представлен в виде простого скрипта. Потому, описывать процесс установки я не буду, просто выложу несколько скриншотов процесса установки:</p>

<p><a href="http://nixway.org/images/posts/2015-11-10/1c_demo_1.png"><img src="http://nixway.org/images/posts/2015-11-10/1c_demo_1_preview.png" alt="Установка демо конфигурации" /></a></p>

<p>1. Создание информационных баз на *nix-подобных ОС должно проходить из под толстого клиента. В противном случае вы рискуете получить ошибку:</p>

<p><img src="http://nixway.org/images/posts/2015-11-10/1c_error_1.png" alt="Создание ИБ. Ошибка" /></p>

<p>Кроме вышеуказанной ошибки, встречается и другая, но уже в толстом клиенте. Когда при добавлении новой ИБ 1С:Предприятие выдает сообщение:</p>

<p><img src="http://nixway.org/images/posts/2015-11-10/1c_error_2.png" alt="Создание ИБ. Ошибка" /></p>

<p>ИБ создается, но 1С:Предприятие некорректно обрабатывает её создание. В этом случае достаточно просто добавить ИБ в список:</p>

<p><a href="http://nixway.org/images/posts/2015-11-10/1c_02.1.png"><img src="http://nixway.org/images/posts/2015-11-10/1c_02.1_preview.png" alt="Создание ИБ. Добавление существующей ИБ" /></a></p>

<p>Вышеуказанные ошибки будут рассмотрены в отдельной статье.</p>

<p>2. При первом запуске 1С:Предприятие сразу же предлагает нам добавить информационную базу (ИБ), жмем <kbd>Да</kbd>:</p>

<p><img src="http://nixway.org/images/posts/2015-11-10/1c_01.png" alt="Создание ИБ. Добавление" /></p>

<p>3. Выбираем пункт <em>Создание новой информационной базы,</em> жмем <kbd>Далее ></kbd>:</p>

<p><img src="http://nixway.org/images/posts/2015-11-10/1c_02.png" alt="Создание ИБ. Новая" /></p>

<p>4. Выбраем шаблон конфигурации для создаваемой ИБ или же создаем ИБ без конфигурации, жмем <kbd>Далее ></kbd>:</p>

<p><img src="http://nixway.org/images/posts/2015-11-10/1c_03.png" alt="Создание ИБ. Конфигурация" /></p>

<p>5. Задаем имя ИБ и выбираем пункт <em>На сервере 1С:Предприятия,</em> жмем <kbd>Далее ></kbd>:</p>

<p><img src="http://nixway.org/images/posts/2015-11-10/1c_04.png" alt="Создание ИБ. Сервер" /></p>

<p>6. По порядку указываем: доменное имя или IP-адрес сервера 1С:Предприятие, имя ИБ, параметры соединения, тип СУБД, адрес сервера баз данных (БД), имя БД на сервере БД, имя пользователя сервера БД, пароль пользователя сервера БД, жмем <kbd>Далее ></kbd>:</p>

<p><img src="http://nixway.org/images/posts/2015-11-10/1c_05.png" alt="Создание ИБ. Параметры подключения" /></p>

<p>7. Параметры запуска оставляем без изменений, жмем <kbd>Готово</kbd>:</p>

<p><img src="http://nixway.org/images/posts/2015-11-10/1c_06.png" alt="Создание ИБ. Параметры запуска" /></p>

<p>8. Если вы всё сделали правильно, то через некоторое время ИБ будет создана и вы увидите её в списке:</p>

<p><img src="http://nixway.org/images/posts/2015-11-10/1c_07.png" alt="Создание ИБ. Список ИБ" /></p>

<p>9. Теперь, когда мы создали ИБ, можно её запустить. Как вы помните, я создавал ИБ из шаблона демонстрационной конфигурации. Так выглядит рабочее окно этой конфигурации:</p>

<p><a href="http://nixway.org/images/posts/2015-11-10/1c_08.png"><img src="http://nixway.org/images/posts/2015-11-10/1c_08_preview.png" alt="Режим - 1С:Предприятие" /></a></p>

<p>Ну и конечно же конфигуратор:</p>

<p><a href="http://nixway.org/images/posts/2015-11-10/1c_09.png"><img src="http://nixway.org/images/posts/2015-11-10/1c_09_preview.png" alt="Режим - Конфигуратор" /></a></p>

<h2>Публикация ИБ на веб-сервере Apache 2.4.<a name="apache24"></a> <a href="#content" title="К содержанию">↑</a></h2>

<p>Хочу обрадовать тех, кому не хватало возможности публикации информационной базы на веб-сервере Apache. Добавление поддержки последней версии Apache, я заметил при установке 1С:Предприятие версии 8.3.8.1652. Может поддержка Apache 2.4 появилась и раньше. Но проверять мне было лень, а новостей на эту тему я не нашел. Даже на <a href="http://v8.1c.ru/requirements/">официальном сайте</a> 1С, на данный момент устаревшая информация. Процесс публикации не изменился. <strong><em>Обращаю особое внимание, что процесс установки описан для Apache не ниже 2.4.</em></strong></p>

<p>Создаем директорию для vrd-файла:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># mkdir -p /var/www/ib/ibname</span></code></pre></td></tr></table></div></figure>


<p>А также файл конфигурации Apache:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># touch /etc/apache2/conf-available/ibname.conf</span></code></pre></td></tr></table></div></figure>


<p>Переходим в каталог со утилитой публикации веб-клиента:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># cd /opt/1C/v8.3/x86_64/</span></code></pre></td></tr></table></div></figure>


<p>Запускаем утилиту:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># ./webinst -apache24 -wsdir ibname -dir '/var/www/ib/ibname' -connstr 'Srvr="as1.nixway.loc";Ref="ibname";' -confPath /etc/apache2/conf-available/ibname.conf</span></code></pre></td></tr></table></div></figure>


<p>Где <code>/var/www/ib/ibname</code> - директория где будет создан vrd-файл, <code>ibname</code> - имя ИБ, <code>as1.nixway.loc</code> - адрес сервера 1С:Предпрятие, а <code>/etc/apache2/conf-available/ibname.conf</code> - путь до конфигурационного файла Apache.</p>

<p>Подключаем конфигурацию:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># a2enconf ibname</span></code></pre></td></tr></table></div></figure>


<p>Перечитываем конфигурацию Apache:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># service apache2 reload</span></code></pre></td></tr></table></div></figure>


<p>Если процедура публикации была проведена корректно, ИБ будет доступна по адресу:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>http[s]://server_ip|server_name/ibname</span></code></pre></td></tr></table></div></figure>


<p><a href="http://nixway.org/images/posts/2015-11-10/1c_10.png"><img src="http://nixway.org/images/posts/2015-11-10/1c_10_preview.png" alt="Режим - Веб-клиент" /></a></p>

<h2>Послесловие<a name="afterword"></a> <a href="#content" title="К содержанию">↑</a></h2>

<p>Прошу в комментариях задавать вопросы только по статье. Если же вы найдете в статье ошибку или у вас есть предложения, просьбы, вопросы выходящие за рамки статьи, можете оставлять их на нашем <a href="https://community.nixway.org">форуме</a>, в специально созданной <a href="https://community.nixway.org/viewtopic.php?pid=589">теме</a>.</p>

<p>Напоминаю копипастерам, использование прямой ссылки на оригинальную статью обязательно.</p>

<p><em>Статья обновлена 10 августа 2016 года.</em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[WPS Office от Kingsoft альтернатива MS Office]]></title>
    <link href="http://nixway.org/2015/07/27/wps-kingsoft-office-review/"/>
    <updated>2015-07-27T10:53:04+06:00</updated>
    <id>http://nixway.org/2015/07/27/wps-kingsoft-office-review</id>
    <content type="html"><![CDATA[<p><img src="http://nixway.org/images/posts/2015-07-27/wps-office.png" alt="Debian + 1C + PostgreSQL" /><br/>
Наконец дошли руки до тестирования <a href="https://www.wps.com/?lang=ru">WPS Office</a>. Это пакет офисных программ, созданный китайским разработчиком программного обеспечения <a href="https://www.wps.com/about-us">Kingsoft</a>, как бесплатная альтернатива <a href="https://ru.wikipedia.org/wiki/Microsoft_Office">Microsoft Office</a>. Пакет состоит из текстового процессора - <em>WPS&nbsp;Writer</em>, табличного процессора - <em>WPS&nbsp;Spreadsheets</em> и программы создания презентаций - <em>WPS&nbsp;Presentation</em>. Несмотря на то, что продукт с закрытым исходным кодом, он на данный момент бесплатен, потому я решился написать небольшой обзор об этом продукте.</p>

<!--more-->


<p>На данный момент доступна только альфа-версия, несмотря на это продукт уже достаточно стабилен. К тому же ведется ведется активная разработка. Официально поддерживается только английский и китайские языки, но к нашей радости имеется <a href="http://wps-community.org">сообщество</a>, отдельные преставители которого занимаются переводом и созданием словарей.</p>

<h2>Установка</h2>

<p>Не думаю, что процесс установки вызовет сложности, т.к. <a href="http://wps-community.org/downloads">доступны</a> установочные пакеты для большинства популярных *nix-подобных ОС. К сожалению готовых установочных пакетов с <a href="https://github.com/wps-community/wps_i18n">локализациями</a>, <a href="http://wps-community.org/download/dicts/">словарями</a> и шрифтами нет. Но, я готов предоставить пакеты, которые собирал для себя:</p>

<ul>
<li>Русская локализация - <a href="https://mega.nz/#!GBhmATxD!i_eRU5DmNGapyo_cf8Q8m2bK8EFDgPasn60PJZSHhUk">deb</a> | <a href="https://mega.nz/#!WIpgnK6Y!5NKa21IZBlRIPkldglGBWS3BFjw8fGRp_Ju2UJ3vHAg">rpm</a>.</li>
<li>Словари для русского языка - <a href="https://mega.nz/#!iN4h1agZ!0RngC7qgpQUwPuWKnxC9N6bf7Yis3HLCfnlldOVYzPo">deb</a> | <a href="https://mega.nz/#!bFwmAbRI!MAOdYAaz6Wj55mckmoNdmPYfGw4L6Wsg1cLN2U0cRCg">rpm</a>,</li>
<li>Шрифты - <a href="https://mega.nz/#!PBwGGTiL!FuZ7VJKh4TwCVefM1seyz8oakTYXrGq2C2zJ_2B3wSo">deb</a> | <a href="https://mega.nz/#!HAIwkSAS!94Ava1zlqB4AVclSerFcjcw8ktMMwF1ef9GY-rYGT80">rpm</a>.*</li>
</ul>


<p>* <span style="font-style:italic;color:gray">В состав пакета входят шрифты: Calibri, Cambria, MT-Extra, Symbol, Webdings, Wingding 1, Wingding 2, Wingding 3.</span></p>

<h2>Впечатление</h2>

<p>Первым что бросается в глаза, так это интерфейс в стиле <a href="https://ru.wikipedia.org/wiki/Ribbon">Ribbon</a>. На первый взгляд выглядит все просто замечательно, но по мере работы с пакетом начинаешь понимать, что не всё так радужно. К примеру, панель быстрого доступа ограничена по функционалу. Она недоступна через горячие клавиши, на неё нельзя назначить нужный функционал, кроме заданного разработчиками. А ведь это очень удобно, вывести на панель наиболее часто используемый функционал и вызывать его горячими клавишами, не переключаясь по вкладкам.</p>

<p><img src="http://nixway.org/images/posts/2015-07-27/ms_office_quick%20access%20toolbar-01.gif" alt="MS Office Quick Access Toolbar" /></p>

<p>Далее рассмотрим функционал <a href="https://ru.wikipedia.org/wiki/Microsoft_Office_Backstage">Backstage</a>. В WPS Office он имеет двойное назначение и это видно по самой кнопке. Сама кнопка, предоставляет крайне скудный функционал:</p>

<p><img src="http://nixway.org/images/posts/2015-07-27/wps_writer_backstage_01.png" alt="WPS Office Backstage" /></p>

<p>Несравнимый с функционалом предоставляемым MS Office Backstage:</p>

<p><a href="http://nixway.org/images/posts/2015-07-27/ms_office_backstage-01.png"><img src="http://nixway.org/images/posts/2015-07-27/ms_office_backstage-01-preview.png" alt="MS Office Backstage" /></a></p>

<p>Те, кто работал в MS Office 2007 и выше, поймут насколько удобнее меню Backstage от MS. Стрелка находящаяся справа от кнопки, предоставляет доступ к меню. Его вы можете увидет на изображении ниже.</p>

<p>Явные на мой взгляд недостатки я перечислил. Теперь давайте рассмотрим особенности и отличия. Самой заметной особенностью, является поддержка стилей интерфейса. Стоит отдельно отметить наличие стиля <em>&ldquo;Классического интефейса&rdquo;.</em> Поменять стиль интерфейса вы можете через меню <span style="font-style:italic;color:gray">(Сервис &raquo; Поменять стиль интерфейса)</span> или через кнопку в заголовке окна:</p>

<p><a href="http://nixway.org/images/posts/2015-07-27/wps-office_gui_change.png"><img src="http://nixway.org/images/posts/2015-07-27/wps-office_gui_change-preview.png" alt="WPS Office GUI change" /></a></p>

<p>Ещё одной отличительной чертой являются вкладки, которые я считаю довольно удобным решением. Кроме того, на приветственной странице, пользователю предлагается набор шаблонов на любой вкус:</p>

<p><a href="http://nixway.org/images/posts/2015-07-27/wps_spreadsheets_01.png"><img src="http://nixway.org/images/posts/2015-07-27/wps_spreadsheets_01-preview.png" alt="WPS Office Spreadsheets" /></a></p>

<p>По поводу заявлениянной поддержки форматов <span style="color:gray">*.docx</span>, <span style="color:gray">*.xlsx</span>, <span style="color:gray">*.pptx</span>, я ничего сказать не могу. На данный момент я не работаю со сложными документами в этих форматах. И даже, если поддержка вышеперечисленных форматов соответствует заявленному, многих огорчит отсутствие поддержки <a href="https://ru.wikipedia.org/wiki/OpenDocument" title="OpenDocument Format">ODF</a>.</p>

<h2>Выводы</h2>

<p>Итак, что представляет из себя Kingsoft WPS Office? ИМХО, это попытка создать альтернативу популярнейшему пакету офисных програм. Но, на данный момент продукт не может конкурировать ни с Microsoft Office, ни даже с LibreOffice. Кому же подойдет этот пакет? Думаю, тем кто привык к ленточному интерфейсу и никогда не работал с классическим интерфейсом. Ведь как я уже писал выше, ленточный интерфейс в этом продукте крайне скуден на функционал и настройки.</p>

<p>Конечно же не стоит ставить крест на этом продукте. Работа над ним продолжается и быть может в будущем, продукт сможет приятно удивить пользователей функционалом и удобным интерфейсом. Ну а на данный момент времени, мне больше подходит <a href="http://ru.libreoffice.org/">LibreOffice</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Установка и настройка Bind9 на Debian&nbsp;8&nbsp;&laquo;Jessie&raquo;]]></title>
    <link href="http://nixway.org/2015/05/01/ustanovka-i-nastroika-bind9-na-debian-jessie/"/>
    <updated>2015-05-01T09:29:13+06:00</updated>
    <id>http://nixway.org/2015/05/01/ustanovka-i-nastroika-bind9-na-debian-jessie</id>
    <content type="html"><![CDATA[<p><img src="http://nixway.org/images/posts/2015-05-01/debian+bind9.png" alt="Bind9" /></p>

<p>В сети очень много статей на тему установки и настройки DNS-сервера Bind9. Они разные. Некоторые написаны просто и доступно, но нет пояснений зачем и почему. В других материал подан очень подробно, но новичкам такой материал осилить сложно. Я же попытаюсь совместить достоинства способов подачи материала, нащупать ту золотую середину, которая подойден большинству. Но опять таки, я не претендую на истину в последней инстанции и готов принять конструктивную критику.</p>

<!--more-->


<p>Итак, вступление закончено, приступим к самой статье. Я как приверженнец Debian, буду описывать процесс установки и настройки именно на этой ОС. Дано Debian&nbsp;8&nbsp;&laquo;Jessie&raquo; установленный вот с такими параметрами <em>(Ну разве кроме пункта <strong>web server</strong>, он пригодится тем, кто в дальнейшем будет работать с веб-сервером Apache):</em><br/>
<a href="http://nixway.org/images/posts/2015-05-01/debian_preinstall_options.png"><img src="http://nixway.org/images/posts/2015-05-01/debian_preinstall_options_preview.png" alt="Debian preinstall options" /></a></p>

<h4>Настройки сети:</h4>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>IP адрес роутера 192.168.1.1
</span><span class='line'>IP адрес сервера 192.168.1.10
</span><span class='line'>Имя домена nixway.loc</span></code></pre></td></tr></table></div></figure>


<p>Для решения данной задачи настроим сервер таким образом, чтобы при обращении по доменному имени внутри сети он отвечал по локальному адресу. Все комманды выполняются от имени суперпользователя (<strong>root</strong>).</p>

<p>Сначала установим необходимые пакеты:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>apt-get -y install bind9 dnsutils</span></code></pre></td></tr></table></div></figure>


<p>Теперь необходимо настроить файл конфигурации Bind9:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vim /etc/bind/named.conf.options</span></code></pre></td></tr></table></div></figure>


<p>Приведём его к следующему виду:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>acl mynetwork {192.168.1.0/24; 127.0.0.1; };
</span><span class='line'>options {
</span><span class='line'>  directory "/var/cache/bind";
</span><span class='line'>  auth-nxdomain no;
</span><span class='line'>  forwarders {192.168.1.1; 8.8.8.8; };
</span><span class='line'>  listen-on-v6 { none; };
</span><span class='line'>  allow-query { mynetwork; };
</span><span class='line'>}; </span></code></pre></td></tr></table></div></figure>


<p><strong>Расшифровка:</strong><br/>
<code>acl</code> - создает <a href="https://ru.wikipedia.org/wiki/ACL">ACL</a> (<em>Access control list</em>) - так называемый список контроля доступа, с помощью которого мы ограничиваем диапазон адресов которые могут запрашивать зоны с нашего сервера. В данном примере это разрешено подсети <code>192.168.1.0/24</code>. и <a href="https://ru.wikipedia.org/wiki/Localhost">локальному хосту</a>.<br/>
<code>allow-query { mynetwork; };</code> - список тех, кто имеет право запрашивать  информацию. Можно ограничить с помошью <em>acl</em> либо установить <code>allow-query { any; };</code> - что будет означать, что запросы разрешенмы всем.<br/>
<code>forwarders {192.168.1.1; 8.8.8.8; };</code> - это DNS провайдера, или любые другие, у которых можно получить информацию о доменах неизвестных вашему серверу.<br/>
<code>listen-on-v6 { none; }</code> - запрещает работать с IPv6.</p>

<h3>Настройка зон</h3>

<p>Для начала покорректируем файл локальной конфигурации Bind9:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vim /etc/bind/named.conf.local</span></code></pre></td></tr></table></div></figure>


<p>Этот файл содержит локальную конфигурацию DNS-сервера, в нем объявляются зоны, связанные с доменами этого сервера. Добавляем в него файлы наших зон (зону прямого просмотра и зону обратного просмотра):</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>zone "nixway.loc" {
</span><span class='line'>    type master;
</span><span class='line'>    file "/etc/bind/zones/nixway/flz.nixway.zone";
</span><span class='line'>};
</span><span class='line'> 
</span><span class='line'>zone "1.168.192.in-addr.arpa" {
</span><span class='line'>    type master;
</span><span class='line'>    file "/etc/bind/zones/nixway/rlz.nixway.zone";
</span><span class='line'>};
</span><span class='line'>  </span></code></pre></td></tr></table></div></figure>


<h3>Зона прямого просмотра</h3>

<p>Зона в DNS — это часть пространства имён DNS, управляемая конкретным сервером или группой серверов DNS. Зона прямого просмотра - это тип зоны в которой доменное имя преобразуется в IP-адрес. Создадим файл для зоны прямого просмотра:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vim /etc/bind/zones/nixway/flz.nixway.zone</span></code></pre></td></tr></table></div></figure>


<p>Со следующим содержимым:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>;
</span><span class='line'>; Зона прямого просмотра
</span><span class='line'>;
</span><span class='line'>$TTL 30
</span><span class='line'>$ORIGIN nixway.loc.
</span><span class='line'> 
</span><span class='line'>@               IN      SOA     ns1.nixway.loc. admin.nixway.loc. (
</span><span class='line'>        2015050101      ; Serial
</span><span class='line'>                1d      ; Refresh
</span><span class='line'>                1h      ; Retry
</span><span class='line'>                1w      ; Expire
</span><span class='line'>                2h      ; Negative Cache TTL
</span><span class='line'>)
</span><span class='line'>
</span><span class='line'>@               IN      NS      ns1.nixway.loc.
</span><span class='line'>@               IN      NS      ns.provider.org.
</span><span class='line'>@               IN      A       192.168.1.10
</span><span class='line'>
</span><span class='line'>ns1             IN      A       192.168.1.10
</span><span class='line'>nixway.loc      IN      A       192.168.1.10
</span><span class='line'>
</span><span class='line'>www             IN      CNAME   nixway.loc.
</span><span class='line'>  </span></code></pre></td></tr></table></div></figure>


<p>В конце этого файла нужно обязательно оставить пустую строку!</p>

<p><strong>Расшифровка:</strong><br/>
<code>$ORIGIN</code> - оригинальное имя зоны<br/>
<code>ns1.nixway.loc.</code>  - Наш DNS-сервер (точка в конце обязательна).<br/>
<code>admin.nixway.loc.</code> - email администратора сервера, где вместо символа @ используется точка.<br/>
<code>Serial</code> - серийный номер зоны в формате ГГГГММДД и номер текущего изменения за этот день. (Важно, при каждом изменении, нужно редактировать этот номер увеличивая его в большую сторону) Пример: <code>2015020301.</code><br/>
<code>Refresh</code> - период времени с которым вторичный сервер днс обращается к основному.<br/>
<code>Retry</code> - период с которым вторичный сервер будет повторять попытки при неудачном обновлении.<br/>
<code>Expire</code> - максимальное время использования данных на вторичном сервере, после которого делается обязательное обновление.<br/>
<code>Negative Cache TTL</code> - время актуальности данных в кэше запросов.</p>

<p>Далее идут записи имён хостов с ip-адресами или псевдонимами.<br/>
<code>ns.provider.org.</code> - вместо этой записи можете указать NS вашего регистратора либо Free DNS сервиса.</p>

<h3>Зона обратного просмотра</h3>

<p>Зона обратного просмотра, выполняет преобразование IP-адреса в доменное имя. Создадим файл для зоны обратного просмотра:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vim /etc/bind/zones/nixway/rlz.nixway.zone</span></code></pre></td></tr></table></div></figure>


<p>И запишем туда следующее:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>;
</span><span class='line'>; Зона обратного просмотря для nixway.loc
</span><span class='line'>;
</span><span class='line'>$TTL 30
</span><span class='line'>@               IN      SOA     ns1.nixway.loc. root.nixway.loc. (
</span><span class='line'>         201505013      ; Serial
</span><span class='line'>                1d      ; Refresh
</span><span class='line'>                1h      ; Retry
</span><span class='line'>                1w      ; Expire
</span><span class='line'>                2h      ; Negative Cache TTL
</span><span class='line'>)
</span><span class='line'> 
</span><span class='line'>@               IN      NS      nixway.loc.
</span><span class='line'>
</span><span class='line'>10              IN      PTR     ns1.nixway.loc.
</span><span class='line'>  </span></code></pre></td></tr></table></div></figure>


<p>В этом файле должны быть только записи типа <code>PTR</code>. В конце этого файла так же должна быть пустая строка. Число <code>10</code> - это последний <a href="https://ru.wikipedia.org/wiki/%D0%9E%D0%BA%D1%82%D0%B5%D1%82_%28%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0%29">октет</a> в IP адресе нашего сервера.</p>

<p>Например, можно добавить в файл зоны прямого просмотра строку:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>router          IN      A       192.168.1.1</span></code></pre></td></tr></table></div></figure>


<p>А в файл зоны обратного просмотра строку:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>1               IN      PTR     router.nixway.loc.</span></code></pre></td></tr></table></div></figure>


<p>Тогда по адресу <code>router.nixway.loc</code> в браузере будет открываться web-интерфейс роутера (эквивалентно <em>192.168.1.1</em>), но только внутри локальной сети.</p>

<h3>Проверка</h3>

<p>Проверим файлы зон на наличие ошибок командой:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>named-checkconf -z</span></code></pre></td></tr></table></div></figure>


<p>Если ошибок нет, обновим информацию о зонах:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>rndc reload</span></code></pre></td></tr></table></div></figure>


<p>Теперь необходимо отредактировать <em>resolv.conf</em>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vim /etc/resolv.conf</span></code></pre></td></tr></table></div></figure>


<p>Приводим его в следующий вид:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>domain nixway.loc
</span><span class='line'>search nixway.loc
</span><span class='line'>nameserver 192.168.1.10
</span><span class='line'>nameserver 192.168.1.1</span></code></pre></td></tr></table></div></figure>


<p>Проверку можно сделать двумя командами:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>nslookup nixway.loc
</span><span class='line'>nslookup 192.168.1.10</span></code></pre></td></tr></table></div></figure>


<p>Которые должны выдать cледующий результат:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Имя:   nixway.loc
</span><span class='line'>Address: 192.168.1.10</span></code></pre></td></tr></table></div></figure>


<h3>Последние штрихи</h3>

<p>Если DHCP у вас раздает роутер, не забудьте установить выдаваемые по умолчанию DNS сервера 192.168.1.10 и 192.168.1.1
Проверьте корректность работы, введя в консоли Windows-машины</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>tracert nixway.loc</span></code></pre></td></tr></table></div></figure>


<p>Если маршрут пошел сразу на адрес  192.168.1.10, значит все работает корректно. Если нет, пропробуйте очистить кэш DNS и посторить еще раз:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>ipconfig /flushdns</span></code></pre></td></tr></table></div></figure>


<p>Не забудьте пробросить необходимые порты на роутере, если это необходимо конечно.</p>

<p><a href="http://forum.nixway.org/viewtopic.php?id=27">Обсуждение</a> статьи на форуме.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Skype и PulseAudio. Настройка микрофона...]]></title>
    <link href="http://nixway.org/2015/04/11/skype-i-pulseaudio-nastroika-mikrofona/"/>
    <updated>2015-04-11T16:36:28+06:00</updated>
    <id>http://nixway.org/2015/04/11/skype-i-pulseaudio-nastroika-mikrofona</id>
    <content type="html"><![CDATA[<p><img src="http://nixway.org/images/posts/2015-04-11/skype+pulseaudio+pavucontrol.png" alt="Skype &amp; PulseAudio" /></p>

<p>После выпуска Skype версии 4.3 для Linux, многие поклонники Linux столкнулись с проблемой работы микрофона в вышеупомянутом Skype. Недавно нашел более-менее универсальное решение. Оно должно подойти всем, у кого микрофон в системе работает.</p>

<!-- more -->


<p>Нам понадобится Pavucontrol.</p>

<blockquote><p>PulseAudio Volume Control (pavucontrol) - простая утилита управления звуком (микшер).
В отличие от классического микшера, он позволяет управлять звуком для устройства и каждого потока воспроизведения раздельно.
Также позволяет перенаправлять поток на другой выход не прерывая воспроизведение.</p></blockquote>

<p>Не сомневаюсь, те у кого Pavucontrol не установлен, прекрасно справится с его установкой. :) Потому описывать процесс установку я не буду.</p>

<ol>
<li>Итак, открываем Pavucontrol, переходим на вкладку Запись (Recording):<br/>
<a href="http://itmages.ru/image/view/2426287/8f1e27e9"><img src="http://storage3.static.itmages.ru/i/15/0404/s_1428122957_1207467_8f1e27e9ca.png" alt="Pavucontrol, recording tab" /></a><br/>
Как мы видим, вкладка Запись (Recording) пуста.</li>
<li>Запускаем тестовый звонок в Skype:<br/>
<a href="http://itmages.ru/image/view/2426290/2200628e"><img src="http://storage3.static.itmages.ru/i/15/0404/s_1428122957_3453301_2200628eae.png" alt="Skype, Echo - Sound Test Service" /></a></li>
<li>Переключаемся в окно Pavucontrol, там мы увидим ползунок настройки громкости для Skype:<br/>
<a href="http://itmages.ru/image/view/2426288/2a1d02a6"><img src="http://storage3.static.itmages.ru/i/15/0404/s_1428122957_2227499_2a1d02a687.png" alt="Pavucontrol, recording tab, Skype stream" /></a></li>
<li>А чуть выше ползунка настройки громкости, есть меню выбора устройства с которого Skype считывает звук. Именно в этом меню надо выбрать устройство, с которого Skype будет считывать звук:<br/>
<a href="http://itmages.ru/image/view/2426291/8576133d"><img src="http://storage4.static.itmages.ru/i/15/0404/s_1428122958_9178295_8576133d07.png" alt="Pavucontrol, recording tab, Skype stream, recording device" /></a><br/>
В моем случае это HP Webcam HD-4110. Его я и выбрал:<br/>
<img src="http://storage4.static.itmages.ru/i/15/0404/h_1428122958_6709430_eaee045f1c.png" alt="Pavucontrol, recording tab, recording device selection menu" /><br/>
После этой простенькой настройки, микрофон в Skype начал вполне сносно работать.</li>
</ol>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Octopress – Troubleshooting]]></title>
    <link href="http://nixway.org/2015/04/09/octopress-troubleshooting/"/>
    <updated>2015-04-09T21:38:00+06:00</updated>
    <id>http://nixway.org/2015/04/09/octopress-troubleshooting</id>
    <content type="html"><![CDATA[<p><img src="http://nixway.org/images/posts/2015-04-09/octopress-troubleshooting.png" alt="Troubleshooting" /></p>

<p>В данный пост я буду собирать решения всех возможных проблем, которые я встречу знакомясь с Octopress.</p>

<!--more-->


<h2>Как исправить ошибку &ldquo;build warning Layout nil requested&rdquo;.</h2>

<p>В случае если команда <code>rake generate</code> ошибку:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Build Warning: Layout 'nil' requested in blog/tags/git/atom.xml does not exist.</span></code></pre></td></tr></table></div></figure>


<p>Надо найти и исправить:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>layout: nil</span></code></pre></td></tr></table></div></figure>


<p>На:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>layout: null</span></code></pre></td></tr></table></div></figure>


<p>В следующих файлах:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>source/atom.xml
</span><span class='line'>source/robots.txt
</span><span class='line'>source/_includes/custom/category_feed.xml</span></code></pre></td></tr></table></div></figure>


<p>Вышеуказанные файлы находятся в каталоге Octopress.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Подборка тем Octopress]]></title>
    <link href="http://nixway.org/2015/04/09/octopress-themes/"/>
    <updated>2015-04-09T17:11:14+06:00</updated>
    <id>http://nixway.org/2015/04/09/octopress-themes</id>
    <content type="html"><![CDATA[<p><img src="http://nixway.org/images/posts/2015-04-09/octopress-themes.png" alt="Octopress themes" /></p>

<p>Решил сделать для себя поборку наиболее понравившихся тем Octopress. Надеюсь эта подборка понравится и вам. В комментариях можете делиться своим списком тем. Вполне возможно, я пропустил немало интересных тем.</p>

<!--more-->


<p>1. Приятная минималистичная тема <a href="https://github.com/tommy351/Octopress-Theme-Slash">Slash</a>, в серых тонах.<br/>
<a href="http://nixway.org/images/posts/2015-04-09/octopress-themes-slash.png"><img src="http://nixway.org/images/posts/2015-04-09/octopress-themes-slash-preview.png" title="Превью темы Slash" alt="Тема Slash" /></a></p>

<p>2. Строгая тема <a href="https://github.com/yang-wei/simplified">Simplified</a>, в оранжево-коричневых тонах. Яркая, но в то же время не режет глаза.<br/>
<a href="http://nixway.org/images/posts/2015-04-09/octopress-themes-simplified.png"><img src="http://nixway.org/images/posts/2015-04-09/octopress-themes-simplified-preview.png" title="Превью темы Simplified" alt="Тема Slash" /></a></p>

<p>3. Светлая тема <a href="https://github.com/lucaslew/whitespace">Whitespace</a>, в серых оттенках, не напрягает. Но в этой теме для меня есть существенный недостаток, а именно использование шрифтов не поддерживающих кириллицу.<br/>
<a href="http://nixway.org/images/posts/2015-04-09/octopress-themes-whitespace.png"><img src="http://nixway.org/images/posts/2015-04-09/octopress-themes-whitespace-preview.png" title="Превью темы Whitespace" alt="Тема Slash" /></a></p>

<p>4. Отличная серо-зеленая тема <a href="https://github.com/lijinma/jin">Jin</a>, автор lijinma.<br/>
<a href="http://nixway.org/images/posts/2015-04-09/octopress-themes-lijinma.png"><img src="http://nixway.org/images/posts/2015-04-09/octopress-themes-lijinma-preview.png" title="Превью темы Jin" alt="Тема Slash" /></a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Установка и настройка LNMP на CentOS, Debian и Gentoo]]></title>
    <link href="http://nixway.org/2013/06/12/ustanovka-i-nastroika-lnmp-na-centos-debian-gentoo/"/>
    <updated>2013-06-12T16:15:21+06:00</updated>
    <id>http://nixway.org/2013/06/12/ustanovka-i-nastroika-lnmp-na-centos-debian-gentoo</id>
    <content type="html"><![CDATA[<p><img src="http://nixway.org/images/posts/2013-06-12/nginx_to_centos_debian_and_gentoo.png" alt="nginx to CentOS, Debian and Gentoo" /></p>

<p>Это руководство открывает серию материалов по установке известных систем управления содержимым (<a href="http://ru.wikipedia.org/wiki/CMS">CMS</a>) на веб-сервер <a href="https://ru.wikipedia.org/wiki/Nginx">nginx</a>. В отдельную статью необходимо выделить общую часть, которая будет одинаковой для всех CMS, написанных на PHP (грубо говоря мы сделаем тот же <a href="http://ru.wikipedia.org/wiki/LAMP">LAMP</a>, только вместо громоздкого и неповоротливого веб-сервера <a href="https://ru.wikipedia.org/wiki/Apache_HTTP_Server">Apache</a> у нас будет nginx). Задача данного руководства – установка веб-сервера nginx, системы управления базами данных MySQL и менеджера процессов FastCGI (FPM), а также их настройка.</p>

<!--more-->


<p>* Конфигурация и установка отдельных CMS будут описаны в дополнительных материалах.</p>

<h2>Установка и запуск nginx, MySQL, PHP-FPM (Linux, nginx, MySQL, PHP - LNMP)</h2>

<p>Все приведенные ниже инструкции сначала были выполнены.<br/>
Небольшие пояснения:<br/>
- символ <code>#</code> (решётка) - означает выполнение команды от <strong>root</strong> (суперпользователя)<br/>
- <code>cat /path/to/some.file</code> - означает что ниже приведено полное содержимое файла <code>some.file</code>, расположенного в каталоге <code>/path/to</code><br/>
- <code>nano /path/to/some.file</code> - означает что надо отредактировать часть файла как указанно<br/>
- в процессе установки MySQL будет произведена предварительная настройка и задан пароль <strong>root</strong>.</p>

<p><strong><em>Gentoo:</em></strong></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># echo "dev-lang/php gd gd2 curl simplexml tokenizer dom tidy sqlite xml fpm cgi" &gt;&gt; /etc/portage/package.use
</span><span class='line'># emerge php nginx mysql</span></code></pre></td></tr></table></div></figure>


<p>Вначале необходимо произвести начальную настройку MySQL:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># emerge --config dev-db/mysql</span></code></pre></td></tr></table></div></figure>


<p><strong><em>Debian:</em></strong></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># cat /etc/apt/sources.list.d/nginx.list
</span><span class='line'>deb http://nginx.org/packages/debian/ wheezy nginx
</span><span class='line'>deb-src http://nginx.org/packages/debian/ wheezy nginx
</span><span class='line'># wget http://nginx.org/keys/nginx_signing.key && cat nginx_signing.key | apt-key add -</span></code></pre></td></tr></table></div></figure>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># apt-get install nginx php5-cli php5-common php5-fpm fcgiwrap mysql-server php5-mysql php5-gd</span></code></pre></td></tr></table></div></figure>


<p><strong><em>CentOS.</em></strong> Тут надо заметить, что в своих репозиториях CentOS нет nginx, поэтому добавим репозиторий:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># cat /etc/yum.repos.d/nginx.repo
</span><span class='line'>[nginx]
</span><span class='line'>name=nginx repo
</span><span class='line'>baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
</span><span class='line'>gpgcheck=0
</span><span class='line'>enabled=1
</span><span class='line'># yum update</span></code></pre></td></tr></table></div></figure>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># yum install nginx mysql mysql-server php-fpm php-cli php-mysql php-gd</span></code></pre></td></tr></table></div></figure>


<p>Настроить MySQL:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># service mysql start
</span><span class='line'># /usr/bin/mysql_secure_installation</span></code></pre></td></tr></table></div></figure>


<p>Управление сервисами MySQL, nginx, PHP-FPM и добавление их в автозагрузку:<br/>
<strong><em>Gentoo:</em></strong></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># /etc/init.d/nginx start
</span><span class='line'># /etc/init.d/mysql start
</span><span class='line'># /etc/init.d/php-fpm start
</span><span class='line'>
</span><span class='line'># rc-update add nginx default
</span><span class='line'># rc-update add mysql default
</span><span class='line'># rc-update add php-fpm default</span></code></pre></td></tr></table></div></figure>


<p><strong><em>Debian:</em></strong></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># /etc/init.d/nginx start
</span><span class='line'># /etc/init.d/mysql start
</span><span class='line'># /etc/init.d/php5-fpm start
</span><span class='line'>
</span><span class='line'># update-rc.d nginx defaults
</span><span class='line'># update-rc.d mysql defaults
</span><span class='line'># update-rc.d php5-fpm defaults</span></code></pre></td></tr></table></div></figure>


<p><strong><em>CentOS:</em></strong></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># service mysqld start
</span><span class='line'># service nginx start
</span><span class='line'># service php-fpm start
</span><span class='line'>
</span><span class='line'># chkconfig --levels 235 mysqld on
</span><span class='line'># chkconfig --levels 235 nginx on
</span><span class='line'># chkconfig --levels 235 php-fpm on</span></code></pre></td></tr></table></div></figure>


<p>Сразу после установки nginx понимает только статические файлы, не исполняемые на сервере, и, если установка прошла успешно, запустив его можно проверить отображение &laquo;Welcome to nginx!&raquo; на <code>localhost</code> (<code>127.0.0.1</code>):</p>

<p><img src="http://nixway.org/images/posts/2013-06-12/nginx-welcome-to-nginx.png" alt="Welcome to nginx!" /></p>

<p>Впрочем может быть и так:</p>

<p><img src="http://nixway.org/images/posts/2013-06-12/nginx-403.png" alt="403 Forbidden" /></p>

<p>Это означает, что сервер не настроен.</p>

<p>Настройки по умолчанию подходят для большинства случаев и не требуют больших изменений на данном этапе. В различных дистрибутивах Linux настройки и месторасположение конфигурационных файлов могут различаться (также это замечание относится к использованию пакетов, установленных из репозиториев, отличных от основного), здесь всё зависит от поддерживающего пакет мейнтейнера.</p>

<p>Неизменным остаётся расположение файла настроек <code>/etc/nginx/nginx.conf</code>. Конфигурации сайтов, дополнительные параметры добавляются в него через опцию <code>include</code>.
В Debian например сейчас конфигурации сайтов добавляются в стиле Apache (добавление конфигурации созданием симлинков):</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>...
</span><span class='line'>include /etc/nginx/conf.d/*.conf;
</span><span class='line'>include /etc/nginx/sites-enabled/*;
</span><span class='line'>...</span></code></pre></td></tr></table></div></figure>


<p>В официальных репозиториях этого нововведения нет и конфигурации сайтов добавляются следующим образов:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>...
</span><span class='line'>include /etc/nginx/conf.d/*.conf;
</span><span class='line'>...</span></code></pre></td></tr></table></div></figure>


<p>То есть любой файл из каталога <code>/etc/nginx/conf.d/</code> с расширением <code>.conf</code> будет добавлен.
Если каталог <code>/etc/nginx/conf.d</code> - отсутствует, создайте его:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># mkdir /etc/nginx/conf.d</span></code></pre></td></tr></table></div></figure>


<p>В <code>include</code> как правило присутствует конфигурация сайта по умолчанию, который как раз и выводит надпись &laquo;Welcome to nginx!&raquo; при обращении к <code>localhost</code> (<code>127.0.0.1</code>):</p>

<p>- Debian/Ubuntu - <code>/etc/nginx/sites-enabled/default</code>
- Gentoo/CentOS - <code>/etc/nginx/conf.d/default</code>
- Больше этот файл не нужен - удалите его.</p>

<h4>Права на каталог сайтов</h4>

<p>Создаем (если не существует) каталог для сайтов и устанавливаем права:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># mkdir -p /var/www/localhost
</span><span class='line'># chmod -R a-rwx,u+rwX,g+rX /var/www
</span><span class='line'># chown www-data:www-data -R /var/www</span></code></pre></td></tr></table></div></figure>


<p>Владельцем каталога сайтов должен быть пользователь, от имени которого запущен и работает вэб-сервер. В Debian и Ubuntu это <strong>www&#8209;data</strong>, в Gentoo, CentOS - пользователь <strong>nginx</strong>. В конфигурации за это отвечает директива <code>user</code> (<em>nginx.conf</em>):</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>user  www-data;
</span><span class='line'>worker_processes  4;
</span><span class='line'>...</span></code></pre></td></tr></table></div></figure>


<p>При переносе сайта, а также чтобы был доступ к содержимому сайта у пользователей, входящих в группу <strong>www&#8209;data</strong> необходимы корректные права на содержимое. Права на каталоги <code>775</code>, на файлы <code>664</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># find /var/www -type d -exec chmod 775 {} +
</span><span class='line'># find /var/www -type f -exec chmod 664 {} +</span></code></pre></td></tr></table></div></figure>


<p>И добавить себя в группу <strong>www&#8209;data</strong> или <strong>nginx</strong> в зависимости от дистрибутива:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># usermod -a -G www-data username</span></code></pre></td></tr></table></div></figure>


<h4>Стандартная конфигурация nginx</h4>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># Документация http://nginx.org/ru/docs/ngx_core_module.html
</span><span class='line'># Пользователь от которого работает вэб-сервер
</span><span class='line'># user nginx;
</span><span class='line'>user www-data;
</span><span class='line'># Количество рабочих процессов = количество ядер*2 /рекомендуется
</span><span class='line'>worker_processes 4;
</span><span class='line'>pid /var/run/nginx.pid;
</span><span class='line'>
</span><span class='line'>events {
</span><span class='line'>   # Максимальное число соединений, которое одновременно
</span><span class='line'>   # может открыть рабочий процесс
</span><span class='line'>   worker_connections 768;
</span><span class='line'>}
</span><span class='line'>
</span><span class='line'>http {
</span><span class='line'>   # Используем sendfile, но осторожно, если надо отдавать большие файлы,
</span><span class='line'>   # то sendfile случается вредит
</span><span class='line'>   sendfile on;
</span><span class='line'>   # Ограничиваем размер сегмента отправляемой за одну блокируемую отдачу
</span><span class='line'>   sendfile_max_chunk  128k;
</span><span class='line'>   # Буфер отдачи который используется для обрабатываемых данных
</span><span class='line'>   postpone_output  1460;
</span><span class='line'>   # Размер хеша для доменных имен.
</span><span class='line'>   server_names_hash_bucket_size 64;
</span><span class='line'>   # Размер данных принимаемых post запросом
</span><span class='line'>   client_max_body_size 15m;
</span><span class='line'>   tcp_nopush on;
</span><span class='line'>   tcp_nodelay on;
</span><span class='line'>   keepalive_timeout 65;
</span><span class='line'>   types_hash_max_size 2048;
</span><span class='line'>   # Не говорим врагу версию nginx
</span><span class='line'>   server_tokens off;
</span><span class='line'>   include /etc/nginx/mime.types;
</span><span class='line'>   default_type application/octet-stream;
</span><span class='line'>   # Настройки логирования
</span><span class='line'>   access_log /var/log/nginx/access.log;
</span><span class='line'>   error_log /var/log/nginx/error.log;
</span><span class='line'>   # Настройки компрессии
</span><span class='line'>   gzip on;
</span><span class='line'>   gzip_disable "msie6";
</span><span class='line'>   gzip_vary on;
</span><span class='line'>   gzip_proxied any;
</span><span class='line'>   gzip_comp_level 6;
</span><span class='line'>   gzip_buffers 16 8k;
</span><span class='line'>   gzip_http_version 1.1;
</span><span class='line'>   gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
</span><span class='line'>
</span><span class='line'>   include /etc/nginx/conf.d/*.conf;
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<h4>Подключение процесс менеджера PHP-FPM к веб-серверу</h4>

<p>* <strong>Важно</strong> - дополнительные пояснения - <a href="http://nixway.org/how-to/fastcgi_php_fpm_for_nginx/">FastCGI (PHP FPM) для nginx</a><br/>
* Связку nginx и PHP-FPM настраиваем на работу через unix сокет</p>

<p>Создадим новую конфигурацию для localhost:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># nano /etc/nginx/conf.d/localhost.conf
</span><span class='line'>server {
</span><span class='line'>   server_name localhost;
</span><span class='line'>   # listen 192.168.0.120:80;
</span><span class='line'>   listen 127.0.0.1:80;
</span><span class='line'>   root /var/www/localhost;
</span><span class='line'>   index index.php;
</span><span class='line'>
</span><span class='line'>   location ~ [^/]\.php(/|$) {
</span><span class='line'>      fastcgi_split_path_info ^(.+?\.php)(/.*)$;
</span><span class='line'>      if (!-f $document_root$fastcgi_script_name) {
</span><span class='line'>         return 404;
</span><span class='line'>      }
</span><span class='line'>      # fastcgi_pass 127.0.0.1:9000;
</span><span class='line'>      fastcgi_pass unix:/var/run/php5-fpm.sock;
</span><span class='line'>      fastcgi_index index.php;
</span><span class='line'>      include fastcgi_params;
</span><span class='line'>   }
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<p>и тестовый php-файл в корне</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># nano /var/www/localhost/index.php
</span><span class='line'>&lt;?php
</span><span class='line'>phpinfo();
</span><span class='line'>?&gt;</span></code></pre></td></tr></table></div></figure>


<h4>Отредактируем конфигурацию PHP-FPM:</h4>

<p><strong><em>Gentoo:</em></strong></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># nano /etc/php/fpm-php5.4/php-fpm.conf</span></code></pre></td></tr></table></div></figure>


<p><strong><em>Debian:</em></strong></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># nano /etc/php5/fpm/pool.d/www.conf</span></code></pre></td></tr></table></div></figure>


<p><strong><em>CentOS:</em></strong></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># nano /etc/php-fpm.d/www.conf</span></code></pre></td></tr></table></div></figure>


<p>Отредактируем в этом файле следующие переменные, <code>listen</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>...
</span><span class='line'>; Note: This value is mandatory.
</span><span class='line'>; listen = 127.0.0.1:9000
</span><span class='line'>listen = /var/run/php5-fpm.sock
</span><span class='line'>...</span></code></pre></td></tr></table></div></figure>


<p><code>user</code>, <code>group</code>:<br/>
* В CentOS и Gentoo - <strong>nginx</strong>, Debian/Ubuntu - <strong>www&#8209;data</strong></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>; Unix user/group of processes
</span><span class='line'>; Note: The user is mandatory. If the group is not set, the default user's group
</span><span class='line'>;       will be used.
</span><span class='line'>user = www-data
</span><span class='line'>group = www-data</span></code></pre></td></tr></table></div></figure>


<p>* в этом файле комментариями является любой текст после символа <code>;</code> (точка с запятой).</p>

<p>После чего перегружаем nginx и PHP-FPM.</p>

<p>Открываем браузер и заходим на <code>localhost</code>, в результате мы должны увидеть тестовую страницу PHP:</p>

<p><img src="http://nixway.org/images/posts/2013-06-12/nginx-phpinfo.png" alt="nginx phpinfo" /></p>

<p>Версия nginx на момент написания - стабильная - nginx/1.4.1, но это в репозитории самого nginx, в репозиториях дистрибутивов версии более ранние, и поэтому могут возникнуть небольшие нестыковки, например в openSUSE 12.3 - версия nginx/1.2.9 и это руководство почти полностью подходит, но необходимо использовать <code>/etc/nginx/fastcgi_params</code> <a href="http://nixway.org/how-to/fastcgi_php_fpm_for_nginx/">отсюда</a>.</p>

<h4>Полезные ссылки:</h4>

<p>nginx: <a href="http://nginx.org/ru/">http://nginx.org/ru/</a><br/>
nginx Wiki: <a href="http://wiki.nginx.org/nginxRu">http://wiki.nginx.org/nginxRu</a><br/>
PHP: <a href="http://www.php.net/">http://www.php.net/</a><br/>
PHP-FPM: <a href="http://php-fpm.org/">http://php-fpm.org/</a><br/>
MySQL: <a href="http://www.mysql.com/">http://www.mysql.com/</a></p>

<p>Автор статьи zenon, и изначально он выкладывал её <a href="http://linuxru.org/linux/205">здесь</a>. У себя я публикую статью с разрешения автора и с сохранением авторства.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Настройка FastCGI (PHP FPM) для Nginx]]></title>
    <link href="http://nixway.org/2013/06/11/fastcgi_php_fpm_for_nginx/"/>
    <updated>2013-06-11T18:54:03+06:00</updated>
    <id>http://nixway.org/2013/06/11/fastcgi_php_fpm_for_nginx</id>
    <content type="html"><![CDATA[<p><img src="http://nixway.org/images/posts/2013-06-11/fastcgi_php-fpm_tuning.png" alt="Nginx to CentOS, Debian and Gentoo" /></p>

<p><a href="https://ru.wikipedia.org/wiki/FastCGI">FastCGI</a> это высокопроизводительный и масштабируемый интерфейс для взаимодействия веб-сервера и приложений, дальнейшее развитие технологии CGI, однако CGI-скрипты перезапускаются с каждым запросом сервера, что существенно снижает производительность; FastCGI оставляет процессы запущенными и только передает им новые запросы.</p>

<p>nginx имеет собственную поддержку технологии FastCGI для работы с внешними серверами и утилитами. PHP тоже поддерживает FastCGI и может быть использован для обработки FastCGI-запросов от nginx.</p>

<!--more-->


<p>В данном примере мы рассмотрим связку nginx и PHP-FPM. Для начала необходимо их установить, в большинстве дистрибутивах для установки есть пакеты с одноимёнными названиями. Или, например в Gentoo, для установки необходим <code>USE</code> флаг <code>fpm</code>, более подробно смотрите в документации к своему дистрибутиву.</p>

<p>Есть много руководств по настройке nginx для работы с PHP FPM, но многие из них являются неполными (неправильно обрабатывается переменная <code>PATH_INFO</code>) или содержат ошибки в обработке сценариев безопасности (отсутствует проверка наличия PHP кода в php файле).</p>

<p>Настроить подключение nginx и PHP-FPM можно двумя способами - либо через TCP&#8209;порт (<code>127.0.0.1:9000</code>), либо unix сокет (<code>/var/run/php-fpm.sock</code>).</p>

<h4>FastCGI параметры</h4>

<p>Первая рекомендация - храните все типовые настройки FastCGI в отдельном файле и, при необходимости, импортируйте их.</p>

<p>Например для Debian и Ubuntu настройки по умолчанию находятся в файле <code>/etc/nginx/fastcgi_params</code>, который должен выглядеть следующим образом:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>fastcgi_param   QUERY_STRING            $query_string;
</span><span class='line'>fastcgi_param   REQUEST_METHOD          $request_method;
</span><span class='line'>fastcgi_param   CONTENT_TYPE            $content_type;
</span><span class='line'>fastcgi_param   CONTENT_LENGTH          $content_length;
</span><span class='line'> 
</span><span class='line'>fastcgi_param   SCRIPT_FILENAME         $document_root$fastcgi_script_name;
</span><span class='line'>fastcgi_param   SCRIPT_NAME             $fastcgi_script_name;
</span><span class='line'>fastcgi_param   PATH_INFO               $fastcgi_path_info;
</span><span class='line'>fastcgi_param   REQUEST_URI             $request_uri;
</span><span class='line'>fastcgi_param   DOCUMENT_URI            $document_uri;
</span><span class='line'>fastcgi_param   DOCUMENT_ROOT           $document_root;
</span><span class='line'>fastcgi_param   SERVER_PROTOCOL         $server_protocol;
</span><span class='line'> 
</span><span class='line'>fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
</span><span class='line'>fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;
</span><span class='line'> 
</span><span class='line'>fastcgi_param   REMOTE_ADDR             $remote_addr;
</span><span class='line'>fastcgi_param   REMOTE_PORT             $remote_port;
</span><span class='line'>fastcgi_param   SERVER_ADDR             $server_addr;
</span><span class='line'>fastcgi_param   SERVER_PORT             $server_port;
</span><span class='line'>fastcgi_param   SERVER_NAME             $server_name;
</span><span class='line'> 
</span><span class='line'>fastcgi_param   HTTPS                   $https;
</span><span class='line'> 
</span><span class='line'># PHP only, required if PHP was built with --enable-force-cgi-redirect
</span><span class='line'>fastcgi_param   REDIRECT_STATUS         200;</span></code></pre></td></tr></table></div></figure>


<h4>Подключаем Nginx к PHP FPM</h4>

<p>Тут мы должны сказать Nginx`у, чтобы проксировал запросы к PHP FPM через протокол FCGI:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>location ~ [^/]\.php(/|$) {
</span><span class='line'>    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
</span><span class='line'>    if (!-f $document_root$fastcgi_script_name) {
</span><span class='line'>         return 404;
</span><span class='line'>    }
</span><span class='line'> 
</span><span class='line'>    fastcgi_pass 127.0.0.1:9000;
</span><span class='line'>    fastcgi_index index.php;
</span><span class='line'>    include fastcgi_params;
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<p>В параметрах <code>php-fpm.conf</code> за подключение отвечает параметр <code>listen</code>.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># /etc/php/fpm-php5.X/php-fpm.conf
</span><span class='line'>...
</span><span class='line'>listen = 127.0.0.1:9000
</span><span class='line'>...</span></code></pre></td></tr></table></div></figure>


<p>В варианте подключения через unix сокет <code>fastcgi_pass</code> будет таким:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>fastcgi_pass unix:/var/run/php5-fpm.sock;</span></code></pre></td></tr></table></div></figure>


<p>А параметр <code>listen</code> вот так:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># /etc/php/fpm-php5.X/php-fpm.conf
</span><span class='line'>...
</span><span class='line'>listen = /var/run/php5-fpm.sock
</span><span class='line'>...</span></code></pre></td></tr></table></div></figure>


<p>После изменения настроек перезапустите nginx.</p>

<h4>Тестирование</h4>

<p>Создайте файл <code>test.php</code> в корневом каталоге nginx следующего содержания:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&lt;?php var_export($_SERVER)?&gt;</span></code></pre></td></tr></table></div></figure>


<p>В браузере сделайте запрос:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>/test.php
</span><span class='line'>/test.php/
</span><span class='line'>/test.php/foo
</span><span class='line'>/test.php/foo/bar.php
</span><span class='line'>/test.php/foo/bar.php?v=1</span></code></pre></td></tr></table></div></figure>


<p>Обратите внимание на значение <code>REQUEST_URI</code>, <code>SCRIPT_NAME</code>, <code>PATH_INFO</code> и <code>PHP_SELF</code>.</p>

<p>Вот правильный вывод для</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>http://example.domain/test.php/foo/bar.php?v=1 :</span></code></pre></td></tr></table></div></figure>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>array (
</span><span class='line'>  'USER' =&gt; 'www-data',
</span><span class='line'>  'HOME' =&gt; '/var/www',
</span><span class='line'>  'FCGI_ROLE' =&gt; 'RESPONDER',
</span><span class='line'>  'QUERY_STRING' =&gt; 'v=1',
</span><span class='line'>  'REQUEST_METHOD' =&gt; 'GET',
</span><span class='line'>  'CONTENT_TYPE' =&gt; '',
</span><span class='line'>  'CONTENT_LENGTH' =&gt; '',
</span><span class='line'>  'SCRIPT_FILENAME' =&gt; '/var/www/test.php',
</span><span class='line'>  'SCRIPT_NAME' =&gt; '/test.php',
</span><span class='line'>  'PATH_INFO' =&gt; '/foo/bar.php',
</span><span class='line'>  'REQUEST_URI' =&gt; '/test.php/foo/bar.php?v=1',
</span><span class='line'>  'DOCUMENT_URI' =&gt; '/test.php/foo/bar.php',
</span><span class='line'>  'DOCUMENT_ROOT' =&gt; '/var/www',
</span><span class='line'>  'SERVER_PROTOCOL' =&gt; 'HTTP/1.1',
</span><span class='line'>  'GATEWAY_INTERFACE' =&gt; 'CGI/1.1',
</span><span class='line'>  'SERVER_SOFTWARE' =&gt; 'nginx/1.4.0',
</span><span class='line'>  'REMOTE_ADDR' =&gt; '192.168.56.1',
</span><span class='line'>  'REMOTE_PORT' =&gt; '44644',
</span><span class='line'>  'SERVER_ADDR' =&gt; '192.168.56.3',
</span><span class='line'>  'SERVER_PORT' =&gt; '80',
</span><span class='line'>  'SERVER_NAME' =&gt; '',
</span><span class='line'>  'HTTPS' =&gt; '',
</span><span class='line'>  'REDIRECT_STATUS' =&gt; '200',
</span><span class='line'>  'HTTP_HOST' =&gt; 'lemp.test',
</span><span class='line'>  'HTTP_USER_AGENT' =&gt; 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:20.0) Gecko/20100101 Firefox/20.0',
</span><span class='line'>  'HTTP_ACCEPT' =&gt; 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
</span><span class='line'>  'HTTP_ACCEPT_LANGUAGE' =&gt; 'en-US,en;q=0.5',
</span><span class='line'>  'HTTP_ACCEPT_ENCODING' =&gt; 'gzip, deflate',
</span><span class='line'>  'HTTP_CONNECTION' =&gt; 'keep-alive',
</span><span class='line'>  'PHP_SELF' =&gt; '/test.php/foo/bar.php',
</span><span class='line'>  'REQUEST_TIME' =&gt; 1367829847,
</span><span class='line'>)</span></code></pre></td></tr></table></div></figure>


<p><strong>Необходимые условия:</strong><br/>
-&nbsp;Требования к PHP - версия 5.3.3 или выше.<br/>
-&nbsp;В php.ini значение <code>cgi.fix_pathinfo = 1</code> (в некоторых мануалах советуют <code>cgi.fix_pathinfo = 0</code> что может привести к не правильной обработке переменной <code>PHP_SELF</code> не равной <code>DOCUMENT_URI</code>).<br/>
-&nbsp;Регулярное выражение <code>fastcgi_split_path_info</code> должно корректно обрабатывать запросы, такие как <code>/test.php/foo/blah.php</code> или <code>/test.php/</code>.<br/>
-&nbsp;Необходимо разрешить nginx'у проверку <code>*.php</code> файлов чтобы предотвратить возможность передачи любых других файлов через PHP-FPM (например загруженные картинки).</p>

<p>Ознакомиться с более подробной информацией о FastCGI вы можете на официальном <a href="http://www.fastcgi.com/">сайте</a>.</p>

<p><a href="http://wiki.nginx.org/phpfcgiexample">Оригинал</a>.</p>
]]></content>
  </entry>
  
</feed>
