1. Технические вопросы
Этот раздел посвящен техническим вопросам сайтостроения. Как правило, речь идет о настройке веб-серверов и CMS под определенные задачи. Предполагается, что у вас есть некий необходимый минимум знаний, чтобы это понять.
Сюда обычно чего-то пишут. Но меня ломает...
Этот раздел посвящен техническим вопросам сайтостроения. Как правило, речь идет о настройке веб-серверов и CMS под определенные задачи. Предполагается, что у вас есть некий необходимый минимум знаний, чтобы это понять.
Поскольку с википедии почикали крайне полезные для меня статьи, пришлось их быстренько дернуть из гуглового кэша. Это:
Установка nginx на Centos/Fedora/Debian
Установка php-fpm на Centos/Fedora/Debian
Пример конфигурации PHP
Пример конфигурации php-fpm
Странички в кодировке 1251, менять надо ручками.
Автор статей Roxis, большой ему респект.
Еще один нужный вещь, который я не успел выдернуть (а именно конфиг нгиныкса) лежит тут. Хотя впрочем его можно собрать и по манам с сайта Игоря Сысоева. Но удобнее иметь готовый, правда?
Вчера наконец разобрался с давно нервировавшм меня косяком. Косяк в том, что 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
Вчера федеральная торговая комиссия США (FTC) закрыла хостинг 3fn.net. Не далее, чем пару месяцев назад я туда чуть не переехал (выбрал таки американского хостера с американскими корнями), поэтому сегодня испытал чувство, что пуля пролетела мимо. Накрыло причем серьезно - у хостера нет даже доступа к оборудованию для того, чтобы раздать клиентам их бэкапы. Видимо, имело место некое своеобразное американское маски-шоу.
Перечень “предъяв” поистине впечатляет. В сделанном сегодня заявлении FTC приводится их перечень:
child pornography, spyware, viruses, trojan horses, phishing, botnet command and control servers, and pornography featuring violence, bestiality, and incest.
3FN был известен своим весьма лояльным отношением ко “всему нехорошему”, как то дорам, порно - как легальному в США, так и не совсем, ну и конечно фарме. Поскольку инициатором закрытия является именно FTC, рискну предположить, что первопричиной проработки вопроса была таки фарма. Ап - судя по публикации в вашингтон пост взяли таки за хостинг ботнетов. А остальное паровозом приписали. Хотя точно конечно никто не скажет.
Учитывая громкие заявления как на сайте самого агентства, так и в американской прессе, вероятность позитивного разрешения конфликта кажется чуть менее, чем нулевой.
Прецедент заставляет задумываться, что бэкапы было бы лучше всего лить на домашний сервер. И иногда отписывать их на сменный нестираемый носитель…
Этот пост больше для себя, чтобы не забыть, но кому то он может тоже оказаться полезным.
Задача стояла собрать на недорогом 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 сокете почему-то не заработало, разбираться было лень.
Вот пожалуй и все.
Колдунства для анализа нагрузки веб-сервера. писал для борьбы с ДДОСами, но пригодится и в более мирных случаях.
Число процессов Apache:
ps aux | grep httpd |wc -l
Число коннектов на 80 порт:
netstat -na | grep :80 | wc -l
То же, в статусе SYN
netstat -na | grep :80 | grep syn
Пример SYN-флуда:
netstat -na | grep :80 | grep SYN | wc -l 767
Посмотреть много ли разных IP:
netstat -na | grep :80 | grep SYN | sort -u | more
На какой домен чаще всего идут запросы:
tcpdump -npi eth0 port domain
Статус Apache:
apachectl status
Посмотреть откуда IP:
whois xxx.xxx.xxx.xxx
или
jwhois xxx.xxx.xxx.xxx
С какого IP сколько запросов:
netstat -na | grep :80 | sort | uniq -c | sort -nr | more
Меня окончательно утомили тормоза апача на моем ВДС (700 метров памяти, центос-5, whm/cpanel, апач 2.2, куплен в ТекТонике, рекомендую). Причина банальна - выжирание памяти апачем при довольно смешной нагрузке в 2-2.5 тысячи пользователей в день. Тюнинг maxclients помог, но не сильно (зарежешь число клиентов чтобы стало больше свободной памяти - начинаются еще более страшные тормоза).
Поэтому было принято дальше кота за яйца не тянуть и перейти на схему с фронтендом на Nginx и бэкэндом на апаче. Схема давно стала фактически индустриальным стандартом для тяжело нагруженных серверов, для тех, кто в танке вот тут человеческим языком объясняется почему такая схема эффективна.
Основная проблема заключалась в том, что прикрутить надо было не к голому серверу, а установленной панельке WHM/Cpanel, что поначалу казалось непросто. За основу был взят вот этот мануал, но в нем многое было не описано, подразумевалось, что ты, типа, старый линуксоид, и тебе и так все понятно. Я же опишу для идиотов, типа себя, чтобы потом не забыть.
Начать надо с установки mod_rpaf на апач. Он нужен для того, чтобы апач получал правильные адреса посетителей от nginxa.
Логинимя под рутом, далее
cd /root/tmpПоследняя строчка собственно устанавливает модуль.
Теперь надо прописать настройки модуля. Идем в WHM, Main >> Service Configuration >> Apache Setup > Include Editor > Pre Main Include и вставляем там приведенный код:
bin=’/usr/local/nginx/sbin/nginx’
pid_file=’/usr/local/nginx/logs/nginx.pid’
case “$1″ in
start)
echo -n “Starting nginx: ”
$bin && echo OK || echo FAILED
;;
stop)
echo -n “Stopping nginx: ”
kill `cat $pid_file` && echo OK || echo FAILED
;;
configtest)
$bin -t
;;
reload)
echo -n “Reloading nginx: ”
kill -HUP `cat $pid_file` && echo OK || echo FAILED
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo “Usage: $0 {start|stop|restart|reload|configtest}”
exit 1
;;
esac
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;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 10;
gzip on;
gzip_min_length 1100;
gzip_buffers 4 32k;
gzip_types text/plain text/html application/x-javascript text/xml text/css;
ignore_invalid_headers on;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
connection_pool_size 256;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
request_pool_size 4k;
output_buffers 4 32k;
postpone_output 1460;
include “/usr/local/nginx/conf/vhost.conf”;
}
EOF
/bin/cp /dev/null /usr/local/nginx/conf/vhost.conf
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;
error_log logs/vhost-error_log warn;
listen 80;
server_name $DOMAIN www.$DOMAIN;
# 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;
#}
location / {
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_send_timeout 90;
proxy_read_timeout 90;
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;
proxy_connect_timeout 30s;
proxy_redirect http://www.$DOMAIN:81 http://www.$DOMAIN;
proxy_redirect http://$DOMAIN:81 http://$DOMAIN;
proxy_pass http://$IP:81/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
EOF
done
done
service nginx restart
правильные настройки апача с модулем prefork для вдс с 768 метрами памяти без фронтенда
RLimitMEM 51467605
RLimitCPU 240
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 200
</IfModule>
колдунства под cpanel:
vi /usr/local/apache/conf/httpd.conf
/usr/local/cpanel/bin/apache_conf_distiller –update –main
/scripts/rebuildhttpdconf