Предлагаю вашему внимаю описание проекта по подготовке внутренней тестовой стендовой среды для PHP-проектов, система при доработке напильником оказалась очень даже хороша.
Базовая установка панели управления VestaCP на хостинг
Установку мы производим на операционную систему Ubuntu Server 16.04 и производится она достаточно просто (буквально в две команды):
# curl -O http://vestacp.com/pub/vst-install.sh # bash vst-install.sh -f
Установку панели управления сопровождает консольный мастер установки и видим, что нам предложена установка полного набора программного обеспечения:
Вы можете установить все компоненты или произвести выборочную установку, для выбора компонентов установки необходимо скрипту установки указать ключи скрипту установки:
- -a, --apache Install Apache [yes|no] default: yes
- -n, --nginx Install Nginx [yes|no] default: yes
- -w, --phpfpm Install PHP-FPM [yes|no] default: no
- -v, --vsftpd Install Vsftpd [yes|no] default: yes
- -j, --proftpd Install ProFTPD [yes|no] default: no
- -k, --named Install Bind [yes|no] default: yes
- -m, --mysql Install MySQL [yes|no] default: yes
- -g, --postgresql Install PostgreSQL [yes|no] default: no
- -d, --mongodb Install MongoDB [yes|no] unsupported
- -x, --exim Install Exim [yes|no] default: yes
- -z, --dovecot Install Dovecot [yes|no] default: yes
- -c, --clamav Install ClamAV [yes|no] default: yes
- -t, --spamassassin Install SpamAssassin [yes|no] default: yes
- -i, --iptables Install Iptables [yes|no] default: yes
- -b, --fail2ban Install Fail2ban [yes|no] default: yes
- -q, --quota Filesystem Quota [yes|no] default: no
Я производил установку ограниченного набора компонентов и в моем случае параметры установки выглядят следующим образом:
# ./vst-install-ubuntu.sh --iptables no --named no --postgresql yes --dovecot no --exim no --force
Обратите внимание, что вам требуется именно изменять набор типового ПО указывая ключи yes и no. Соответственно, после проведенных манипуляций, экран подтверждения состава устанавливаемых компонентов отличается от штатного:
Следующим этапом настройки, мы задаем email адрес администратора системы и домен который будет обслуживать этот сервер, а дальнейшая установка (после указания необходимых параметров) будет проходить в автоматическом режиме.
По завершении установки вы увидите web-url на который необходимо подключаться, логин и пароль администратора (пароль генерируется автоматически и его необходимо в дальнейшем изменить в web-интерфейсе управления).
Первый этап настройки прошел довольно просто, но вот дальнейшая настройка таит в себе несколько сюрпризов. Во первых, свежеустановленная система встречает нас самоподписанным сертификатом и доступом по ip-адресу, но это мелочи, так как первый вход в систему оказался неудачным и панель управления полноценно запустилась только после перезагрузки. Обратите на это внимание, лучше сразу после установки перезагрузить сервер и не рисковать.
Во вторых, на одной из инсталляций мы поймали ошибку:
2017/11/23 02:00:51 [error] 334#0: *1 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 10.253.3.1, server: _, request: "GET /login/ HTTP/1.1", upstream: "fastcgi://unix:/var/run/vesta-php.sock", host: "10.253.3.254:8083"
Как мы выяснили в процессе экспериментов, это было связано с тем, что правила iptables настроенные VestaCP запретили разрешение DNS-имен, но после внесения дополнительного правила для работы с внешним DNS-сервером панель управления стала работать корректно.
Для временной остановки Firewall вы можете использовать команду:
# /usr/local/vesta/bin/v-stop-firewall
Обратите внимание, что Vesta CP в своем составе содержит собственный DNS-сервер и в настройках определения DNS-имен (/etc/resolv.conf) лучше указать принудительное использование локального DNS-сервера. В дополнение к настройкам разрешения имен убедитесь, что в файле /etc/hosts прописан домен который мы указывали на этапе установки в противном случае панель управления будет отсылать на почту администратора ошибки вида (sudo: unable to resolve host php.help-me-24.com):
127.0.0.1 localhost php.help-me-24.com
Подготовка инфраструктуры для обслуживания поддомена для php-разработки и тестирования
Прежде всего, нам необходимо настроить DNS-зону нашего домена таким образом, чтобы все DNS-адреса 4-го уровня домена *.php.help-me-24.com разрешались на один FrontEnd Nginx сервер который будет принимать входящие подключения для нашего субдомена php.help-me-24.com. Если DNS-сервер обслуживающий вашу зону принадлежит вам, то проблем с настройкой такого разрешения имен у вас не возникнет, но в случае когда DNS-сервер обслуживается сторонним хостинг-провайдером и вам предоставляется доступ к ограниченному web-интерфейсу управления DNS, тогда это может вызвать некоторые проблемы.
Мы используем Yandex DNS и Yandex почту для домена и как выяснилось Яндекс поддерживает такого рода настройки, а для настройки такого поведения, вам необходимо указать параметр A-записи в виде *.php:
Теперь все "виртуальные домены" для PHP web-разработчиков разрешаются на один Nginx сервер который в свою очередь перенаправляет web-запросы в VPN-сеть к настроенному в прошлом пункте серверу с установленной VestaCP.
Следующим этапом, мы настраиваем обслуживание перенаправления запросов с Nginx frontend на Vesta-сервер, причем настраиваем таким образом, что запросы к домену php.help-me-24.com перенаправлялись на панель управления на порту 8083 (предварительно упаковываясь в ssl Let's Encrypt), а запросы к субдоменам перенаправляются напрямую на порт 80 того же сервера (ssl сертификат настраивается при необходимости на Nginx Frontend).
Для VestaCP потребуется отключить самоподписанный сертификат и защиту трафика, для чего в конфигурационный файл /usr/local/vesta/nginx/conf/nginx.conf необходимо внести некоторые изменения:
server { ssl off; #ssl_certificate /usr/local/vesta/ssl/certificate.crt; #ssl_certificate_key /usr/local/vesta/ssl/certificate.key; #ssl_session_cache shared:SSL:10m; #ssl_session_timeout 10m;
Перезапустите панель управления Vesta и попробуйте подключиться без префикса https.
Переходим к настройке Frontend Nginx-сервера и я не буду подробно описывать файл конфигурации, так как решений такого плана я рассматривал уже множество и ничем уникальным этот конфигурационный файл не выделяется.
Конфигурационный файл содержит следующие записи:
server { listen 80; server_name *.php.help-me-24.com; access_log /var/log/nginx/vhost-php.help-me-24.com.log; error_log /var/log/nginx/vhost-php.help-me-24.com-error.log; client_max_body_size 10G; location / { proxy_pass http://10.253.3.200:80; proxy_read_timeout 6h; proxy_connect_timeout 600s; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for; proxy_set_header Host $host:$server_port; proxy_set_header X-Forwarded-Proto $scheme; } } server { listen 443 ssl; ssl_certificate /etc/letsencrypt/live/php.help-me-24.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/php.help-me-24.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot server_name *.php.help-me-24.com; access_log /var/log/nginx/php.help-me-24.com.log; error_log /var/log/nginx/php.help-me-24.com-error.log; add_header Strict-Transport-Security "max-age=63072000;"; client_max_body_size 10G; location / { proxy_pass http://10.253.3.200:80; proxy_read_timeout 6h; proxy_connect_timeout 600s; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for; proxy_set_header Host $host:$server_port; proxy_set_header X-Forwarded-Proto $scheme; } } server { listen 80; server_name php.help-me-24.com; return 301 https://php.help-me-24.com$request_uri; } server { listen 443 ssl; ssl_certificate /etc/letsencrypt/live/php.help-me-24.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/php.help-me-24.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot server_name php.help-me-24.com; access_log /var/log/nginx/php.help-me-24.com.log; error_log /var/log/nginx/php.help-me-24.com-error.log; add_header Strict-Transport-Security "max-age=63072000;"; client_max_body_size 10G; location / { proxy_pass http://10.253.3.200:8083; proxy_read_timeout 6h; proxy_connect_timeout 600s; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for; proxy_set_header Host $host:$server_port; proxy_set_header X-Forwarded-Proto $scheme; } }
Единственное отличие от рассматриваемых ранее, это запись:
server_name *.php.help-me-24.com;
Она сообщает Nginx, что необходимо обрабатывать все субдомены (можно писать довольно сложные регулярные выражения).
Фактически, на данном этапе ферма для PHP разработчиков можно сказать, что запущена и можно создавать пользователей, домены и базы данных с использованием web-интерфейса.
Дополнительно было доработано
- Отключен выбор по умолчанию опций DNS Support и Mail Supprt
- Настроено проксирование FTP и защита FTP при помощи SSL
- Интегрировали авторизацию с учетными записями Active Directory
Полезные команды администрирования VestaCP
Сброс пароля администратора web-панели:
# /usr/local/vesta/bin/v-change-user-password admin NewPassword