Кроме интеграции 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;
К этой статье тут все комментарии.