Ускоряем 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/sh
cat << 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 $username@$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>
EOF
exit 0;

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

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

#!/bin/sh
cat << 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;
                }
        }
EOF
killall -s 1 nginx
exit 0;

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

#!/bin/sh
cat << 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;
                }
        }
EOF
killall -s 1 nginx
exit 0;

 

К этой статье тут все комментарии.

 

0
Your rating: None