Пакет Mailman из репозиториев Debian/Ubuntu поставляется с настройками для Apache, но не для nginx. Данная статья расскажет как вы можете использовать Mailman из репозитория Debian Squeeze/Ubuntu 11.04/11.10 c виртуальным хостом nginx. Nginx – это HTTP сервер, который использует гораздо меньше ресурсов, чем Apache и отдает страницы, особенно статические, намного быстрее.

1. Подготовка к работе

Допустим, мы хотим использовать Mailman на виртуальном хосте www.example.com/example.com с корневой директорией/var/www/www.example.com/web.

Также, у вас должна быть рабочая инсталляция LEMP (включая установленный MySQL), как описано в этих статьях:

  • Установка nginx с поддержной PHP5 и MySQL на Debian Squeeze
  • Установка nginx с поддержкой PHP5 (а также PHP-FPM) и MySQL на Ubuntu 11.04

Замечание для пользователей Ubuntu:

Раз нам надо выполнять все команды в статье от с привилегиями суперпользователя, мы можем писать в начале каждой команды sudo или стать суперпользователем просто выполнив:

1
sudo su

2. Установка Fcgiwrap

Для того, чтобы разрешить nginx обрабатывать веб-интерфейс Mailman, нам нужен установленный пакет fcgiwrap:

1
apt-getinstall fcgiwrap

После установки демон fcgiwrap скорее всего уже запущен; его сокет/var/run/fcgiwrap.socket. Если он не запущен, вы можете использовать скрипт/etc/init.d/fcgiwrap чтобы запустить его.

3. Настройка виртуального хоста

Если вы еще не настроили виртуальный хост nginx, вы можете это сделать следующим образом:

Корневой директорией моего сайта www.example.com является/var/www/www.example.com/web – если её еще нет, создайте её:

1
mkdir -p/var/www/www.example.com/web

Дальше мы создаем базовую конфигурацию виртуального хоста www.example.comв nginx.  Для этого в директории /etc/nginx/sites-available/ создаем файл www.example.com.vhost:

1
vi /etc/nginx/sites-available/www.example.com.vhost

С настройками нашего хоста:

server {
  listen 80;
  server_name www.example.com example.com;
  root /var/www/www.example.com/web;

  if ($http_host != "www.example.com") {
    rewrite ^ http://www.example.com$request_uri permanent;
  }

  index index.php index.html;

  location = /favicon.ico {
    log_not_found off;
    access_log off;
  }

  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
  }

  # Deny all attempts to access hidden files
  # such as .htaccess, .htpasswd, .DS_Store (Mac).
  location ~ /. {
    deny all;
    access_log off;
    log_not_found off;
  }
  location ~* .(jpg|jpeg|png|gif|css|js|ico)$ {
    expires max;
    log_not_found off;
  }
}

Чтобы разрешить этот хост, мы создадим к нему символическую ссылку из директории /etc/nginx/sites-enabled/ :

1
2
cd /etc/nginx/sites-enabled/
ln -s/etc/nginx/sites-available/www.example.com.vhost www.example.com.vhost

Перезапустите nginx, чтобы изменения вступили в силу:

1
/etc/init.d/nginx reload

4. Установка Mailman + настройка виртуального хоста Mailman

Упрощенно установка Mailman выглядит следующим образом:

1
apt-getinstall mailman

Перед запуском Mailman, должен быть создан первый список рассылки с названием mailman :

1
newlist mailman

Результат выполнения команды:

root@server1:~# newlist mailman
Enter the email of the person running the list:
<– email администратора, напр.: info@example.com
Initial mailman password:
<– пароль администратора для списка mailman
To finish creating your mailing list, you must edit your /etc/aliases (or
equivalent) file by adding the following lines, and possibly running the
`newaliases’ program:

## mailman mailing list
mailman: “|/var/lib/mailman/mail/mailman post mailman”
mailman-admin: “|/var/lib/mailman/mail/mailman admin mailman”
mailman-bounces: “|/var/lib/mailman/mail/mailman bounces mailman”
mailman-confirm: “|/var/lib/mailman/mail/mailman confirm mailman”
mailman-join: “|/var/lib/mailman/mail/mailman join mailman”
mailman-leave: “|/var/lib/mailman/mail/mailman leave mailman”
mailman-owner: “|/var/lib/mailman/mail/mailman owner mailman”
mailman-request: “|/var/lib/mailman/mail/mailman request mailman”
mailman-subscribe: “|/var/lib/mailman/mail/mailman subscribe mailman”
mailman-unsubscribe: “|/var/lib/mailman/mail/mailman unsubscribe mailman”

Hit enter to notify mailman owner… <– здесь нажмите ENTER

root@server1:~#

После этого откройте /etc/aliases :

1
vi /etc/aliases

и добавьте следующие строки:

[...]
mailman: "|/var/lib/mailman/mail/mailman post mailman"
mailman-admin: "|/var/lib/mailman/mail/mailman admin mailman"
mailman-bounces: "|/var/lib/mailman/mail/mailman bounces mailman"
mailman-confirm: "|/var/lib/mailman/mail/mailman confirm mailman"
mailman-join: "|/var/lib/mailman/mail/mailman join mailman"
mailman-leave: "|/var/lib/mailman/mail/mailman leave mailman"
mailman-owner: "|/var/lib/mailman/mail/mailman owner mailman"
mailman-request: "|/var/lib/mailman/mail/mailman request mailman"
mailman-subscribe: "|/var/lib/mailman/mail/mailman subscribe mailman"
mailman-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe mailman"

Потом выполните команду:

1
newaliases

и перезапустите Postfix:

1
/etc/init.d/postfix restart

Далее запустите демон Mailman:

1
/etc/init.d/mailman start

Откройте /etc/nginx/sites-available/www.example.com.vhost :

1
vi /etc/nginx/sites-available/www.example.com.vhost

и добавьте следующую часть в контейнер server {} :

server {
  [...]
  location /cgi-bin/mailman {
     root /usr/lib/;
     fastcgi_split_path_info (^/cgi-bin/mailman/[^/]*)(.*)$;
     include /etc/nginx/fastcgi_params;
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
     fastcgi_param PATH_INFO $fastcgi_path_info;
     fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
     fastcgi_intercept_errors on;
     fastcgi_pass unix:/var/run/fcgiwrap.socket;
  }

  location /images/mailman {
     alias /usr/share/images/mailman;
  }
  location /pipermail {
     alias /var/lib/mailman/archives/public;
     autoindex on;
  }
  [...]
}

Убедитесь, что вы используете правильный сокет в строке fastcgi_pass unix. Стандартно сокет fcgiwrap расположен в /var/run/fcgiwrap.socket.

Это определяет алиас /cgi-bin/mailman/ для вашего виртуального хоста. Это означает, что вы можете получить доступ к  админ-интерфейсу Mailman для списка по адресу http://<виртуальный хост>/cgi-bin/mailman/admin/<имя списка>, и страница для пользователей списка рассылки доступна по адресуhttp://<виртуальный хост>/cgi-bin/mailman/listinfo/<имя списка>.

По адресу http://<vhost>/pipermail вы можете найти архивы списка рассылки.

Пкркзапустите nginx:

1
/etc/init.d/nginx reload

Вот и всё! Сейчас вы можете зайти на http://www.example.com/cgi-bin/mailman/admin/mailman для управления списком рассылки mailman:

 

и по адресу http://www.example.com/cgi-bin/mailman/listinfo/mailman для доступа к публичной странице списка рассылки mailman (где пользователи могут подписаться):

 

По адресу http://www.example.com/pipermail вы можете найти архив списка рассылки:

 

Кроме, того, если Ваш Sendmail идет со включенной по умолчанию опцией smrsh, ограничивающей исполнение скриптов через MTA (а в случае использования дистрибутивов, не базирующихся на Red Hat Linux это именно так), то Вам необходимо в каталоге /etc/smrsh/ создать симлинк на mailman:

cd /etc/smrsh/
ln -s /usr/local/mailman/mail/mailman mailman

Следующий шаг — создание списка периодически выполняемых задач при помощи crontab (например, оповещение администратора о запросах на включение пользователей в список рассылки):

cd /usr/local/mailman/cron
crontab -u mailman crontab.in
cd ..

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

./bin/mailmanctl start
cp scripts/mailman /etc/init.d/mailman
chkconfig -add mailman