Этап 2. Настройка Mysql-сервера, вэб-сервера и развёртывание CMS-системы.
Сейчас всё больше и больше набирает популярность вэб-сервер Nginx, в первую очередь, благодаря своей лёгкости. Также бесконечно приятным является тот факт, что этот вэб-сервер разрабатывается нашим отечественным разработчиком. Устанавливать вэб-сервер будем вот в такой связке: nginx+php-fpm+eaccelerator. Ну а CMS-систему (а-ля болванку для сайта) — конечно же Joomla!. А для джумлы, в свою очередь, понадобится Mysql. Для настройки всего этого я пользовался вот этими статьями:
http://wiki.firstvds.ru/index.php/Установка_freebsd_nginx_php-fpm_MySQL_phpMyAdmin
http://habrahabr.ru/post/67152
http://wiki.firstvds.ru/index.php/Высокопроизводительный_web-сервер
http://www.lissyara.su/articles/freebsd/www/nginx+php-fpm+mysql
http://docs.joomla.org/Nginx
и конечно же, замечательной русской документацией nginx: http://nginx.org/ru/docs
Ставим Nginx:
cd /usr/ports/www/nginx-devel
make install clean
Опции сборки я указал вот такие:
Объясняю, почему выбрал все штатные модули: а пусть будут! На тот случай, если к сайту начну накручивать всяку-всячину. Модулей сторонних разработчиков намного больше, чем штатных, но их не стал ни одного ставить, побоявшись каких-либо конфликтов, которые потом могли бы вылезти.
А тут я покажу свои опции сборки в тех пакетах, которые шли по зависимостям. Имеется ввиду, если мои опции отличались от предлагаемых по умолчанию:
Теперь установим PHP к нашему вэб-серверу:
cd /usr/ports/lang/php52
make install clean
Опции:
Заметьте, что во FreeBSD 9 патч php-fpm уже включён в дистрибутив php. Поэтому уже не нужно ставить его отдельно, как это описано в вышеприведённых мною ссылках на другие статьи.
Далее, ставим php52-exstensions:
cd /usr/ports/lang/php52-extensions
make install clean
Опции:
Здесь я тоже побольше всего выбрал с расчётом, что может в будущем захочется поприкручивать к сайту всяку-всячину.
Важно! Не выбирайте одновременно два конфликтующих экстеншина: IMAP и YAZ.
Зависимости, в которых я менял опции сборки:
После установки php-расширений поставим eaccelerator:
cd /usr/ports/www/eaccelerator
make install clean
Опции сборки я оставил по умолчанию.
Далее, необходимо установить Mysql-server, который мы будем использовать почти везде и почти для всего:
cd /usr/ports/databases/mysql55-server
make install clean
Опции сборки Mysql-сервера я оставил по умолчанию.
После установки такого множества пакетов предлагаю перезагрузить сервер и уже потом начать кофигурировать всё то, что мы поставили. Я думаю, что первым делом, мы добавим в файл /etc/rc.conf вот такие строчки:
mysql_enable="YES"
# строчка ниже означает месторасположение наших баз, потому как, если к серверу будет подключаться дополнительный жёсткий диск, то базы переместятся на него.
mysql_dbdir="/usr/home/mysql"
php_fpm_enable="YES"
nginx_enable="YES"
И первое, что мы настроим — это Mysql-server. Создадим эту самую папку с соответствующими правами на неё:
mkdir /usr/home/mysql
chown mysql:mysql /usr/home/mysql
Теперь запустим сам mysql:
/usr/local/etc/rc.d/mysql-server start
Потом запустим вот этот скрипт: /usr/local/bin/mysql_secure_installation , который настроит безопасность нашего mysql-сервера. Он будет задавать вопросы, на которые будем отвечать:
Enter current password for root (enter for none): жмём энтер, т.к. пароль пароль суперпользователя на mysql у нас пока пустой
Set root password? [Y/n] y
New password: вводим пароль суперпользователя на mysql
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y
С помощью этого скрипта мы выполнили следующие действия: задали пароль для суперпользователя root, так как по умолчанию для него не установлен пароль; удалили анонимного пользователя, который создаётся только для тестовых целей; запретили пользователю root входить удалённо — теперь он сможет заходить только с localhost; удалили тестовую БД test и доступ к ней.
Что ж, теперь настроим eaccelerator. Сначала создадим папку для его временных файлов:
mkdir /tmp/eaccelerator
chown www /tmp/eaccelerator
chmod 0700 /tmp/eaccelerator
Затем, нам надо внести некоторые изменения в файл /usr/local/etc/php.ini, однако мы его не найдём а этом месте. Зато вместо него есть файл php.ini-recommended. Сделаем его копию под названием php.ini (или просто переименуем его в php.ini) и вот уже в этот файл пропишем настройки после строчки zend.ze1_compatibility_mode = Off:
; Подключаем расширение
zend_extension="/usr/local/lib/php/20060613/eaccelerator.so"
; Включаем eAccelerator
eaccelerator.enable="1"
; Максимальный размер кеша в мегабайтах
eaccelerator.shm_size="128"
; Корневой каталог для хранения кеша
eaccelerator.cache_dir="/tmp/eaccelerator"
; Встроенный оптимизатор кода
eaccelerator.optimizer="1"
; Включаем проверку модификации PHP файлов.
eaccelerator.check_mtime="1"
; Режим отладки
eaccelerator.debug="0"
; Фильтр файлов, которые должны быть закэшированы
eaccelerator.filter=""
; Максимально допустимое значение которое может быть
; отправлено в разделяемую память. По-умолчанию - без ограничений.
eaccelerator.shm_max="0"
; Когда акселлератору потребуется отправить в разделяемую
; память какой-то объект и при этом в памяти для него
; не окажется места, он попытается удалить файлы, которые
; не были запрошены в течении последних "shm_ttl" секунд.
; По-умолчанию, это значение равно "0" - не удалять ничего.
; 3600сек — это 1 час.
eaccelerator.shm_ttl="3600"
; Когда акселлератору потребуется отправить в разделяемую
; память какой-то объект и при этом в памяти для него
; не окажется места, он попытается удалить старые скрипты,
; если предыдущие такие попытки были не больше, чем
; "shm_prune_period" секунд назад.По-умолчанию, это значение
; равно "0" - не удалять ничего.
eaccelerator.shm_prune_period="0"
; Включить или отключить кеширование скомпиленных скриптов
; _только_ на диск. Этот параметр не влияет на данные сессий
; и кеширование контента. По-умолчанию, значение 0, что означает
; что данные будут кешироваться и в памяти и на диске.
eaccelerator.shm_only="0"
; Включить или отключить сжатие закешированного контента.
; По-умолчанию, "1" - сжимать.
eaccelerator.compress="1"
; Уровень сжатия. По-умолчанию, "9" - максимум.
eaccelerator.compress_level="9"
Но на этом редактирование ещё не заканчиваем. Сразу поправим некоторые строчки, которые потом всё равно пришлось бы править. Находим и приводим в соответствующий вид следующие строчки:
upload_max_filesize = 20M
output_buffering = off
Потом находим вот такую закомментированную строчку:
; extension_dir = "./"
и правим её вот до такого вида:
extension_dir = "/usr/local/lib/php/20060613"
Эта строчка указывает, в каком каталоге находятся установленные экстеншины (которые мы только что поставили) для php.
Чтобы чуточек обезопасить свой сервер, можно ещё отключить вот этот параметр:
expose_php = Off
Php не будет слать дополнительные заголовки о том, что результат сгенерирован им. От совсем детских хакеров и ботов порой помогает. Ну и в ряде других случаев... "Expose" означает "обнаруживать себя".
Вот теперь сохраняем изменения и приступим к конфигурированию php-fpm. Находим файл /usr/local/etc/php-fpm.conf и приводим в соответствующий вид вот эти строчки:
<value name="listen_address">/tmp/php-fpm.sock</value>
<value name="max_children">50</value>
<value name="request_terminate_timeout">31s</value>
Этими строчками мы задали файл сокета, через который nginx будет подключаться к php-fpm; установили максимальное количество дочерних процессов; задали интервал после которого дочерний процесс будет убит — эта функция будет срабатывать, когда параметр 'max_execution_time' в php.ini не остановит выполнение скрипта в заданное время.
Далее, не забываем установить владельца на папку:
chown www:www /var/run/php-fpm
Теперь можно попробовать стартануть php-fpm:
service php-fpm onestart
А теперь ВНИМАНИЕ!!! Если при старте php-fpm выходит вот такая ошибка:
starting php_fpm.
Segmentation fault (core dumped)
/usr/local/etc/rc.d/php-fpm: WARNING: failed to start php_fpm
То это может быть связано со следующими ситуациями:
1 У вас установлены вместе расширения IMAP и YAZ (я говорил выше, что этого не надо делать)
2 Расширение RECODE грузится после расширений IMAP или MYSQL
Информация взята от сюда. В моём случае была вторая ситуация, и чтобы её разрешить, добрые люди придумали специальный скрипт, который выставляет оптимальный порядок загрузки php-расширений. Воспользоваться им можно так:
fetch http://www.pingle.org/files/fixphpextorder.sh
sh ./fixphpextorder.sh
Однако, у меня он, почему-то не совсем корректно отработал и в файле /usr/local/etc/php/extensions.ini почему-то появились две строчки extension=mysqli.so , и из-за этого при загрузке php-fpm вылазила уже другая ошибка. Поэтому, одну строчку extension=mysqli.so (ту что повыше) я удалил. После этого php-fpm благополучно запустился без ошибок:
service php-fpm start
Starting php_fpm
Теперь можно заняться и самим nginx. Он у меня завёлся почти с пол пинка. И это благодаря тому, что в джумловской документации уже выложен готовый кусок конфига, с которым джумла работает. Я его совсем чуть-чуть поправил, и вот так он выглядит (/usr/local/etc/nginx/nginx.conf):
user www; # количество воркеров рекомендуют делать по количеству ядер. У меня 2 ядра worker_processes 2; # настраиваем куда писать лог error_log /var/log/nginx-error.log; pid /var/run/nginx.pid; events { worker_connections 1024; use kqueue; } http { include mime.types; default_type application/octet-stream; # разрешить загружать файлы sendfile on; keepalive_timeout 5m; client_max_body_size 100m; # использовать сжатие gzip on; gzip_http_version 1.1; gzip_comp_level 6; gzip_min_length 1100; gzip_buffers 4 8k; gzip_types text/plain application/xhtml+xml text/css application/xml application/xml+rss text/javascript application/javascript application/x-javascript gzip_proxied any; gzip_disable "MSIE [1-6]\."; server { # тут многое итак понятно: задаём имя сервера, порт, расположение каталога с сайтом. listen 80; server_name example.com www.example.com; server_name_in_redirect off; access_log /var/log/nginx/access_log; error_log /var/log/nginx/error_log info; root /usr/local/www/mysite; index index.php; # Support Clean (aka Search Engine Friendly) URLs location / { try_files $uri $uri/ /index.php?q=$uri&$args; } index index.php index.html index.htm default.html default.htm; # deny running scripts inside writable directories location ~* /(images|cache|media|logs|tmp)/.*\.(php|pl|py|jsp|asp|sh|cgi)$ { return 403; error_page 403 /403_error.html; } location ~ .*.php$ { # include /etc/nginx/fastcgi.conf; fastcgi_pass unix:/tmp/php-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } # caching of files location ~* \.(ico|pdf|flv)$ { expires 1y; } location ~* \.(js|css|png|jpg|jpeg|gif|swf|xml|txt)$ { expires 14d; } } # HTTPS server. Ниже настраиваем параметры для возможности работы через https # По большому счёту, здесь всё тоже самое, только добавлены настройки ssl server { listen 443; server_name example.com www.example.com; ssl on; ssl_certificate cert.pem; ssl_certificate_key cert.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; root /usr/local/www/mysite; index index.php; # Support Clean (aka Search Engine Friendly) URLs location / { try_files $uri $uri/ /index.php?q=$uri&$args; } index index.php index.html index.htm default.html default.htm; # deny running scripts inside writable directories location ~* /(images|cache|media|logs|tmp)/.*\.(php|pl|py|jsp|asp|sh|cgi)$ { return 403; error_page 403 /403_error.html; } location ~ .*.php$ { # include /etc/nginx/fastcgi.conf; fastcgi_pass unix:/tmp/php-fpm.sock; fastcgi_index index.php; # вот тут главно не проглядеть этот момент, что строчка ниже подключает уже другой файл с параметрами include fastcgi_params-ssl; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } # caching of files location ~* \.(ico|pdf|flv)$ { expires 1y; } location ~* \.(js|css|png|jpg|jpeg|gif|swf|xml|txt)$ { expires 14d; } } }
Сохраняем конфиг. Затем делаем копию файла /usr/local/etc/nginx/fastcgi_params с названием /usr/local/etc/nginx/fastcgi_params-ssl (тем, что указан в секции HTTPS). И в его содержимое добавляем вот такую строчку:
fastcgi_param HTTPS on;
Без этой строчки доступ по HTTPS работать не будет.
Теперь нам надо создать сертификат для подключения по https. Делаем это так (находясь в каталоге /usr/local/etc/nginx):
openssl req -new -x509 -days 9999 -nodes -out cert.pem -keyout cert.key
При этом будут задаваться вопросы, на которые отвечать надо примерно так:
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Sverdlovskaya
Locality Name (eg, city) []:EKB
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mr.Technotrance
Organizational Unit Name (eg, section) []:noname
Common Name (eg, YOUR name) []:example.com
Email Address []:yourmail@example.com
Примечание: Common Name должен совпадать с названием вашего домена. Создадим каталог для логов nginx:
mkdir /var/log/nginx
chown www:www /var/log/nginx
Забегу немного вперёд и скажу, что с этой конфигурацией nginx у меня отлично заработал и postfixadmin, и roundcube. Запускать nginx пока не торопимся. Сначала давайте скачаем джумлу и расположим её в каталоге, который указали в настройках nginx. Скачать русифицированную джумлу можно здесь:
Когда скачаете архив с джумлой, то просто распакуйте его содержимое в каталог /usr/local/www/mysite. После этого, обязательно дадим права на этот каталог пользователю www:
chown -R www:www /usr/local/www/mysite
И, конечно же, не забудем создать базу mysql для джумлы, а также отдельного пользователя для доступа к этой базе:
mysql -p
CREATE DATABASE `joomla` CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON joomla.* TO 'joomla'@'localhost'
IDENTIFIED BY 'my_password' WITH GRANT OPTION;
Вот теперь запускам nginx, чтобы наш конфиг начал работать. Если nginx, при запуске, не выдал никаких ошибок, то пробуем зайти на наш сервер: http://192.168.0.100
Вы должны увидеть вот такую картинку:
Это открылся инсталятор джумлы. На этой странице выбираем язык установки. Жмём далее:
На втором этапе инсталятор проверяет, подходит ли наша система для установки. Как видите, у нас всё идеально. Жмём далее. Скриншот с лицензией я не стал делать.
Настройки подключения к базе:
Если здесь что-то введёте неправильно, то будете получать сообщение об ошибке. Если всё верно, то появится следующий этап конфигурирования фтп, который мы пропускаем, потому как мы потом поставим свой, намного более функциональный, фтп-сервер.
Далее:
Я не стал устанавливать демо-данные, поскольку буду делать всё сам с нуля. Демо-данные — это готовый демонстрационный сайт.
Последний этап:
Нажимаем кнопку «удалить директорию installation». Всё! Первоначальная настройка закончена.
Чтобы настраивать дальше, нужно зайти по адресу http://192.168.0.100/administrator где вы попадёте в админку джумлы. Но эту настройку рассматривать уже не будем. Потому что сайт для себя каждый делает по-своему. Настало время третьего этапа настройки нашего сервера.
Этап 3. Настройка почтового сервера.
Вернуться обратно на:
Этап 1
Перейти сразу на:
Этап 4