Воскресенье, 13 Май 2012 14:47

Настройка домашнего сервера, выполняющего роли веб-сервера, почтового сервера и фтп-сервера. Этап 2.

Автор
Оцените материал
(8 голосов)

Этап 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. Скачать русифицированную джумлу можно здесь:

http://joomlaportal.ru

Когда скачаете архив с джумлой, то просто распакуйте его содержимое в каталог /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

Прочитано 9194 раз Последнее изменение Суббота, 30 Ноябрь 2013 22:17

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

Защитный код
Обновить

Вы здесь: Home Мои статьи FreeBSD Настройка домашнего сервера, выполняющего роли веб-сервера, почтового сервера и фтп-сервера. Этап 2.