среда, 12 ноября 2014 г.

FreeBSD 9 ICMP шторм на lo0

Однажды после обновления с 9.0 до 9.2 на loopback-интерфейсе (lo0) появился сильный icmp-шторм. Помогло отключение TSO на внешнем интерфейсе:
ifconfig em0 -tso

https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=144311

суббота, 16 марта 2013 г.

Pyramid + virtualenv + UWSGI + nginx на FreeBSD

В этой заметке описывается настройка связки Pyramid + UWSGI + nginx + python3.2 в двух вариантах: virtualenv и uwsgi-plugins на хостинге FreeBSD. Надо отметить, что по-умолчанию на сервере используется python2.7.

I. virtualenv

Для начала надо установить python3.2 и необходимые дополнительные пакеты:
make -C /usr/ports/lang/python32 install clean
make -C /usr/ports/databases/py-sqlite3 PYTHON_VERSION=python3.2 NO_PKG_REGISTER=yes install
(NO_PKG_REGISTER необходим для обхода конфликта с уже установленными версиями для дефолтного python2.7)
make -C  /usr/ports/devel/py-distribute PYTHON_VERSION=python3.2 NO_PKG_REGISTER=yes install
pip-3.2 install virtualenv

Затем необходимо создать окружение для пользователя, из под которого будет работать сайт:
su user
cd
virtualenv-3.2 --system-site-packages env

и установить локальный uwsgi:
env/bin/pip install uwsgi

Клонируем сайт из репозитория gitolite:
git clone git@127.0.0.1:/project.git

Далее надо настроить uwsgi (project.yaml):
uwsgi:
  chdir: /www/user/project
  virtualenv: /www/user/env
  uid: user
  gid: user
 # указываем socket, при помощи которого будет происходить
 # взаимодействие между nginx и uwsgi
  socket: /tmp/project_uwsgi.sock
 # здесь указываем путь к проекту
   pythonpath: /www/user/project
# путь к лог файлу
  daemonize: /www/user/log/uwsgi.log
 # прочие настройки, значения который можно посмотреть на сайте uWSGI
  max-requests: 5000
  buffer-size: 32768
  harakiri: 30
  reload-mercy: 8
  master: 1
  no-orphans: 1
 # если выполнить команду "touch <имя ниже указанного файла>",
 # то произойдет перезапуск uwsgi демона.
  touch-reload: /www/user/uwsgi
  paste: config:/www/user/project/production.ini

Конфиг nginx:
server {
  listen 80;
 
  server_name project.ru www.project.ru;

  access_log /www/user/log/access;
  error_log /www/user/log/error;

  root /www/user/project/;

  location / {
 # ниже надо указать путь к socket'у, при помощи которого
 # nginx и uwsgi будут сообщаться.
 # в данном случае путь это '/var/tmp/odmin4eg_uwsgi.sock'
  uwsgi_pass unix:///tmp/user_uwsgi.sock;
 include uwsgi_params;
 uwsgi_param SCRIPT_NAME /;

 # 8 -- число буфферов
 # 128k -- размер буфера
  # фактически, мы сможем передать от project в nginx только 1 мб информации.
 # играйтесь с этим значением при поднятии своего проекта
 uwsgi_buffers 8 128k;
 }

 location /static/ {
 # а вот здесь указываем абсолютный путь к директории со
 # статическими файлами
  alias /www/user/project/www/static/;
 expires 30d;
 }
}

II. uwsgi plugin

cd /usr/ports/uwsgi
make
cd work/uwsgi-1.2.4/
echo "plugin_dir = /usr/local/lib/uwsgi" >> buildconf/core.ini
python uwsgiconfig.py --clean
python uwsgiconfig.py --build core
python uwsgiconfig.py --plugin plugins/python core python27
python32 uwsgiconfig.py --plugin plugins/python core python32
здесь возможно потребуется пересобрать Python3.2: make -C /usr/ports/lang/python32/ CFLAGS=-fPIC deinstall install
cd /usr/ports/uwsgi
make install

pip-3.2 install PasteDeploy pyramid pyramid-debugtoolbar pyramid-tm waitress zope.sqlalchemy
Возможна такая ситуация при запуске uwsgi: Traceback (most recent call last):
  File "/usr/local/lib/python3.2/site-packages/paste/deploy/loadwsgi.py", line 247, in loadapp
    return loadobj(APP, uri, name=name, **kw)
  File "/usr/local/lib/python3.2/site-packages/paste/deploy/loadwsgi.py", line 271, in loadobj
    global_conf=global_conf)
  File "/usr/local/lib/python3.2/site-packages/paste/deploy/loadwsgi.py", line 277, in loadcontext
    if '#' in uri:
TypeError: Type str doesn't support the buffer API
Тогда надо добавить в /usr/local/lib/python3.2/site-packages/paste/deploy/loadwsgi.py перед строкой 277 содержащей if '#' in uri: if isinstance(uri, bytes):
        uri = uri.decode('utf-8')



Ссылки:
http://projects.unbit.it/uwsgi/wiki/Guide4Packagers
http://projects.unbit.it/uwsgi/wiki/MultiPython
http://liangsun.org/network/pyramid-nginx-uwsgi-mysql/

вторник, 1 мая 2012 г.

Виртуальные домены на sendmail+cyrus-imap

В sendmail.mc пишем:
FEATURE(local_lmtp)
FEATURE(mailertable, `hash -o /etc/mail/mailertable')
define(`confLOCAL_MAILER', `cyrusv2')
mailer(`cyrusv2')

После компиляции в sendmail.cf надо внести изменения в разделе про cyrus (@todo: сделать это sendmail.mc):
S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP, E=\r\n,

В mailertable для каждого домена:
example.com cyrusv2:/var/imap/socket/lmtp

В access:
From:example.com RELAY

В imapd.conf:
defaultdomain: example.com
unixhierarchysep: 1
virtdomains: userid
admins: admin
tls_cert_file: /var/imap/server.pem
tls_key_file: /var/imap/server.pem


Пользователь admin будет управлять всеми ящиками на всех доменах. Если надо админа для конкретного домена, то пишем так:
admins: admin, admin@example2.com

Создаем сертификат и ключи:
openssl req -new -x509 -nodes -out /var/imap/server.pem -keyout /var/imap/server.pem -days 365
Когда спросят про "Common Name (eg, YOUR name)" нужно ввести имя того же домена, который прописан в defaultdomain (здесь - example.com).

Прописываем для админа пароль:
saslpasswd2 -c admin@example.com

И начинаем создавать ящики:
cyradm --user admin@example.com example.com
cm user/user1@example.com
cm user/user1@example2.com

Пароли для них так же прописываются через saslpasswd2:
saslpasswd2 -c user1@example.com
saslpasswd2 -c user1@example2.com

Источники:
http://cyrusimap.web.cmu.edu/docs/cyrus-imapd/2.3.16/install-configure.php
http://cyrusimap.web.cmu.edu/docs/cyrus-imapd/2.3.16/install-virtdomains.php
http://cyrusimap.web.cmu.edu/mediawiki/index.php/Cyrus_Virtual_Domains

четверг, 12 апреля 2012 г.

php 5.2 и php 5.3 на одном сервере (FreeBSD)

Для обеспечения работоспособности php 5.2 и php 5.3 на одном сервере можно сделать следующее:

1. убедится, что php 5.2 и его расширения установлены из портов php52 и php52-extensions соответственно.

2. make -C /usr/ports/lang/php5/ PREFIX=/usr/local/php53 PHPBASE=/usr/local/php53 PHP_AUTOCONF=/usr/local/bin/autoconf-2.68 PHP_AUTOHEADER=/usr/local/bin/autoheader-2.68 install

3. make -C /usr/ports/lang/php5-extensions/ PREFIX=/usr/local/php53 PHPBASE=/usr/local/php53 PHP_AUTOCONF=/usr/local/bin/autoconf-2.68 PHP_AUTOHEADER=/usr/local/bin/autoheader-2.68 install

на этом шаге могут возникнуть проблемы с портами, которые не были еще установлены в систему и поставились по зависимостям модулей: из-за указания PREFIX они тоже поставятся в /usr/local/php53, но нам этого не надо, поэтому:

pkg_delete <проблемный порт>

make -C /usr/ports/<категория>/<проблемный порт> install

и повторяем пункт 3.



Настройка Apache

php 5.2 оставлен модулем, а php 5.3 будет работать через cgi.

1. добавляем:

ScriptAlias /php53/ “/usr/local/php53/bin/”

<Directory “/usr/local/php53/bin”>
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

2. для виртуальных хостов, которым требуется php 5.3 разрешаем переписывать FileInfo:

AllowOverride FileInfo

3. в документруте сайта в .htaccess надо добавить:

AddHandler php53 .php
Action php53 /cgi-bin/php53-cgi

4. копируем:

cp /usr/local/php53/bin/php-cgi ~<user>/cgi-bin/php53-cgi

Все пункты, кроме п.1, необходимы если используется suexec. Если же suexec не используется, то берем пп.1, 2, а 3 будет таким:

AddHandler php53 .php
Action php53 /php53/php-cgi



Примечание

В режиме cgi php не читает php.ini из домашнего каталога пользователя. Есть два способа решения:

1. сделать линк на пользовательский php.ini в каталоге cgi-bin:

cd ~/cgi-bin

ln -s ../php.ini

2. в php 5.3 появилась поддержка изменения настроек для каждого отдельного каталога путем размещения в них файла .user.ini