Debian, Dojo, Django, Python

Делюсь опытом в описанных технологиях. Блог в первую очередь выполняет роль памяток для меня самого.

Показаны сообщения с ярлыком linux. Показать все сообщения
Показаны сообщения с ярлыком linux. Показать все сообщения

Настройка Exim4 / Dovecot в Astra Linux SE 1.5

Настройка почты в Astra Linux 1.5 ALD

Исходные данные и задачи

Необходимо настроить сервер электронной почты, работающий в рамках домена Astra Linux 1.5 SE. Исходные данные:

Параметр Значение
Имя домена local.net
FQDN сервера server.local.net
IP-адрес сервера 192.168.0.1
Маска сети: 255.255.255.0

Настройка сети

Отключаем графический менеджер управления сетевыми подключениями wicd.

Отключение wicd
chkconfig wicd off

Прописываем настройки сети в файле /etc/network/interfaces

/etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet static
    address 192.168.0.1
    netmask 255.255.255.0
    gateway 192.168.0.1
    network 192.168.0.0
    broadcast 192.168.0.255
    dns-nameservers 192.168.0.1
    dns-search local.lan

После этого нужно выполнить перезапуск демона сети:

Перезапуск демона сети
service networking stop && service networking start

В документации к демону networking написано, что команда restart является устаревшей и работает не так, как ожидается.

Необходимо в файле /etc/hosts прописать соответствие FQDN сервера и его IP-адреса, а также задать hostname

/etc/hosts
127.0.0.1    localhost
192.168.0.1 server.local.net server

192.168.0.101 arm01.local.net arm01
192.168.0.102 arm02.local.net arm02
192.168.0.103 arm03.local.net arm03

В файле /etc/hostname меняем краткое имя компьютера server на полное server.local.net, а также изменяем текущее значение системной переменной:

hostname
echo server.local.net > /etc/hostname
hostname server.local.net

Инициализация домена

Действуем согласно официальной инструкции от РусБиТех:

ald-init
ald-init init

Появится уведомление о том, что команда init уничтожит всю базу данных LDAP и Kerberos, будут остановлены и перезапущены службы, и упадет с неба большая звезда, горящая подобно светильнику, и падет на третью часть рек и на источники вод... Отвечаем утвердительно

Попросят ввести пароли для доступа к базе данных Kerberos и пароль администратора Astra Linux Directory. Лучше записать куда-нибудь, потому что понадобится ещё не раз.

Спустя какое-то время на экране появится сообщение:

Успешная инициализация
Astra Linux Directory сконфигурирована.
Сервер ALD активен.
Клиент ALD включен.

Astra Linux Directory сервер успешно инициализирован.

Установка и настройка почтовых сервисов.

Необходимо установить три пакета:

Пакет Описание
exim4-daemon-heavy Передает сообщения и умеет работать с мандатными метками.
dovecot-imapd Умеет отдавать почту клиентам.
dovecot-gssapi Умеет принимать авторизацию на сервере через Kerberos (ALD).

Отдельно отмечу, что сразу же после установки нужно будет запустить конфигурирование exim4.

Установка и конфигурирование
aptitude install exim4-daemon-heavy dovecot-imapd dovecot-gssapi -y
dpkg-reconfigure exim4-config

Процесс настройки exim4 не очень сложный, но нужно правильно ответить на несколько вопросов.

Вопрос Ответ
Общий тип почтовой конфигурации интернет-сайт; приём и отправка почты напрямую, используя SMTP
Почтовое имя системы: local.net
IP-адреса, с которых следует ожидать входящие соединения SMTP: 192.168.0.1
Другие места назначения, для которых должна приниматься почта: local.net
Домены, для которых доступна релейная передача почты: Оставляем пустым
Машины, для которых доступна релейная передача почты: Оставляем пустым
Сокращать количество DNS-запросов до минимума (дозвон по требованию)? Нет
Метод доставки локальной почты: Maildir формат в домашнем каталоге
Разделить конфигурацию на маленькие файлы? Да

Теперь нужно удалить из каталога /var/mail файл с именем пользователя, созданного при установке системы (у меня обычно administrator).

Удаление лишнего файла
rm /var/mail/administrator

Создадим сервисы ALD для работы с почтой:

Создание сервисов ALD и ключей Kerberos
ald-admin service-add imap/server.local.lan
ald-admin sgroup-svc-add imap/server.local.lan --sgroup=mac
ald-admin sgroup-svc-add imap/server.local.lan --sgroup=mail
ald-admin service-add smtp/server.local.lan
ald-admin sgroup-svc-add smtp/server.local.lan --sgroup=mac
ald-admin sgroup-svc-add smtp/server.local.lan --sgroup=mail
ald-client update-svc-keytab imap/server.local.lan --ktfile="/var/lib/dovecot/dovecot.keytab"
ald-client update-svc-keytab smtp/server.local.lan --ktfile="/var/lib/dovecot/dovecot.keytab"

Указывая имя сервиса, важно помнить, что после слеша указывается то же самое имя сервера, что и в файле /etc/hostname. Если даже в настройках Bind вы потом укажете, что mail.local.net и smtp.local.net являются всего лишь псевдонимами для server.local.net, почта работать не будет, потому что Kerberos очень строго проверяет этот параметр.

После создания файла ключей нужно предоставить доступ к нему для dovecot:

Доступ к файлу ключей
setfacl -m u:dovecot:x /var/lib/dovecot
setfacl -m u:dovecot:r /var/lib/dovecot/dovecot.keytab

Dovecot

Выполняем настройку dovecot. Если убрать все комментарии из файлов, то получится примерно следующее (в тех файлах, где меняли):

/etc/dovecot/dovecot.conf
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap
listen = 192.168.0.1
dict {}
!include conf.d/*.conf
!include_try local.conf
/etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
auth_mechanisms = gssapi
auth_gssapi_hostname = server.local.lan
auth_krb5_keytab = /var/lib/dovecot/dovecot.keytab
!include auth-system.conf.ext

Я не могу в настройку SSL. Отключаем:

/etc/dovecot/conf.d/10-ssl.conf
ssl = no
ssl_cert = </etc/dovecot/dovecot.pem
ssl_key = </dovecot/private/dovecot.pem

Маленькая настройка для корректной работы с почтой - добавляем в файле /etc/dovecot/conf.d/10-master.conf в секцию service auth:

/etc/dovecot/conf.d/10-master.conf
# ...
service auth {
  unix_listener auth-client {
    mode = 0600
    user = Debian-exim
  }
  # ...
}

Немного упрощаем себе и пользователям жизнь, автоматически создавая на сервере каталоги под входящие, отправленные и удаленные письма при первой авторизации (параметр auto = subscribe).

/etc/dovecot/conf.d/15-mailboxes.conf
namespace inbox {
  mailbox Drafts {
    special_use = \Drafts
    auto = subscribe
  }
  mailbox Junk {
    special_use = \Junk
  }
  mailbox Trash {
    special_use = \Trash
    auto = subscribe
  }
  mailbox Sent {
    special_use = \Sent
    auto = subscribe
  }
}

Расположение каталогов внутри /var/mail/%username% можно изменить, сделав более удобным, если в /etc/dovecot/conf.d/10-mail.conf немного изменить параметр mail_location:

/etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/var/mail/%u:LAYOUT=fs

Exim4

Теперь нужно сделать пару дополнительных настроек Exim4.

/etc/exim4/conf.d/auth/33_exim4-dovecot-kerberos-ald
dovecot_gssapi:
  driver = dovecot
  public_name = GSSAPI
  server_socket = /var/run/dovecot/auth-client
  server_set_id = $auth1 # В конце цифра один, а не маленькая эль

Файл /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt очень большой, поэтому не привожу его полностью. В самом начале нужно добавить в секцию acl_check_rcpt 4 строки, чтобы выглядело примерно так:

Проверка авторизации
acl_check_rcpt:
  deny
    message = "Auth required"
    hosts = *:+relay_from_hosts
    !authenticated = *
  accept:
    hosts = :
    control = dkim_disable_verify
# и так далее

Проверка работоспособности

Заходим от имени пользователя ALD. Запускаем Thunderbird и создаем новую учетную запись. В параметрах IMAP- и SMTP-серверов пишем одно и то же - server.local.net. При нажатии кнопки "Проверка параметров" параметры авторизации должны измениться на Kerberos/GSSAPI. Сохраняем, перезапускаем почтовый клиент. После второго запуска должно загрузиться дерево папок с сервера. Пишем письмо сами себе, если пришло - все хорошо. Если нет - очень внимательно проверяем содержимое всех конфигурационных файлов. Я сам потерял три дня из-за того, что в одном месте пропустил всего одну строку.

Настройка GRUB2 в Debian

Зачем настраивать GRUB 2

Решил я настроить свой GRUB 2, потому что не все его параметры меня устраивают. Ну, например, уменьшить таймаут, увеличить разрешение, в конце концов, поменять фоновую картинку. К чему в итоге пришёл, написано ниже.

Все выполняемые операции требуют привилегий пользователя root.

Настройка разрешения

Первое, что нужно сделать - зайти в консоль самого GRUB'а при запуске. Для этого нужно нажать клавишу c, и, если пароль на загрузчик не установлен, сразу же осуществляется переход к командной строке. Тут вводим одну команду из двух (результат на моём Debian 9 одинаковый):

Команды для определения графических режимов
videoinfo
vbeinfo

Обе команды дают один и тот же результат - список доступных GRUB'у режимов видеоадаптера. Однако, всё не так просто. Дело в том, что при запуске загрузчика загружается видеодрайвер, НО ЭТО НЕ ТОТ ВИДЕОДРАЙВЕР, который даёт полный доступ ко всем режимам видеоадаптера. Таким образом, у меня, например, максимально доступное разрешение не соответствует параметрам монитора, т. е. тут не всё так просто.

В общем, параметры монитора я выяснил, теперь надо было подкрутить /etc/default/grub. Настраивать нужно именно этот файл, поскольку при вызове скрипта update-grub настройки будут взяты оттуда. Ниже привожу только те настройки, которые менял.

/etc/default/grub
GRUB_DEFAULT=0
GRUB_TIMEOUT=3
GRUB_GFXMODE=1280x1024x32          # Разрешение загрузочного меню GRUB
GRUB_GFXPAYLOAD_LINUX=1920x1080x32 # Передается в параметрах ядра
GRUB_BACKGROUND=/etc/alternatives/desktop-theme/grub/Hexagons-16x9.png
GRUB_DISABLE_OS_PROBER="true"

Краткое описание параметров:

GRUB_DEFAULT Пункт меню по умолчанию
GRUB_TIMEOUT Время в секундах до загрузки пункта по умолчанию
GRUB_GFXMODE Графический режим загрузчика. Можно указать так же значение auto.
GRUB_GFXPAYLOAD_LINUX Разрешение графического режима, которое загрузчик передаст ядру. Если указать правильное значение, можно запускать ОС сразу с нужным разрешением экрана.
GRUB_BACKGROUND Путь к фону загрузчика. Допускается использовать файлы в форматах jpg, png и tga. При необходимости изображение будет отмасштабировано под GRUB_GFXMODE. Если картинки не будет в указанном месте, загрузчик будет запущен в текстовом режиме, без какой-либо графики.
GRUB_DISABLE_OS_PROBER Запретить запуск утилиты osprober, собирающей информацию о других установленных ОС. Поскольку у меня Linux единственная ОС на этом компьютере, могу себе позволить сэкономить немного времени.

После настройки всех параметров обязательно нужно вызвать команду update-grub. Для тех систем, где используется GRUB2, данная команда является символической ссылкой на update-grub2.

Запуск Django-приложений через mod_python в Astra Linux SE

Статья не завершена. Окончательный вид она примет только после проверки работоспособности предложенного метода авторизации в реальных условиях.

Запуск Python-Web-приложений в Astra Linux

В Astra Linux до версии 1.6 не было иного способа нормального запуска Web-приложений, написанных на Python, кроме mod_python. В настоящее время самый популярный способ - WSGI, однако, в сертифицированных версиях Astra Linux SE (1.4, 1.5) есть только указанный выше модуль для Apache. Безусловно, есть и третий способ - запуск приложения в отладочном режиме через вот эту команду:

python manage.py runserver

Надо ли объяснять, что делать так не нужно?

Итак, задачи, решение которых я предлагаю в этой статье:

  • Настройка Apache для работы в рамках ALD (Astra Linux Domain)
  • Настройка виртуального хоста для Django-приложения
  • Авторизация в приложении Django через ALD/Kerberos

Настройка ALD и Apache

Все выполняемые операции требуют привилегий пользователя root.
Если кому-то покажется, что далее идёт пересказ официальной инструкции для администратора, то вам не кажется - взято отсюда.

Установка необходимых модулей Apache.

Устанавливаем два модуля Apache (считаем, что Apache уже установлен на сервере).

Установка модулей
apt-get install libapache2-auth-mod-kerb libapache2-mod-python

Включаем эти модули и перезапускаем WEB-сервер:

Включение модулей, перезапуск сервера
a2dismod auth_pam
a2enmod python
a2enmod auth_kerb

Настройка ALD.

Теперь нужно настроить сервер таким образом, чтобы клиенты, подключающиеся в рамках сессии ALD, прозрачно авторизовались на сервере. В инструкции всё описано, лишь немного постараюсь прояснить моменты, которые у меня вызвали вопросы.

Создадим принципала в ALD и добавим его в группу mac

ald-admin service-add HTTP/server.domain.lan
ald-admin sgroup-svc-add HTTP/server.domain.lan --sgroup=mac

Теперь создадим файл ключа Kerberos и дадим права на него пользователю www-data.

KEYTAB="/etc/apache2/keytab"
ald-client update-svc-keytab HTTP/server.domain.lan --ktfile=$KEYTAB
chown www:data $KEYTAB
chmod 644 $KEYTAB

Теперь можно перезапустить WEB-сервер:

service apache2 restart

Создание виртуального хоста Apache.

Подготовительные операции выполнены, на клиентах Firefox настроен на использование GSS API для авторизации (about:config, потом в параметр network.negotiate-auth.delegation-uris вписываем http://,https://). Самое время создать виртуальный хост для нашего Django-проекта, лежащего в каталоге /var/www/site/.

Apache Virtual Host: /etc/apache2/sites-available/astra-django-project
<VirtualHost *:80>
    ServerName   server.domain.lan
    ServerAdmin  useradmin@domain.lan
    DocumentRoot /var/www/site

    AddDefaultCharset utf-8

    <Directory "/var/www/site/”>
        Options -Indexes FollowSymLinks -MultiViews
        AllowOverride None

        AuthType       Kerberos
        KrbAuthRealms  DOMAIN.LAN
        KrbServiceName HTTP/server.domain.lan
        Krb5Keytab     /etc/apache2/keytab
        KrbMethodNegotiate on
        KrbMethodK5Passwd off
        KrbSaveCredentials on
        require valid-user

        Order deny,allow
        Allow from all
    </Directory>

    <Location "/">
        SetHandler    python-program
        PythonHandler django.core.handlers.modpython
        SetEnv        DJANGO_SETTINGS_MODULE site.settings
        PythonOption  diango.root /var/www/site
        PythonPath    "['/var/www/site/',] + sys.path"
        PythonAutoReload On
    </Location>

    <Location "/media/”>
        SetHandler None
    </Location>

    <Location "/static/">
        SetHandler None
    </Location>

    <LocationMatch "\.(jpg|gif|png)$">
        SetHandler None
    </Location>

    ErrorLog /var/www/site/log/error.log
    LogLevel warn
    SetEnfIf Request_URI "\.jpg$|\.gif$|\.css$|\.js" is_static
    CustomLog /var/www/site/log/access.log combined env=!is_static # Убрать лишнее из логов доступа, например, статику
</VirtualHost>

Не забываем включить наш сайт в список разрешенных:

a2ensite astra-django-project
service apache2 reload

Побочные эффекты

Возможно, у меня руки кривые, или я чего-то не знаю, но есть некоторые факты, которым я не нахожу другого объяснения, например, откусывание заголовков HTTP сервером Apache. Допустим, у нас есть вот такой код:

Возврат JSON с заголовками.
# -*- coding: utf-8 -*-

u"""Виды для обработки данных абонентов."""

from django.shortcuts import get_object_or_404
from django.views.generic import View

from abonent.models import Abonent
from rest.responses import JsonResponse

from .serializers import AbonentSimpleSerializer


class AbonentRootView(View):

    def get(self, request):
        u"""
        Именно здесь происходит сериализация модели в JSON.

        Возвращаемый объект - JsonResponse.
        """
        
        root_abonent = Abonent.objects.filter(parent=None)[0]
        serializer = AbonentSimpleSerializer()

        response = JsonResponse({
            "items": [
                serializer.serialize(root_abonent),
            ],
            "total": 1
        })

        # Тут задаем заголовки, чтобы библиотека dgrid могла с ними работать
        # Не надо смотреть на цифры, они сейчас не имеют значения (просто пример)
        response["Content-Range"] = "items: 1-1/1"

        return response

Не суть важно, как происходит сериализация (сериализатор возвращает словарь), важно то, что происходит в строке, где устанавливается заголовок ответа Content-Range. Если запустить отладочный сервер, то в заголовках ответа мы его увидим. Если выполнять этот же код с помощью Apache, т. е. так, как я выше написал, заголовок будет просто выброшен. Как это лечить в Astra Linux 1.4, я не знаю. Но, например, при использовании библиотеки DStore использовать свойство useRangeHeaders будет нельзя. Т. е. и DGrid тоже работать не будет, нужно помимо свойства items передавать ещё и total. Не такая уж большая проблема, но под определение подводного камня подходит хорошо.

Настройка DNS-сервера bind9 в Debian/Astra Linux

Цели

  • Настройка основного сервера DNS для маленькой локальной сети
  • Сервер должен быть безопасным
  • Сервер должен хранить настройки для конфигурации данной сети
  • Сервер должен обслуживать доменную зону home.net с адресами в подсети 192.168.0/24

Как обычно, если не указано иное, команды выполняются от имени пользователя root.

Исходные данные

Доменная зона home.net
Подсеть 192.168.0/24
Имя основного сервера dc.home.net
IP-адрес сервера имен 192.168.0.1
Имя первого хоста arm01.home.net
IP-адрес первого хоста 192.168.0.101
Имя N-го хоста armN.home.net
IP-адрес N-го хоста 192.168.0.(100+N)

Установка сервера

apt-get install bind9 -y

Сервер установлен, но установка сделана не безопасным способом. Нужно выполнить несколько дополнительных действий, описанных подробнее в Debian Wiki - Bind.

Будем запускать сервер в изолированном окружении:

mkdir -p /var/bind9/chroot/{etc,dev,var/cache/bind,var/run/named}
mknod /var/bind9/chroot/dev/null c 1 3
mknod /var/bind9/chroot/dev/random c 1 8
chmod 660 /var/bind9/chroot/dev/{null,random}
mv /etc/bind /var/bind9/chroot/etc
ln -s /var/bind9/chroot/etc/bind /etc/bind
chown bind:bind /var/bind9/chroot/etc/bind/rndc.key
chmod 775 /var/bind9/chroot/var/{cache/bind,run/named}
chgrp bind /var/bind9/chroot/var/{cache/bind,run/named}

Теперь нужно изменить расположение PIDFILE. Для этого в файле /etc/init.d/bind9 нужно переопределить переменную PIDFILE.

/etc/init.d/bind9
PIDFILE=/var/bind9/chroot/var/run/named/named.pid

Чтобы сервер понимал, что его запускают в изолированном окружении, нужно изменить параметры его запуска, внеся небольшие коррективы в файл /etc/default/bind9

/etc/default/bind9
OPTIONS="-u bind -t /var/bind9/chroot"

Перенастроим логирование rsyslog

echo "\$AddUnixListenSocket /var/bind9/chroot/dev/log" > /etc/rsyslog.d/bind-chroot.conf

Настройка опций сервера

Безопасность

Основные настройки сервера хранятся в файле /etc/bind/named.conf.options (на самом деле сейчас это всего лишь символическая ссылка, но на суть дела это не влияет). Добавим пару параметров для пущей безопасности в разделе options:

/etc/bind/named.conf.options
options {
    ...
    version none; // Скроем версию bind
    allow-query {
        192.168.0/24; // Отвечать будем только на запросы, приходящие из внутренней сети
    };
    ...
}

Включение в конфигурацию новой доменной зоны

В файле /etc/bind/named.conf.default-zones добавим указание на файлы прямой и обратной зоны, чтобы сервер мог обслуживать локальную сеть:

/etc/bind/named.conf.default-zones
...
zone "home.net" in { // Локальная сеть
    type master;
    file "/etc/bind/db.home.net";    // В этом файле будут адреса прямой зоны
};

zone "0.168.192.in-addr.arpa" {      // Так описывается обратная зона, т. е. первые три октета
                                     // записываются в обратном порядке и добавляется .in-addr.arpa
    type master;
    file "/etc/bind/db.0.168.192";   // В этом файле будут адреса обратной зоны
};

Прямая доменная зона

Ниже просто приведу содержимое файла /etc/bind/db.home.net.

/etc/bind/db.home.net
$TTL 3h
@   IN SOA dc.home.net. administrator.home.net. (
; Вместо @ будет подставлено автоматически имя зоны из файла /etc/bind/named.conf.default-zones
    2017092701 ; Это число нужно менять каждый раз при изменении этого файла
               ; Очень удобно взять текущее число и добавить ещё пару цифр для указания ревизии
    3h         ;
    1h         ;
    1w         ;
    1h
)

      IN NS dc.home.net. ; Указываем имя основного DNS-сервера, обслуживающего зону
                         ; Наличие пробела или табуляции в начале строки и точки
                         ; после .net обязательно

dc    IN A  192.168.0.1  ; IP-адрес сервера имен
imap  IN CNAME dc        ; Указываем, что наш DNS-сервер так же отзывается на imap.home.net
smtp  IN CNAME dc        ; и smtp.home.net

arm01 IN A 192.168.0.101
arm02 IN A 192.168.0.102
arm03 IN A 192.168.0.103
arm04 IN A 192.168.0.104
arm05 IN A 192.168.0.105
arm06 IN A 192.168.0.106
arm07 IN A 192.168.0.107
arm08 IN A 192.168.0.108
arm09 IN A 192.168.0.109
arm10 IN A 192.168.0.110

Обратная зона

Создадим файл, на который ссылается обратная зона, и заполним его по образцу:

/etc/bind/db.0.168.192
$TTL 3h
@   IN SOA dc.home.net. administrator.home.net. (
    2017092701 ; Это число тоже нужно менять
    3h         ;
    1h         ;
    1w         ;
    1h
)

      IN NS dc.home.net.

1   IN PTR dc.home.net. ; Наш сервер

101 IN PTR arm01.home.net.
102 IN PTR arm02.home.net.
103 IN PTR arm03.home.net.
104 IN PTR arm04.home.net.
105 IN PTR arm05.home.net.
106 IN PTR arm06.home.net.
107 IN PTR arm07.home.net.
108 IN PTR arm08.home.net.
109 IN PTR arm09.home.net.
110 IN PTR arm10.home.net.

Запуск сервера и проверка работоспособности

Если всё сделано правильно, точки расставлены и IP-адреса указаны верно, можно попробовать запустить наш сервер:

service bind9 start

Если вместо кучи ошибок сервер просто написал, что всё хорошо, можно проверить разрешение имен:

host arm01.home.net
host 192.168.0.9

В обоих случаях сервер должен вернуть информацию о том, на что указывает доменное имя или IP-адрес. Если вместо этого он выдает сообщение об ошибке, самое время проверить корректность конфигурационных файлов. Это делается вызовом следующих несложных команд:

named-checkconf /etc/bind/named.conf
named-checkzone home.net /etc/bind/db.home.net
named-checkzone 192.168.0 /etc/bind/db.0.168.192

Данные утилиты из состава пакета bind9utils укажут на ошибки в конфигурационных файлах.

Клиенты

Существует несколько способов настроить обращение к DNS-серверу на клиентских машинах. По скольку речь идет об операционной системе для социальной группы 'siloviki', выбор инструментальных средств невелик - wicd, /etc/network/interfaces и /etc/resolv.conf.

Первый способ отметаем сразу же, поскольку с wicd довольно много проблем. Не буду останавливаться на них подробно, но обычно первое, что приходится делать на свежеустановленной системе - убрать его из автозагрузки:

service wicd stop
chkconfig wicd off

Можно указать DNS-сервер в настройках сетевых интерфейсов, однако, в этом случае их нужно прописывать для каждого сетевого интерфейса, а я не люблю повторяться. В связи с этим просто откорректируем файл /etc/resolv.conf на клиентских машинах:

domain home.net
search home.net
nameserver 192.168.0.1

Работа в ненулевых мандатных режимах

В данном дистрибутиве реализована мандатная модель разграничения доступа, в том числе к сетевым сервисам. Чтобы обеспечить корректную работу демона named в режимах с мандатной меткой, отличной от нулевой, нужно добавить всего одну строчку в файл /etc/parsec/privsock.conf:

/usr/sbin/named

Настройка сети в Astra Linux

Все выполняемые операции требуют привилегий пользователя root.

Astra Linux использует для конфигурирования сетей собственную утилиту wicd. В общем, она довольно удобна, но у неё есть фатальный недостаток - её писали не мы сеть не будет работать до авторизации пользователя в системе. Для обычных компьютеров в этом нет ничего страшного, однако, для сервера это большая проблема, так как иногда его приходится перезагружать по SSH.

Пусть компьютеры будут находиться в сети с адресами 192.168.0.XXX, где вместо XXX - число от 1 до 254.

Настройка осуществляется путем правки файла /etc/network/interfaces. Каждый сетевой интерфейс (сетевая карта, хотя это не совсем точное название) настраивается отдельно. Настройки для сервера выглядят так:

/etc/network/interfaces
auto lo eth0

iface lo inet loopback

iface eth0 inet static
    address 192.168.0.1
    netmask 255.255.255.0
    gateway 192.168.0.1         # В качестве шлюза - наш сервер с IP=1
    network 192.168.0.0         # Указываем сеть, это обязательно для работы в составе ALD
    broadcast 192.168.0.255     # Сервер ALD начиная с Astra 1.5 выводит ошибку, если не видит
                                # этого параметра в настройках сети.
    dns-nameservers 192.168.0.1 # Тут через пробел можно перечислить ВСЕ DNS-серверы сети
    dns-search DOMAIN.NET       # Имя домена ALD

Первая строчка auto lo eth0 указывает, какие интерфейсы должны быть запущены при загрузке ОС. Отмечу, что локальная петля lo должна присутствовать там в любом случае.

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

iface Ключевое слово, говорящее о том, что дальше будет описание сетевого интерфейса
eth0 Указываем, что данный сетевой интерфейс должен быть привязан к сетевой карте eth0. Посмотреть список карт можно командой: lshw -class network
inet Указываем, что это будет настройка сети.
static При этом все настройки будут указаны вручную.
address IPv4-адрес компьютера
netmask Маска подсети.
gateway Шлюз, т. е. IP-адрес, через который идёт подключение к интернету. Обычно на сервере указывают адрес, выданный провайдером, но в нашем случае (закрытый от мира сегмент) пусть будет 192.168.150.1, т. е. компьютер обращается сам к себе.
dns-nameservers Список разделенных пробелами IP-адресов DNS-серверов. Полезно при разворачивании ЕПП под управлением Astra Linux и настройке приложения bind.

На клиентских компьютерах настройки следует выполнить аналогичным образом, меняя только четвёртый октет в поле address.

На этом настройка не заканчивается. Теперь нужно отключить автозапуск встроенных утилит и остановить уже запущенный экземпляр службы wicd, после чего перезапустить службу поддержки сети.

service wicd stop
chkconfig wicd off
rm /etc/xdg/autostart/fly-admin-wicd.desktop
service networking restart

Если на одной сетевой карте по каким-то причинам нужно иметь 2 или более IP-адресов, настройки делаются следующим образом:

/etc/network/interfaces
auto lo
iface lo inet loopback # Кстати, удалять интерфейс локальной петли не стоит,
                       # некоторые службы от этого сходят с ума и начинают
                       # выдавать весьма странные ошибки

auto eth0:0
allow-hotplug eth0:0
iface eth0:0 inet static
    address 192.168.0.1
    netmask 255.255.255.0
    network 192.168.0.0
    gateway 192.168.0.1
    broadcast 192.168.0.255
    dns-nameservers 192.168.0.1 192.168.0.2
    dns-search DOMAIN.NET

auto eth0:1
allow-hotplug eth0:1
iface eth0:1 inet static
    address 10.2.12.54      # Адрес, маска и все остальные параметры в этой
    netmask 255.255.255.128 # секции были придуманы за 20 секунд, поэтому
    network 10.2.12.0       # не ручаюсь за правильность заполнения. Гуглите
    gateway 10.2.12.1       # маску подсети для этого случая самостоятельно.
    broadcast 10.2.12.255
    dns-nameservers 8.8.8.8
    dns-search GOOGLE.RU

Посмотреть настройку сети в Debian более подробно можно на официальной Wiki-странице или её несколько устаревшей русской версии

Схема БД или таблицы в PostgreSQL

Всё время забываю, как в PostgreSQL сделать дамп схемы БД, без данных. Команда на удивление проста:

pg_dump -s -d %DATABASE_NAME% -U %USER_NAME% > %FILE_NAME%
Параметр Назначение
-s Ключ указывает на то, что нужно сделать копию только схемы БД
-d Ключ, задающий имя БД, с которой нужно работать.
-U Ключ, указывающий пользователя, от имени которого будет делаться копия схемы. Пользователь должен иметь доступ хотя бы на чтение данной БД.
%FILE_NAME% Файл, в который следует сохранить вывод. В противном случае вся схема будет выведена на экран.

А если вместо -s указать -t и потом имя таблицы, то будет снята схема только с неё, например:

pg_dump -d project -U xphoenix -t auth_users > auth_users_shema.sql

Nginx + PHP-FPM в Debian 7

Введение

В статье рассматривается настройка сервера Debian 7 для размещения проектов PHP в связке с Nginx и PHP-FPM.

Долгое время мне вполне хватало возможностей Apache для разработки моих проектов на PHP. Были некоторые трудности с .htaccess и перенаправлением всех запросов на Front Controller, однако, чуть позже я понял, что Apache уже не может полностью удовлетворить моей тяги к максимальной производительности и начал искать другие пути. Почитав, я выяснил, что доля интернет-серверов под управлением Apache неуклонно снижается на протяжении уже нескольких лет, на замену ему приходят другие, которые дают бОльшую произодительность с меньшей затратой машинных ресурсов. Среди множества решений я выбрал PHP-FPM. Судя по тестам производительности, произведённым многими энтузиастами, именно он в связке с Nginx является наиболее перспективным способом размещения сайтов на PHP.

Цели

  • Увязка PHP-FPM с nginx
  • Конфигурирование параметров сайта для его корректной работы через Front Controller

Установка необходимого ПО

Добавим в список репозитории nginx, предварительно создав файл nginx.list в каталоге /etc/apt/sources.list.d/:

cd /etc/apt/sources.list.d/
touch nginx.list
/etc/apt/sources.list.d/nginx.list
deb http://nginx.org/packages/debian/ wheezy nginx
deb-src http://nginx.org/packages/debian/ wheezy nginx

Скачиваем ключ репозитория:

wget http://nginx.org/keys/nginx_signing.key

Установка ключей в deb-системах делается так:

apt-key add nginx_signing.key

Теперь можно выполнить установку всех необходимых программ:

apt-get update && apt-get install php5 php5-fpm nginx -y
Кратко по списку:
  • php5 и php5-fpm - интерпретатор и FastCGI-сервер для него
  • nginx - проксирующий сервер, будет нашим Front-End, т.е. сервером, принимающим запросы пользователя. Не путать с Front Controller, это совершенно разные вещи!

Настройка PHP и PHP-FPM

При установке PHP-FPM создаёт внутри каталога /etc/php5 подкаталог fpm. Внутри этого каталога находится несколько нужных нам файлов и подкаталогов. Первым делом вносим изменения в файл /etc/php5/fpm/php.ini

cd /etc/php5/fpm
nano php.ini

Здесь множество настроек, которые влияют на поведение PHP. В качестве символа комментария следует использовать точку с запятой. Самыми полезными я считаю следующие настройки:

  • short_open_tag = Off - использование коротких тегов считать ошибкой. Официальная документация по PHP рекомендует не использовать короткие теги.
  • asp_tags = Off - мы тут всё-таки на PHP пишем, а не на ASP.NET
  • max_execution_time = 60 - для некоторых CMS, например, Drupal, стандартных 30 секунд часто не хватает для выполнения некоторых скриптов, например, обновления
  • error_reporting = E_ALL - разработчику нужно видеть все ошибки. Если сервер боевой, нужно выставить в значение E_ALL & ~E_DEPRECATED & ~E_STRICT
  • display_errors = On - для разработки, для боевых условий - Off
  • display_startup_errors = On - аналогично
  • post_max_size = 16M - можно и больше, если через POST будут передаваться достаточно большие объёмы данных
  • default_charset = "UTF-8" - обязательно, если хочется избавиться от большинства проблем с кодировкой. Осторожно! Настройка влияет на весь сервер. Также кодировку можно задать в самом скрипте!
  • cgi.fix_pathinfo=1 - пригодится, если приложение работает через Front Controller
  • upload_max_filesize = 32M - можно и больше, если на сервер будут загружаться большие файлы
  • default_socket_timeout = 60 - в нашем случае связь с Nginx будет именно через сокет. Не стоит выставлять слишком большие значения, это приведёт к падению производительности.

Остальные настройки в этом файле можете делать по своему усмотрению.

Теперь нужно подредактировать файл www.conf в каталоге pool.d/www.conf

nano pool.d/www.conf

Следует изменить user и group на те, от имени которых будут выполняться скрипты. Не следует выполнять их от имени root, это дыра в безопасности. Я рекомендую указывать здесь владельца каталога /var/www

user = www-data
group = www-data

Не менее важная настройка:

listen = /var/run/php5-fpm.sock

Именно через этот сокет будет производиться обмен данными с Nginx. Остальные настройки я рекомендую оставить по умолчанию. Их тонкая настройка заслуживает отдельной подробной статьи.

После сохранения изменений следует перезапустить php-fpm:

service php5-fpm restart

Настройка Nginx

Перейдём в каталог настроек nginx:

cd /etc/nginx/

Здесь нам нужны 2 файла:

  • nginx.conf - основной файл конфигурации сервера
  • fastcgi_params - настройки Nginx для работы с FastCGI-серверами, например, PHP-FPM

Я привёл содержимое этих файлов к следующему виду:

nginx.conf
user nginx;
worker_processes 2;         # По числу ядер/процессоров, либо эмпирическим путём
worker_priority  -5;        # Отрицательные числа задают более высокий приоритет
worker_rlimit_nofile 2048;  # Можно открыть сразу 2048 подключений без изменения параметров ядра

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;

    keepalive_timeout  60; #Поддерживать подключение 1 минуту

    client_max_body_size 20m; #Разрешить загрузку файлов до 20 МБ
    server_tokens off;

    #Сжатие передаваемых данных
    gzip  on;
    gzip_disable "msie6";
    gzip_comp_level 2;
    gzip_proxied any;
    gzip_types text/plain text/css application/x-javascript text/xml application/xml+rss text/javascript;

    include /etc/nginx/conf.d/*.conf;
}
В конец файла fastcgi_params нужно добавить всего одну строчку, вот эту:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Теперь в каталоге /etc/nginx/conf.d/ создадим файл site.conf

nano /etc/nginx/conf.d/site.conf
index index.php;
server {
    server_name www.site.ru;
    rewrite ^ $scheme://site.ru$request_uri? permanent;
}
server {
    server_name site.ru;
    access_log /var/www/site.ru/log/access.log;
    error_log /var/www/site.ru/log/error.log;
    root /var/www/site.ru;

    location / {
        try_files $uri $uri/ /index.php?$request_uri;
        index index.php;
    }

    location ^~ /protected/ {
        deny all;
    }

    location ~ \.php$ {
        try_files $uri = 404;
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }
}

Разберём по частям этот файл:

index index.php;

Считать страницей по-умолчанию index.php

server {
    server_name www.site.ru;
    rewrite ^ $scheme://site.ru$request_uri? permanent;
}

Все запросы на http://www.site.ru автоматически переадресовывать к http://site.ru/

server_name site.ru;
access_log /var/www/site.ru/log/access.log;
error_log /var/www/site.ru/log/error.log;
root /var/www/site.ru;

Собственно наш сервер, с указанием его имени, логов и указанием корневого каталога

location / {
    try_files $uri $uri/ /index.php?$request_uri;
    index index.php;
}

Тут указано, что все запросы вида http://site.ru/login/auth следует переадресовывать к http://site.ru/index.php - как раз то, что нужно для Front Controller'а

location ^~ /protected/ {
    deny all;
}

Запрещаем любые обращения к папке protected нашего сайта. Там лежат исходные коды, к которым будет обращаться только index.php, веб-сервер их отдавать не должен.

location ~ \.php$ {
    try_files $uri = 404;
    include fastcgi_params;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
}

Выдавать ошибку 404, если запрошенный php-файл не найден. В остальном - просто переадресовать запрос на наш PHP-FPM-сервер. Также в этих строках выполняется подключение файла настроек /etc/nginx/fastcgi_params.

После выполнения всех операций следует перезапустить сервис Nginx

service nginx restart

Если исходные файлы сайта размещены в каталоге /var/www/site.ru/, а также этот каталог содержит подкаталог log, владельцем которого является www-data, то при обращении к сайту мы увидим главную страницу.

Оптимизация PostgreSQL

В этой статье я хочу поделиться своими знаниями в области оптимизации PostgreSQL и ссылками на весьма авторитетные источники. Очень подробное руководство с полным описанием всех параметров настройки производительности (и не только) СУБД PostreSQL написал Алексей Васильев.

Вот его страничка.

А вот его замечательная книга.

Книга распространяется абсолютно бесплатно, кроме того, описанные в ней приёмы актуальны для последних версий PostgeSQL. От себя хочу лишь добавить небольшую выдержку из этого фундаментального труда.

Для оптимизации PostgreSQL я использую утилиту pgtune.

apt-get install pgtune

После её установки надо скопировать конфигурационный файл postresql.conf и запустить эту утилиту с некоторыми параметрами:

cd /etc/postgresql/9.3/main
cp postgresql.conf postgresql.conf.bak
pgtune -i postgresql.conf.bak -o postgresql.conf

Кратко по параметрам:

-i postgresql.conf.bak

Задаёт имя файла, настройки из которого нужно взять за основу

-o postgresql.conf

Имя файла, в который нужно вывести оптимизированные настройки.

Помимо этих двух параметров утилита pgtune имеет ещё кучу дополнительных опций. Самой полезной лично для меня оказалась директива

--type

Она позволяет указать, для каких целей планируется использовать СУБД, что влияет на параметры оптимизации. Для веб-сайтов, например, можно написать вот так:

pgtune -i postgresql.conf.bak -o postgresql.conf --type web

Другие ключи можно посмотреть в описании утилиты по команде

man pgtune

Apache не читает .htaccess

Столкнулся с тем, что Apache читает файл .htaccess, который я создал для своего сайта, но совершенно его не воспринимает. Длительное чтение статей выявило, что недостаточно полно был настроен файл конфигурации Apache httpd.conf. В этой статье я расскажу, что было сделано не так, и что нужно сделать. Все операции требуют привилегий root.

Содержимое файла .htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]

Эти директивы должны были бы перенаправлять все запросы к сайту с любой страницы на index.php, однако на самом деле этого не происходило и я получал сообщение Error 404: Page not found. Отходить от шаблона проектирования Front Controller я не собирался, поэтому начал читать.

В большинстве статей написано, что нужно раскомментировать следующие строки в httpd.conf:

LoadModule rewrite_module modules/mod_rewrite.so

В CentOS 6 эта строка раскомментирована по умолчанию, и нужная библиотека также присутствует в каталоге файлов Apache. В Deb-дистрибутивах этот мод по умолчанию выключен, включается командой:

a2enmod rewrite

Дальше нужно проверить, что в httpd.conf раскомментированы следующие строки:

AccessFileName .htaccess

#Какой-то текст, куча комментариев...

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>

Однако и этого недостаточно. По-умолчанию в качестве DocumentRoot для Apache указана папка /var/www/html. Соответствующие правила ее обработки описаны в httpd.conf следующими строками (комментарии удалены):

<Directory "/var/www/html">
    Options Indexes FollowSymLinks MultiViews

    AllowOverride All

    Order allow,deny
    Allow from all
</Directory>

Я выкладываю сайты на свой сервер в папку /var/www, т. е. по факту у меня DocumentRoot'ом будет выступать именно она, а не /var/www/html. Это дело привычки, просто потом при заполнении файлов конфигурации виртуальных хостов писать текста немного меньше.

Добавим в httpd.conf следующее:

<Directory "/var/www">
    Options Indexes +FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

Не забудьте перезапустить Apache:

Debian

service apache2 restart

CentOS

service httpd restart

Теперь при вводе в адресной строке URI типа http://site.lo/Login/Auth сервер будет перенаправлять запрос на index.php, а тот, в свою очередь, будет вызывать метод Auth контроллера Login, но это уже совсем другая история.

Apache Virtual Host в CentOS (виртуальные хосты Apache)

В данной статье будет рассказано о том, как настроить Apache в CentOS и разместить несколько сайтов, используя виртуальные хосты. Все операции имеет право делать только root.

Начнем с того, что в CentOS Apache называется httpd, и, соответственно, команда для установки имеет следующий вид:

yum install httpd

Нас спросят, действительно ли мы хотим этим заняться. Отвечаем y (Yes). Можно было написать и так:

yum install httpd -i

Добавим его в автозагрузку:

chkconfig httpd on

Все операции с демоном httpd осуществляются командой

/etc/init.d/httpd %команда%

или так

service httpd %команда%

Например, так можно перезапустить сервис:

service httpd restart

Список доступных команд можно посмотреть вот так:

service httpd

Все настройки Apache в CentOS хранятся в подкаталогах каталога /etc/httpd

В каталоге conf находится главный конфигурационный файл - httpd.conf.

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

Директива Listen указывает, какие порты будет слушать сервер. По умолчанию там стоит значение 80, т. е. все соединения идут с 80-го порта (мировой стандарт, если что). Если у нас специфическая ситуация, то можно поменять это значение, либо добавить другие порты, написав, например, следующее:

Listen 80
Listen 81
Listen 192.168.1.25:82

Что, собственно, здесь происходит? Listen 81 указывает, что нужно слушать также и 81 порт. Строка Listen 192.168.1.25:82 заставляет сервер прослушивать запросы, приходящие с сетевого интерфейса с адресом 192.168.1.25 через 82-ой порт.

В строке

Include conf.d/*.conf

говорится, что нужно также загрузить параметры из всех файлов с расширением .conf, находящихся в каталоге conf.d. Забегая вперед замечу, что файлы конфигураций сайтов мы будем размещать именно там.

ServerAdmin root@localhost

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

DirectoryIndex index.html index.html.var

указывает, в каком порядке искать страницы сайта, если пользователь ввел только адрес. Немного модифицируем эту строку для разработки на php:

DirectoryIndex index.php index.html index.html.var

Строки для языков у меня стерты все, за исключением двух:

AddLanguage en .en
AddLAnguage ru .ru

и соответственно

LanguagePriority ru en

Снимаем комментарий вот тут:

AddDefaultCharset UTF-8

и вот тут

NameVirtualHost *:80

Для тех, кто собирается программировать на Python, используя Django, рекомендую добавить в самом конце строку

WSGIRescrictStdout Off

Перейдем в каталог /etc/httpd/conf.d/.

Здесь мы видим несколько файлов с расширением .conf. Обычно там лежат default.conf, welcome.conf и php.conf (если уже установили PHP). Для добавления нового сайта достаточно скопировать

default.conf

и немного изменить его:

cp default.conf mysite.conf
vim mysite.conf

Внутри файла достаточно написать следующее:

<VirtualHost *:80>
    ServerName www.demo1.ru
    ServerAlias demo1.ru
    ServerAdmin admin@otheremail.com #Указываем адрес администратора этого сайта

    DocumentRoot "/var/www/demo1"
    <Directory "/var/www/demo1">
        Order allow,deny
        Allow from all
    </Directory>

    LogLevel debug #По умолчанию для всего сервера стоит значение warn, т. е. писать в лог только события не ниже предупреждения. Для разработчиков сайтов я рекомендую ставить именно debug

    ErrorLog "/var/www/demo1/log/apache_error.log" #Эти две директивы необязательны, но они помогут разобраться, какие ошибки происходят на сайте
    CustomLog "/var/www/demo1/log/apache_access.log" combined #Лог с запросами к серверу: страницы, ресурсы и т. д.

    #FileETag none
</VirtualHost>

Также рекомендую добавить следующую запись в настройки виртуального хоста:

Alias / "/var/www/demo1"

Тем самым мы указываем, какую директорию считать корнем сайта.

Внимание! Каталог /var/www/demo1/log/ должен существовать, иначе при перезапуске apache выдаст сообщение об ошибке и откажется стартовать! После всего этого перезагружаем конфигурацию apache (быстрее, чем полный перезапуск с параметром restart, особенно если с сайтом работают клиентские машины):

/etc/init.d/httpd reload

Теперь, чтобы обратиться к данному сайту по адресу, необходимо прописать сопоставление в файле hosts

Linux:   /etc/hosts
Windows: C:\Windows\System32\Drivers\etc\hosts

Любым текстовым редактором добавляем туда строки (у меня адрес сервера 192.168.1.1):

192.168.1.1 demo1.lo
192.168.1.1 www.demo1.lo

Теперь, когда я буду вводить в строке браузера demo1.lo, он будет автоматически запрашивать на сервере нужное содержимое. Обратите внимание, по умолчанию apache ищет в каталоге сайта файл index.html.

Настройка vsftpd в CentOS

Я расскажу, как настроить доступ к FTP авторизованным пользователям в CentOS 6.4 (статья давно не обновлялась, а т.к. я прочно перешёл на Debian, то ждать переписывания не стоит).

Все операции делаются от имени root.

  1. Установка

    yum install -i vsftpd
  2. После установки нужно добавить нужный демон в автозагрузку:

    chkconfig vsftpd on
  3. Откроем основной файл настроек (новички вместо vim могут использовать nano)

    vim /etc/vsftpd/vsftpd.conf
  4. Для начала закроем анонимный доступ:

    anonymous_enable=NO
  5. Открыть доступ авторизованным пользователям:

    local_enable=YES
  6. Разрешить запись:

    write_enable=YES
  7. Можно написать что угодно, это служебное сообщение, которое выводится при подключении к данному серверу:

    ftpd_banner=Welcome to my FTP-server!
  8. Сохраняем изменения и перезапускаем службу:

    /etc/init.d/vsftpd restart
  9. Следует учесть, что если нужно дать доступ в систему пользователю, у которого нет валидного shell'а, следует указать его shell как nologin командой

    usermod --shell /sbin/nologin %имя_пользователя%

    В противном случае при попытке входа на FTP пользователь будет получать ошибку автризации.

  10. Если в системе используется SELinux, то нужно разрешить несколько действий нашему демону:

    setsebool -P allow_ftpd_full_access on
    setsebool -P ftp_home_dir on

    Ключ -P используется для того, чтобы настройки сохранились после перезагрузки.

Установка и настройка PostgreSQL в CentOS

По-умолчанию в CentOS 6.4 идет Postgresql версии 8.4. Нам не надо такую старую, поэтому первым делом нужно добавить официальный репозиторий и запретить установку старых пакетов. Все операции выполняются под root'ом.

Идем сюда и смотрим ссылку на последнюю стабильную версию для CentOS. На момент написания статьи это была версия 9.2, ссылка на пакет была такой

Скачиваем его командой wget:

wget http://yum.postgresql.org/9.2/redhat/rhel-6-x86_64/pgdg-centos92-9.2-6.noarch.rpm

Если система выдает сообщение, что wget - неизвестная команда, его нужно установить:

yum install wget -y

После успешной установки повторяем запрос. Итак, Файл репозитория скачался, пора его импортировать:

rpm -i pgdg-centos92-9.2-6.noarch.rpm

Теперь необходимо запретить системе устанавливать старые пакеты из стандартного репозитория. Открываем любым редактором файл /etc/yum.repos.d/CentOS-Base.repo и добавляем в секции [base] и [updates] строку

exclude=postgresql*

Должно получиться примерно так (комментарии удалены):


[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
exclude=postgresql*

[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
exclude=postgresql*

[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

[contrib]
name=CentOS-$releasever - Contrib
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib
#baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

Теперь нужно обновить локальную копию списка пакетов:

yum update

А вот теперь можно установить сервер:

yum install postgresql92-server -y

Теперь сервер нужно настроить. Инициализируем его:

service postgresql-9.2 initdb

и добавим в автозагрузку:

chkconfig postgresql-9.2 on

Все настройки сервера хранятся в каталоге /var/lib/pgsql/9.2/data/. Отредактируем файл pg_hba.conf

vim /var/lib/pgsql/9.2/data/pg_hba.conf

В этом файле несколько строк, которые отвечают за параметры доступа к серверу. Следует обратить внимание на строку

local   all   all   ident

Не вдаваясь в детали скажу, что эта строка разрешает подключение локальных пользователей к серверу без ввода логина и пароля, если пользователь авторизован в системе. Пока не будем ничего менять, вернемся сюда позже. Сейчас нужно войти в систему под именем пользователя postgres:

su postgres

Запускаем оболочку psql

bash-4.1$ psql

Нас пускают без ввода пароля, выдавая окно приветствия:

psql (9.2.4)
Введите "help", чтобы получить справку.

postgres=#

Зададим пользователю postgres пароль, чтобы иметь возможность более простым способом авторизоваться в СУБД. Ввод точки с запятой в конце команды обязателен.

ALTER ROLE postgres WITH PASSWORD 'postgres';

Система ответит:

ALTER ROLE

Можно покинуть интерпретатор, для этого вводим в консоли команду

postgres=# \q

Выходим из-под пользователя postgres:

bash-4.1$ exit

Теперь внесем изменения в вышеуказанный файл pg_hba, приведя его примерно к такому виду:

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             192.168.1.2/32          md5

Первая строка разрешает подключение к СУБД для всех локальных пользователей, но при этом требует с них ввод пароля. Вторая делает практически то же самое, но мы эту строку оставим для того, чтобы подключаться к СУБД могли даже те пользователи, у кого нет системной учетной записи, а есть только роль в СУБД. Например, Вы добавили несколько баз данных и указали для них владельцев, но при этом не хотите, чтобы они имели возможность входить в систему. При этом эти люди не будут ограничены в работе со своей базой данных.

Последняя строка разрешает подключаться к любой базе любому пользователю с адреса 192.168.1.2, требуя взамен логин и пароль. Чтобы эта настройка работала, необходимо в файле postgresql.conf раскомментировать и изменить строку

#listen_addresses = 'localhost'

на

listen_addresses = '*'

Это заставит СУБД слушать все сетевые интерфейсы в поисках входящих подключений. Удобно (и очень опасно), если Вы хотите управлять СУБД через pgAdmin удаленно. Остальные настройки можно оставить по-умолчанию.

Перезапускаем службу:

service postgresql-9.2 restart

Если всё нормально, видим:

Останавливается служба postgresql-9.2:                     [  OK  ]
Запускается служба postgresql-9.2:                         [  OK  ]

Пробуем подключиться от имени пользователя postgres:

psql -U postgres

Поздравляю! Можете приступать к изучению консольных команд PostgreSQL. В самом простом случае Вам нужно будет создать пользователя СУБД и добавить для него базу данных. Запустите интерпретатор psql:

psql -U postgres

Введите команды:

CREATE ROLE abcd WITH PASSWORD 'dcba' LOGIN;
CREATE DATABASE aabbccdd WITH OWNER abcd;

Вы только что создали пользователя abcd с паролем dcba, разрешили ему вход в СУБД и добавили базу данных, указав, что ее владельцем является этот новый пользователь, т. е. он имеет все необходимые привилегии для работы с этой базой. Если захотите подключиться к БД aabbccdd от имени пользователя abcd, введите в консоли команду psql с вот этими ключами:

psql -U abcd -d aabbccdd

Если не указать ключ -d и имя БД следом за ним, PostgreSQL попытается подключиться к БД с тем же названием, что и имя текущего пользователя, не найдет ее и выдаст сообщение об ошибке.