Linux + Nginx + Fcgiwrap + Movable Type

Movable Type (произносится Мувейбл Тайп) - проприетарная CMS, разрабатываемая японской фирмой Six Apart.

movabletype

Ключевые особенности этой CMS:

  • Генерация статических HTML либо PHP файлов. Фактически, это cms для html сайтов. HTML-статика позволяет открываться страничкам сайта очень быстро, нагрузка на сервер близка к нулю, что позволяет размещать сотни сайтов на маломощном сервере.
  • Любое колличество сайтов/блогов на одной инсталяции движка.
  • CMS разработана на языке PERL. Позволяет внедрять на любые страницы PHP-код.
  • Для использования CMS знать Perl или PHP не требуется. Система использует собственный язык разметки. Необходимы хотя бы начальные знания html+css.

Недостатки (если их таковыми можно назвать):

  • для установки и задействования всех функций движка зачастую необходим доступ к настройкам сервера с правами root.
  • шаблоны для сайта/блога необходимо разрабатывать самостоятельно (для этого достаточно знать html+css), либо переделывать из шаблонов для других cms, например wordpress.

Где скачать Movable Type

На сегодняшний день (февраль 2015 года) актуальными версиями Movable Type являются: 5.2.12, 6.0.7 и 6.1 (релиз от 11 февраля 2015 года).
Ветка 5.2 - является Open Source и распространяется бесплатно. Для этой ветки компания Six Apart выпускает только обновления, связанные с безопастностью. Скачать можно на официальном сайте в ветке stable. Версии с 1 по 4 можно скачать в архивной ветке.
Руссифицированная Open Source версия Movabletype 5.2.12 доступна на сайте Movable-Type.ru

Версии из веток 6.0 и 6.1 являются проприетарным продуктом и распространяются за плату, стоимость лицензии составляет $499

Однако, для персонального использования Movable Type остается бесплатной. Под персональным использованимем понимается зарегистрированный в системе 1 администратор или автор, система должна использоваться в некоммерческих целях. Бесплатная версия от платной ничем не отличается, только лицензией. Соблюдение лицензии полностью на совести вебмастера.

Чтобы официально бесплатно получить последнюю версию Movable Type - идем на японский сайт Six Apart (не пугаемся иероглифов) и нажимаем на кнопку скачивания:

mt-download

Открывшуюся страницу проматываем до конца - до поля ввода почты:

mt-download-2

В поля ввода указываем свою почту, а в выпадающем меню выбираем второй пункт:

mt-download-3
что обозначает: хочу попробовать.

Если вам уже присылали CMS (ваш email есть в базе рассылки movabletype и вам периодически приходят новости на японском), то выбирайте третий пункт バージョンアップ (обновление версии).

Нажав синюю кнопку отправить, через пару минут вам на почту придет письмо в котором будет ссылка на скачивание архива и одноразовый пароль. Переходим по ссылке, вводим пароль и скачиваем файл.

Другой вариант получения CMS:
Напишите Андрею Серебрякову email с просьбой выслать Movable Type. Андрей занимается руссификацией движка, очень хорошо знает все тонкости, связанные с Movable Type и пришлет вам руссифицированную версию.

Конфигурация сервера на примере Gentoo для CMS Movable Type

Если у вас сервер на базе Debian или Ubuntu, то этот раздел (специфичных настроек для Gentoo) можно пропустить.
Установка и конфигурация сервера на базе Debian или Ubuntu описана здесь, переходите сразу к разделу Установка Movable Type.

Глобальные настройки (для Gentoo):

# /etc/portage/make.conf
...
USE="-X -gtk -xmp -gpm -ipv6 -bluetooth -apache -apache2 -wifi -systemd -alsa -sqlite \
logrotate php mysql mysqli gd gd2 curl simplexml tokenizer dom tidy xml fpm cgi gzip fcgi fcgiwrap ftp"
LINGUAS="en"
LANG="en_US.UTF-8"
EMERGE_DEFAULT_OPTS="--ask --verbose --usepkg"
# версию php можно выбрать 5-5, либо для большей совместимости с различными движками (форумы, доски объявлений и т.д.), можно установить версию 5-4
PHP_TARGETS="php5-4"
PHP_INI_VERSION="production"
NGINX_MODULES_HTTP="access auth_basic autoindex \
browser charset empty_gif fastcgi geo gzip limit_conn limit_req \
map memcached proxy referer rewrite scgi split_clients ssi \
upstream_ip_hash userid uwsgi gunzip gzip_static push perl"

Флаги:

# /etc/portage/package.use
...
dev-lang/php sockets truetype pdo xmlreader xmlrpc xmlwriter xpm zip production
dev-db/mysql -* community ssl latin1
dev-db/phpmyadmin setup vhosts
dev-perl/GD jpeg png truetype animgif gif
net-ftp/proftpd openssl clamav

Обновляем дерево портэжей:

emerge eix
eix-update
eix-sync

Что бы не разрастались логи пригодится ротация:

emerge logrotate

Можно установить для удобства файловый менеджер Midnight Commander:

emerge app-misc/mc

Устанавливаем Nginx + MySQL + PHP

emerge php nginx mysql

Это долгая процедура, дольше всего компилится php.

Запускаем сервисы:

# /etc/init.d/nginx start
# /etc/init.d/mysql start
# /etc/init.d/php-fpm start

Добавляем в автозапуск:

# rc-update add nginx default
# rc-update add mysql default
# rc-update add php-fpm default

После старта nginx при наборе в браузере IP-адреса вашего сервера (или домена, привязанного к этому IP) должно быть приветствие Welcome to Nginx!
Если же вы видите 403 Forbidden - значит сервер не сконфигурирован, необходимо отредактировать конфиг /etc/nginx/nginx.conf (см. ниже "Конфигурация Nginx").

Настраиваем MySQL:

emerge --config dev-db/mysql

устанавливаем пароль для рута mysql, записываем куда нибудь, что бы не забыть (пароль должен быть достаточно сложным для подбора ботами, например 16-значный, содержащий цифры и буквы в различном регистре).

Директория для сайтов и скриптов на сервере

Сайты у нас будут находится в директории /var/www/домен
cgi-скрипты для всех сайтов - в директории /var/www/cgi-bin
Примечание: директорию /var/www можно вынести на отдельный раздел жесткого диска при первичной установке системы.
Конфиги сайтов - в /etc/nginx/sites-available
Работающие сайты - в /etc/nginx/sites-enabled
В sites-enabled будут симлинки на конфиги из sites-available (удобно, если у вас несколько сайтов). Для отключения сайта надо будет всего лишь удалить симлинк, не затрагивая конфиг.

Создаем директорию для сайтов:

mkdir /var/www

Даем nginx права на директорию:

chmod 755 /var/www && chown nginx:nginx /var/www

Создаем директорию для cgi-скриптов:

mkdir -p /var/www/cgi-bin
chmod 755 /var/www/cgi-bin && chown nginx:nginx /var/www/cgi-bin

Конфигурация Nginx

# /etc/nginx/nginx.conf
user nginx nginx;
worker_processes 2; # это значение равно колличеству ядер процессора в системе.
pid /var/run/nginx.pid;
error_log /var/log/nginx/error_log info;
events {
worker_connections 1024; # значение 1024 по умолчанию, если на сервере достаточно оперативки, то можно выставить 4096 или если сомневаетесь в правильности значения - auto
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main
'$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
client_header_timeout 10m;
client_body_timeout 10m;
send_timeout 10m;
connection_pool_size 256;
client_header_buffer_size 1k;
large_client_header_buffers 4 2k;
request_pool_size 4k;
server_names_hash_bucket_size 64;
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain;
output_buffers 1 32k;
postpone_output 1460;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 75 20;
ignore_invalid_headers on;
index index.html;
include /etc/nginx/sites-enabled/*.conf;
}

Для удобства создаем темплейты:

mkdir /etc/nginx/templates

Темплейт подключения PHP (будет использоваться для php-движков, например для форума phpBB):

# /etc/nginx/templates/php
index index.html index.php;
location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        include fastcgi.conf;
}
# запрещаем доступ к файлам .htaccess и .htpassword
location ~ /\.ht {
        deny all;
}
location = /favicon.ico {
        log_not_found off;
        access_log off;
}
location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
}

# кеширование статик-файлов браузером, устанавливаем значение в часах или max (максимальное):
# тут пример для всевозможных файлов, которые рекомендуется закешировать.
# location ~* ^.+\.(css|rss|gif|jpeg|jpg|js|txt|png|tif|tiff|ico|jng|bmp|doc|pdf|rtf|xls|ppt|jardiff|rar|rpm|swf|sit|zip|bin|exe|dll|deb|cur)$ {
# expires 168h;
# log_not_found off;
# }

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}

Редактируем php-fpm.conf

# /etc/php/fpm-php5.5/php-fpm.conf
...
; Note: This value is mandatory.
; listen = 127.0.0.1:9000
listen = /var/run/php5-fpm.sock
...
; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions.
; Default Values: user and group are set as the running user
;                 mode is set to 0666
listen.owner = nginx
listen.group = nginx
listen.mode = 0666
...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = nginx
group = nginx
...
; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 20
...

Отключаем уязвимость php:

# /etc/php/fpm-php5.5/php.ini
cgi.fix_pathinfo=0

Перезапустим сервисы:

/etc/init.d/nginx restart && /etc/init.d/php-fpm restart

или

# service nginx restart && service php-fpm restart

Конфигурирование сервера (пока что, только для php) завершено, можно приступать к размещению сайта.

Конфигурация сайта php + cgi

Рассмотрим на примере домена site1.ru

Создаем необходимые директории для файлов:

mkdir -p /var/www/site1.ru/{htdocs,private,log,backup}
  • /var/www/site1.ru/htdocs - это основная рабочая директория сайта.
  • /var/www/site1.ru/private - для личных (приватных) файлов.
  • /var/www/site1.ru/log - директория для логов сайта.
  • /var/www/site1.ru/backup - для бекапов.

Создаем конфиг для сайта:

# /etc/nginx/sites-available/site1.ru.conf
server {
server_name site1.ru;
root /var/www/site1.ru/htdocs;
access_log /var/www/site1.ru/log/access.log;
error_log /var/www/site1.ru/log/error.log;
include /etc/nginx/templates/php;
}

Включаем сайт (создаем симлинк):

ln -s /etc/nginx/sites-available/site1.ru.conf /etc/nginx/sites-enabled/site1.ru.conf

После редактирования конфигов не забываем релоад конфигов:

/etc/init.d/nginx reload

Проверим работу сайта. Создадим файл test.php

# nano /var/www/site1.ru/htdocs/test.php
<?php
phpinfo
();
?>

Устанавливаем права на файл:

chmod 644 /var/www/site1.ru/htdocs/test.php && chown nginx:nginx /var/www/site1.ru/htdocs/test.php

Пробуем открыть в браузере: site1.ru/test.php

Если PHP работает, то удаляем с сервера файл test.php. Если не работает - смотрим логи nginx (/var/log/nginx/) и сайта (/var/www/site1.ru/log/) - ищем где ошибка.

После успешной проверки работы php можно приступать к установке дополнительных пакетов, необходимых для работы cgi-скриптов.

Устанавливаем дополнительные пакеты:

emerge fcgiwrap spawn-fcgi

Конфигурируем spawn-fcgi для запуска fcgiwrap:

# $ cp /etc/conf.d/spawn-fcgi /etc/conf.d/spawn-fcgi.fcgiwrap
# $ nano /etc/conf.d/spawn-fcgi.fcgiwrap
FCGI_SOCKET=/var/run/fcgiwrap.sock
FCGI_ADDRESS=
FCGI_PORT=
FCGI_PROGRAM=/usr/sbin/fcgiwrap
FCGI_USER=nginx
FCGI_GROUP=nginx
FCGI_EXTRA_OPTIONS="-M 0700"
ALLOWED_ENV="PATH"
FCGI_CHILDREN=1
FCGI_CHROOT=

Создадим симлинк на spawn-fcgi.fcgiwrap

$ cd /etc/init.d/
$ ln -s spawn-fcgi spawn-fcgi.fcgiwrap

Стартуем сервис:

/etc/init.d/spawn-fcgi.fcgiwrap start

Добавляем сервис в автозагрузку:

rc-update add spawn-fcgi.fcgiwrap default

Создадим темлейт cgi

# nano /etc/nginx/templates/cgi

с кодом:

location ~ ^/cgi-bin/.*\.cgi$ {
    gzip off; #отключаем сжатие скриптов
    fastcgi_pass unix:/var/run/fcgiwrap.sock-1; # сокет у нас будет sock-1
    fastcgi_index index.cgi;
    fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
    fastcgi_param QUERY_STRING     $query_string;
    fastcgi_param REQUEST_METHOD   $request_method;
    fastcgi_param CONTENT_TYPE     $content_type;
    fastcgi_param CONTENT_LENGTH   $content_length;
    fastcgi_param GATEWAY_INTERFACE  CGI/1.1;
    fastcgi_param SERVER_SOFTWARE    nginx;
    fastcgi_param SCRIPT_NAME        $fastcgi_script_name;
    fastcgi_param REQUEST_URI        $request_uri;
    fastcgi_param DOCUMENT_URI       $document_uri;
    fastcgi_param DOCUMENT_ROOT      $document_root;
    fastcgi_param SERVER_PROTOCOL    $server_protocol;
    fastcgi_param REMOTE_ADDR        $remote_addr;
    fastcgi_param REMOTE_PORT        $remote_port;
    fastcgi_param SERVER_ADDR        $server_addr;
    fastcgi_param SERVER_PORT        $server_port;
    fastcgi_param SERVER_NAME        $server_name;
}

Также в этот темлпейт (или лучше в конфиг сайта) можно добавить указание на размещение страниц ошибок:

# error congif
error_page 400 /error/400.html;
error_page 401 /error/401.html;
error_page 403 /error/403.html;
error_page 404 /error/404.html;
error_page 405 /error/405.html;
error_page 500 /error/500.html;
error_page 502 /error/502.html;
error_page 503 /error/503.html;
recursive_error_pages on;
location = /error/400.html {
internal;
}
location = /error/401.html {
internal;
}
location = /error/403.html {
internal;
}
location = /error/404.html {
internal;
}
location = /error/405.html {
internal;
}
location = /error/500.html {
internal;
}
location = /error/502.html {
internal;
}
location = /error/503.html {
internal;
}

Понятно, что эти страницы 404.html и т.д. надо будет потом создать (можно средствами movabletype) в директории /var/www/домен/htdocs/error/

Теперь в любую конфигурацию сайта добавляем строку:

include /etc/nginx/templates/cgi;

и сервер станет обрабатывать скрипты .cgi расположенные в /var/www/cgi-bin/

Например:

# nano /etc/nginx/sites-available/site1.ru.conf
server {
server_name site1.ru;
root /var/www/site1.ru/htdocs;
access_log /var/www/site1.ru/log/access.log;
error_log /var/www/site1.ru/log/error.log;
include /etc/nginx/templates/php;
include /etc/nginx/templates/cgi;
}

Дополнительно создадим директрию для временных файлов fcgi-cache:

mkdir /tmp/fcgi-cache/
chown nginx:nginx -R /tmp/fcgi-cache/

Перезагрузим сервисы:

/etc/init.d/nginx restart && /etc/init.d/php-fpm restart && /etc/init.d/spawn-fcgi.fcgiwrap restart

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

Проверяем обработку сервером скриптов cgi

Переходим в директорию cgi-bin:

cd /var/www/cgi-bin

Создадим тестовый скрипт:

nano /var/www/cgi-bin/test.cgi

с кодом:

#!/usr/bin/perl -w
print "Content-type: text/html\n\n";
print "<html><head><title>Hello World!! </title></head>\n";
print "<body><h1>Hello world</h1></body></html>\n";

Делаем скрипт исполняемым и даем права на него nginx:

chmod 755 /var/www/cgi-bin/test.cgi && chown nginx:nginx /var/www/cgi-bin/test.cgi

Запускаем в браузере:

http://site.ru/cgi-bin/test.cgi

Если perl-скрипты обрабатывается сервером, мы увидим:
Hello world

Если вместо "Hello world" появилась ошибка 403 (доступ запрещен) или 404 (страница не найдена), значит неверно настроены права для директории /var/www/cgi-bin или для файла /var/www/cgi-bin/test.cgi

Исправляем:

chmod 755 -R /var/www/cgi-bin && chown nginx:nginx -R /var/www

Ошибки 500 (ошибка сервера), 502 Bad Gateway (недопустимый ответ от сервера) - говорят о неверной конфигурации сервера. Необходимо еще раз перепроверить вышеперечисленные конфиги, посмотреть логи.

После успешного запуска скрипта test.cgi переходим к установке Movable Type.

Добавить комментарий