Установка и настройка вебсервера (nginx + apache2 + mod_ruid2 + php + mysql)
Давно собирался написать статью по полной настройке веб сервера. Настройка apache2 + mod_ruid2 + php,nginx,mysql,logrotate.
Итак,приступим.
Ставим необходимые пакеты:
apt-get update apt-get install nginx apache2 php5 mysql-server libapache2-mod-php5 php5-suhosin php5-gd php5-mysql php5-xcache libapache2-mod-rpaf
Вместе с этими пакетам установятся необходимые зависимости. Во время установки mysql-server необходимо будет указать пароль для root.
Перейдем к настройке.
Настройка Nginx
Для начала удаляем линк на default хост вебсервера — он нам ни к чему:
rm /etc/nginx/sites-enabled/default
После этого прриводим конфиг nginx’a к следующему виду:
#nano /etc/nginx/nginx.conf user www-data; worker_processes 4; # кол-во работающих потомков nginx. ставим по кол-ву ядер pid /var/run/nginx.pid; events { worker_connections 768; # макс. кол-во соединений,которое будет обрабатывать nginx # multi_accept on; }
http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; server_tokens off; # скрываем версию nginx # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream;
log_format main '$remote_addr $host - $remote_user [$time_local] $request_time $upstream_response_time $request $status $body_bytes_sent "$http_user_agent" "$http_referer" reql:$request_length'; access_log /var/log/nginx/access.log main; # используем расширенное логирование error_log /var/log/nginx/error.log;
gzip on; # используем сжатие текстовой информации для экономии трафика клиентов gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# используется для проксирования на apache2 proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ## # Default Host ##
# указываем хост по-умолчанию. в данном случае здесь идет перенаправление на apache # сделано для упрощения управлением виртуальных хостов через apache
server { listen 80 default; location ~ /\.ht { deny all; } location / { proxy_pass http://127.0.0.1:88; } } ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
Apache.
Дальше перейдем к настройке. Вносим правки в файлы:
#cat /etc/apache2/ports.conf ...
NameVirtualHost * Listen 127.0.0.1:88
...
Меняем название virtualhost’a по-умолчанию:
#nano /etc/apache2/sites-available/default
<VirtualHost *>
...
Указываем опцию ServerName,добавляя в начало конфига:
#cat /etc/apache2/apache2.conf | grep ServerName
ServerName web
Включаем модуль rewrite,который используется в большинстве cms:
a2enmod rewrite
Настраиваем модуль подмены remote_addr после nginx’a,комментируем опцию ifmodule,из-за которой не происходит нормальной подмены (если кто-то подскажет другое решение — дайте знать):
#cat /etc/apache2/mods-enabled/rpaf.conf
#<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
#</IfModule>
Установка mod_ruid2
Модуль предназначен для запуска процессов apache от имени другого пользователя. В данном случае,у каждого сайта есть свой системный пользователь. Это позволяет более гибко настраивать права доступа,а также повысить безопасность данных. Последнюю актуальную версию качаем с http://sourceforge.net/projects/mod-ruid/:
apt-get install libcap-dev apache2-prefork-dev cd /tmp
wget http://switch.dl.sourceforge.net/project/mod-ruid/mod_ruid2/mod_ruid2-0.9.7.tar.bz2 tar xjf mod_ruid2-0.9.7.tar.bz2 cd mod_ruid2-0.9.7 apxs2 -a -i -l cap -c mod_ruid2.c
Конфигурационные файлы и структура каталогов.
Дальше о стуктуре каталогов для хостов. Я приверженец того,чтобы отделять проекты друг от друга. Вот что у меня получилось:
/home/www/ - базовый каталог для проектов /home/www/site.by/ - домашний каталог проекта /home/www/site.by/tmp/ - каталог для временных файлов и сессий /home/www/site.by/log/ - каталог для логов /home/www/site.by/www/ - корневой каталог для веб части проекта
Создадим системного пользователя,от которого будут выполяться все запросы apache. Чтобы пользователи не могли залогиниться через ssh,узнаем путь к nologin,добавляем в список шеллов (без этого многие ftp серверы не хотят логинить данный польхователей):
# which nologin /usr/sbin/nologin
echo '/usr/sbin/nologin' >> /etc/shells
Проверяем umask для новых пользователей (для безопасности). Если нужно — правим:
# grep DIR_MODE /etc/adduser.conf
DIR_MODE=0750
Создаем пользователя,добавляем nginx в группу пользователя,иначе он не сможет получить доступ к домашнему каталогу веб проекта:
useradd -s /usr/sbin/nologin -d /home/web/site.by/ site usermod -a -G site www-data
Создаем файлы конфигов:
#cat /etc/apache2/sites-available/site.by
<VirtualHost *>
ServerAdmin info@site.by
ServerName site.by
ServerAlias www.site.by
DocumentRoot /home/www/site.by/www/
<Directory /home/www/site.by/www/>
php_admin_value open_basedir "/home/www/site.by"
php_admin_value upload_tmp_dir "/home/www/site.by/tmp"
php_admin_value session.save_path "/home/www/site.by/tmp"
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
<IfModule mod_ruid2.c>
RUidGid site site
</IfModule>
ErrorLog /home/www/site.by/log/error.log
# Possible values include: debug,info,notice,warn,error,crit,
# alert,emerg.
LogLevel warn
CustomLog /home/www/site.by/log/access.log combined
</VirtualHost>
# cat /etc/nginx/sites-available/site.by
server
location ~* \.(jpg|swf|jpeg|gif|png|css|js|ico)$
location /
}
Делаем софт линки данных конфигов в каталоги,конфигурационные файлы которых автоматически подгружаются apache и nginx:
cd /etc/apache2/sites-enabled/ && ln -s ../sites-available/site.by . # или можно заменить на a2ensite site.by cd /etc/nginx/sites-enabled/ && ln -s ../sites-available/site.by .
Далее перезагружаем сервисы:
/etc/init.d/apache2 restart /etc/init.d/nginx restart
При необходимости повышения безопасности можно отключить некоторые функции php:
#grep disable_functions /etc/php5/apache2/php.ini
disable_functions = system,exec,passthru,shell_exec,escapeshellarg,escapeshellcmd,dl,show_source,fileowner,filegroup,posix_getpwuid,posix_getgrgid,posix_uname,cwd,php_uname,popen,proc_open,ini_get_ll,disk_total_space,diskfreespace,disk_free_space
При этом при запуске из консоли php интерпритатора будет использоваться файл /etc/php5/cli/php.ini. Таким образом можно разрешить некоторые функции для привелигированных пользователей.
Настраиваем ротацию логов. Создаем файл со следующим содержимым:
# cat /etc/logrotate.d/apache-sites /home/www/*/log/*.log { daily missingok rotate 5 compress delaycompress notifempty create 644 root root sharedscripts postrotate /etc/init.d/apache2 reload > /dev/null
endscript prerotate if [ -d /etc/logrotate.d/httpd-prerotate ]; then \ run-parts /etc/logrotate.d/httpd-prerotate; \ fi; \ endscript }
В итоге,кадлые сутки будет создаваться архив за предыдущий день,всего архивов — не более 5,все сжимается gzip’ом.
Хочу обратить внимание на то,что если сайт (cms) генерирует css/js/image на лету,то данные типы динамически создаваемых файлов нужно исключить из конфига nginx’а для этого сайта. Или вовсе его удалить: при настройке по данным выше рекомендациям все запросы nginx перенаправляет на apache даже если не нашел у себя данных о сайте в своих конфигах.
На этом все.
В будущем планирую выложить скрипт для автоматического добавления нового проекта (сайта) согласно данным настройкам
UPD: Выкладываю образ виртуальной машины для virtualbox,настроенной по данной инструкции. Файл в формате .ova указать в меню Файл — Импорт конфтгураций. Объем для скачивания ~ 600 Mb. Логин: root ,пароль: itblog