disclaimer:
Все настройки приведенные в данной статье проверены мной на рабочем сервере, но они не являются единственно верным решением, по сему любые дополнения, примеры ваших конфигов и дельные советы приветствуются в комментариях.
Статья написана в основном для тех, кто собирается установить Alto CMS на своем выделенном (VPS/VDS) сервере или переезжает с виртуального хостинга на нормальный сервер. Не так давно мне понадобилось поднять свой удаленный dev-сервер для более более полного тестирования своих разработок и я хотел бы поделиться с вами вариантом моей конфигурации и рассказать об некоторых хитростях настройки связки Nginx+Apache для Alto CMS.
Я выбрал проверенную временем и довольно популярную в последнее время связку nginx+apache+mod_php+phpMyAdmin на Ubuntu Server 12.04.3 LTS. Для удаленного доступа к файлам будет использоваться SFTP. Для доступа к файлам сайта и работы с ними будет использоваться отдельная учетная запись с возможностью захода только по SFTP и только в папку с принадлежащими этой учетке сайтами. Будет поддерживаться авторизация как по паролю, так и по ключу. Интерактивный вход по SSH для этой учетной записи будет невозможен дабы не создавать потенциальную дыру, все необходимые действия с сервером можно будет осуществлять либо из под root, либо из под вашей основной учетной записи.
Файлы сайта будут находиться в каталогах вида /var/www/имя_юзера/sites/имя_сайта/ В зависимости от значения имя_юзера тот или иной пользователь (вдруг у вас их будет несколько) будет иметь доступ к тому или иному аккаунту.
Установка компонентов
Начнем с установки всего необходимого (в примерах все команды выполняются в учетной записи root, иначе используем sudo):
aptitude install apache2-mpm-itk mysql-server libapache2-mod-php5 ssh nginx
Далее ставим phpMyAdmin, но, что бы избавиться от возможных проблем, поставим его свежую версию из PPA-репозитория. Для этого добавим новый репозиторий:
nano /etc/apt/sources.list
вписываем на новую строку
deb http://ppa.launchpad.net/nijel/phpmyadmin/ubuntu precise main
и закрываем редактор Ctrl+X не забывая ответить Y, что бы изменения сохранились.
Добавляем ключ для этого репозитория:
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 06ED541C
aptitude update
а теперь ставим сам phpMyAdmin:
aptitude install phpmyadmin
При установке phpMyAdmin указываем произвольный пароль для подключения к БД. Все необходимое мы установили, теперь осталось все это настроить и подготовить необходимые каталоги и учетные записи.
Создаем нужные каталоги (обязательно они должны принадлежать root:root если работаете не под root используйте sudo):
mkdir /var/www/ivan/
mkdir /var/www/ivan/sites/
mkdir /var/www/ivan/sites/logs/
mkdir /var/www/ivan/sites/temp/
mkdir /var/www/ivan/sites/site.dev/
Далее создадим пользователя ivan в группе www-data от которого будем работать с сайтом, а установка шелла в /bin/false гарантирует нам, что пользователь никак не сможет интерактивно зайти в систему. Если нужна авторизация только по ключу, то добавьте параметр --disabled-password:
adduser --home /var/www/ivan --no-create-home --shell /bin/false --ingroup www-data ivan
Теперь назначим нужные права:
chown ivan:www-data /var/www/ivan/sites/site.dev
chown ivan:www-data /var/www/ivan/sites/logs
chown ivan:www-data /var/www/ivan/sites/temp
chmod 0755 /var/www/ivan/sites/site.dev
chmod 0755 /var/www/ivan/sites/logs
chmod 0755 /var/www/ivan/sites/temp
Настройка SFTP
Настройка SFTP будет заключаться в том, что для всех членов группы www-data мы сделаем так, чтобы при заходе по SFTP они попадали сразу в папку sites своего аккаунта (в нашем примере для пользователя ivan это будет /var/www/ivan/sites/) без возможности выбраться выше по дереву каталогов. Для этого в конец файла /etc/ssh/sshd_config (не перепутайте с ssh_config) дописываем следующее:Match Group www-data
AllowTCPForwarding no
X11Forwarding no
ChrootDirectory %h/sites
ForceCommand internal-sftp -u 0022
Этим мы добились того, что для всех пользователей из группы www-data отключаем TCP и X11 форвадинг, ограничиваем доступ только нужной папкой (для этого нам нужно было делать sites папки доступными для записи только для root), меняем им обработчик SFTP на встроенный, которому не нужно полноценное окружение с шеллом и задаем по умолчанию создание папок и файлов с правами 755 и 644 соответственно.
Теперь перезапустим SSH:
service ssh restart
Настройка Apache и Nginx
Начнем с конфигов Apache и в /etc/apache2/apache2.conf в самый низ добавим:Include /etc/phpmyadmin/apache.conf
она нам нужна для загрузки конфига phpMyAdmin. Изменим порт Apache по умолчанию на 8080 так как он будет работать локально за Nginx-ом. Для этого открываем /etc/apache2/ports.conf и меняем значение:
NameVirtualHost *:8080
Listen 127.0.0.1:8080
Далее создаем виртуальный хост в /etc/apache2/sites-available:
nano /etc/apache2/sites-available/site.dev
и вписываем туда следующую конфигурацию:
<VirtualHost *:8080>
ServerName site.dev
ServerAlias www.site.dev
ServerAdmin admin@example.org
#Указываем от какого пользователя работать Apache
AssignUserId ivan www-data
DocumentRoot /var/www/ivan/sites/site.dev
ErrorLog /var/www/ivan/sites/logs/apache_error.log
CustomLog /var/www/ivan/sites/logs/apache_access.log combined
<Directory /var/www/ivan/sites/site.dev>
Options -ExecCGI -Indexes -Includes +FollowSymLinks
AllowOverride All
<IfModule mod_php5.c>
# Запрещаем php за пределы своей директории
php_admin_value open_basedir /var/www/ivan/sites/site.dev
#Сохраняем временные файлы и сессии в корневом каталоге
php_admin_value upload_tmp_dir /var/www/ivan/sites/temp
php_admin_value session.save_path /var/www/ivan/sites/temp
# Отключаем возможность инклюда по URL
php_admin_flag allow_url_include off
# Отключаем возможность динамической подгрузки модулей PHP
php_admin_flag enable_dl off
# Отключаем всю лабудень для системных вызовов
php_admin_value suhosin.executor.func.blacklist apache_note,apache_setenv,closelog,debugger_off,debugger_on,define_syslog_variables,escapeshellarg,escapeshellcmd,ini_restore,openlog,passthru,pclose,pcntl_exec,popen,proc_close,proc_get_status,proc_nice,proc_open,proc_terminate,shell_exec,syslog,system,url_exec
</IfModule>
</Directory>
# Закрываем, на всякий случай, доступ в temp
<Directory /var/www/ivan/sites/temp>
AllowOverride None
Order Deny,Allow
Deny from All
</Directory>
# Закрываем, на всякий случай, доступ в logs
<Directory /var/www/ivan/sites/logs>
AllowOverride None
Order Deny,Allow
Deny from All
</Directory>
</VirtualHost>
Теперь активируем сайт, перезагрузим Apache и включим необходимый mod_rewrite:
a2ensite site.dev
a2enmod rewrite
service apache2 restart
Далее создадим виртуальный хост Nginx, для этого создадим файл:
nano /etc/nginx/sites-available/site.dev
и в нем следующую конфигурацию:
server {
listen 80;
server_name site.dev www.site.dev;
access_log /var/www/ivan/sites/logs/nginx_access.log;
error_log /var/www/ivan/sites/logs/nginx_error.log;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_set_header Host $host;
proxy_set_header Connection close;
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;
#Отдаем всю статику минуя Apache напрямую
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|js|wmv|avi|cur|swf|mp3|wma|htc|cur|7z)$
{
root /var/www/srv/marques1/www/sitera;
#Настройка ресайза картинок для Alto. Так как картинки ресайзятся по внешним запросам, то если нет нужной картинке в паке сайта - передаем запрос на Apache и далее движку сайта
try_files $uri @resize;
index index.html index.php;
access_log off;
expires 30d;
}
#Указываем место статичных файлов phpMyAdmin (вместо pmadm можно указать любой алиас)
location ~*/pmadm/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$
{
root /usr/share;
index index.html index.php;
access_log off;
expires 30d;
}
#Настройка ресайза картинок для Alto. Так как картинки ресайзятся по внешним запросам, то если нет нужной картинке в паке сайта - передаем запрос на Apache и далее движку сайта
location @resize
{
proxy_pass http://127.0.0.1:8080;
proxy_connect_timeout 60;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
}
#Все остальные запросы отдаем Apache
location /
{
proxy_pass http://127.0.0.1:8080/;
proxy_connect_timeout 60;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
}
location ~ /\.ht
{
deny all;
}
}
создаем ссылку на конфиг и перемещаем ее в /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/site.dev /etc/nginx/sites-enabled/site.dev
Настройка phpMyAdmin
Ну и напоследок осталось немного подправить конфиг phpMyAdmin, так как мы хотим изменить его адрес по умолчанию (ну что бы никто лишний раз не лазал туда) со стандартного адрес_сайта/phpmyadmin на адрес_сайта/pmadm (можно придумать любой вариант). Для этого открываем файл /etc/phpmyadmin/apache.conf и меняем строчку:Alias /phpmyadmin /usr/share/phpmyadmin
на
Alias /pmadm /usr/share/phpmyadmin
Как вы помните в конфиге Nginx мы уже указали этот алиас, нам осталось только создать символьную ссылку в каталоге /etc/, что бы и Nginx мог нормально попасть в каталог phpMyAdmin:
ln -s /etc/phpmyadmin/
mv phpmyadmin pmadm
mv pmadm /etc/
Перезагружаем Nginx:
service nginx restart
Все! Теперь можно заливать файлы сайта по SFTP на сервер через созданный нами аккаунт ivan и приступать к установке Alto CMS.
Можно делать так:
1. mkdir -p /var/www/ivan/sites/{temp,logs,site.dev}
2. chown -R ivan:www-data /var/www/ivan/sites
3. chmod -R 0755 /var/www/ivan/sites
И я бы не рисковал в удаленном шелле запускать просто так:
sleep 2 && service ssh restart
Мало ли чего… когда sleep бует отдавать управление дальше — все пройдет плавно, даже если у тебя порвался коннект… это так из горького опыта администрирования дедиков
Ну и да… я не Иван, я Стас :)
ivan — это как пример названия аккаунта, почему-то решил использовать это простое русское имя :)
sleep я добавил… Смысл в следующем: если не дай бог у тебя порвется коннект в момент рестарта демона — демон не срубится из-за зависшей сессии, поэтому поток управления отдаешь сначала башу через слип, а он потом выполнит следующую команду нормально…
Хорошо если у тебя VPS/VDS — можно их с админки пнуть, а если это дедик железный у буржуйского прова, где поддержка за каждый пинок железки просит 10-20 eur? ;-) — утож :)