Еще один нужный вещь, который я не успел выдернуть (а именно конфиг нгиныкса) лежит тут. Хотя впрочем его можно собрать и по манам с сайта Игоря Сысоева. Но удобнее иметь готовый, правда?
Вчера наконец разобрался с давно нервировавшм меня косяком. Косяк в том, что simplepie отказывался нормально тянуть фиды. Проявлялось причем на всем - как на обычном вордпрессовоском агрегаторе, который виджет, так и на feedwordpress и wp-o-matic. То есть тянуть то он их тянул, но при этом коцал тэги < > & - в таком духе. Естественно, часть фидов превращалась в какую-то хренотень, потому что хтмл-разметка лезла в текст. Самое сложное как всегда было найт причину. А она в том, что libxml, начиная с версии 2.7.0 коцал эти тэги. Баг типа вылечен в версии 2.7.2, как заявляется. Но на самом деле это не так. Лечение работает только для php 5.2.8, а для более ранних версий - хрен. Пришлось пересобрать апач с похапе 5.2.8 и либхмл 2.7.3. Попутно стало понятно, что на whm+nginx автоапдейт с easyapache не работает. Чтобы заработал, надо убрать Main >> Service Configuration >> Apache Setup > Include Editor > Pre Main Include, пересобрать и после этого запихать скрипт обратно. Естественно, перед этим надо /usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
Этот пост больше для себя, чтобы не забыть, но кому то он может тоже оказаться полезным.
Задача стояла собрать на недорогом VDS конструкцию, не сильно потребляющую память под довольно наргуженную веб-приладу. Апач отпадал даже на бэкенде потому как очень уж он прожорлив. К тому же, в силу специфики моей прилады в бэкенде он тоже разрастался, хотя и не так сильно.
Поэтому было принято решение поднять чистый Nginx. Сам Nginx PHP не поддерживает, но позволяет подцепить его как cgi, что собственно и было реализовано.
Нужно сказать, что такая связка в зависимости от типа приложения (CMS) может давать где-то от 1.5 до 5 раз экономии памяти по сравнению с апачем и примерно во столько же раз быстрее работать. Но есть ограничения - большинство CMS по сути писаны под апач и их установка на “неродной” сервер требует некоторых танцев с бубном. Плюс Nginx не поддерживает некоторые фичи, которые есть в апаче (например .htaccess), опять же нужны ручные правки конфига. Поэтому область применения “чистого” Nginx ограничена и большее распространение получила связка Nginx-фронтенд <-> Apache-бэкенд. Как ставить ее на Cpanel/WHM я уже как то писал.
Тем не менее, бенифиты конфигурации очень значительны. Как же она собирается.
В качестве базовых были взяты две очень толковых статьи -
Для начала сносим апач, он нам больше не понадобится
rpm -e httpd –nodeps
тем же образом другие ненужные вам пакеты, я например вынес mysql, почту, спамассасин и еще какой то мусор.
Заводим юзера и группу от которой будет работать веб-сервер
groupadd www-data
useradd -g www-data www-data
Ставим nginx по конфиг в /usr/nginx/conf/nginx.conf Меняем юзера nobody на www-data
Проверяем (service nginx start и смотрим на страничку “Welcome to Nginx”) - работает? Тогда раскомментируем кусок конфига про php и идем дальше.
Теперь по мануалу тупым копи-пастом ничего не выдумывая ставим php-fpm.
Поставили - подкладываем конфиги
В конфиге php-fpm.conf меняем юзера nobody на www-data, увеличиваем max_children (значение подбирается экспериментально под имеющуюся память, у меня 100). Если прилада имеет свойство течь (кривые скрипты и пр.), уменьшаем max_requests до сотни-другой.
Я также в обеих конфигах поменял listen address c /tmp/php-fpm.sock на 127.0.0.1:9000, на unix сокете почему-то не заработало, разбираться было лень.
Меня окончательно утомили тормоза апача на моем ВДС (700 метров памяти, центос-5, whm/cpanel, апач 2.2, куплен в ТекТонике, рекомендую). Причина банальна - выжирание памяти апачем при довольно смешной нагрузке в 2-2.5 тысячи пользователей в день. Тюнинг maxclients помог, но не сильно (зарежешь число клиентов чтобы стало больше свободной памяти - начинаются еще более страшные тормоза).
Поэтому было принято дальше кота за яйца не тянуть и перейти на схему с фронтендом на Nginx и бэкэндом на апаче. Схема давно стала фактически индустриальным стандартом для тяжело нагруженных серверов, для тех, кто в танке вот тут человеческим языком объясняется почему такая схема эффективна.
Основная проблема заключалась в том, что прикрутить надо было не к голому серверу, а установленной панельке WHM/Cpanel, что поначалу казалось непросто. За основу был взят вот этот мануал, но в нем многое было не описано, подразумевалось, что ты, типа, старый линуксоид, и тебе и так все понятно. Я же опишу для идиотов, типа себя, чтобы потом не забыть.
Начать надо с установки mod_rpaf на апач. Он нужен для того, чтобы апач получал правильные адреса посетителей от nginxa.
Логинимя под рутом, далее
cd /root/tmp
mkdir mod_rpaf
cd mod_rpaf/
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar xzf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
/usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
Последняя строчка собственно устанавливает модуль.
Теперь надо прописать настройки модуля. Идем в WHM, Main >> Service Configuration >> Apache Setup > Include Editor > Pre Main Include и вставляем там приведенный код:
LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On# Enable reverse proxy add forwardRPAFproxy_ips 127.0.0.1 LIST_OF_YOUR_IPS# which ips are forwarding requests to usRPAFsethostname On# let rpaf update vhost settings# allows to have the same hostnames as in the “real”# configuration for the forwarding ApacheRPAFheader X-Real-IP# Allows you to change which header mod_rpaf looks# for when trying to find the ip the that is forwarding# our requests
List_of_your_IPs меняем на список купленных к серверу адресов, через пробел. Жмем сохранить, перезапустить апач. Ахтунг! при докупке свежих IP их всех нужно будет потом руками прописывать в этом месте
Теперь нам надо перетащить апач на какой нибудь другой порт, например 81, потому что на стандартный 80 порт мы будем сажать nginx. Для этого в WHM идем в Tweak settings и правим порт на котором висит апач - 0.0.0.0:80 на 0.0.0.0:81. Жмем “apply” - ответа мы уже не дождемся, порт поменян. При необходимости можно зайти по http://whm.че-то-там.com:81
Обратите внимание, что https мы не переносим. Если есть желание, можно попробовать перенести и его за nginx, но особо смысла не вижу.
Возвращаемся в консоль - нам надо поправить настройки prefork’a в конфиге апачи.
Для начала убедитесь, что у вас используется именно prefork, используя:
httpd -V | grep MPM Поравьте соответствующий раздел конфига vi /usr/local/apache/conf/httpd.conf, поправьте на что-то вроде этого:<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 5
MaxClients 100
MaxRequestsPerChild 100
</IfModule>Если у Вас worker, то раздел, естественно, другой. Теперь нужно конфиг продистилировать скриптами WHM, чтобы он нормально прососался: /usr/local/cpanel/bin/apache_conf_distiller –update –main/scripts/rebuildhttpdconf
поправтье номер порта 80 на 81 в настройках сервиса мониторинга
vi /etc/chkserv.d/httpd
и перезапустите его:
/etc/init.d/chksrvd restart
или
/etc/init.d/chkservd restart
сервис может называться по разному, в крайнем случае ребут вас спасет.
На этом с апачем мы закончили, ставим nginx (по мотивам отсюда):Нам понадобится компилятор, ставим его если еще нет:yum -y install gcc pcre-devel zlib-develСкачиваем и распаковываем nginx:mkdir /root/tmp/nginx
cd /root/tmp/nginx
wget http://sysoev.ru/nginx/nginx-0.6.35.tar.gz
tar xzf nginx-*.tar.gz
cd nginx-*/
Устанавливаем:./configure
make
make install
ln -s /usr/local/nginx/conf /etc/nginxПрописываем ротацию логов:vi /etc/logrotate.d/nginx
туда:/usr/local/nginx/logs/*log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/bin/kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` 2> /dev/null || true
endscript
} Делаем инит-скрипт:vi /etc/init.d/nginx
туда:#!/bin/sh
#
# Init file for nginx server daemon
#
# chkconfig: - 85 15
# description: nginx server daemon #
Добавляем права на выполнение:chmod +x /etc/init.d/nginx
и прописываем автозагрузку (runlevel 3) ln -s ../init.d/nginx /etc/rc3.d/S99nginxТеперь нам надо прицепить скрипт, который генерит конфиги nginxa на основании насроек whm. Мы запихаем его в /scripts/postwwwacct, чтобы он обновлял конфиги после каждого добавления аккаунта:vi /scripts/postwwwacctтуда:#!/bin/sh
cat > “/usr/local/nginx/conf/nginx.conf” <<EOF
user nobody;
worker_processes 2;
error_log logs/error.log info;
worker_rlimit_nofile 8192;
events {
worker_connections 512; # increase for more busy servers
use rtsig; # you should use epoll here for Linux kernels 2.6.x
}
http {
server_names_hash_max_size 2048;
include mime.types;
default_type application/octet-stream;
cd /var/cpanel/users
for USER in *; do
for DOMAIN in `cat $USER | grep ^DNS | cut -d= -f2`; do
IP=`cat $USER|grep ^IP|cut -d= -f2`;
ROOT=`grep ^$USER: /etc/passwd|cut -d: -f6`;
echo “Converting $DOMAIN for $USER”;
cat >> “/usr/local/nginx/conf/vhost.conf” <<EOF
server {
access_log off;
# uncomment location below to make nginx serve static files instead of Apache
# !WARNING!
# it will make the bandwidth accounting incorrect as these files won’t be logged!
#location ~* .(gif|jpg|jpeg|png|wmv|avi|mpg|mpeg|mp4|htm|html|js|css)$ {
# root $ROOT/public_html;
#}
proxy_buffer_size 4k;
# you can increase proxy_buffers here to suppress “an upstream response
# is buffered to a temporary file” warning
proxy_buffers 16 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
Для ядра 2.6 нужно также поменять use rtsig на use epoll.Если сервер лично ваш и/или вам пофиг на корректность отображения трафа в WHM/Cpanel, можно поставить nginx не только как реверс-прокси к апаче, но и как веб-сервер под статический контент - картинки, файлы и прочее и получить еще большее увеличение производительности. Для этого надо в скрипте раскомментировать строки:#location ~* .(gif|jpg|jpeg|png|wmv|avi|mpg|mpeg|mp4|htm|html|js|css)$ {# root $ROOT/public_html;
В первый раз запустим генератор конфигурации руками (на первый запуск закомментируем в нем последнюю строку):
/scripts/postwwwacct Теперь проверим, чего он нагенерил: /usr/local/nginx/sbin/nginx -tСтартуем nginx:/usr/local/nginx/sbin/nginx
И - вуаля! На всякий случай стоит проверить поведение сервера после ребута.
Результаты можете оценить сами.