Ускоряем DirectAdmin

Кроме интеграции nginx, я бы хотел немного поговорить о php. Как известно, он может работать в трех режимах — mod, cgi и fast-cgi. Наиболее быстрым является mod apache. Однако самым экономным в плане работы с оперативкой — fast-cgi.

 

Каждый решает сам для себя, что ему важнее — быстрее рисовать страницы или экономить память. Лично мой выбор — экономить память, тем более что с fast-cgi без проблем работают такие популярные движки как WordPress, Drupal, Битрикс и многие другие.

Для контроля за fast-cgi я предлагаю использовать php-fpm. Это нормальная интеграция fast-cgi в php, которая позволяет плодить процессы, рестартовать их, корректно убивать и менять их число в зависимости от нагрузки.

Когда DirectAdmin создает нового пользователя, то вызывает скрипт user_create_post.sh  в /usr/local/directadmin/scripts/custom в который передает информацию о логине в переменной $username. Этим и воспользуемся, написав например такой скрипт, генерирующий кусок XML конфига для php-fpm:

#!/bin/shcat << EOF > /etc/fpm/$username.conf                <section name="pool">                        <value name="name">$username</value>                        <value name="listen_address">/home/$username/php</value>                        <value name="listen_options">                                <value name="backlog">-1</value>                                <value name="owner">$username</value>                                <value name="group">apache</value>                                <value name="mode">0660</value>                        </value>                        <value name="php_defines">                            <value name="sendmail_path">/usr/sbin/sendmail -t -i -f [email protected]$domain</value>                            <value name="upload_tmp_dir">/home/$username/tmp</value>                            <value name="session.save_path">/home/$username/tmp</value>                        </value>                        <value name="user">$username</value>                        <value name="group">$username</value>                        <value name="pm">                                <value name="style">static</value>                                <value name="max_children">2</value>                        </value>                        <value name="request_terminate_timeout">60s</value>                        <value name="rlimit_files">206103</value>                        <value name="rlimit_core">0</value>                        <value name="catch_workers_output">yes</value>                        <value name="max_requests">256</value>                        <value name="environment">                                <value name="HOSTNAME">$HOSTNAME</value>                                <value name="PATH">/usr/local/bin:/usr/bin:/bin</value>                                <value name="TMP">/home/$username/tmp</value>                                <value name="TMPDIR">/home/$username/tmp</value>                                <value name="TEMP">/home/$username/tmp</value>                                <value name="OSTYPE">$OSTYPE</value>                                <value name="MACHTYPE">$MACHTYPE</value>                                <value name="MALLOC_CHECK_">2</value>                        </value>                </section>EOFexit 0;

Теперь о nginx и генерации конфига. Устанавливаем nginx классическим образом как акселлератор на 85-ом порту и делаем проброс через iptables. Подключаем в конфиг чтение всех файлов конфигов из /etc/nginx/vhost/*

Когда создается домен или поддомен, DirectAdmin соответственно запускает domain_create_post.sh и subdomain_create_post.sh. Просто создадим эти скрипты, чтоб они добавляли конфиг в nginx и рестартовали его:

#!/bin/shcat << EOF > /etc/nginx/vhost/$domain.conf   server {        listen       $ip:85;        server_name  $domain www.$domain;        access_log  /var/log/httpd/domains/$domain.log  main;        root   /home/$username/domains/$domain/public_html;
                location / {                        fastcgi_pass unix:/home/$username/php;                        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;                        fastcgi_index  index.php;                        include        fastcgi_params;                }                location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {                        root /home/$username/domains/$domain/public_html;                        error_page 404 = @fallback;                }                location @fallback {                        fastcgi_pass unix:/home/$username/php;                        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;                        fastcgi_index  index.php;                        include        fastcgi_params;                }        }EOFkillall -s 1 nginxexit 0;

Если же надо оставить apache и просто отдавать статику nginx, то используем такой конфиг:

#!/bin/shcat << EOF > /etc/nginx/vhost/$domain.conf   server {        listen       $ip:85;        server_name  $domain www.$domain;        access_log  /var/log/httpd/domains/$domain.log  main;        root   /home/$username/domains/$domain/public_html;
                location / {                        proxy_pass http://$ip:80;                        proxy_redirect http://$ip:80/ /;                        proxy_set_header Host $host;                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;                        proxy_set_header X-Real-IP $remote_addr;                }                location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {                        root /home/$username/domains/$domain/public_html;                        error_page 404 = @fallback;                }                location @fallback {                        proxy_pass http://$ip:80;                        proxy_redirect http://$ip:80/ /;                        proxy_set_header Host $host;                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;                        proxy_set_header X-Real-IP $remote_addr;                }        }EOFkillall -s 1 nginxexit 0;