Установка и настройка Nginx+Apache на сервере для Alto CMS

nginx+apache
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.

Похожие статьи

  • Настройка сервера
    Всем привет, хостинг — fastvps, стоит Debian 7 + ispmgr lite, на сервере помимо сайта на Alto есть 2 сайта на DLE и 1 на Wordpress. Что необходимо сделать?
  • Про секретную админку, поддомены и прочие тонкости маршрутизации в Alto CMS
    Довольно часто встречаются такие вопросы: А как сделать, чтобы админка работала не по адресу site.com/admin, а по секретному адресу, который знаю только я? Или вопрос из этой же серии: как сделать, чтоб блоги...
  • Что за предупреждения в журнале?
    Не первый раз обнаруживаю в журнале ошибок такие сообщения: E_WARNING [2] mysqli::real_connect(): (42000/1203): User xxxxxx already has more than 'max_user_connections' active connections (/xxxxxxxxx/sovunion....
  • Nginx ограничение нагрузки
    Вещь о которой я хочу написать довольно тривиальна, но вдруг кому-то будет полезна. В Nginx есть модуль ngx_http_limit_req_module. Данный модуль позволяет ограничивать количество и частоту запросов к сайту с одного...

9 комментариев

+1
Иван, умничка! Но вставлю свои три копейки…

Можно делать так:
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 бует отдавать управление дальше — все пройдет плавно, даже если у тебя порвался коннект… это так из горького опыта администрирования дедиков
Отредактирован:
+1
По 1,2, 3 пункту — согласен, но я специально расписал все по строкам, что бы более понятно было тем, кто с linux еще на вы. По поводу sleep 2 && service ssh restart — немного не понял, у меня sleep нет. Просто пнуть SSH по любому нужно после изменения конфига. (можно и service ssh reload)
Ну и да… я не Иван, я Стас :)
ivan — это как пример названия аккаунта, почему-то решил использовать это простое русское имя :)
Отредактирован:
+1
Сорри, Стас. :)
sleep я добавил… Смысл в следующем: если не дай бог у тебя порвется коннект в момент рестарта демона — демон не срубится из-за зависшей сессии, поэтому поток управления отдаешь сначала башу через слип, а он потом выполнит следующую команду нормально…
Хорошо если у тебя VPS/VDS — можно их с админки пнуть, а если это дедик железный у буржуйского прова, где поддержка за каждый пинок железки просит 10-20 eur? ;-) — утож :)
0
А, понял — согласен, сам один раз наступал на эти грабли. Можно проще
service ssh reload
это не критично при дисконекте.
Отредактирован:
+1
А зачем апач? Почему не nginx+php-fpm?
Я использую последний вариант и все работает стабильно.
0
Согласен, вариант хороший, но связка nginx+apache немного более популярна. Напишите статью об этом — будет здорово.
0
Писать особо не о чем. Установка ничем не отличается от дефолтной.
0
ну разве что реврайты из .htaccess переписать в конфиги nginx.
0
У вас ошибочка в файле /etc/nginx/sites-available/site.dev
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;

поправьте на /var/www/ivan/sites/site.dev
:)
Отредактирован:
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.