Перейти к собственно контенту

Блог@DeathStar.Name

Блог системного администратора

Архив

Рубрика: CentOS

Случилось так, что у одного из сайтов появилось какое-то «левое» зеркало,  которое сильно подбило позиции в поисковике. Я думал что домен просто направили на IP того сервера, на который ссылался домен. Прописал в конфиг виртуального хоста строки, запрещающие доступ к сайту по IP адресу

if ($host !~ ^(example.com|www.example.com)$ ) {
return 403;
}

Но не помогло, так как выяснилось что сайт на «левом» зеркале парсился PHP скриптами через CURL. Сразу возникла идея просто запретить доступ по User Agent, но он был изменен на GoogleBot/2.1 , и если его забанить то и поисковые боты не смогут попасть на сайт. Осталось только 1 решение, сравнивать User Agent и IP адрес, с которого был запрос, и если это реальные IP адреса гуглобота, то пропускать, иначе отдавать ошибку 403. В конфиг nginx добавляем в секцию http следующие строки ( это все IP адреса и подсети, которые использует гуглобот и которые мне удалось найти, если есть чем дополнить пишите в коментариях ):

geo $googlebotip {
default 0;
64.18.0.0/20 1;
64.233.160.0/19 1;
66.102.0.0/20 1;
66.249.80.0/20 1;
72.14.192.0/18 1;
74.125.0.0/16 1;
108.177.8.0/21 1;
172.217.0.0/19 1;
173.194.0.0/16 1;
207.126.144.0/20 1;
209.85.128.0/17 1;
216.58.192.0/19 1;
216.239.32.0/19 1;
203.208.60.0/24 1;
66.249.64.0/20 1;
72.14.199.0/24 1;
209.85.238.0/24 1;
66.249.90.0/24 1;
66.249.91.0/24 1;
66.249.92.0/24 1;
2001:4860:4000::/36 1;
2404:6800:4000::/36 1;
2607:f8b0:4000::/36 1;
2800:3f0:4000::/36 1;
2a00:1450:4000::/36 1;
2c0f:fb50:4000::/36 1;
2001:4860:4801:1::/64 1;
2001:4860:4801:2::/64 1;
2001:4860:4801:3::/64 1;
2001:4860:4801:4::/64 1;
2001:4860:4801:5::/64 1;
2001:4860:4801:6::/64 1;
2001:4860:4801:7::/64 1;
2001:4860:4801:8::/64 1;
2001:4860:4801:9::/64 1;
2001:4860:4801:a::/64 1;
2001:4860:4801:b::/64 1;
2001:4860:4801:c::/64 1;
2001:4860:4801:d::/64 1;
2001:4860:4801:e::/64 1;
2001:4860:4801:2001::/64 1;
2001:4860:4801:2002::/64 1;
104.132.0.0/21 1;
104.132.12.0/24 1;
104.132.128.0/24 (далее…)

В дополнение к статье Собственный Dynamic DNS сервер на базе Bind решил написать статью, для тех у кого есть домен c использованием Clouflare.com. В настройках CF получаем API Key. Допустим zone называется deathstar.name , мне нужно было для домашнего файлохранилища как и в предыдущей статье менять IP по крону ( метод получения внешнего немного изменен, но можно и использовать метод с предыдущей статьи )

Скрипт находится тут

ID всех записей можно узнать командой:

curl https://www.cloudflare.com/api_json.html   -d 'a=rec_load_all'   -d 'tkn=ВАШ API ключ'   -d 'email=deathstar@deathstar.name'   -d 'z=deathstar.name'

тут находим запись netdisk.deathstar.name и левее названия будет rec_id. Ставим в крон аналогично предыдущей статьи и радуемся.

При включений режима PHP как CGI вместо страничек отображался код скриптов.

Исправляем так: ( на примере CentOS 6 )
создаем файл /etc/httpd/conf.d/php-cgi.conf со следующим содержимым:
ScriptAlias /local-bin /usr/bin
AddHandler application/x-httpd-php5 php
Action application/x-httpd-php /php-bin/php

Перезапускаем apache
[root@hz2 httpd]# /etc/init.d/httpd restart
И наслаждаемся рабочим PHP-CGI.

В дополнение к этой статье решил написать данный мануал. Заказчику потребовалось с выходом PHP 7 поставить эту версию как вторую. Сервер с CentOS 6 , ISPmanager 4 и PHP 5.4.45.

Качаем последнюю версию PHP 7.0.2, распаковываем
[root@hz2 ~]# wget http://php.net/get/php-7.0.2.tar.gz/from/this/mirror
[root@hz2 ~]# tar xzvf php-7.0.2.tar.gz
[root@hz2 ~]# cd ./php-7.0.2

Конфигурируем PHP:
[root@hz2 ~]# mkdir -p /opt/php70

[root@hz2 ~]# ./configure --prefix=/opt/php70 --with-zlib-dir --with-freetype-dir --enable-mbstring --with-libxml-dir=/usr --enable-soap --enable-calendar --with-curl --with-mcrypt --with-zlib --with-gd --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-zip --with-pcre-regex --with-pdo-mysql --with-mysqli --with-jpeg-dir=/usr --with-png-dir=/usr --enable-gd-native-ttf --with-openssl --with-libdir=lib64 --enable-ftp --with-imap --with-imap-ssl --with-kerberos --with-gettext --enable-cgi

Если появляются ошибки о нехватке необходимого ПО или сорцов ставим все это дело:
[root@hz2 ~]# yum install libxml2-devel bzip2-devel curl-devel libjpeg-devel libpng-devel libX11-devel gd-devel libc-client-devel libmcrypt-devel mysql-devel

Собираем и ставим
[root@hz2 ~]# make && make install

Нам нужно сделать, что бы при использовании php как модуля апача использовалась версия 5.4.45, а при втором варианте 7.0. Будет удобно если можно будет прям определять какая версия нужна для какого сайта и пользователя. Для этого нам нужно просто заменить файл php-cgi, что мы и сделаем, но для начала сбекапим старый.

[root@hz2 ~]# mv /usr/bin/php-cgi php-cgi.back
[root@hz2 ~]# ln -s /opt/php70/bin/php-cgi /usr/bin/php-cgi

На этом все!. Заходим в панель ISPmanager и выбираем «PHP как CGI», для того, что бы у вас использовалась версия php 7.0

В дополнение к этой статье я напишу как установить Redmine и при необходимости перенести данные на сервер с ОС CentOS 6.5 и панелью ISPmanager Lite.

У нас имеется один сервер с рабочим Redmine и второй с ISPmanager Lite на котороый и будет делать перенос.

1) Ставим пакеты для сборки сорцов:

# yum install gcc-c++ patch readline readline-devel zlib zlib-devel
# yum install libyaml-devel libffi-devel openssl-devel make
# yum install bzip2 autoconf automake libtool bison iconv-devel mysql-devel

2) Устанавливаем RVM ( Ruby Version Manager ):

# curl -L get.rvm.io | bash -s stable

3) Выставляем переменные окружения:

# source /etc/profile.d/rvm.sh

4) Ставим Ruby 1.9.3 и назначаем дефолтным в системе, проверяем работоспособность:

# rvm install 1.9.3
# rvm use 1.9.3 --default

Провеверям:

# ruby --version
ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-linux]

5) Ставим Passenger и добавляем поддержку в Nginx:

# gem install passenger

Качаем исходный код nginx:

# cd /tmp
# wget http://nginx.org/download/nginx-1.7.9.tar.gz && tar xvzf nginx-1.7.9.tar.gz

Смотри с какими параметрами был уже бинарик у нас собран:

# nginx -V
nginx version: nginx/1.7.9
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
TLS SNI support enabled
configure arguments: --user=nginx --group=nginx --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --with-debug --with-http_secure_link_module --with-http_random_index_module --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module (далее…)

Как правило у большинства домашних провайдеров всегда динамические IP адреса, а так как порой надо было иметь доступ к внешнему жесткому диску MyBookLive из интернета — было решено поднять свой DynDNS сервер.
Нам потребуется домен и DNS сервер который будет обслуживать домен.
Про настройку Bind в качестве Master и Slave сервера писать не буду — в интернете куча статей, у меня крутится Bind99 на FreeBSD в качестве Master + Slave с двумя внешними IP адресами на сервере.

На клиенте ( у меня это MyBookLive с Debian на борту ) генерируем ключи для возможности удаленного обновления зоны:
dnssec-keygen -a hmac-md5 -b 128 -n USER deathstar

Должно получится два файла Kdeathstar.+157+03649.private и Kdeathstar.+157+03649.key
Смотрим содержимое файла Kdeathstar.+157+03649.key
deathstar# cat Kdeathstar.+157+03649.key
deathstar. IN KEY 0 3 157 OoMn1WMkDFdAH/ZZ9ip0Imm==

На сервере создаем файл /etc/namedb/keys.conf с таким содержимым ( значение для строки secret берем выше из файла ключа Kdeathstar.+157+03649.key на клиенте ):
key deathstar {
algorithm hmac-md5;
secret "OoMn1WMkDFdAH/ZZ9ip0Imm==";
};

Затем на сервере в файл /etc/namedb/named.conf впишите в самый конец файла:
include "/etc/namedb/keys.conf";

и приводим зону в этом же файле к такому состоянию:
zone "deathstar.name" {
type master;
file "/etc/namedb/master/deathstar.name";
allow-update { key deathstar; };
allow-query { any; };
notify yes;
};

и перезапускаем bind
deathstar# /etc/rc.d/named restart

На клиенте создаем скрипт такого вида:
#!/bin/sh

# SETTINGS
TTL=10
SERVER=ns1.deathstar.name
HOSTNAME=netdisk.deathstar.name.
ZONE=deathstar.name
KEYFILE="/etc/Kdeathstar.+157+03649.private"

IP_FILE="/tmp/myBookLiveIP"
OLDIP="$(grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' $IP_FILE)"
IP="$(wget -q checkip.dyndns.org -O - | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}')"
DNSIP="$(host -t A $HOSTNAME | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}')"

if (далее…)

В дополнение к этой статье  напишу как сделать несколько IP адресов на 3proxy:

 

Установка все как в предыдущей статье

( в CentOS : yum install -y 3proxy

Debian / Ubuntu: apt-get install 3proxy )

но конфиг уже выглядит иначе

# Name servers
nserver 8.8.8.8
nserver 8.8.4.4
# nscache is good to save speed, traffic and bandwidth
nscache 65536

# Here we can change timeout values

users user:CL:password

daemon

log /var/log/3proxy/3proxy.log
logformat «- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T»
archiver gz /bin/gzip %F
rotate 30

auth strong
allow * * * *

proxy -n -a -p3128 -i100.218.211.82 -e100.218.211.82 -p3128
proxy -n -a -p3128 -i142.218.209.164 -e142.218.209.164 -p3128
proxy -n -a -p3128 -i167.248.229.155 -e167.248.229.155 -p3128
proxy -n -a -p3128 -i162.211.209.142 -e162.211.209.142 -p3128
proxy -n -a -p3128 -i162.213.109.133 -e162.213.109.133 -p3128
proxy -n -a -p3128 -i162.219.302.124 -e162.219.302.124 -p3128

auth strong

flush

maxconn 32
socks -n -a -p3128 -i100.218.211.82 -e100.218.211.82 -p3128
socks -n -a -p3128 -i142.218.209.164 -e142.218.209.164 -p3128
socks -n -a -p3128 -i167.248.229.155 -e167.248.229.155 -p3128
socks -n -a -p3128 -i162.211.209.142 -e162.211.209.142 -p3128
socks -n -a -p3128 -i162.213.109.133 -e162.213.109.133 -p3128
socks -n -a -p3128 -i162.219.302.124 -e162.219.302.124 -p3128

setgid 65535
setuid 65535

При входе в панельку по адресу https://X.X.X.X/manager/ пишет вот такую ошибку
Request timeout to panel reached. Panel has not started yet.
Но по адресу https://X.X.X.X/manager/ispmgr панелька открывется,

Причина ошибки — обновиление панельки с версии 4.4.10.6 на 4.4.10.8.

Для того, чтобы пофиксить эту проблему выполняем следующую команду
# echo 'ispmgr' > /usr/local/ispmgr/bin/index
то есть создаем в каталоге файл index с содержимым ispmgr.

В дополнение к статье по настройке почтового сервера на FreeBSD решил написать как настроить тоже самое, но на ОС CentOS 6.

Подключаем репозиторий Remi и Epel

rpm --import https://fedoraproject.org/static/0608B895.txt
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-7.noarch.rpm
yum install yum-priorities
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

Приводим файл /etc/yum.repos.d/epel.repo к такому виду

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

и файл /etc/yum.repos.d/remi.repo к такому виду:

[remi]
name=Les RPM de remi pour Enterprise Linux $releasever - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/remi/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/remi/mirror
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
failovermethod=priority

[remi-test]
name=Les RPM de remi en test pour Enterprise Linux $releasever - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/test/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/test/mirror
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

Ставим MySQL , добавляем в атозагрузку и стартуем:

yum install mysql mysql-server
chkconfig --levels 235 mysqld on
/etc/init.d/mysqld start

Установим пароь для root в MySQL следующей командой:

mysql_secure_installation

Устанавливаем nginx ( да да, как и в прошлый раз мы обойдемся без тяжеловесного Apache и сделаем все на NGINX + PHP-FPM ), добавим в автозагрузку и стартуем
yum install nginx
chkconfig --levels 235 nginx on
/etc/init.d/nginx start

Ставим PHP-FPM и необходимые модули PHP:

yum --enablerepo=remi,remi-test install php php-fpm php-common php-pear php-pdo php-mysql php-pgsql php-pecl-memcache php-gd php-mbstring php-mcrypt php-xml php-pear-DB php-posix

Приводим файл /etc/php-fpm.conf к такому виду:

[global]
pid = /var/run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/error.log
include=/etc/php-fpm.d/*.conf

А файл /etc/php-fpm.d/www.conf к такому:

[www]
listen = /tmp/php-fpm.sock
user = apache
group = apache
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_value[memory_limit] = 128M

Настраиваем nginx. Для этого приводим файл /etc/nginx/nginx.conf к такому виду:

user apache;
worker_processes 2;

error_log /var/log/nginx/error.log;

pid /var/run/nginx.pid;

events {
use epoll;
worker_connections 8192;
}

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;
client_body_buffer_size 16K;
client_header_buffer_size 1k;
client_max_body_size 32M;
large_client_header_buffers 2 1k;
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 5 5;
send_timeout 10;
reset_timedout_connection on;
server_tokens off;
gzip on;

# PHP-FPM

upstream php-fpm {
server unix:/tmp/php-fpm.sock;
}

# Virtual hosts

include /etc/nginx/conf.d/*.conf;

}

и создаем файлы виртуальых хостов:
1) Для Vexim ( /etc/nginx/conf.d/exim.deathstar.name.conf ) файл выглядит вот так:

server
{
listen 80;
server_name exim.deathstar.name;
access_log /var/log/nginx/exim-access.log;
error_log /var/log/nginx/exim-error.log;
root /usr/share/vexim2/vexim;
index index.php;
charset utf-8;

location = /favicon.ico {
log_not_found off;
access_log off;
}

location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

location ~ .php$
{
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

location ~ /.ht
{
deny all;
}
}

2) Для Roundcube файл ( /etc/nginx/conf.d/mail.deathstar.name.conf ) выглядит так:

server
{
listen 80;
server_name mail.deathstar.name;
access_log /var/log/nginx/mail-access.log;
error_log /var/log/nginx/mail-error.log;
root /usr/share/roundcubemail;
index index.php;
charset utf-8;

location = /favicon.ico {
log_not_found off;
access_log off;
}

location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

location ~ .php$
{
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

location ~ /.ht
{
deny all;
}
}
и перезагружаем nginx:

/etc/init.d/nginx restart

Устанавливаем Exim,Dovecot и прочее ПО:

yum install -y exim exim-mysql dovecot dovecot-mysql clamd clamav spamassassin

Скачиваем и распаковываем Vexim
cd /usr/share/
wget http://silverwraith.com/vexim/vexim2.2.1.tar.gz
tar zxvf vexim2.2.1.tar.gz
chown -R root:root vexim2/

Копируем конфиги из Vexim в каталог с Exim

mv /etc/exim/exim.conf /etc/exim/exim.conf.bak
cp /usr/share/vexim2/docs/configure /etc/exim/exim.conf
cp /usr/share/vexim2/docs/vexim-* /etc/exim/

Добавляем юзера Vexim

useradd vexim -u 90 -d /usr/local/mail -s /sbin/nologin -m

Устанавливаем БД для Vexim

perl /usr/share/vexim2/setup/create_db.pl --act=newdb --dbtype=mysql --uid=93 –gid=93 --mailstore=/usr/local/mail

Редактируем файл

/usr/share/vexim2/vexim/config/variables.php

и прописываем доступ к БД

$sqldb = "vexim"; имя БД
$sqluser = "vexim"; логин
$sqlpass = "PASSWORD"; пароль заданный ранее

Отключим и удалим Postfix, который по умолчанию уже стоит в системе CentOS 6.

alternatives --config mta
chkconfig --level 123456 postfix off
service postfix stop
yum remove postfix -y

Отключаем SELINUX:
echo 'SELNIUX=disabled' >> /etc/selinux/config

Добавлеяем сервисов в автозагрузку
chkconfig --level 35 clamav on
chkconfig --level 35 spamassasin on
chkconfig --level 35 exim on
chkconfig --level 35 dovecot on

Выставляем права:

usermod -a -G exim clamav
chmod -Rf g+w /var/spool/exim
chmod -Rf g+s /var/spool/exim
chown exim:exim -R /usr/local/mail
chown exim:exim -R /var/spool/exim

Правим пути в конфиге Exim:

cd /etc/exim/
sed -i.bak -e ‘s//usr/local/etc//etc/g’ exim.conf
sed -i.bak -e ‘s/MAILMAN_USER=mailnull/MAILMAN_USER=exim/g’ -e ‘s/MAILMAN_GROUP=mail/MAILMAN_GROUP=exim/g’ exim.conf

Находим в конфигe exim строку:
MY_IP = CHANGE и описываем свой ip
MY_IP = 46.38.63.5
Находим:
trusted_users = avleen:www
и меняем на apache . Остается:

trusted_users = apache
Менякем юзера, от которого будет запускаться exim, меняем строки

exim_user = mailnull
exim_group = mail

на
exim_user = exim
exim_group = exim

Находим закоментированную строку, отвечающую за подключение к MySQL серверу,раскоментируем ее и поставим там свой пароль:
hide mysql_servers = localhost::(/tmp/mysql.sock)/vexim/vexim/PASSWORD

Находим секцию system_aliases: и в ней меняем строки

user = mailnull
group = mail

на
user = exim
group = exim

И запускаем:
service exim start

Настраиваем Dovecot:
Приводим конфиг /etc/dovecot/dovecot.conf к такому виду:

base_dir = /var/run/dovecot/
disable_plaintext_auth = no
first_valid_uid = 93
listen = *
login_greeting = Dovecot ready man.
login_log_format_elements = user=< %u> method=%m rip=%r lip=%l %c
mail_location = maildir:~/Maildir
log_path =/var/log/dovecot

# Log file to use for informational and debug messages.
# Default is the same as log_path.
#info_log_path =

# Prefix for each line written to log file. % codes are in strftime(3)
# format.
log_timestamp = "%b %d %H:%M:%S "

passdb {
driver = pam
}
passdb {
args = /etc/dovecot/dovecot-mysql.conf
driver = sql
}
protocols = imap pop3
service auth {
unix_listener auth-master {
group = exim
mode = 0660
user = exim
}
user = root
}
service imap-login {
chroot =
client_limit = 256
process_limit = 128
process_min_avail = 3
service_count = 1
vsz_limit = 64 M
}
service pop3-login {
chroot =
client_limit = 256
process_limit = 128
process_min_avail = 3
service_count = 1
vsz_limit = 64 M
}
ssl = no
userdb {
driver = passwd
}
userdb {
args = /etc/dovecot/dovecot-mysql.conf
driver = sql
}
protocol imap {
imap_client_workarounds = tb-extra-mailbox-sep
mail_plugins = quota imap_quota
}
protocol pop3 {
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
pop3_uidl_format = %08Xu%08Xv
}

Настраиваем подключение к MySQL в файле /etc/dovecot/dovecot-mysql.conf
driver = mysql
connect = host=/var/lib/mysql/mysql.sock user=vexim password=PASSWORD dbname=vexim
default_pass_scheme = MD5-CRYPT
password_query = SELECT crypt as `password` FROM users,domains WHERE users.username = '%u' AND users.enabled = '1' AND users.type = 'local' and domains.enabled = '1' and domains.domain_id = users.domain_id
user_query = SELECT pop as home, uid, gid FROM users WHERE username = '%u'

И запускаем все:

/etc/init.d/dovecot start
/etc/init.d/clamav start
/etc/init.d/spamassassin start

Устанавливаем roundcube

cd /usr/share
wget http://sourceforge.net/projects/roundcubemail/files/roundcubemail/0.8.1/roundcubemail-0.8.1.tar.gz
tar zxvf roundcubemail-0.8.1.tar.gz

mv roundcubemail-0.8.1 roundcubemail
chown -R apache:apache roundcubemail/
chmod -R 777 roundcubemail/temp/ roundcubemail/logs/

Создаем базу

mysql -p
Enter password: ( вводим пароль от root MySQL )
Welcome to the MySQL monitor. Commands end with ; or g.

Вводим команду
CREATE DATABASE roundcubemail DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

И команду
GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY 'password'; ( вместо password пишем пароль для юзера roundcube )

и выходим командой quit

Импортируем БД
mysql -p roundcubemail < roundcubemail/SQL/mysql.initial.sql ( вводим пароль от root MySQL )

Копируем конфиги

cp roundcubemail/config/db.inc.php.dist roundcubemail/config/db.inc.php
cp roundcubemail/config/main.inc.php.dist roundcubemail/config/main.inc.php

редактируем файл roundcubemail/config/db.inc.php

и вместо pass пишем пароль заведенный для юзера roundcube
$rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';

Редактируем roundcubemail/config/main.inc.php

и заменяем в нем строки:
$rcmail_config['default_host'] = ''; на
$rcmail_config['default_host'] = 'localhost';

$rcmail_config['smtp_server'] = ''; на
$rcmail_config['smtp_server'] = 'localhost';

$rcmail_config['smtp_user'] = ''; на

$rcmail_config['smtp_user'] = '%u';

$rcmail_config['smtp_pass'] = ''; на
$rcmail_config['smtp_pass'] = '%p';

$rcmail_config['smtp_auth_type'] = ''; на
$rcmail_config['smtp_auth_type'] = 'CRAM-MD5';

$rcmail_config['language'] = ; на
$rcmail_config['language'] = ru_RU;

$rcmail_config['create_default_folders'] = false; на
$rcmail_config['create_default_folders'] = true;

$rcmail_config['default_charset'] = ''; на
$rcmail_config['default_charset'] = 'UTF-8';

и сохраняем.

Теперь Roundcube доступен по адресу http://mail.deathstar.name а Vexim по http://exim.deathstar.name

Добавляем в конфиг nginx в секцию http такие строки:

## FastCGI Cache
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
fastcgi_cache_path /tmp/nginx/cache levels=2 keys_zone=sites:100m inactive=1d max_size=10g;

и в описание вирт хоста в секцию сервер пишем:

### Fast-CGI Cache

location / {
if ($request_uri ~* "\.(ico|css|js|gif|jpe?g|png)$") {
expires max;

}
}

if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
set $do_not_cache 1;
}

fastcgi_cache_bypass $do_not_cache;
fastcgi_no_cache $do_not_cache;
fastcgi_pass_header Cookie;
fastcgi_cache sites;
fastcgi_cache_key $request_method|$host|$request_uri;
fastcgi_cache_valid 301 8h;
fastcgi_cache_valid 404 1h;
fastcgi_cache_valid 200 1h;

Создаем каталог для кеша и выставляем права:
mkdir -p /tmp/nginx/cache
chmod -R 777 /tmp/nginx/cache

Перезапускаем nginx :

/usr/local/etc/rc.d/nginx restart

Лазаем по сайту и смотри в каталог с кешем:

deathstar# ls /tmp/nginx/cache
00 0e 1c 2a 38 46 54 62 70 7e 8c 9a a8 b6 c4 d2 e0 ee fc
01 0f 1d 2b 39 47 55 63 71 7f 8d 9b a9 b7 c5 d3 e1 ef fd
02 10 1e 2c 3a 48 56 64 72 80 8e 9c aa b8 c6 d4 e2 f0 fe
03 11 1f 2d 3b 49 57 65 73 81 8f 9d ab b9 c7 d5 e3 f1 ff
04 12 20 2e 3c 4a 58 66 74 82 (далее…)