четверг, 30 августа 2012 г.

Настройка Nginx и php-fpm для установки Netcat

Ставим из портов PHP:

cd /usr/ports/lang/php5
make install clean

В настройках установщика не забываем выбрать php-fpm. После установки можно поставить требуемые вам дополнения PHP:

cd /usr/ports/lang/php5-extensions
make install clean

Разрешаем запуск php-fpm, прописав в /etc/rc.conf :

php_fpm_enable="YES"

Копируем файл настроек PHP:

cd /usr/local/etc
cp php.ini-production php.ini

Для работы Netcat возможно понадобится включить в нём опции register_global и short_open_tag. А вообще, конечно, настройка PHP требует куда более тонкого конфигурирования, что выходит за рамки данной статьи.

Теперь пора поставить вебсервер Nginx:

cd /usr/ports/www/nginx
make install clean

Так же вписываем в /etc/rc.conf разрешение на запуск Nginx:

nginx_enable="YES"

Осталось поставить из портов MySQL:

cd /usr/ports/database/mysql50-server
make install clean

Прописать в /etc/rc.conf разрешение на его запуск:

mysql_enable="YES"

Запустить MySQL:

cd /usr/local/etc/rc.d
./mysql-server start

Скопировать файл настроек MySQL (возможно придется играться с кодировками, описано в одной из предыдущих заметок):

cp /usr/local/share/mysql/my-large.cnf /usr/local/etc/my.cnf

И задать пароль суперпользователя MySQL:

mysqladmin -u root password <newpassword>

На этом установка и предварительная подготовка закончена, можно приступать к конфигурированию.

В файле /usr/local/etc/php-fpm.conf настраиваем работу php-fpm через сокет, что даст небольшой прирост производительности по сравнению с работой по tcр:

;listen = 127.0.0.1:9000
listen = /tmp/php-fpm.sock

Больше здесь можно ничего не править, открываем файл /usr/local/etc/nginx/nginx.conf для настройки Nginx:

user  www;
worker_processes  8; # Рекомендуется выставлять по количеству ядер
worker_priority -5; # Повышенный приоритет для снижения задержек из за исполнения скриптов

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
    use kqueue; # Рекомендуется для FreeBSD
}

http {
    include       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  logs/access.log  main;

    sendfile        on;
    tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    send_timeout 30s;
    reset_timedout_connection on;

    #gzip  on;

    upstream fpm {
        server unix:/tmp/php-fpm.sock;
    }

    server {
        listen       80;
        server_name my-site.ru www.my-site.ru;

        charset cp1251;
        root   /usr/local/www/nginx/my-site;

        #access_log  logs/host.access.log  main;

        location / {
            root   /usr/local/www/nginx/my-site;
            index index.php;
            # Следующие три строки нужны для работы Netcat
fastcgi_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri";
            if (!-e $request_filename) {
                rewrite ^(.+)$ /netcat/require/e404.php?REQUEST_URI=$1 last;
            }
        }

        error_page  404              /netcat/require/e404.php; # Нужно для функционирования Netcat

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }

        location ~ \.php$ {
            fastcgi_pass   fpm;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

        location ~ /\.ht {
            deny  all;
        }
    }
}

Запускаем демонов php-fpm и nginx:

/usr/local/etc/rc.d/nginx start
/usr/local/rtc/rc.d/php-fpm start

Теперь осталось только создать базу данных для Netcat и пользователя для работы с ней:

mysql -u root -p
mysql> create database netcat;
mysql>  grant all on netcat.* to netcat_user@localhost identified by 'netcat_password';

Вот и всё, можно заниматься установкой Netcat'а. 

среда, 29 августа 2012 г.

Перехват звонков (pickup) в Asterisk

Где не настраивал Asterisk в небольших организациях - практически нигде не была востребована функция перехвата звонка (по умолчанию *8), обычно всё разруливалось стратегиями дозвона в группах и очередях, а в редких исключениях использовался стандартный метод перехвата звонка с конкретного телефона **XXXX. Сегодня функция глобального перехвата звонка впервые понадобилась клиенту и ему был рассказан способ с нажатием *8. Как оказалось - по умолчанию данная функция не работает, требуется добавить к настройкам номеров абонентов опцию callgroup, в которой указывается принадлежность внутреннего номера к конкретной группе, и опцию pickupgroup, в которой указывается звонки каких групп можно перехватывать с этого номера.

А теперь самое важное - прописав в настройках номера групп, на которые были разделены внутренние номера в организации (600, 601, 602 и т.д.) я так же не добился работы глобального перехвата, только после документации и гугла было выяснено что номера групп могут быть в диапазоне от 0 до 63.

Проблемы с кодировкой в MySQL-PHP

Периодически бывает так, что web-сервер с поддержкой php отображает тексты из php-скриптов нормальными русскими буквами, а все данные из MySQL отображаются знаками вопроса (??????????). Подобная проблема обычно появляется при импорте данных в базу из дампа.

Для начала стоит просмотреть дамп для понимания используемой в нём кодировки символов. К примеру данные в нём в кодировке UTF-8. Пробуем создать базу данных с кодировкой по умолчанию UTF-8:


create database pelikanch_data default character set cp1251 collate cp1251_unicode_ci;



В консоли MySQL даём команду show variables и смотрим кодировку у следующих переменных:


character_set_client
character_set_connection
character_set_database
character_set_results
character_set_server
character_set_system
collation_connection
collation_database
collation_server


Для быстрой проверки используем

set character_set_client=UTF8;

Так же и для остальных переменных. Лучше прописать переменные в файл настроек my.cnf - в секцию [mysqld] дописываем:

default-character-set = utf8
init-connect = "SET NAMES utf8"

так же можно здесь же дописать:


character_set_client = utf8
collation_server = utf8_general_ci

Что-либо из вышеперечесленного обычно помогает, если не помогло - возможно проблема в самих скриптах PHP.

четверг, 16 августа 2012 г.

Очистка очереди MTA Exim

В очереди, увы, может накапливаться всякая дрянь... Кто-то неправильное мыло в веб-форме указал, где-то спамеры с несуществующего адреса что-то прислали. От этого нужно избавляться, желательно по крону.
Настоятельно рекомендую все пути к бинарникам прописать абсолютными -- для верности. 

Пользователь от которого запускается скрипт должен быть доверенным для Exim'а (в общем случае, просто добавте его в группу mail).

По непонятным причинам экзим иногда теряет тела писем после доставки. В следствие чего, в выводе списка писем (exim -bp) объем тела не указан. exiqgrep такое не понимает и падает с подобной ошибкой:

Line mismatch: 4h 1Kg6sa-0454TM-Tu


Лечится так:


exim -bpr | grep "^[0-9][0-9][0-9]d" | awk `{print $2}' | xargs -n 1 -P 20 exim -Mrm

Рекомендую очень хорошо понять, что делает скрипт перед тем как пихать его в крон. Почта удаляется из очереди навсегда.


   #!/bin/bash

   # Определяем qualify_domain -- он нужен для удаления всякой лажи
   domain=`exim -bP | grep -i "^qualify_domain" | sed -e s/.*\=\ //g`
   # Это очень шаманская строчка
   exim -bpr | grep '<' | awk '{print $2}' | grep '-' | xargs exim -Mrm 2> /dev/null
   # если скрипту передан параметр c, то включается более агрессивный режим
   if [ "$1" == "c" ]; then
      # Удаляем все баунсы старше 10 минут
      exiqgrep -o 600 -if '^<>$' |xargs exim -Mrm
      # Удаляем сообщения с адресами начинающимися с подчерка, минуса или вертикальной черты
      exiqgrep -f '^<\_|^<\-|^<\|' -i | xargs exim -Mrm exiqgrep -r '^\_|^\-|^\|' -i | xargs exim -Mrm
      #Удаляем сообщения отправленные скриптами на китайские домены старше 10 минут
      exiqgrep -f "$domain" -r '.cn$' -o 600 -i | xargs exim -Mrm
      # Удаляем любые сообщения отправленные скриптами, если они не доставлись за 12 часов
      exiqgrep -f "$domain" -o 43200 -i | xargs exim -Mrm
      exit
   fi
   # В мягком режиме удаляем только frozen баунсы и письма с невозможными адресами в заголовках
   exiqgrep -zif '^<>$' |xargs exim -Mrm
   exiqgrep -f '^<\_|^<\-|^<\|' -i | xargs exim -Mrm
   exiqgrep -r '^\_|^\-|^\|' -i | xargs exim -Mrm


P.S. Взято отсюда. В оригинальной статье еще много полезного.

Полезные команды MTA Exim

Список сообщений в очереди:
exim -bp
exim -bpr (быстрее выводит)
exiqgrep (без опций)
exiqgrep -b (нагляднее)


Число сообщений в очереди:
exim -bpc

Удаление замороженных сообщений:
exiqgrep -zi | xargs exim -Mrm

Удаление всех баунсов из очереди:
exiqgrep -if '^<>$' | xargs exim -Mrm

Удаление сообщений конкретного отправителя из очереди:
exiqgrep -f [user]@host.ru -i | xargs exim -Mrm

Удаление  сообщений определенного адресата из очереди:
exiqgrep -r [user]@host.ru -i | xargs exim -Mrm

Принудительная рассылка всей почты в очереди:
exiqgrep -i | xargs exim -M