Установка и настройка вебсервера (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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *