Posts Tagged ‘ FreeBSD

apache-itk-mpm и виртуальный хостинг

Итак, рано или поздно возникает задача в духе: «А как бы нам организовать хостинг нескольких клиентов с их сайтами так чтобы они не имели друг к другу доступа и не было проблем с доступом к файлам через web/ftp/ssh?». Тут уже обычный стандартный apache не справляется и нужно городить некую более сложную конфигурацию. К счастью, задача эта не уникальна и поэтому давным давно есть готовые решения. Одним из них есть модификация apache2 под названием apache-itk-mpm. Он позволяет запускать от имени определенного в конфигах системного пользователя некий виртуалхост апача. Тоесть получаем чтото в духе некоего изолированного контейнера для нужного пользователя или ряда оных. Туманно объяснил, но по конфигам это более понятно. Итак, поехали! Читать полностью

12.12.2012 — А что ты делал в этот день?

Ковырялся на винте в поисках мусора для удаления, сильно уж винчестер засрал. Случайно нашелся скриншот датированный 12.12.12 — я удаленно через IPMI устанавливаю FreeBSD. Клево, даже время 12:12 🙂

12-12-2012 12:12

А что вы делали в этот день? Читать полностью

Ejabberd на FreeBSD с авторизацией в Active Directory

Установка ничем особенным не отличается, как обычно, собрал из портов.
А вот конфигурация весьма интересная и отличается крайней невменяемостью, которую ejabberd унаследовал от языка программирования, на котором он написан — erlang. Многие админы сломали голову в попытках настроить данный софт, и часто совсем отказываются от его использования в пользу jabberd2 или openfire. Я считаю что напрасно, но это только мое ИМХО.
Итак, для настройки достаточно создать пару конфигурационных файлов и прописать автостарт в rc.conf. Также необходимо создать учетку в AD которая имеет права на чтение LDAP базы домена my.domain.local, в моем случае это — CN=for_jabber,OU=it,DC=my,DC=domain,DC=local
Также нужен pem файл который содержит сертификат и ключ для шифрования сетевой деятельности между клиентами и сервером. Ничего особенного в нем нету, стандартное содержимое формата:

-----BEGIN CERTIFICATE-----
....cert here....
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
....key here....
-----END RSA PRIVATE KEY-----

Листинг конфига /usr/local/etc/ejabberd/inetrc

{lookup,["file","native"]}.
{host,{127,0,0,1}, ["localhost","hostalias"]}.
{file, resolv, "/etc/resolv.conf"}.

Листинг главного конфига ejabberd — /usr/local/etc/ejabberd/ejabberd.cfg

override_global.
override_local.
override_acls.

{loglevel, 2}.

% Ports and services
{listen, [

        % Client to server
        {5222, ejabberd_c2s, [
                starttls_required, {certfile, "/usr/local/etc/ejabberd/jabber.pem"},
                zlib
        ]},

        % HTTP service
        {5280, ejabberd_http, [
                web_admin
        ]}

]}.

% Webadmin access
{acl, admins, {user, "my_ad_login", "my.domain.local"}}.
{access, configure, [{allow, admins}]}.

% Host config
{hosts, ["my.domain.local"]}.

%
% HOST: my.domain.local
%

{host_config, "my.domain.local", [

        {auth_method, ldap},
        {ldap_servers, ["my.domain.local"]},
        {ldap_rootdn, "CN=for_jabber,OU=it,DC=my,DC=domain,DC=local"},
        {ldap_password, "12345609876"},
        {ldap_base, "DC=my,DC=domain,DC=local"},
        {ldap_uids, [{"sAMAccountName", "%u"}]},
        {ldap_filter, "(&(objectCategory=person)(objectClass=user))"}

]}.

{language, "ru"}.

{access, muc_admin,  [{allow, admins}]}.
{access, muc_access, [{allow, all}]}.
{access, muc_create, [{allow, admins}]}.
{access, muc_log,    [{allow, admins}]}.

%%%.   =======
%%%'   MODULES

%%
%% Modules enabled in all ejabberd virtual hosts.
%%
{modules,
 [
  {mod_adhoc,    []},
  {mod_announce, [{access, announce}]}, % recommends mod_adhoc
  {mod_blocking,[]}, % requires mod_privacy
  {mod_caps,     []},
  {mod_configure,[]}, % requires mod_adhoc
  {mod_disco,    []},
  %%{mod_echo,   [{host, "echo.localhost"}]},
  {mod_irc,      []},
  {mod_http_bind, []},
  %%{mod_http_fileserver, [
  %%                       {docroot, "/var/www"},
  %%                       {accesslog, "/var/log/ejabberd/access.log"}
  %%                      ]},
  {mod_last,     []},
  {mod_muc,      [
                  {host, "conference.@HOST@"},
                  {access, muc_access},
                  {access_create, muc_create},
                  {access_persistent, muc_create},
                  {access_admin, muc_admin},
                  {default_room_options,
                        [
                         {logging, true}
                        ]}
                 ]},
  {mod_muc_log,  [{access_log, muc_log}, {cssfile, false}, {dirname, room_jid}, {outdir, "/usr/local/www/ejabberd/logs_muc"}]},
  {mod_log_chat, [{path, "/usr/local/www/ejabberd/logs_chat"}, {format, html}]},
  {mod_offline,  [{access_max_user_messages, max_user_offline_messages}]},
  {mod_ping,     []},
  %%{mod_pres_counter,[{count, 5}, {interval, 60}]},
  {mod_privacy,  []},
  {mod_private,  []},
%% Proxy Server for file transfer over NAT %%  
  {mod_proxy65,  [
                {host, "proxy.my.domain.local"}, %% defines the Jabber ID of service.
                {ip, {0,0,0,0}}, %% 127.0.0.1 by default, make it 0.0.0.0 to listen on all interfaces, or the ip of specific interface
                {hostname, "my.domain.local"}, % useful service run behind a NAT. default is ip option. Ex: "proxy.mydomain.org", "200.150.100.50"
                {port, 7777}, %% Default, we don't need to add
                {access, all} %% Default, we don't need to add
                 ]},
  {mod_pubsub,   [
                  {access_createnode, pubsub_createnode},
                  {ignore_pep_from_offline, true}, % reduces resource comsumption, but XEP incompliant
                  %%{ignore_pep_from_offline, false},  % XEP compliant, but increases resource comsumption
                  {last_item_cache, false},
                  {plugins, ["flat", "hometree", "pep"]}  % pep requires mod_caps
                 ]},
  {mod_register, [
                  %%
                  %% Protect In-Band account registrations with CAPTCHA.
                  %%
                  %%{captcha_protected, true},

                  %%
                  %% Set the minimum informational entropy for passwords.
                  %%
                  %%{password_strength, 32},

                  %%
                  %% After successful registration, the user receives
                  %% a message with this subject and body.
                  %%
                  {welcome_message, {"Welcome!",
                                     "Hi.\nWelcome to this XMPP server."}},

                  %%
                  %% When a user registers, send a notification to
                  %% these XMPP accounts.
                  %%
                  %%{registration_watchers, ["admin1@example.org"]},

                  %%
                  %% Only clients in the server machine can register accounts
                  %%
                  {ip_access, [{allow, "127.0.0.0/8"},
                               {deny, "0.0.0.0/0"}]},

                  %%
                  %% Local c2s or remote s2s users cannot register accounts
                  %%
                  %%{access_from, deny},

                  {access, register}
                 ]},
  %%{mod_register_web, [
                  %%
                  %% When a user registers, send a notification to
                  %% these XMPP accounts.
                  %%
                  %%{registration_watchers, ["admin1@example.org"]}
  %%             ]},
  {mod_roster,   []},
  %%{mod_shared_roster,[]},
  {mod_shared_roster_ldap, [
          {ldap_filter, "(&(objectCategory=person)(objectClass=user))"},
          {ldap_base, "OU=Organisation,DC=my,DC=domain,DC=local"},
   %%     {ldap_rfilter, "(&(sAMAccountType=805306368)(!(memberOf=CN=Some_not_real_users,OU=Users_All,OU=Organisation,DC=my,DC=domain,DC=local)))"},
          {ldap_rfilter, "(&(objectClass=person)(objectClass=user))"},
          {ldap_groupattr, "department"},
          {ldap_groupdesc, "department"},
          {ldap_memberattr, "sAMAccountName"},
          {ldap_userdesc, "cn"}
        ]},
  %%{mod_service_log,[]},
  {mod_shared_roster,[]},
  {mod_stats,    []},
  {mod_time,     []},
  %%{mod_vcard,    []},

{mod_vcard_ldap,
   [
    %% We use the same server and port, but want to bind anonymously because
    %% our LDAP server accepts anonymous requests to
    %% "ou=AddressBook,dc=example,dc=org" subtree.
    {ldap_rootdn, "CN=for_jabber,OU=it,DC=my,DC=domain,DC=local"},
    {ldap_password, "12345609876"},
    %% define the addressbook's base
    {ldap_base, "OU=Organisation,DC=my,DC=domain,DC=local"},
    %% uidattr: user's part of JID is located in the "mail" attribute
    %% uidattr_format: common format for our emails
    %%%%%%{ldap_uids, [{"mail","%u@myco.ua"}]},
    %% We have to define empty filter here, because entries in addressbook does not
    %% belong to shadowAccount object class
    %%{ldap_filter, "(&(sAMAccountType=805306368)(!(memberOf=CN=Some_not_real_users,OU=Users_All,OU=Organisation,DC=my,DC=domain,DC=local)))"},
    {ldap_filter, "(&(objectClass=person)(objectClass=user))"},
    %% Now we want to define vCard pattern
    {ldap_vcard_map,
      [{"NICKNAME", "%u", []},
       {"GIVEN", "%s", ["givenName"]},
       {"MIDDLE", "%s", ["initials"]},
       {"FAMILY", "%s", ["sn"]},
       {"FN", "%s", ["displayName"]},
       {"EMAIL", "%s", ["mail"]},
       {"ORGNAME", "%s", ["company"]},
       {"ORGUNIT", "%s", ["department"]},
       {"CTRY", "%s", ["c"]},
       {"LOCALITY", "%s", ["l"]},
       {"STREET", "%s", ["streetaaadress"]},
       {"REGION", "%s", ["st"]},
       {"PCODE", "%s", ["postalCode"]},
       {"TITLE", "%s", ["title"]},
       {"URL", "%s", ["wWWHomePage"]},
       {"DESC", "%s", ["description"]},
       {"TEL", "%s, office: %s", ["mobile", "telephoneNumber"]}]},
    {ldap_search_fields,
      [{"User", "%u"},
       {"Name", "givenName"},
       {"Family Name", "sn"},
       {"Email", "mail"},
       {"Company", "company"},
       {"Department", "department"},
       {"Role", "title"},
       {"Description", "description"},
       {"Phone", "mobile"}]},
    {ldap_search_reported,
      [{"Full Name", "FN"},
       {"Nickname", "NICKNAME"},
       {"Email", "EMAIL"}]}
  ]},

  {mod_version,  [
        {show_os, true}
  ]}
 ]}.

Со стороны клиента настройки должны быть такие:

    server — server FQDN
    domain — my.domain.local
    username — AD sAMAccountName
    password — AD password
    Шифрование — обязательно!

Также в данном конфиге используется модуль которого нету в стандартной поставке сервера — mod_log_chat, его необходимо собирать самому и подключать отдельно. Как это делается я писал ранее.
Не побрезгуйте ознакомиться с официальной документацией, она, на удивление, очень подробная с множеством примеров и разъяснений.
Enjoy!

FreeBSD — exim + rspamd

Идея о том чтобы выкинуть нафик непомерно прожорливый spamassassin из почтовой связки exim + dovecot давно мучила мне мозг. В особенности если учесть что поток почты единицы писем в сутки 🙂 Но вот случайно набрел на просторах инета инфо про замечательную альтернативу SA — rspamd. Заинтриговала невероятная легковесность решения при сохранении функциональности. Ну чтож … гоним метлой из системы жирного spammassassina и пробуем настроить rspamd. Вроде бы все должно быть просто, вот и документация есть — дел на пару минут, ан нет — установить с полпинка не получилось 🙂
Итак, как я говорил выше, на сервере установлен и работает exim + sa, для начала нужно отучить exim проверять письма spamassasin-ом, для этого уберите из конфига exim-а все что вяжет его с SA. Это просто, справится любой.
Дальше тоже просто — установить из портов rspamd. Тут и писать нечего, идем в порты и устанавливаем привычным способом.
А вот следующий шаг оказался для меня тяжеловат — нужно пересобрать exim с поддержкой rspamd, для этого есть patch patch-exim-src_spam.c.diff который можно скачать вот тут. Читать полностью

MySQL — Could not execute Write_rows_v1 event on table my_wp.wp_options; Duplicate entry

На мастере была проблема с одной из БД, в результате slave тоже ругается ошибкой

Last_SQL_Error: Could not execute Write_rows_v1 event on table my_wp.wp_options; Duplicate entry '_transient_doing_cron' for key 'option_name', Error_code: 1062; handler error
HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000014, end_log_pos 337

Решить удалось довольно просто, сбойную команду нужно просто пропустить, для этого подколючаемся в mysql под рутом и выполняем:

mysql> stop slave;
mysql> SET GLOBAL sql_slave_skip_counter = 2;
mysql> start slave;

Enjoy!

MySQL — ‘wp_options’ is marked as crashed and should be repaired

Както раз у меня завалился mysql, после перезапуска в логах увидел такую срань. Причем блог на wordpress при этом нормально работал,

131112  9:37:52 [Note] /usr/local/libexec/mysqld: ready for connections.
Version: '5.5.34-log'  socket: '/tmp/mysql.sock'  port: 3306  Source distribution
131112 09:37:53 mysqld_safe A mysqld process already exists
131112  9:40:44 [ERROR] /usr/local/libexec/mysqld: Table './diff_wp/wp_options' is marked as crashed and should be repaired
131112  9:40:44 [Warning] Checking table:   './my_wp/wp_options'
131112  9:40:45 [ERROR] /usr/local/libexec/mysqld: Table './diff_wp/wp_usermeta' is marked as crashed and should be repaired
131112  9:40:45 [Warning] Checking table:   './my_wp/wp_usermeta'
131112  9:40:46 [ERROR] /usr/local/libexec/mysqld: Table './diff_wp/wp_posts' is marked as crashed and should be repaired
131112  9:40:46 [Warning] Checking table:   './my_wp/wp_posts'
131112  9:40:47 [ERROR] /usr/local/libexec/mysqld: Table './diff_wp/wp_postmeta' is marked as crashed and should be repaired
131112  9:40:47 [Warning] Checking table:   './my_wp/wp_postmeta'
131112  9:40:47 [ERROR] /usr/local/libexec/mysqld: Table './diff_wp/wp_comments' is marked as crashed and should be repaired
131112  9:40:47 [Warning] Checking table:   './my_wp/wp_comments'

На официальном сайте mysql рекомендуют в таком случае восстановить таблицы специальной утилитой — myisamchk Читать полностью

FreeBSD + Ejabberd — как собирать модули

Чуть позже напишу о конфигурации jabberd сервера для корпоративных нужд. Будет и AD-авторизация, и общий список контактов из AD, и логирование разговоров и конференций. А пока простенькая заметка как собирать модули для ejabberd, для затравки, так сказать.
Все очень просто. Настолько просто что и представить невозможно. Делается «в два клика мышкой» 😉 Алгоритм примерно такой:
1. Залить исходники
2. Скомпилить плагин
3. Скопировать в директорию с плагинами сервера
4. Сделать необходимые настройки в конфиге
Поехали …. Читать полностью

FreeBSD. HAST + UCARP = файловый кластер. Или нет?

Идея настроить репликацию файлов между серверами давно закралась мне в голову. Хочется такой себе файловый кластер на FreeBSD. Очень уж хотелось засунуть туда один web-ресурс. С базой данных все понятно, сам mysql прекрасно справляется с репликацией своих баз (я писал уже о репликации в mysql в одной из предыдущих заметок). Но что делать с файлами? Rsync и прочее не нравится, точнее нравится и даже трудится в данный момент, но есть одна проблема — решение содержит постоянную временную задержку синхронизации, а значит данные на slave-нодах всегда будут отставать от master-а. И вот както я нашел HAST, он лишен проблемы с задержкой синхронизации, так как синхронизирует данные в реальном времени. Жаль только что в данный момент HAST ограничен работой с двумя хостами в режиме master-slave или в терминологии самого HAST «Primary — Secondary». По сути можно построить клестер «с холодным резервом». И еще одна ложка дегтя — больше двух хостов в связку добавить нельзя, один мастер, один слейв …. эх 🙁 Также есть ограничения на общий ресурс — это может быть либо отдельный диск либо раздел, директорию или файл сделать общим ресурсом нельзя. Ну все равно интересно — пробуем!
Вводные данные:
FQDN server1 — node1.loc, IP — 10.10.10.10 — условный master
FQDN server2 — node2.loc, IP — 10.10.10.20 — условный slave
«Общий» для обоих нод IP, по сути, адрес кластера — 10.10.10.100
«Общий» ресурс — www
Диск который будем делать общим — /dev/da0
Точка монтирования «общего» ресурса — /usr/local/www/hast
Поехали! Читать полностью

FreeBSD — memcached + php5

Захотелось мне улучшить производительность связки PHP5 + MySQL + Apache22 на сервере с FreeBSD. Решил добавить в эту связку еще и memcached для улучшения отдачи сгенеренного php-шкой кода.
Делается крайне просто, все что нужно — уже есть в портах. Сначала ставим сам memcached:

root@black:~# cd /usr/ports/databases/memcached

И установим такой командой:

root@black:/usr/ports/databases/memcached# make install clean

Для автозапуска добавим в /etc/rc.conf строки:

memcached_enable="YES"
memcached_flags="-d -m 64 -u nobody -l 127.0.0.1"

Запустим сервис:

root@black:~# service memcached start

Идем дальше …. Читать полностью

Решено! esniper — Unknown error code 34

Решено!
Давно пользуюсь сей прекрасной утилиткой для автоматических ставок на ebay, но вот после очередного обновления системы отказывается работать зараза!
В форум разрабам написал, пока молчат как партизаны … может кто подскажет как полечить? Пробовал пересобирать и саму прогу и curl — не помогает, видать новый curl ему не нравится совсем.
Вобщем система у меня такая:

root@gw:~# pkg_version -v |egrep 'esniper|curl'
curl-7.33.0 = up-to-date with port
esniper-2.28.0_1 = up-to-date with port
php5-curl-5.4.21_1 = up-to-date with port
root@gw:~#
root@gw:~# esniper -d -s 5 -u my_ebay_login 300996098933 5
Enter eBay password:
Auction 30099609xxxx: Unknown error code 34
Retrying...
Auction 30099609xxxx: Unknown error code 34
Retrying...
Auction 30099609xxxx: Unknown error code 34
Auction 30099609xxxx: Unknown error code 34
root@gw:~#

Помогите инфой, плиз …..
Проблема оказалась в банальном отсутствии опции «cookies» в CURL, после пересборки курла с данной опцией прога отлично заработала 🙂