Установка nginx+varnish(3.0)+apache + Mysql + PHP на CentOS 6

--> Есть статья новее, для Centos 7 <--

Итак, у нас есть CentOS, подключенный к интернету и нам нужно поставить на него всем известную связку apache+mysql+php. Я немного усложню задачу с веб-сервером. Поставим nginx - ftontend'ом, varnish - middleend'ом, apache - backend'ом. Почему так? Чтобы нам небыли страшны никакие нагрузки - эта связка в значительной степени ускоряет работу веб-приложений.

nginx будет впереди. Зарекомендовавший себя как идеальное решение для отдачи статистики (файлов), он также будет заниматься различными перенаправлениями. В нём это делать очень удобно и быстро. Вся документация есть на русском языке (потому как проект русский ;)), что так же не может не радовать.
varnish будет посредине. Это сверх-замечательный ускоритель веб-приложений, который занимается кешированием. Как написано на сайте разработчиков: "You install it in front of any server that speaks HTTP and configure it to cache the contents. Varnish Cache is really, really fast.". Да и хорошо контролировать все этапы отдачи отдельно - это удобно.
apache старый, добрый поставим в конце. Думаю, в рекламе он не нуждается. Старый, проверенный... тяжёлый.... медленный.... =) В общем, его. Опять же, для большинства проектов можно обойтись без apache... мнений много. Очень. Но мы не будем вдаваться в эти подробности - ставим три веб-сервера.

Если Вы подключали репозитории с инструкции - значит у Вас не должно возникнуть никаких проблем. Пользуйтесь опцией yum --enablerepo=name_repo и yum --disablerepo=name_repo, если это необходимо. В разных репозиториях разные пакеты и разные версии. Например, в remi php 5.4, а в atomic 5.3 и т.д. Ну, я выбираю последний софт, так как сервер новый.

Начнём!
yum install httpd php php-devel php-gd php-mbstring php-mcrypt php-xml php-pear php-pdo php-mysql nginx mysql mysql-server varnish

Установиться большая куча пакетов и, в итоге, должно появится Complete! Что же мы вообще ставим?! На самом деле - только всё необходимое. Кому интересно можно посмотреть спойлер:

Spoiler: Highlight to view

  • httpd - Apache HTTP-сервер - наш backend. В CentOS он называется именно так (http://ru.wikipedia.org/wiki/Apache);<.li>
  • php - скриптовый язык программирования общего назначения, интенсивно применяемый для разработки веб-приложений (http://ru.wikipedia.org/wiki/Php);
  • php-devel - - это дополнительные инструменты. Нам они понадобятся для установки xcache;<.li>
  • php-gd - графическая библиотека GD, содержащая функции для работы с изображениями (http://php.net/manual/ru/book.image.php);
  • php-mbstring - предоставляет расширенную поддержку кодировок (http://php.net/manual/ru/book.mbstring.php‎);
  • php-mcrypt - библиотека, которая поддерживает алгоритмы блочного шифрования (http://www.php.net/manual/ru/book.mcrypt.php);
  • php-xml - данный инструментарий позволяет Вам анализировать, но не проверять XML-документы (http://php.net/manual/ru/book.xml.php);
  • php-pear - это аббревиатура от "PHP Extension and Application Repository" - Репозиторий приложений и модулей PHP (http://pear.php.net/manual/ru/about.pear.php);
  • php-pdo - определяет простой и согласованный интерфейс для доступа к базам данных в PHP (http://php.net/manual/ru/book.pdo.php);
  • php-mysql - эти функции позволяют вам работать с MySQL. Это расширение не рекомендуется использовать при написании собственного нового кода! Смотрите ссылку (http://php.net/manual/ru/book.mysql.php);
  • nginx - простой, быстрый и надёжный сервер, не перегруженный функциями. Применение nginx целесообразно прежде всего для статических веб-сайтов (http://nginx.org/ru/);
  • mysql - клиент mysql-server (http://ru.wikipedia.org/wiki/Mysql);
  • mysql-server - свободная система управления базами данных. Разработку и поддержку MySQL осуществляет корпорация Oracle (http://ru.wikipedia.org/wiki/Mysql);
  • varnish - cache web-сервер (https://www.varnish-cache.org/).

Что дальше? Нужно бы засунуть всё в автозагрузку, чтобы, мало ли, всё поднималось без нас. Поехали:

chkconfig httpd on &&
chkconfig mysqld on &&
chkconfig nginx on &&
chkconfig varnish on

Далее подключим сразу xcache. Про это я уже писал тут. Выполняем эти действия, но apache пока не включаем!

Теперь настроим apache на работу по модели Apache-ITK. Почему на неё? Это очень удобный режим, позволяющий избежать различных проблем с правами на виртуальных хостах. Т.е. мы ставим владельца корневой папки хоста конкретного пользователя, таким образом даём ему все права на изменение любых файлов внутри и при этом apache так же работает от имени этого пользователя. Инструкция того, как это сделать. Apache пока не включаем! =)

Теперь схема того, как всё будет работать. Впереди стоит nginx на 80 порту. Далее varnish на своём порту по умолчанию 6081 и в конце apache на 8081. В принципе, конечно, номера портов для varnish и apache можно выбрать и другие - это не принципиально. Сначала закончим с apache'ом. Мне нравится, как организованы виртуальных хосты в семействе debian, поэтому Вам так же предлагаю перенять это. А так же сделать отдельные папки для логов ошибок и доступов. Это очень удобно тем, что не придётся ничего искать. Всё чётко структурировано и очень удобно в управлении и других различных операциях. Создадим несколько папок:

mkdir /etc/httpd/sites-available &&
mkdir /etc/httpd/sites-enabled &&
mkdir /var/log/httpd/error/ &&
mkdir /var/log/httpd/access/ &&
mkdir /var/log/nginx/error/ &&
mkdir /var/log/nginx/access/

Пояснения:
1) Первая папка это созданные, но не "включенные" виртуальные хосты. Иногда бывает полезно, например, когда нужно выключить хост на некоторое время;
2) Вторая папка будет содержать symlink'и на созданные хосты из первой. Т.е., чтобы временно выключить хост, достаточно удалить symlink, не удаляя конфигурацию виртуального хоста;
3) Как, думаю, понятно из названия 3, 4, 5, 6 папки нужны для структуризации логов. Очень удобно, особенно когда логи называются по имени хоста. Плюс к этому я написал свой скрипт бэкапов и ротации логов. Если интересно - милости прошу.

Перейдём к настройкам самого apache.
Открываем файл:
nano /etc/httpd/conf/httpd.conf
Здесь нам нужно сделать несколько изменений:
1) Во-первых, добавить строчку:
Include sites-enabled/*.conf
2) Во-вторых, добавляем:
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" varnishcombined
Это абсолютно не обязательно! Просто эта строчка немного меняет вид логов доступа с учётом, что у нас ещё есть varnish по средине. Мне так удобнее, а Вы сами смотрите.
3) В-третьих, найти существующую директиву Listen 80 и изменить её на Listen 127.0.0.1:8081. Вообще, обычно ставят на 8081, но, у меня ещё развёрнут solr через tomcat, а он висит как раз на 8081. Но - дело Ваше, какие порты занимать =)
Если Вы хотите, чтобы у Вас был доступ к apache в обход nginx'а (иногда удобно, если нужно посмотреть, что выдаёт без кэшей именно сам apache, или, например, если у Вас в nginx стоит httpd авторизация, или Вы хотите "скрыть" виртуальных хост, чтобы он не был доступен по стандартному порту (80)) необходимо дописать ещё строчку Listen xxx.xxx.xxx.xxx:8081, где xxx.xxx.xxx.xxx - Ваш внешний IP.
4) Найти NameVirtualHost и поменять порт! Очень важно, чтобы он соответствовал тому, что прописано в Listen.

В итоге в файле должны быть:

Listen 127.0.0.1:8081
Listen xxx.xxx.xxx.xxx:8081
NameVirtualHost *:8081

Никаких других не закомментированных директив Listen и NameVirtualHost быть не должно!
Apache включать ещё рано!

Далее переходим к настройкам виртуальных хостов. Иначе получим ошибку "[warn] NameVirtualHost *:8081 has no VirtualHosts".
Создадим и отредактируем наш виртуальный хост:
nano /etc/httpd/sites-available/domain.ru.conf
Внутри должно быть, примерно, следующее:

<VirtualHost *:8081>
  ServerAdmin admin@domain.ru
  ServerName domain.ru
  ServerAlias www.domain.ru
  ErrorLog /var/log/httpd/error/domain.ru
  CustomLog /var/log/httpd/access/domain.ru varnishcombined
  DocumentRoot /var/www/domain.ru/www/
  <Directory /var/www/domain.ru/www>
    Options FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from All
 </Directory>
  AssignUserID user group
</VirtualHost>

Ниже пояснения, если нужны... как сумел =)

Spoiler: Highlight to view

  • VirtualHost *:8081 - Указываем, что тут начинается конфигурация отдельного виртуального хоста. Часть "*:8081" должна совпадать с директивой NameVirtualHost в главном конфигурационном файле apache.
  • ServerAdmin admin@domain.ru - Почта администратора сайта.
  • ServerName domain.ru - Основное имя сайта.
  • ServerAlias www.domain.ru - Псевдонимы сайта (другие имена).
  • ErrorLog /var/log/httpd/error/domain.ru - Путь к логам ошибок.
  • CustomLog /var/log/httpd/access/domain.ru varnishcombined - Путь к логам доступа, отображающимся по формату "varnishcombined".
  • DocumentRoot /var/www/domain.ru/www - Корневая папка сайта.
  • Directory /var/www/domain.ru/www - Директива, в которой указываются параметры к данной папке и всем подпапкам в ней.
  • Options FollowSymLinks - Сервер будет проходить по ссылкам на файлы (ярлыкам).
  • AllowOverride All - Будет ли сервер искать файлы .htaccess и читать их. all - да, none - нет.
  • Order allow,deny - Параметр контролирует трёх-фазную систему контроля доступа.
  • Allow from All - Параметр "разрешить отовсюду".
  • /Directory - Окончание параметров директивы.
  • AssignUserID user group - Указывает от какого пользователя должен работать apache.
  • /VirtualHost # Окончание файла конфигурации виртуального хоста.

Теперь нам нужно "включить" наш хост.

cd /etc/httpd/sites-enabled/
ln -s ../sites-available/domain.ru.conf

Всё, apache готов. Если Вы не забыли создать корневую папку виртуального хоста и пользователя, которого указали в параметре AssignUserID, то всё должно быть хорошо. Хотя, если забыли, то:

useradd -d /var/www/domain.ru user
mkdir /var/www/domain.ru/www
chmod 755 /var/www/domain.ru

Система создаст не только пользователя, но и одноименную группу, а так же домашнюю директорию. Обратите внимание, что подпапку www мы создаём вручную, специально, чтобы не путать файлы самого сайта и служебные файлы пользователя.
Проверим apache:
/etc/init.d/httpd configtest
Результатом этой команды должно быть:
Syntax OK

Spoiler: Highlight to view

Если ВДРУГ Вы получили ошибку:
httpd.itk: apr_sockaddr_info_get() failed for blabla
Значит:
1) "blabla" - это имя Вашего сервера, прописанное в /etc/sysconfig/network
2) Нужно зайти в /etc/hosts и добавит запись:
127.0.0.1 blabla

Если ВДРУГ =) Вы получили ошибку:
httpd.itk: Could not reliably determine the server's fully qualified domain name, using blabla for ServerName
Да в общем тоже самое почти. Только нужно убрать 127.0.0.1 и поставить IP внешнего интерфейса.

Если Синтаксис ОК, то включаем apache, мы с ним закончили:
/etc/init.d/httpd start

Теперь varnish.
Для начала скачиваем вот такие хитрые настройки для него и удаляем стандартные:

cd /etc/varnish/ &&
wget http://alexxkn.ru/sites/default/files/attachments/varnish.tar.gz &&
tar xzf varnish.tar.gz &&
rm -rf varnish.tar.gz default.vcl &&
mv varnish/* ./ &&
rm -rf varnish /etc/sysconfig/varnish &&
cp varnish.example /etc/sysconfig/varnish

Ссылка на файл настроек так же есть в конце статьи. В своё время брал их от сюда: https://github.com/mattiasgeniar/varnish-3.0-configuration-templates/blo...
Как то решил обновить шаблон, но varnish не поднялся. И так с парой-тройкой версий. В итоге перестал пробовать. Вас не отговариваю =)

На этом всё =) На всякий случай - настройки (IP и порт) backend'а лежат в файле /etc/varnish/custom.backend.vcl. Кому интересно, по мимо шаблонов мы поменяли параметры запуска varnish на:

Spoiler: Highlight to view

DAEMON_OPTS="-a :6081 \
             -T localhost:6082 \
             -f /etc/varnish/production.vcl \
             -u varnish -g varnish \
             -s file,/var/lib/varnish/varnish_storage.bin,1G \
             -p connect_timeout=600s \
             -p first_byte_timeout=600s \
    	     -p between_bytes_timeout=600s"

Запускаем varnish:
/etc/init.d/varnish start

Теперь nginx
Наконец-то, в последних версиях (по крайней мере в 1.5.2) из файла nginx.conf убрали пример настройки виртуального хоста! Если Вы не понимаете о чём я - да и Бог с ним =) Приступим.

На самом деле nginx в общем-то готов к запуску. Нужно, разве что, создать конфигурацию виртуального хоста. Тем не менее, скину свой рабочий конфиг (файл /etc/nginx/nginx.conf):

Spoiler: Highlight to view

user  nginx;
worker_processes  12;
worker_rlimit_nofile 100000;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
 
events {
  worker_connections  2048;
  use epoll;
}
 
http {
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
 
  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
 
  access_log /var/log/nginx/access.log  main;
 
  sendfile        on;
  tcp_nopush	  on;
  tcp_nodelay     on;
  server_tokens   off;
  gzip            on;
  gzip_static     on;
  gzip_comp_level 5;
  gzip_min_length 1024;
  gzip_types	  text/plain application/x-javascript text/css application/json application/javascript;
  keepalive_timeout  65;
  client_max_body_size 100m;
  proxy_read_timeout 300;
  proxy_connect_timeout 300;
  proxy_send_timeout 300;
 
  include /etc/nginx/conf.d/*.conf;
  server_names_hash_bucket_size 128;
}

Про значение параметров рассказывать не буду. Все они отлично описаны на официальном сайте на русском языке -
Нам остаётся лишь прописать виртуальный хост.

 cd /etc/nginx/conf.d/
nano domain.ru.conf

Spoiler: Highlight to view

server {
  listen  xxx.xxx.xxx.xxx:80;
  server_name  www.domain.ru;
  rewrite ^ http://domain.ru$request_uri? permanent;
}
 
server {
  listen xxx.xxx.xxx.xxx:80;
  server_name domain.ru;
 
  error_log /var/log/nginx/error/domain.ru;
  access_log /var/log/nginx/access/domain.ru;
 
  location ~* \.(jpg|jpeg|gif|png|bmp|svg|swf|htm|js|ico|css|mp3|ogg|mpe?g|gz|tar|avi|zip|gz|bz2|rar)$ {
    try_files $uri $uri/ @drupal;
    root /var/www/domain.ru/www;
  }
 
  location ~ /\.ht {
    deny  all;
  }
 
  location / {
    proxy_pass http://127.0.0.1:6081;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
  }
 
  location @drupal {
    proxy_pass http://127.0.0.1:6081;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
  }
}

Что тут есть?...

  1. Значит сначала стоит редирект с www на без www.
  2. Директива location указывает на корневую папку виртуального хоста и ищет и отдаёт из неё файлы (статику) с указанными расширениями. Разумеется, их можно изменить/дополнить. Если nginx не находит файла по указанному пути, он передаёт запрос дальше (сначала на varnish, потом apache). И backend уже сам разбирается, что с ним делать.
  3. Файлы вида ".ht*" (обычно .htacces и .htpasswd) не отдавать "не под каким предлогом" =)

Ну, в целом всё. Можно проверить правильность настроек и запускать nginx:

/etc/init.d/nginx configtest
/etc/init.d/nginx start

На этом настройки web-серверов закончены! Теперь быстренько mysql - и всё =)
Для начала надо посмотреть, какой конфиг у нас там прописан. Найти его можно по адресу:
nano /etc/my.cnf
Вообще правильная настройка БД - это целое искусство.... которым я, к сожалению, толком не обладаю =)
Предлагаю Вам несколько вариантов, как это сделать:

  1. Оставить всё как есть ^_^;
  2. Посмотреть разные конфиг-файлы, предлагаемые по умолчанию:
    nano /usr/share/mysql/my-huge.cnf
    nano /usr/share/mysql/my-innodb-heavy-4G.cnf
    nano /usr/share/mysql/my-large.cnf
    nano /usr/share/mysql/my-medium.cnf
    nano /usr/share/mysql/my-small.cnf

    Внутри есть описания, но, по большому счёту, они отличаются количеством Вашей оперативной памяти;

  3. Зайти на сайт persona.com и создать там свой индивидуальный конфиг-файл.

Будем считать, что Вы справились с задачей выбора конфиг-файла и записали всё необходимое в файл настроек БД - /etc/my.cnf.
Далее, запускаем БД:
/etc/init.d/mysql start
И последний штрих - запустим настройку безопасности:
/usr/bin/mysql_secure_installation
Здесь Вас попросят:

  • Ввести пароль для root пользователя на БД;
  • Предложат удалить доступ для анонимных пользователей (обязательно соглашайтесь!);
  • Убрать доступ root пользователю удалённо;
  • Удалить тестовые БД и пользователя;
  • Перезагрузить таблицу привилегий.

Ну, вот и всё =)
Буду очень рад уточнениям и вопросам - потому как большой объём статьи и вполне возможны опечатки и "что-то забыл" =)
Всем удачи!

Приложение: 

Комментарии

Здравствуйте. Можно поподробнее расписать DAEMON_OPTS что да как? вместо localhost реальный ip писать7

Доброго. Если правильно понимаю, вопрос про varnish.

В конфиге следующее:

DAEMON_OPTS="-a :6081 \
             -T localhost:6082 \
             -f /etc/varnish/production.vcl \
             -u varnish -g varnish \
             -s file,/var/lib/varnish/varnish_storage.bin,1G \
             -p connect_timeout=600s \
             -p first_byte_timeout=600s \
    	     -p between_bytes_timeout=600s"

Я предлагаю оставить тут всё как есть. Чтобы понимать, постараюсь пояснить:

-a :6081 - говорит о том, что varnish будет слушать порт 6081 на всех адресах. Если Вы не хотите, чтобы обращения на varnish были возможно напрямую, можно исправить на "-a 127.0.0.1:6081". В этом случае мы оставляем только один адрес для общения varnish'а и nginx'а. Я оставляю на "всех" адресах. Иногда полезно глянуть что говорит конкретно каждый из веб-серверов. Например, кто-то что-то закешировал, а обращение на порт конкретного веб-сервера поможет обойти этот кэш и понять проблему;
-T localhost:6082 - Telnet admin interface listen address and port. Интерфейс через telnet. Штука не безопасная, поэтому вешаем на localhost;
-f file - поясняет какой конфиг использовать по умолчанию;
-u -g определяют user и group от имени которых будет работать varnsih;
-s file, size - здесь говорим, что кэш будет храниться в файле, по такому-то адресу и будет иметь размер не превышающий указанный;
-p - собственно, доп.параметры. В данном примере говорим, чтобы ждал ответа подольше =)

1. "Реальный" IP, в целом, не нужен.

2. Данная конфигурация МОЖЕТ быть "заточена" конкретно под drupal или wp (есть заготовки), но в целом это просто рабочая конфигурация. Должно всё работать так. И разгрузку сервера Вы тоже должны заметить.

Добрый день. Спасибо за статью. Все запустилось , Кроме varnish - не стартует. Все делал по Вашему мануалу. С дефолт. настройками varnish стартует.
Подскажите - куда копать.
Спасибо.

Доброго. Маловато, конечно, информации для диагностики) Важное замечание: этот мануал для варниша версии 3.x. Возможно дело в этом. Не использую четвертый, потому что модуль на друпале еще не научился с ним работать. Потом, конечно же, перепишу.

Спасибо. Вот это то и пропустил. ))

Да это, вроде, я не написал) Каюсь)

Еще вопрос - главная страница вордпресс открывается , при попытке перехода на любую другую
The requested URL /pogranichnaya-sluzhba-kontrabandist-1-v-ukraine-litvin-ne-vinovat/ was not found on this server.
Apache/2.2.22 (@RELEASE@) Server at homing.su Port 80
хотя тестовые страницы открывались нормально. Куда копать, подскажите плииз.

Похоже, что либо:
а) Не работают чистые ссылки;
б) Не правильно настроен конфиг под wordpress (опять же не правильно отрабатывают чистые ссылки);
в) Может быть ещё .htaccess.

спасибо. поставил 4тый , настроил с вордпрессом , работает. действительно быстрее. за статью еще раз спасибо.

День добрый
Вопрос по nginx - все по мануал делал, но в итоге при обращении к серверу по домену nginx берем инку не из файла виртуального хоста а из главного конфета :(
Т.е. по задумке все файлы лежат в /var/www/ddddddd.ru/www/ но сам nginx игнорирует виртуальный конфиг и берет файлы отсюда /etc/nginx/html где их естественно нет. куда копать?

Доброго.
Это очень похоже на отсутствие в файле /etc/nginx/nginx.conf строчки:
include /etc/nginx/conf.d/*.conf;

Или - у файла конфигурации нет расширения .conf

Здравствуйте! Акакой ip сюда listen xxx.xxx.xxx.xxx:80; вставить?

Здравствуйте. Так как nginx выступает в роли frontend'а, прописывайте сюда Ваш внешний IP.

Здравствуйте,

Ошибок не выдает, но открывает первый сайт по списку в апаче. :(

Так бывает, когда до апача не доходит имя сайта. Возможно, никакие конфиги nginx, кроме default.conf не читаются. Так может быть, если:
1. забыли расширение .conf;
2. Положили файлы конфигураций в папку, которая не include'ется в nginx;
3. Файлы были скачаны с другого сервера, на котором выключен SELinux. На целевом SELinux включен. Файлы имеют не верный контекст безопасности.

Доброго здоровья, хорошая инструкция.
У Вас в конфигах апач слушает 8081 порт, а нгинкс отправляет на 6081, я по неопытности и невнимательности поимел все те проблемы, о которых люди в комментариях выше писали, пока внимательно не изучил и не привёл к общему виду. Поправьте пожалуйста, чтобы новички поменьше спотыкались. Варниш, ещё не ставил, но предполагаю те же вилы ))

Здравствуйте! Ну.. дело ровно в этом, что "Варниш, ещё не ставил" =) Потому что nginx отправляет запросы на varnish, а тот, в свою очередь, отправляет запросы на apache.

Так что.... =)

Да, я уже понял, что в варнише дело, кстати, этой проблемы бы не было, если бы ещё указали версию варниша в самой статье, или написали что-то типа yum install varnish-3.0. Я из-за того его и не запустил, что версия по умолчанию (4.0) не запускается с конфигом от 3.0 )) А поскольку варниш, вообще, первый раз вижу, отложил до лучших времён.

Согласен, исправим. Вообще, статья уже требует новой версии, конечно...

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

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Target Image