ITblog.by » Статьи » Установка и настройка вебсервера (nginx + apache2 + mod_ruid2 + php + mysql)

Установка и настройка вебсервера (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 {
listen 80;
server_name site.by www.site.by;

location ~ /\.ht {
deny all;
}

location ~* \.(jpg|swf|jpeg|gif|png|css|js|ico)$ {
root /home/www/site.by/www;
}

location / {
proxy_pass http://127.0.0.1:88;
}

}

 

Делаем софт линки данных конфигов в каталоги, конфигурационные файлы которых автоматически подгружаются 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


Аватар пользователя Stepa
  • Stepa
  • 28 декабря 2012 17:29
  • Группа Гости
  • Новостей: 0
  • Комментариев: 0
Кривой ман, [cenzured].Только виртуалку запарол. [cenzured]
Аватар пользователя greenlogles
  • greenlogles
  • 11 января 2013 16:31
  • Группа Администраторы
  • Новостей: 65
  • Комментариев: 22
1. Я никому ничего не обязан. В том числе писать маны для каждого подрастающего/ленивого администратора. Это мой блог, где я пишу для себя. Кому полезно - пусть пользуется.

2. Думаю вы обратили внимание при установке mod_ruid сообщение о том, что не найден пакет apache2-prefork-dev и его надо установить. Если да, то вопросов не было бы.
Обращайте внимание на сообщение системы об ошибках.
И даже не знаю что нужно было сделать, чтобы "запороть" виртуалку.

3. У меня все работает (с)
Аватар пользователя Ivan
  • Ivan
  • 23 февраля 2013 02:35
  • Группа Гости
  • Новостей: 0
  • Комментариев: 0
Гайд классный, поднял всё и сразу.

Надеюсь Автор напишет как Освоить quota limit для юзеров :).
Аватар пользователя greenlogles
  • greenlogles
  • 23 февраля 2013 17:21
  • Группа Администраторы
  • Новостей: 65
  • Комментариев: 22
Ivan, спасибо.
Как раз планирую ближайшее время разобраться разобраться с квотами, почтовыми серверами и автоматизацией этого "добра" smile
Аватар пользователя Ivan
  • Ivan
  • 25 февраля 2013 01:42
  • Группа Гости
  • Новостей: 0
  • Комментариев: 0
Как раз таки я уже почти и автоматизировал всё это хозяйство, в данный момент пишу Биллинг.


Вот код автоматизации:
http://pastebin.com/7tfyrdtR

Если интересно что я тут намутил, отпишись в icq: 15181158 / skype: ivan6335523 :)
Аватар пользователя greenlogles
  • greenlogles
  • 25 февраля 2013 09:40
  • Группа Администраторы
  • Новостей: 65
  • Комментариев: 22
Ivan, у меня аналогичный скриптик есть для создания виртуалхостов - частичная переделка virtualhost.sh

Как появится свободное время - обязательно напишу smile
Аватар пользователя Тимур
  • Тимур
  • 1 марта 2013 07:35
  • Группа Гости
  • Новостей: 0
  • Комментариев: 0
Добрый день,

Очень полезная статья, не могли бы вы подсказать начинающему администратору, как правильно настроить apache+nginx, если у меня два домена, для каждого создавать отдельные файлы конфигураторов?
Аватар пользователя greenlogles
  • greenlogles
  • 1 марта 2013 08:37
  • Группа Администраторы
  • Новостей: 65
  • Комментариев: 22
Тимур, да, для каждого домена создавать свой конфиг (как минимум для apache).
А размещать под одним пользователем или под разными - вам решать.
Аватар пользователя Dedok
  • Dedok
  • 13 марта 2013 15:23
  • Группа Гости
  • Новостей: 0
  • Комментариев: 0
а зачем
postrotate
/etc/init.d/apache2 reload > /dev/null

если есть

create 644 root root
Аватар пользователя greenlogles
  • greenlogles
  • 13 марта 2013 15:46
  • Группа Администраторы
  • Новостей: 65
  • Комментариев: 22
Цитата: Dedok
а зачем

Дело в том, что апач при работе постоянно держит открытым файл лога. При удалении/перемещении (во время ротации) нужно сообщить ему, чтобы переоткрыл файл (и получить новый дескриптор для открытого лога). Потому reload.
Альтернативный способ - послать HUP

/bin/kill -HUP `cat /var/run/apache2.pid 2> /dev/null` 2> /dev/null || true
Аватар пользователя Dedok
  • Dedok
  • 13 марта 2013 16:06
  • Группа Гости
  • Новостей: 0
  • Комментариев: 0
greenlogles,
вы в этом уверены, что он держит открытыми, а не дописывает их тупо в конец?
я просто не представляю как у меня апач может держать открытые логи весом от 1гига до 30 в количестве 120 штук одновременно..

в общем сам решил убедиться и проверил wink
получилось интересная ситуевина, при переименовании лога, в него все-равно продолжается запись, при удалении и создании нового в новый не пишется без перезагрузки апача...
Аватар пользователя greenlogles
  • greenlogles
  • 13 марта 2013 16:18
  • Группа Администраторы
  • Новостей: 65
  • Комментариев: 22
Dedok,
Да, верно.. Я только не уверен к чему идет привязка открытого файла: inode на диске или дискриптору.. В любом случае, в памяти находится только адрес (или смещение относительно чего-то) лога, а не его содержимое. Потому объем лога не влияет на объем озу или используемого cpu.

Сделано это скорее для повышения быстродействия: операции открытия/закрытия файла при большой нагрузке на вебсервер занимали бы львиную долю времени (реального и процессорного)
Аватар пользователя Dedok
  • Dedok
  • 13 марта 2013 16:45
  • Группа Гости
  • Новостей: 0
  • Комментариев: 0
greenlogles,
ну тогда получается, что
create 644 root root
лишнее?
ведь рестарт апача по любому создаст лог файлы.
просто хочется уже разобраться немного, а не тупо копировать конфиги wink
и как мне кажется, что могут быть ситуации когда апач стартует от www и он не сможет писать в roota.

и не понятно предназначение
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi; \
endscript
просто видел уже много конфигов и не встречал prerotate, что это за действия которые должны выполняться перед ротацией логов?

зы: и нафига требовать мыло для поста если с левым мылом прокатывает, а веть родное жалко пихать для сбора ботами ...тем более ручная модерация идет...
Аватар пользователя greenlogles
  • greenlogles
  • 13 марта 2013 22:40
  • Группа Администраторы
  • Новостей: 65
  • Комментариев: 22
Цитата: Dedok
/etc/logrotate.d/httpd-prerotate

Данный конфиг был переделан из дефолтового файла /etc/logrotate.d/apache2 ubuntu server. Посчитал, что меинтейнеры дистрибутива/разработчики апача больше в курсе внутреннего строения.

Насчет create и prerotate - они не обязательны.

А реальная почта нужна лишь для того, чтобы можно было подписаться на комментарии. Пока не до конца допилил сайт, потому все немного костыльно. Пока оцениваю свои силы и время: допилить текущий или взять другой движок.
Буду стараться пофиксить комменты ближайшее время. Спасибо за замечания
Аватар пользователя vismuth
  • vismuth
  • 27 марта 2013 10:23
  • Группа Посетители
  • Новостей: 0
  • Комментариев: 10
Спасибо все работает)) Есть только пару вопросов по домену заходит на сайт, а внутренний ip-адресу 192.168.1.100 адрес сервера, пишет it's work, как это возможно?
И еще вопрос как сделать что CMS движки работали нормально?
И как размещать к примеру 10 сайтов на одном ip-адресе?

Заранее спасибо))
Аватар пользователя greenlogles
  • greenlogles
  • 29 марта 2013 12:11
  • Группа Администраторы
  • Новостей: 65
  • Комментариев: 22
vismuth,
В данной реализации nginx используется как прокси + отдача напрямую (без apache) картинок, css и прочего.
В вашем случае подозреваю, что некорректно настроен конфиг для апача, потому как он выдает страницу по-умолчанию.
Проверьте, точно ли есть линк /etc/apache2/sites-enabled/имя_домена
Если есть, перезапустите апач (именно restart)
Если не заработает, надо смотреть логи nginx и apache. По умолчанию сайты будут открываться через любой ip сервера. Если нужна привязка к конкретному ip - нужно подправить конфиг nginx'a (указать "listen 192.168.1.100:80")

По данной инструкции можно обслуживать почти неограниченное кол-во доменов. Просто для каждого создается пользователь, конфиг для apache (обязательно) и nginx (необязательно)

Если и после просмотра логов ничего не заработало - можете написать мне в скайп (логин как никнейм в комментариях) - возможно получится помочь
Аватар пользователя vismuth
  • vismuth
  • 29 марта 2013 13:11
  • Группа Посетители
  • Новостей: 0
  • Комментариев: 10
не работает вот что пишет nginx error.log


2013/03/29 13:55:14 [error] 2404#0: *20 FastCGI sent in stderr: "Unable to open primary script: /etc/nginx/html/index.php (No such file or directory)" while reading response header from upstream, client: 192.168.1.1, server: homehosts.r$
2013/03/29 13:55:21 [error] 2404#0: *20 FastCGI sent in stderr: "Unable to open primary script: /etc/nginx/html/installation/index.php (No such file or directory)" while reading response header from upstream, client: 192.168.1.1, server$



А в апаче вообще папка пуста

Ну все делал как вы описывали в этом уроки

да линк есть /etc/apache2/sites-enabled/mysite

я выполняю всегда командой
ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/
ln -s /etc/apache2/sites-available/mysite /etc/apache2/sites-enabled/
Аватар пользователя greenlogles
  • greenlogles
  • 29 марта 2013 16:05
  • Группа Администраторы
  • Новостей: 65
  • Комментариев: 22
vismuth,
У вас включен Fact-CGI модуль у nginx. Вероятно он и пытается сам обработать php файлы

Проверьте каталог /etc/nginx/sites-enabled/. В нем должны быть только ссылки на конфиги размещаемых файлов, а каталог /etc/nginx/conf.d/ вообще пустой.
Аватар пользователя vismuth
  • vismuth
  • 31 марта 2013 17:06
  • Группа Посетители
  • Новостей: 0
  • Комментариев: 10
На этом все.
В будущем планирую выложить скрипт для автоматического добавления нового проекта (сайта) согласно данным настройкам

А когда это будущее настанет? fellow а то не как не получается прилепить несколько сайтов к одному Ip а в будущем планирую прикупить второй Ip от другого провайдера
Аватар пользователя vismuth
  • vismuth
  • 4 апреля 2013 16:52
  • Группа Посетители
  • Новостей: 0
  • Комментариев: 10
У меня не как не получается создать на один айпи несколько доменов((
Аватар пользователя greenlogles
  • greenlogles
  • 6 апреля 2013 23:42
  • Группа Администраторы
  • Новостей: 65
  • Комментариев: 22
vismuth,
Пишите на почту info [собака] itblog.by - попробую помочь.
Можете прикрепить архивом каталоги /etc/apache2/ и /etc/nginx/ для того, чтобы быстрее разобраться.
Насчет скрипта - заготовка есть. Разгребусь с домашними делами - выложу.
Аватар пользователя vismuth
  • vismuth
  • 14 апреля 2013 01:08
  • Группа Посетители
  • Новостей: 0
  • Комментариев: 10
Мне что не оч. понравилась как отображается на Nginx Joomla, пришлось снести все и установить ОС заново без Nginx только Apache2, но есть и плюсы, зато я сделал нормальный RAID1 с оповещением на почту если один из дисков скопытится winked
Аватар пользователя greenlogles
  • greenlogles
  • 14 апреля 2013 08:13
  • Группа Администраторы
  • Новостей: 65
  • Комментариев: 22
vismuth, а в чем именно проблемы были ?
Аватар пользователя vismuth
  • vismuth
  • 14 апреля 2013 09:10
  • Группа Посетители
  • Новостей: 0
  • Комментариев: 10
greenlogles,

1. Проблема это отображение часть ссылки в строке поиска, где ее по сути не должно быть,
2 админ панели, папки с файлами jpeg, png и т.д. отображались с значком кирпич
3 умный поиск не работал
4 на другом сайте при нажатие на любую вкладку из меню возвращала обратно на главную, мне это все надоело, времени нету поджимал хостир с оплатой, а съехать я не мог на свой сервер, вот и пришлось переписывать ОС с нуля и ставить только Apache
Аватар пользователя greenlogles
  • greenlogles
  • 14 апреля 2013 10:28
  • Группа Администраторы
  • Новостей: 65
  • Комментариев: 22
Странно.
Развернул для теста стандартную джумлу - j.itblog.by
Таких ошибок не наблюдаю.
В любом случае, скоро настрою и выложу диск виртуальной машины с настроенным по данной инструкции веб сервером (от virtualbox)
Аватар пользователя vismuth
  • vismuth
  • 14 апреля 2013 22:56
  • Группа Посетители
  • Новостей: 0
  • Комментариев: 10
greenlogles,

Я это обнаружил только когда на реальное железо уже установил, тогда и обнаружил эти проблемы(( ну Apache не так уже не много ресурсов жрет пока)))
Аватар пользователя Petro
  • Petro
  • 19 апреля 2013 20:25
  • Группа Гости
  • Новостей: 0
  • Комментариев: 0
Как настроить apache 2.2 так, чтобы он принимал соединения от конкретных имен и портов, например, чтобы на abc.myzone.org:80 грузился, а на abc.myzone.org:8080 выдавал ошибку
Аватар пользователя Кирилл
  • Кирилл
  • 19 апреля 2013 23:36
  • Группа Гости
  • Новостей: 0
  • Комментариев: 0
При попытке запустить апач выдает

apache2: Syntax error on line 269 of /etc/apache2/apache2.conf: Syntax error on line 1 of /etc/apache2/sites-enabled/grand-wow.com: /etc/apache2/sites-enabled/grand-wow.com:1: <VirtualHost> was not closed.
Action 'configtest' failed.
The Apache error log may have more information.

Делал все по ману.
Аватар пользователя greenlogles
  • greenlogles
  • 20 апреля 2013 17:15
  • Группа Администраторы
  • Новостей: 65
  • Комментариев: 22
Petro, вообще можно закрыть фаерволом (iptables).
Или посмотреть конфиги apache/nginx на наличие открытого порта 8080.
По данной инстукции апач будет висеть на localhost (не на внешнем интерфейсе)

Кирилл, судя по ошибке, у вас не закрыт тег <Virtualhost> в файле /etc/apache2/sites-enabled/grand-wow.com
Может не все полностью скопировали?
Аватар пользователя greenlogles
  • greenlogles
  • 22 апреля 2013 02:13
  • Группа Администраторы
  • Новостей: 65
  • Комментариев: 22
UPD: Выкладываю образ виртуальной машины для virtualbox, настроенной по данной инструкции. Подробности в конце статьи

Rating All.BY Анализ сайта ITblog.by