[Полноценный сервер — Часть3] Установка Apache2+nginx+php5+MySQL и еще по мелочи…

Ну что же … продолжим ? … Очередная задача с которой должен справляться данный сервер — это поддержка сайта, а точнее нескольких сайтов … Для чего ? Вопрос глупый … поэтому не отвечу … Для чего я пишу данную запись при наличии кучи инструкций в инете на эту тему ? Для себя! … Короче начну со списка ПО которое мы будем ставить и немного теории …

Внимание! Данный материал на данный момент (5.4.11 03:11) является сыроватым! Есть непонятные места, о которых я еще сам не понимаю, но собственно, это все будет исправляться!

Apache2 — самый распространённый HTTP сервер. Распространяется бесплатно, включая исходные тексты (своя лицензия). Поддерживаются сценарии на CGI (включая FastCGI), PHP, perl, Java.

nginx — это очень быстрый HTTP сервер, который часто используют вместо или совместно с Apache, чтобы снизить нагрузку на сервер и увеличить скорость обработки запросов посетителей.

PHP (рекурсивный акроним словосочетания «PHP: Hypertext Preprocessor») — это широко используемый язык программирования общего назначения с открытым исходным кодом. PHP сконструирован специально для ведения Web-разработок и может внедряться в HTML-код.

MySQL — это система управления базами данных. База данных представляет собой структурированную совокупность данных. Эти данные могут быть любыми — от простого списка предстоящих покупок до перечня экспонатов картинной галереи или огромного количества информации в корпоративной сети. Для записи, выборки и обработки данных, хранящихся в компьютерной базе данных, необходима система управления базой данных, каковой и является ПО MySQL. Поскольку компьютеры замечательно справляются с обработкой больших объемов данных, управление базами данных играет центральную роль в вычислениях. Реализовано такое управление может быть по-разному — как в виде отдельных утилит, так и в виде кода, входящего в состав других приложений.

Ну да ладно. Хватит теории. Данная связка будет работать таким образом, что все скрипты php будут обрабатываться Apache-м а вся статика — Nginx-ом. Это делается для того чтобы экономились ресурсы…

Начнем! Для начала установим одной строкой Apache+php5+Mysql+PhpMyAdmin:

sudo aptitude install mysql-server mysql-client libmysqlclient15-dev apache2 apache2-doc apache2-utils libexpat1 ssl-cert libapache2-mod-php5 libapache2-mod-ruby php5 php5-common php5-curl php5-dev php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-mhash php5-ming php5-mysql php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl phpmyadmin

Во время установки понадобиться ввести пароль на root пользователя для MySql и пароль конфигурации PhpMyAdmin.

Немного расскажу о некоторых модулях, которые желательно тоже поставить. Всем известно, что Apache по умолчанию работает от одного пользователя, из этого следует что он имеет доступ ко всем php файлам. Естественно это не есть хорошо, поэтому на помощь нам приходит модуль apache2-mpm-itk. Для его установки набираем:

sudo aptitude install apache2-mpm-itk

Далее после его установки в виртуальных хостах указываем строку AssignUserId user1 users, где user1 — пользователь, а users — группа. Пример  конфигурации виртуального хоста с комментариями вы увидите ниже …

После успешной установки разрешим модули SSL, rewrite, suexec, include в Apache:

sudo a2enmod ssl rewrite suexec include

Далее нам необходимо настроить apache таким образом, чтобы он слушал порт 81, так как 80 порт у нас будет слушать nginx. Откроем в редакторе файл ports.conf …

sudo vim /etc/apache2/ports.conf

… и приведем его к такому виду:

NameVirtualHost *:81  Listen 81 
#<IfModule mod_ssl.c>  
#Listen 443 
#</IfModule> 
#<IfModule mod_gnutls.c>  
#Listen 443 
#</IfModule>

—————————————————-

При написании следующей части была обнаружена ошибка … nginx и apache слушали один и тот же порт, поэтому эти строки я закомментировал! При правильном раскладе у вас по netstat должна отображаться следующая инфа:

$ sudo netstat -eelnpA inet | sort -nk4 | egrep "^[A-Z]|:80" 
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program nametcp 
0 0 0.0.0.0:443 0.0.0.0:* LISTEN 0 1345107 10596/nginxtcp 
0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 1345106 10596/nginxtcp 
0 0 0.0.0.0:81 0.0.0.0:* LISTEN 0 1345349 10669/apache2 

—————————————————-

Далее откроем файл apache2.conf:

sudo vim /etc/apache2/apache2.conf

и изменяем или добавляем директивы

Timeout 90 
KeepAlive Off 
ServerName site.ru 

Отрубаем хосты по умолчанию:

sudo a2dissite default default-ssl 

Перезагружаем Apache:

sudo /etc/init.d/apache2 restart

Проверим логи Apache — если все запросы идут с адреса 127.0.0.1 то нужно ставить mod_rpaf:

sudo aptitude install libapache2-mod-rpaf

Для настройки mod_rpaf достаточно открыть файл rpaf.conf :

sudo vim /etc/apache2/mods-enabled/rpaf.conf

и привести его к виду (10.10.10.107 — это ip сервера):

<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 10.10.10.107
</IfModule>

Перезагружаем apache:

sudo /etc/init.d/apache2 restart

Теперь, например, у нас есть домен на сервере www.site.ru — рассмотрим пример виртуального хоста.
Создаем файл www.site.ru в папке /etc/apache2/sites-available/:

sudo vim /etc/apache2/sites-available/www.site.ru

Далее пустой файл приводим к следующему виду:

ps: Данный файл будет обновляться, а точнее описание на него!…

#Указываем порт 81!
<VirtualHost *:81>
#Задаем почтовый адрес вебмастера
ServerAdmin webmaster@site.ru
#Задаем имя хоста
ServerName site.ru
#Задаем алиас хоста
ServerAlias www.site.ru
Указываем путь к каталогу с файлами сайта:
DocumentRoot /home/user1/www.site.ru/www/htdocs

<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>

<Directory /home/user1/www.site.ru/www/htdocs/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>

ScriptAlias /cgi-bin/ /home/user1/www.site.ru/www/cgi-bin/
<Directory "/home/user1/www.site.ru/www/cgi-bin/">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

#Указываем пути к лог-файлам (лог с ошибками, и доступом), а так же способ отображения лога:
ErrorLog /home/user1/www.site.ru/logs/site.ru-error.log
# Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
LogLevel warn
CustomLog /home/user1/www.site.ru/logs/site.ru-access.log combined

#Указываем пользователя и  группу, от которого будет запускаться процесс:
<IfModule mpm_itk_module>
AssignUserId user1 users
</IfModule>
</VirtualHost>

Вуаля! Хост настроили!

Теперь приступим к установки самого ngnix.
Чтобы его установить на Debian 6, необходимо добавить /etc/apt/sources.list следующие строки:

deb http://nginx.org/packages/debian/ squeeze nginx 
deb-src http://nginx.org/packages/debian/ squeeze nginx

После, скачиваем ключ для проверки подлинности подписи репозитория nginx и добавляем его в связку ключей apt:

wget http://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key

Теперь ставим сам ngnix:

sudo aptitude install ngnix

После успешной установки открываем файл конфигурации ngnix:

 sudo vim /etc/nginx/nginx.conf

… и приводим его к следующему виду:

# Пользователь от которго запускается данный процесс.
user www-data;
# Указываем количество ядер в процессоре.
worker_processes  2;
# Указываем путь к логу с ошибками.
error_log  /var/log/nginx/error.log;
# Директива задаёт файл, в котором хранится номер основного процесса.
pid        /var/run/nginx.pid;

events {
# Количество рабочих процессов
worker_connections  1024;
}

http {
include       /etc/nginx/mime.types;
default_type  application/octet-stream;
server_names_hash_bucket_size 64;
access_log  /var/log/nginx/access.log;

sendfile        on;
tcp_nopush     on;
# Директива задаёт таймаут, в течение которого keep-alive соединение с клиентом не будет закрыто со стороны сервера.
keepalive_timeout  65;
tcp_nodelay        on;

gzip  on;
gzip_proxied        any;
gzip_min_length     1100;
gzip_http_version   1.0;
gzip_buffers        4 8k;
gzip_comp_level     9;
gzip_types          text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

После редактирования конфига создадим файл proxy.conf  :

sudo vim /etc/nginx/proxy.conf
# 22.03.11
# Директива задаёт текст, который нужно изменить в строках заголовка "Location" и "Refresh" в ответе проксируемого сервера
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;
proxy_set_header            Connection close;
# Директива разрешает передавать от проксируемого сервера клиенту запрещённые для передачи строки.
proxy_pass_header           Content-Type;
proxy_pass_header           Content-Disposition;
proxy_pass_header           Content-Length;
# Максимально допустимый размер тела запроса клиента.
client_max_body_size        10m;
# Размер буфера для чтения тела запроса клиента.
client_body_buffer_size     128k;
# Таймаут для соединения с проксированным сервером.
proxy_connect_timeout       90;
# Таймаут при передаче запроса проксированному серверу.
proxy_send_timeout          90;
# Таймаут при чтении ответа проксированного сервера.
proxy_read_timeout          90;
# Размер буфера, в который будет читаться первая часть ответа, получаемого от проксируемого сервера.
proxy_buffer_size           4k;
# Число и размер буферов для одного соединения, в которые будет читаться ответ, получаемый от проксируемого сервера.
proxy_buffers               4 32k;
# Размер буфера из которого будет отдаваться ответ клиенту не дожидаясь всего ответа от upstream.
proxy_busy_buffers_size     64k;
# Устанавливает количество данных, которые будут записаны на proxy_temp_path при записи.
proxy_temp_file_write_size  64k;

Теперь перейдем к созданию хоста для нашего сайта www.site.ru в ngnix:

sudo vim /etc/nginx/sites-available/www.site.ru

… и приводим его к следующему виду:

# Хост для www.site.ru
server {
 listen 80;
 server_name     site.ru www.site.ru srv.site2.ru;
 access_log      /home/site.ru/www.site.ru/logs/nginx.access-site.ru.log;
 error_log       /home/site.ru/www.site.ru/logs/nginx.error-site.ru.log;

 location / {
  proxy_pass      http://127.0.0.1:81/;
  include         /etc/nginx/proxy.conf;
 }

 location ~* \.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|xml|docx|xlsx|js)$ {
 root            /home/site.ru/www.site.ru/www/htdocs;
 }
}

После создания — включаем этот хост:

sudo ln -s /etc/nginx/sites-available/www.site.ru /etc/nginx/sites-enabled/www.site.ru

… и перезагружаем nginx:

sudo /etc/init.d/nginx restart

PhpMyAdmin в данной связке будет немного не корректно работать, но это дело поправимо … открываем default хост:

sudo vim /nginx/sites-available/default

Далее запишем туда следующее содержимое:

location /phpmyadmin {
  proxy_pass      http://127.0.0.1:81/phpmyadmin/;
  include         /etc/nginx/proxy.conf;
  allow all;
}

И перезагружаем nginx:

 sudo /etc/init.d/nginx restart

Все! Проверяем: www.site.ru/phpmyadmin — должно все работать!

Пока на данный момент все … далее я выложу скрипт с помощью которого можно будет добавлять хосты с БД и т.д. НО после установки ftp сервера! …

Материалы которые мне очень пригодились для написания этой статьи:

ngnix:

http://nginx.org/ru/
http://forum.nginx.org/read.php?21,166190
http://sysoev.ru/nginx/docs/ngx_core_module.html
http://sysoev.ru/nginx/docs/http/ngx_http_core_module.html
http://sysoev.ru/nginx/docs/http/ngx_http_proxy_module.html
http://wiki.nginx.org/HttpProxyModule
http://wiki.linuxformat.ru/index.php/LXF95:Податливый Nginx

Apache:

http://habrahabr.ru/blogs/ubuntu/20736/
http://forum.ubuntu.ru/index.php?topic=52552.0
http://ru-ua.ws/showthread.php?t=971
http://mannix.ru/ubuntu/ustanovka-i-nastrojka-apache2-php5-ssl-mysql5-pod-linux.html

ngnix + apache:

http://debianworld.ru/articles/ustanovka-nginx-kak-front-end-k-apache-v-debian-ubuntu/
http://debianworld.ru/articles/ustanovka-nginx-apache-i-nastrojka-virtualnyh-hostov-c-podderzhkoj-ssl-https-v-debian-ubuntu/
http://linuxforum.ru/viewtopic.php?pid=30737
http://rubuntu.ru/blog/server/435/nastrojka-apache-2-nginx-php-5-mysql-memcached-eaccelerator-sphinx-v-ubuntu.html
http://server-tuning.info/nginx/apache-frontend.html
http://www.opennet.ru/base/net/nginx_ipb.txt.html
http://kovyrin.net/2006/05/18/nginx-as-reverse-proxy/lang/ru/

phpmyadmin:

http://www.gentoo.ru/node/17933
http://forum.lissyara.su/viewtopic.php?f=3&t=25131
http://forum.ubuntu.ru/index.php?topic=88544.0

www-data