Установка и настройка Apache, MySQL, PHP, Exim, Dovecot, Ruby on Rails и Redmine на CentOS 5.4

Установка и настройка Apache, MySQL, PHP, Exim, Dovecot, Ruby on Rails и Redmine на CentOS 5.4
Задача
Установка по ssh, иногда прибегая к помощи WinSCP as FAR Plugin следующего ПО на VDS:
  • CentOS 5.4 32bit (если у Вас x86_64, незабывайте делать поправку на архитектуру при установке rmp, в частности)
  • Apache 2.2.3
  • MySQL 5.1.53
  • PHP 5.3.3
  • Exim 4.72
  • Dovecot 1.0.7
  • Ruby 1.8.7
  • Rails 2.3.5
  • Redmine 1.0.4
Руководство получилось весьма обширным, в основном благодаря тому, что я старался осветить поставленные вопросы наиболее подробно. К тому же, не редко приводил тезисно (или в качестве ссылок) альтернативные варианты решения, которые не были выбраны мной в силу тех или иных причин, указанных по возможности. Описание пестрит ссылками/источниками, поскольку я старался максимально позволить читателю «владеть ситуацией», при необходимости обращаясь к этим источникам где могла быть предоставлена информация более полно и подробно.
Disclaimer
  • Поскольку я программист, постигаю азы администрирования во время решения поставленной задачи, не имея никакой теоретической базы, лишь опыт, к сожалению;
  • Крайне важным считаю отметить тот факт, что версии устанавливаемого Вами ПО должны совпадать перечисленным выше, особенно это касается mail-составляющей сервера (подробности ниже в п.7);
  • Описание в большей степень создавалось для для себя (руководствуясь правилом №5), тем не менее решил поделиться с общественностью. Может быть, найдутся пожелания и замечания — буду очень рад;
  • С одной стороны, старался сделать пункты независимыми, чтобы можно было не читать все, а обратиться лишь к интересующей информации, если есть такая необходимость. Но, поскольку, все же решается общая задача конфигурирования «от А до Я» то, с другой стороны, и связность пунктов присутствует;
  • Не претендую? ни в коем случае, на истину в последней инстанции, более того, кое-где оставляю вопросы на которые сам не нашел ответа;
  • Вряд ли Вы найдете здесь описание используемой команды или ее параметров, поскольку лучшее описание всегда будет в man.

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

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

0. Общая настройка системы

Установка Вашей timezone, осуществляется достаточно просто. Создается символическая ссылка /etc/localtime на timezone:
# rm -rf /etc/localtime
# ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime

После установки date позволит проверить успешность:
$ date
Thu Dec 5 16:59:03 MSD 2009

Существуют и другие варианты установки timezone, поэтому каждый может найти удобный для себя.

Warning! Варинат с setuptool:
# setup

к сожалению, не сработал. Видимо, не у меня одного — описание причины.

У меня не было файла hosts, что в определенный момент даже вызвало проблему, я добавил его в /etc со следующим содержимым:
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6

(Наверняка его не было так как на VDS минимальная конфигурация ОС, я взял файл с «полной сборки» CentOS 5.5)

Так же мне понадобился mc и screen. Последним рекомендую пользоваться, чтобы не испортить результат работы нескольких часов банальным дисконетом. Здесь можно быстро «научиться» им пользоваться.
Устанавливаем все очень просто:
# yum -y install mc screen

В дальнейшем, любую нехватку пакета можно устранить с помощью yum по аналогии, главное чтобы таковой нашелся в репозиториях. Я использовал: Remi, Atrpms (адаптированно для CentOS) и endpoint RPM repository (для Ruby и Ruby on Rails).

Здесь я выполнил обновление установленных пакетов. Думаю, что это разумно поскольку еще не подключено ни одного стороннего репозитория, поэтому новым версиям, из базовых репов, можно доверять. Для обновления используем:
# yum update


1. Установка Apache

Авторизуемся как root.
Проверяем, что не установлен Apache:
# rpm -qa | grep httpd

Усли команда ниже ничего не вернула — значит нет Apache, тогда ставим его:
# yum install httpd

Проверяем, что теперь он установлен:
# rpm -qa | grep -i http
httpd-2.2.3-43.el5.centos.3

При помощи следующей команды, можно добавить Apache в автозагрузку:
# chkconfig httpd on

Удовлетворимся версией из репозитория. Настройка Apache описана ниже.

2. Устанавливаем MySQL

# yum install mysql-server

Проверим, что он установлен:
# rpm -qa | grep -i mysql
mysql-libs-5.0.51a-1.fc9.i386
mysql-server-5.0.51a-1.fc9.i386
perl-DBD-MySQL-4.005-8.fc9.i386
mysql-5.0.51a-1.fc9.i386

Настроим MySQL на автоматический запуск во время загрузки системы и запустим его уже сейчас. Аналогично Apache:
# chkconfig mysqld on
# service mysqld start

После установки MySQL пользователь root для него не имеет пароля и можно авторизоваться без пароля:
# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.51a Source distribution
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.
mysql>

Очевидно, это является небезопасным, поэтому назначим пароль для root. Лучше всего для этого выполнить скрипт
# /usr/bin/mysql_secure_installation

Он позволит сделать следующее:
  • Установить пароль root;
  • Удалит пользователя anonymous;
  • Запретит авторизоваться для root с удаленных машин;
  • Удалит тестовую базу;
  • и еще несколько операций, режим интерактивный у него — читайте внимательно.
Теперь можно проверить успешность установки пароля:
# mysql -u root
ERROR 1045 (28000):Access denied for user ‘root’@'localhost’(using password:NO)
[Note: root access without password is denied]
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.0.51a Source distribution
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
+——————–+
2 rows in set (0.00 sec)

В репозиториях CentOS достаточно старый MySQL, подключим репозиторий Remi и выполним обновление.
Предварительно создадим директорию в home, например. Чем лучше tmp?:
# cd ~
# mkdir remi
# cd remi

Нижеследующие команды позиционируются для RHEL 5, но естественно, прекрасно работают на CentOS
Непосредственно загрузим и установим Remi:
# wget <a href="http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm">download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm</a>
# wget <a href="http://rpms.famillecollet.com/enterprise/remi-release-5.rpm">rpms.famillecollet.com/enterprise/remi-release-5.rpm</a>
# rpm -Uvh remi-release-5*.rpm epel-release-5*.rpm

Нужно включить репозиторий Remi, т.к. по умолчанию он выключен.
Для этого поправим файл /etc/yum.repos.d/remi.repo дабы у [remi] стало enabled=1

Проверяем какая версия MySQL установлена:
# rpm -qa | grep -i mysql

Проверяем какая последняя версия MySQL доступна для установки:
# yum check-update mysql-server

Если нужно, теперь можно обновить:
# yum update mysql-server


3. Установка PHP

# yum install php

Проверяем, был ли установлен PHP:
# rpm -qa | grep -i php

Устанавливаем MySQL модуль для PHP:
# yum search php-mysql
Loaded plugins: refresh-packagekit
=========== Matched: php-mysql =============
php-mysql.i386 : A module for PHP applications that use MySQL databases
# yum install php-mysql


// Дополнительные модули можно установить при помощи команды:
// # yum install php-common php-mbstring php-mcrypt php-devel php-xml php-gd

Аналогично MySQL, обновляем PHP (из Remi).
Проверяем установленную версию PHP.
# rpm -qa | grep -i php

Проверяем последнюю доступную в резозитории версию PHP.
# yum check-update php

Обновляем PHP.
# yum update php


// Обновляем также любые дополнительные php модули, если они были установлены ранее:
// # yum check-update php-common php-mbstring php-mcrypt php-devel php-xml php-gd
// # yum update php-common php-mbstring php-mcrypt php-devel php-xml php-gd

4. Настройка Apache, с виртуальными хостами

Предварительно не мешало бы сделать backup httpd.conf, чтобы можно было в любой момент откатиться:
# cp httpd.conf httpd.conf.original 

Это касается и всех других конфигов, которые будут подвергаться изменениям.

Редактируем файл /etc/httpd/conf/httpd.conf удобным для Вас редактором, добавляем следующие строки:
Eсли не было, тогда:
Listen 80

И в любом случае добавляем, заменим {YOUR IP} на Ваш IP адрес.
NameVirtualHost {YOUR IP}:80
Include /etc/httpd/conf/domains.conf

После этого создаем domains.conf, со следующим содержимым, учитывая что нужен vhost для домена example.com:
<VirtualHost {YOUR IP}:80>
 ServerName <a href="http://www.example.com">www.example.com</a>
 ServerAlias <a href="http://www.example.com">www.example.com</a> example.com
 ServerAdmin admin@example.com
 DocumentRoot /var/www/example.com/html
 ScriptAlias /cgi-bin/ /var/www/example.com/cgi-bin/
 UseCanonicalName OFF
 CustomLog /var/log/httpd/example.com.log combined
 ErrorLog /var/log/httpd/example.com.error.log
 LogLevel info

<Directory /var/www/example.com>
 Options +Includes -Indexes
 AllowOverride ALL
 php_admin_flag engine ON
 


Не забудьте изменить {YOUR IP} на Ваш IP.
Здесь предлагается следующая структура директорий для расположения файлов сайтов, следовательно эти директории должны существовать:
/var/www/{DOMAIN}/html
/var/www/{DOMAIN}/cgi-bin
{DOMAIN} — Ваш домен.
Запускаем Apache:
# service httpd start

Если в будущем нужно будет его перезапустить, для этого выполните:
# service httpd restart

Проверить работает ли сервис можно так:
# service httpd status

Если возникли проблемы, лучший помощник — логи, посмотреть нужный лог можно так:
# tail -f /var/log/httpd/{DOMAIN}.error.log


5. Настройка MySQL

Авторизуемся в shell MySQL как root:
# mysql -u root -p

Создаем пользователя со всеми привилегиями для нужной БД на localhost и иных хостах, если нужно. Не мешало бы использовать привилегии «по минимуму», но это не редко вызывает проблемы при развертывании backup, тогда начинаем подбирать и т.п. — тоже не очень хорошо. Может быть где-то есть список наиболее часто используемых привилегий?
В документации MySQL рекомендуется создать сначала пользователя, после чего установить привилегии для него. Хотя, на моей версии MySQL создание пользователя можно было пропустить, он создавался при установке привилегий. Установка прав и пароля пользователю для localhost:
mysql> GRANT ALL PRIVILEGES ON needdb.* TO needuser@"localhost" IDENTIFIED BY '{PASSWORD}' WITH GRANT OPTION;

Установка прав и пароля пользователю для всех иных хостов:
mysql> GRANT ALL PRIVILEGES ON needdb.* TO needuser@"%" IDENTIFIED BY '{PASSWORD}' WITH GRANT OPTION;

Примечание!
Имейте в виду, что пароль указанный в данной команде будет сохранен в истории команда MySQL, которая расположена ~/.mysql_history
Думаю, не лишним будет очистка этого файла, или некоторых его строк после выполнения всех административных операций.

6. Настройка PHP

Здесь настройка зависит от задач, которые будут решаться с помощь php.
Путь конфигурационного файла PHP: /etc/php.ini
Скорее всего придется, установить timezone для этого в этом файле найдите строку
;date.timezone = 

и замените на
date.timezone = "Europe/Moscow"

Без этой настройки у меня не правильную дату возвращали функции PHP, в частности date().

Понадобилась мне и установка ImageMagick, но он тянул за собой абсолютно не нужные на сервере иксы, поэтому решили совместно с NickLion собрать ImageMagick без иксов. Но ставить gcc и остальные необходимые пакеты на сервере не хотелось, поэтому собрали rpm, на другой машине и ее поставили на сервере.

7. Настройка почтового сервера (MTA и IMAP/POP3 сервера)

Sub disclaimer

Важно понимать тот факт, что настройка связки достаточно сильно зависит от версий, которые Вы выбрали. По крайней мере для меня этот этап был наиболее долгим и проблемным в основном благодаря тому, что версии в статях различались с версиями устанавливаемого ПО. Тут два варианта — либо используются только те версии ПО что указаны выше и все с высокой долей вероятности сразу заработает, либо берутся другие версии и «гарантировать» работоспособность данного мануала уже не получиться.
Очевидный вывод: статья неизбежно в будущем потеряет актуальность, но не стоит впадать в панику, Вы всегда может смело обратиться на Установка и настройка почтовых систем под FreeBSD, там наверняка будет что-то актуальное и полезное. И не страшно, что FreeBSD, обладая минимальными знаниями в nix системах без труда можно руководствоваться приведенными там статьями.

«Слепой» способ. Читаем, как минимум первые комментарии, чтобы устранить некоторые неточности статьи. Наверняка, не самый лучший способ, т.к. вряд ли кто-то станет ставить ПО и конфиги, не понимаю что он делает.

«Полный» способ, которым я и воспользовался, в отличие от других пунктов, описывать полностью не буду, лишь приведу ссылки на статьи взятые за основу конфигурирования и опишу основные изменения, которые вносились.
Кто-то скажет, отвратительный способ описания и, возможно, будет прав. Но с другой стороны, кому нужно разобраться с установкой и конфигурированием (а не скопировать и удовлетвориться тем что есть, такой метод подачи — то что нужно, другим смотреть быстрый способ выше) надеюсь останутся довольны.
Если все же, будет большое число желающих увидеть собранную в одном месте информацию о решении поставленной задачи на CentOS, я буду очень рад и не поленюсь описать полностью, тогда уже и более новой версией Dovecot.

Отмечу, что Exim нужно устанавливать с поддержкой Dovecot и MySQL.
Проверяем, что установленный Exim поддерживает авторизацию через Dovecot
#: exim -bV | grep dovecot
Authenticators: cram_md5 cyrus_sasl dovecot plaintext spa

Такого Exim нет в репах CentOS 5.4, поэтому я просто искал по имени в сети нужные мне rpm и устанавливал их. Очень не хотелось собирать из исходников. Ставил последнюю версию, на текущий момент это 4.72, и MySQL lookup support (exim-mysql-4.72-41.el5.i386.rpm) для него. Нашел здесь как Exim так и MySQL lookup support.
Почему подключенный репозиторий ATrpms не позволяет найти и установить этот Exim с помощью yum?
Кстати, не стоит переживать, что установленный Exim не содержит в информации о себе поддержку MySQL.
Наверное потому что «поддержка» идет отдельно? Уж простите мою темноту.
Я полагаю, что если Exim собрать с поддержкой MySQL по идеи он (mysql) должен быть виден здесь:
# exim -bV | grep Lookups
Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmnz dnsdb dsearch ldap ldapdn ldapm nis nis0 nisplus passwd sqlite

Dovecot ставил из репозитория. Кому нужна более новая версия руководствуйтесь официальным Wiki.

Основная статья по установке и настройке Exim + Dovecot.
Warning! Ориентированная на FreeBSD, но никаких трудов не составляет адаптировать под CentOS:

Права на сокеты для аутентификации мне пришлось расширить, иначе сыпались ошибки в логи.

Установка postfixadmin.

Если Exim не собирался из исходников, следовательно uid и gid для его пользователя не менялись при сборке, как описано здесь. Возможно, при установке будет уже создан пользователь с требуемыми uid и gid, короче нужно поправить/проверить эти значения в /etc/passwd для пользователя под которым запускается Exim. Значения uid=26, gid=26.
Здесь можно почитать как решается проблема с блокировкой в этой ситуации.
В этом пункте присутствует некое недопонимание — зачем нужно менять uid, gid? Почему эти значения используются при получении пользователя из БД и т.п.

Wiki с модификациями, которые обязательно необходимо наложить для указанных версий.

Очень хорошее описание тестирования установленной связки здесь.
После пунктов с установкой Exim и Dovecot. Рекомендую пройти описанные тесты, они могут помочь в решении возникших проблем.
Warning! Статья ориентированна на FreeBSD.

Добавляем установленные и настроенные сервисы в автозагрузку:
# chkconfig exim on
# chkconfig dovecot on


8. Установка Ruby on Rails и Redmine (Passenger)

За основу была взята статья из официального руководства и английский вариант how to для Passenger (mod_rails). Они, естественно, пересекаются.

В качестве альтернативы, встретил пометку о том, что «работоспособной» статей является так же — Installing Rails on CentOS 5.

Установим endpoint RPM repository (для Ruby и Ruby on Rails):
# yum update
# cd /tmp
# wget <a href="https://packages.endpoint.com/endpoint-rpmsign.pub">packages.endpoint.com/endpoint-rpmsign.pub</a>
# rpm --import endpoint-rpmsign.pub
# wget <a href="https://packages.endpoint.com/rhel/5/os/i386/endpoint-repo-1.0-1.i386.rpm">packages.endpoint.com/rhel/5/os/i386/endpoint-repo-1.0-1.i386.rpm</a> 
# yum localinstall endpoint-repo-1.0-1.i386.rpm
# yum clean all

Установим ruby-enterprise и ruby-enterprise-rubygems:
# yum install ruby-enterprise ruby-enterprise-rubygems

Перед началом установки с помощью gem можно создать файл ~/.gemrc, если такого нет, и указать в нем:
gem: --no-ri --no-rdoc

Это заставит gem в последующем не устанавливать документацию. Зачем она на сервере!?

Дальше, Ruby on Rails но версии 2.3.5, такую как требует руководство Redmine. Сначала я поставил без указания версии, в следствии чего получил Rails 3.0.3 откуда, по моему возникла проблема с "{{value}}", "{{count}}" и т. п. на страницах Redmine.
Итак, для Redmine ставим версию 2.3.5:
# gem install -v=2.3.5 rails

Если возникла ошибка о том что требуется версия 1.3.6 или выше:
bundler requires RubyGems version >= 1.3.6

Ставим последнюю версию gems:
# wget <a href="http://production.cf.rubygems.org/rubygems/rubygems-1.3.7.tgz">production.cf.rubygems.org/rubygems/rubygems-1.3.7.tgz</a>
# tar -zxvf rubygems-1.3.7.tgz
# cd rubygems-1.3.7
# ruby setup.rb config
# ruby setup.rb setup
# ruby setup.rb install

После чего установка rails отработала, напугав меня лишь последней строкой:
# gem install rails
Successfully installed thor-0.14.6
Successfully installed railties-3.0.3
Successfully installed bundler-1.0.7
Successfully installed rails-3.0.3
4 gems installed
Installing ri documentation for thor-0.14.6...
Installing ri documentation for railties-3.0.3...
Installing ri documentation for bundler-1.0.7...
Installing ri documentation for rails-3.0.3...
File not found: lib

С gems вышла странность: при установке yum говорит что версия 1.3.6 (собственно она так именована в репозитории), а установленный gem говорит иначе:
# gem -v
1.3.5

Видимо в репах ошибка закралась.

Далее выбираем подходящий для себя способ получения Redmine, можно скачать и распаковать архив, кто-то рекомендует получить из svn хранилища или git репозитория. Я выбрал первый вариант:
# cd /var/www
# wget <a href="http://rubyforge.org/frs/download.php/73457/redmine-1.0.4.tar.gz">rubyforge.org/frs/download.php/73457/redmine-1.0.4.tar.gz</a>
# tar -xvf redmine-1.0.4.tar.gz
# mv redmine-1.0.4 redmine
# cd redmine

Все же не удалось избежать установки компилятора. Явно, мы собирать ничего не будет, но а gem никак не обойдется без gcc и еще нескольких пакетов для дальнейшей установки:
# yum install mysql-devel
# yum install make gcc gcc-c++
# gem install mysql

Создаем БД и пользователя для Redmine, любым удобным для Вас способом:
# mysql -u root -p
mysql> CREATE DATABASE redmine CHARACTER SET UTF8;
mysql> GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost' IDENTIFIED BY '{PASSWORD}' WITH GRANT OPTION;
mysql> quit

Создаем копию конфикурационного файла Redmine
# cp config/database.yml.example config/database.yml

После чего редактируем его, меняя production для вновь созданной БД, подробности на официальной странице.
Далее, все как требует документация Redmine:
# rake generate_session_store
# RAILS_ENV=production rake db:migrate
# RAILS_ENV=production rake redmine:load_default_data
Поскольку все операции проводились под root, а нужно дать apache доступ, выполним:
# chown -R apache:apache files log tmp public/plugin_assets
# chmod -R 755 files log tmp public/plugin_assets

Теперь установим и сконфигурируем Passenger:
# yum install httpd-devel apr-devel
# gem install passenger
# passenger-install-apache2-module

После установки passenger добавил следующие строки в конфиг Apache — /etc/httpd/conf/httpd.conf
LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.0
PassengerRuby /usr/local/bin/ruby

Перезапустим httpd:
# service httpd restart

Теперь Redmine должен заработать успешно! Если возникли проблемы, читаем логи и мои пометки ниже.
Для справки.
Список загруженных модулей Apache можно увидеть при помощи команды:
# apachectl -t -D DUMP_MODULES

Если у возникнет проблема, что повсеместно на страницах Redmine виден текст "{{value}}", "{{count}}" и подобные, нужно сделать downgrade для i18n до 0.4.2. У меня такая проблема была, думаю из-за того что я изначально поставить rails 3.0.3, а после откатился до требуемой в доках Redmine версии v2.3.5. Решение этой же проблемы.

Спасибо за Ваше внимание и уделенное для прочтения время.
Удачи в настройке и поисках решения проблем!


1 комментарий

avatar
Спасибо за ман!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.