Блог пользователя - EliteMonk

D7 Мультисайтинг

12 апреля 2011 в 1:02

Будут использованы сайты aaa.ru и bbb.ru находящиеся в мультисайтинговой связке. А так же адреса на которых сайты разрабатывались zzz.ru, т.е. aaa.zzz.ru и bbb.zzz.ru Первое отличие от D6 это возможность задать название папки не по домену. Копируем файл sites/example.sites.php в sites/sites.php и прописываем соответствия.

$sites['aaa.ru'] = 'aaa.ru';
$sites['aaa.zzz.ru'] = 'aaa.ru';
$sites['bbb.ru'] = 'bbb.ru';
$sites['bbb.zzz.ru'] = 'bbb.ru';

Как видим, теперь не надо будет менять пути при переносе сайта, а также рыться в базе чтобы поправить все ссылки. По сравнению с D6 очень удобно, то что может быть у каждого сайта своя база, и даже не одна, например, один из вариантов, вынести все переводы в отдельную базу. Так же перенос и отделение от мультисайтинга значительно облегчится.

$databases = array (
  'default' =>
  array (
    'default' =>
    array (
      'database' => 'd7_aaa',
      'username' => 'd7_aaa_u',
      'password' => '<ваш-пароль>',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => array(
        'default'         => '',
        'locales_source'  => 'd7_shared_locales.',
        'locales_target'  => 'd7_shared_locales.',
      ),
    ),
  ),
);

Munin

11 апреля 2011 в 23:41

Оглавление

Устанавливаем клиент и сервер

sudo apt-get install munin munin-node

переходим в каталог доступных плагинов munin

cd /usr/share/munin/plugins

скачиваем плагины для nginx

sudo wget -O nginx_request http://exchange.munin-monitoring.org/plugins/nginx_request/version/2/download
sudo wget -O nginx_status http://exchange.munin-monitoring.org/plugins/nginx_status/version/3/download
sudo wget -O nginx_memory http://exchange.munin-monitoring.org/plugins/nginx_memory/version/1/download

скачиваем другие плагины

sudo wget -O multimemory http://exchange.munin-monitoring.org/plugins/multimemory/version/3/download
sudo wget -O sshd_log http://exchange.munin-monitoring.org/plugins/sshd_log/version/1/download
sudo wget -O php5-fpm_status http://exchange.munin-monitoring.org/plugins/php5-fpm_status/version/1/download
sudo wget -O mysql_connections http://exchange.munin-monitoring.org/plugins/mysql_connections/version/1/download
sudo wget -O mysql_qcache http://exchange.munin-monitoring.org/plugins/mysql_qcache/version/1/download
sudo wget -O mysql_qcache_mem http://exchange.munin-monitoring.org/plugins/mysql_qcache_mem/version/1/download

делаем плагины исполняемыми

sudo chmod +x nginx_request
sudo chmod +x nginx_status
sudo chmod +x nginx_memory
sudo chmod +x multimemory
sudo chmod +x sshd_log
sudo chmod +x php5-fpm_status
sudo chmod +x mysql_connections
sudo chmod +x mysql_qcache
sudo chmod +x mysql_qcache_mem

Почта

11 апреля 2011 в 23:35

Оглавление

Содержать свой почтовый сервер, со всеми прибомбасами, такими как антивирусник, антиспам и так далее, оказалось слишком дорого в плане ресурсов, это будет плохо вписываться в имеющиеся 384М оперативки, даже при 512 я буду смотреть в сторону увеличения воркеров для fpm, увеличения памяти для скриптов (сейчас 1 воркер на 128М, что катострафически мало), также буду смотреть в сторону организации ускорителя и кеша... В общем только на конфигурации 1Gb оперативной памяти следует задуматься о развёртовании полноценного почтового сервера.

Я использую яндекс, т.к. в панели управления доменами у моего регистратора есть автоматическая привязка. Но можно пробовать завязывать на gmail или mail.ru

Меняем имя сервера (по умолчанию оно server), впринципе это нужно для полноценного почтового сервера, но пускай будет настроено правильно.

sudo vim /etc/hostname

Пишем название, например

sergei

Меняем хост

sudo vim /etc/hosts

Заменяем нули на реальный IP

0.0.0.0 sergei.example-d6.ru  sergei

Перезагружаем ОС

sudo reboot

Смотрим на имя и хост

hostname
hostname -f

Если после перезагрузки имя не сменилось, то надо идти в панель управления VDS если нет доступа к ней, то просить хостера сменить имя.

Установим нужные пакеты, которые настроены будут позже

sudo apt-get install postfix libsasl2-2 sasl2-bin

Отредактируем конфиг:

sudo vim /etc/postfix/main.cf

Cron

11 апреля 2011 в 23:31

Оглавление

Нужно настроить cron для всех сайтов, в том числе и для технических. Периоды выбираются индивидуально для каждого сайта, но на технический я ставлю 1 раз в сутки, не смотря на то что в админке drupal'a ставлю проверять обновления раз в неделю...

Открываем для редактирования задачи cron'a

sudo crontab -e

Должно быть примерно так, третья строка (www.example-d6.ru) запускается каждую минуту чтобы убедиться сразу что работает, после чего надо выставить нормальное время, чтобы не завалить сервер если сайтов в мультисайтинге десяток, а то и не один...

45 2 * * * /usr/bin/wget -O - -q -t 1 http://technical.example-d6.ru/cron.php
15 3 * * * /usr/bin/wget -O - -q -t 1 http://technical.example-d7.ru/cron.php
* * * * * /usr/bin/wget -O - -q -t 1 http://www.example-d6.ru/cron.php
35 3 * * /usr/bin/wget -O - -q -t 1 http://www.example-d7.ru/cron.php

D6 Установка

11 апреля 2011 в 23:28

Оглавление

Создаём папочки в sites

Копируем в www.example-d6.ru из sites/default файл default.settings.php и переименовываем в settings.php
Также копируем в www.example-d6.ru robots.txt

Если сайт переносится, редактируется settings.php чтобы данные о базе были верны.
Если ставиться, новый сайт и он первый на связке, то настройки добавляются при установке, потом редактируются.
Если ставиться, новый сайт, но он уже не первый, то копировать settings.php удобнее из соседнего сайта связки, и изменить следующее

$db_url = 'mysqli: //и ваши данные о базе
$db_prefix = array(
  '
default' => 'exampled6_',
  '
locales_meta' => 'shared_',
  '
locales_source' => 'shared_',
  '
locales_target' => 'shared_',
);
$base_url = '
http://www.example-d6.ru';
ini_set('memory_limit', '128M');

Теперь остаётся только задать адрес

sudo vim /etc/nginx/sites-available/example-d6.ru

Заменяем на свой хост

server {
   listen 80;
   server_name example-d6.ru;
   rewrite ^ http://www.example-d6.ru$request_uri? permanent; #301 redirect
}

server {
   listen 80;
   server_name www.example-d6.ru;
   access_log /var/log/nginx/example-d6.ru.access.log;

   root /var/www/drupal6;
   index index.php;

   if (!-e $request_filename) {
     rewrite ^/(.*)$ /index.php?q=$1 last;
   }

   error_page 404 index.php;

   # hide protected files

Установка сайта

11 апреля 2011 в 23:24

Оглавление

Далее я буду описывать установку для разных пользователей и как минимум двух установок Drupal6 и Drupal7. Это наглядно покажет как добавлять, новые сайты которые не входят в мультисайтинг с первым, а также как добовлять в уже имеющуюся систему.

MySqlDumper

11 апреля 2011 в 23:20

Оглавление

Ставим MySqlDumper (www.mysqldumper.net), его я использую для переноса баз данных, т.к. один сайт имеет запредельный размер, порядка 500М в несжатом виде, также ставлю на хостинг, там делаю экспорт, здесь импорт.

PhpMyAdmin

11 апреля 2011 в 23:17

Оглавление

Устанавливаем нужные пакеты

sudo apt-get install phpmyadmin php5-mcrypt

В окошке не выбираем ничего просто жмём enter

Добавляем хост

sudo vim /etc/nginx/sites-available/phpmyadmin.example.ru

Вставляем примерно следующее

server {
   listen 80;
   server_name pma.example.ru;
   rewrite ^ http://phpmyadmin.example.ru$request_uri? permanent; #301 redirect
}

server {
   listen 80;
   server_name phpmyadmin.example.ru;

   root /usr/share/phpmyadmin;

   access_log /var/log/nginx/phpmyadmin.example.ru.access.log;

   location / {
     root /usr/share/phpmyadmin;
     index index.php;
   }

   location ~ \.php$ {
     fastcgi_pass 127.0.0.1:9000;
     fastcgi_index index.php;
     fastcgi_param SCRIPT_FILENAME /usr/share/phpmyadmin$fastcgi_script_name;
     include fastcgi_params;
   }
}

Включаем

sudo ln -s /etc/nginx/sites-available/phpmyadmin.example.ru /etc/nginx/sites-enabled/phpmyadmin.example.ru

Забегая вперёд, после входа PhpMyAdmin будет жаловаться на установленный Suhosin, правим конфиг как рекомендовано в доках на PhpMyAdmin

sudo vim /etc/php5/conf.d/suhosin.ini

Должны быть следующие значения:

suhosin.sql.bailout_on_error = off
suhosin.post.max_array_index_length = 256
suhosin.post.max_totalname_length = 8192
suhosin.post.max_vars = 2048
suhosin.request.max_array_index_length = 256
suhosin.request.max_totalname_length = 8192

eAccelerator

11 апреля 2011 в 23:09

Оглавление

Скачиваем во временную папку последнию версию и устанавливаем

cd /tmp/
sudo wget http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2
sudo tar xvjf eaccelerator-0.9.6.1.tar.bz2
cd eaccelerator-0.9.6.1
sudo phpize
sudo ./configure --enable-eaccelerator=shared
sudo make
sudo make install
cd ~

теперь редактируем и добавляем следующие строки, начиная после тега [PHP]:

sudo vim /etc/php5/fpm/php.ini
; eAccelerator configuration
; Note that eAccelerator may also be installed as a PHP extension or as a zend_extension
; If you are using a thread safe build of PHP you must use
; zend_extension_ts instead of zend_extension
;extension = "/usr/lib/php5/20090626/eaccelerator.so"
zend_extension = "/usr/lib/php5/20090626/eaccelerator.so"
eaccelerator.shm_size = "32"
eaccelerator.cache_dir = "/var/cache/eaccelerator"
eaccelerator.enable = "1"
eaccelerator.optimizer = "1"
eaccelerator.check_mtime = "1"
eaccelerator.debug = "0"
eaccelerator.filter = ""
eaccelerator.shm_max = "0"
eaccelerator.shm_ttl = "0"
eaccelerator.shm_prune_period = "0"
eaccelerator.shm_only = "0"
eaccelerator.compress = "1"
eaccelerator.compress_level = "9"
eaccelerator.allowed_admin_path = "/var/www/eaccelerator"

Создаём директории с нужными права

sudo mkdir -p /var/cache/eaccelerator
sudo chmod 0777 /var/cache/eaccelerator
sudo mkdir -p /var/www/eaccelerator
sudo chmod 0755 /var/www/eaccelerator

Копируем панель управления

PHP

11 апреля 2011 в 23:02

Оглавление

Нам понадобятся 2 библиотеки, закачаем последние версии и установим их

cd /tmp
wget http://us.archive.ubuntu.com/ubuntu/pool/main/k/krb5/libkrb53_1.6.dfsg.4~beta1-5ubuntu2_i386.deb
wget http://us.archive.ubuntu.com/ubuntu/pool/main/i/icu/libicu38_3.8-6ubuntu0.2_i386.deb
sudo dpkg -i *.deb
cd ~

Обновим список репозиториев, для установки последней стабильной версии PHP

sudo vim /etc/apt/sources.list

Добавляем

deb http://php53.dotdeb.org stable all

Обновляемся и устанавливаем PHP с нужными пакетами.

sudo apt-get update
sudo apt-get install php5-cli php5-common php5-suhosin
sudo apt-get install php5-fpm php5-cgi
sudo apt-get install php-apc php5-curl php5-dev

Редактируем конфиг для fpm, т.к. через него у нас будет запускаться FastCGI

sudo vim /etc/php5/fpm/php.ini

Вставляем следующий параметр

cgi.fix_pathinfo = 0

Правим конфиг для пакета php-apc

sudo vim /etc/php5/conf.d/apc.ini

Добавляем строку

apc.shm_size = 48

Чтобы не было падений php-fpm открываем этот конфиг

sudo vim /etc/php5/fpm/pool.d/www.conf

Nginx

11 апреля 2011 в 22:57

Оглавление

Смотрим установлен ли апач

dpkg -l | grep apache

Если установлен, то удаляем примерно так (будет зависеть от установленных пакетов):

sudo apt-get --purge remove apache2 apache2.2-bin apache2.2-common apache2-mpm-prefork apache2-utils apache2-doc

Устанавливаем nginx

sudo apt-get install nginx

Запускаем

sudo /etc/init.d/nginx start

Далее в браузере вводим IP своего VDS и видим надпись

Welcome to nginx!

* Если появилась ошибка 403, то на этом этапе не страшно, в одной из версий неправильный конфиг дефолтовый, что исправиться при установке PHP

Меняем дефолтовый конфиг

sudo vim /etc/nginx/sites-available/default

Заменяем содержимое файла на следующее

server {
  listen 80;
  server_name localhost;
  access_log /var/log/nginx/localhost.access.log;

  ## Default location
  location / {
    root /var/www;
    index index.php;
  }

  ## Images and static content is treated different
  location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
    access_log off;
    expires 30d;
    root /var/www;
  }

  ## Parse all .php file in the /var/www directory
  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param REQUEST_METHOD $request_method;

Подготовка ОС

11 апреля 2011 в 22:53

Оглавление

Устанавливаем локаль

sudo /usr/sbin/locale-gen en_US.UTF-8 && sudo /usr/sbin/update-locale LANG=en_US.UTF-8

Обновляемся

sudo apt-get update

Ставим менеджер для обновлений

sudo apt-get install update-manager-core
sudo do-release-upgrade

Ставим для обзора процессов и их потребления памяти ими, ставим htop

sudo apt-get install htop

используем очень просто

htop

Ставим утилиты разработки

sudo apt-get install build-essential

Если стоит 10.04 а не 10.10 то обновление делается так

Открываем файл менеджера обновлений для правки

sudo vim /etc/update-manager/release-upgrades

Заменяем

Prompt=lts

на

Prompt=normal

Обновляемся

sudo do-release-upgrade

Теперь должна быть версия 10.10

Подготовка сервера

11 апреля 2011 в 22:38

Оглавление

Хостер установил уже Ubuntu Server 10.10 и даже поставил ssh и Apache 2.

Заходим через SSH как root, сразу меняем пароль на нормальный

passwd

Добавляем группу избранных, назовём её raccess

/usr/sbin/groupadd raccess

Открываем файл, для того чтобы нашу группу сделать "избранной"

/usr/sbin/visudo

Добавляем в конец файла, далее если не оговаривается, то всегда вставляется именно в конец.

## Allows people in group raccess to run all commands
%raccess ALL=(ALL) ALL

Добавляем нового пользователя, пускай будет admin, но в теории хорошо как и группу называть по другому, это усложняет взлом подбором.

/usr/sbin/adduser admin

Добавляем его к ранее созданной группе

/usr/sbin/usermod -a -G raccess admin

Добавляем папку для ключей SSH

mkdir ~/.ssh

Генерируем ключи

ssh-keygen -t rsa

Делаем для нашего будущего аккаунта, где вместо нулей подставляем реальный IP адрес

scp ~/.ssh/id_rsa.pub admin@0.0.0.0:
mkdir ~admin/.ssh
mv ~admin/id_rsa.pub ~admin/.ssh/authorized_keys

Назначаем права нашему пользователю

chown -R admin:admin ~admin/.ssh
chmod 700 ~admin/.ssh
chmod 600 ~admin/.ssh/authorized_keys

Настраиваем SSH

vim /etc/ssh/sshd_config

Проверяем значения и меняем или добавляем строки если нет...

 

Памятка: Установка друпала на VDS

3 марта 2011 в 5:43

Прошло месяца два после начала этой памятки, она была 100 раз переработана, и выросла до таких размеров, что читать на одной странице довольно сложно, поэтому я разбил её на логические части. По прежнему приветствуются замечания и предложения в комментариях.

Моя первая попытка самому разобраться с вопросом, раньше всегда возлагал данную процедуру на хостера... Задача: составить памятку, по которой можно будет в пошаговом режиме поставить максимально лучшую систему для drupal (под мультисайтинг), без панели.

Исходные данные:
1 - недорогой VDS, который часто будет у заказчиков. 1.5G 384М 1 ядро, на котором будет только 1 владелец, и как следствие только 1 сайт будет в мультисайтинге.
2 - VDS 2G 1024M 1 ядро * до 8 =)), тут будет очень много сайтов в связке.
1 и 2 - ОС Ubuntu 10.10 или 10.04, которую обновим до 10.10

Оглавление:

Подготовка сервера
Подготовка ОС
Nginx
PHP
--eAccelerator
--MemCache
MySQL
--PhpMyAdmin
--MySqlDumper
Установка сайта
--D6 Подготовка
--D6 Установка

Все предки и потомки во views

24 ноября 2010 в 4:34

Всем привет,

Как во view сделать следующее?

Есть словари с глубокой иерархией, например

Все авто
-Audi A4
--B5
--B6
--B7
-Audi A6
--C4
--C5

Это все с помощью модуля "Иерархический выбор" даётся выбирать пользователю, и он может остановиться на любом уровне, рассмотрим 2 примера

1. Выбрал B5 - нужно отобразить все документы этой группы (сейчас только она и отображается), но на сайте есть документы, которые относятся к Audi A4 т.к. считается что применимо ко всем кузовам, например диски, лого "А4" или ещё чего, и пользователю неудобно через контрол выделять все кузова, да и новые могут добавиться например B8, нужно именно фильтром во views сделать, т.е. надо вывести материалы всех предков...

2. Audi A4 - тут обратная ситуация, нужно показать документы всех кузовов, т.е. потомков, т.к. возможно пользователь не знает к чему относиться искомая деталь, допустим нужно человеку навигацию, вероятно что его кузов не имеет такого товара например B5, но человек (например механик) готов купить навигацию с платой от другого кузова, но чтобы выбрать нужно чтобы они списком были и он мог сравнить цены и прочее, т.е. щелкать на каждый кузов и смотреть не очень удобно, учитывая что словарь не единственный и словари и так будут большими, то хочется максимальной простоты для пользователя...

Есть готовые модули? или может стандартными средствами решается? (но ид термина с глубиной не то, мне не термины сливать надо а документы при выводе) Может сниплетом или хаком можно вопрос решить, очень нужно в кратчайшие сроки и готов на любое безумство Lol

Фильтр для представления в графической форме.

20 ноября 2010 в 8:57

хочу что-то подобное для друпала...

https://www.eparts.ee/catalog/#brand:5/year:1997/fuel:1/model:253/modifi...

Как я себе это представляю... Есть документы которые содержат в обязательном порядке 2 термина из разных словарей. С помощью представления делаем фильтры, но он выглядит не очень, хочется графический выбор как в Taxonomy List, но с поддержкой иерархии и для фильтра представления.

Может будут у кого какие идеи как реализовать?

Cron Splitter - модуль для разбиения работы крона на части.

16 марта 2010 в 18:27

Не смог найти нужного модуля, поэтому попытался написать сам, выкладываю что получилось, если кто знает модуль реализующий нужную мне возможность (описание ниже) отпишитесь, не хочу изобретать велосипед. С радостью выложил бы на drupal.org но не знаю как, поделитесь как это сделать.

Описание:
Модуль лишь помощник для других модулей. Столкнулся с такой проблемой, на сайте который будет вести различную статистику, необходим постоянный перерасчёт, и реализован пока 1 модуль, но скоро их будет несколько. Нужно не только разбить выполнение одного модуля на части но и сделать выполнение модулей поочерёдно. Для примера задача перерасчёта для одного модуля целиком выполняется 2 дня. Но можно разбить на логические части выполнение каждой по 5 мин, что приемлемо с расчётом запуска крона каждые 10 мин. Но если модулей будет 10 и каждый будет иметь работу на 5 мин, а при добавлении 11-го модуля заново в ручную выставлять время для каждого модуля модуля чтобы не пересекались просто кошмарно Smile

Коротко:
Модуль запоминает который модуль работал в последний раз и при следующем вызове крона отдаёт право работы следующему по списку модулю. При этом для каждого модуля имеет индекс задачи и подзадачи, их естественно тоже запоминает и когда очередь вновь дойдёт до этого модуля он вызовется со следующими по списку индексами.

Использование:
В своём модуле нужно реализовать 3 хука.

1. хук должен вернуть кол-во задач нужных этому модулю. Например если задач 4 то просто

function hook_cron_splitter_parts() {