Установка и настройка среды дистанционного обучения

Материал из RSU WiKi
Перейти к: навигация, поиск
Pen.pngЭта статья находится в процессе написания.
Если вы считаете, что её стоило бы доработать как можно быстрее, пожалуйста, скажите об этом.
Tower of babel.png外國 language!
В статье используется несколько языков. Необходимо использовать один. Совсем неплохо, если это будет русский.

В статье рассмотрен процесс установки и настройки среды дистанционного обучения на базе свободного ПО: ОС SuSE Linux, веб-серверов Nginx и Apache, платформы дистанционного обучения Moodle и платформы для вебинаров OpenMeetings.

Содержание

Установка и настройка OpenSUSE Linux

Основная статья: Установка сервера Linux

Ставим OpenSUSE 12.2 и настраиваем автоматическое обновление:

zypper in yast2-online-update

Входим в Yast и настраиваем еженедельные обновления.

Сетевые настройки

Параметры адаптера

Правим /etc/sysconfig/network/ifcfg-eth0

BOOTPROTO='static'
BROADCAST=''
ETHTOOL_OPTIONS=''
IPADDR='192.0.2.133/25'
MTU=''
NAME='82545EM Gigabit Ethernet Controller (Copper)'
NETMASK=''
NETWORK=''
REMOTE_IPADDR=''
STARTMODE='auto'
USERCONTROL='no'
LABEL_V6='V6'
IPADDR_V6='2001:DB8::ffff:a2::133'
PREFIXLEN_V6='64'

Применяем:

rcnetwork restart

SuSEfirewall2

Основная статья: Борьба с брутфорсом SSH

Правим /etc/sysconfig/SuSEfirewall2

FW_DEV_EXT="any"
FW_SERVICES_EXT_TCP="80 443 1935 5080 8088"
FW_SERVICES_EXT_UDP="1935 5080 8088"
FW_CONFIGURATIONS_EXT=""
FW_SERVICES_ACCEPT_EXT="0/0,tcp,22,,hitcount=3,blockseconds=60,recentname=ssh"

Применяем:

rcSuSEfirewall restart

Apache2

Основная статья: Настройка web-сервера
zypper in apache2

Правим /etc/apache2/listen.conf

Listen 127.0.0.1:8080

<IfDefine SSL>
    <IfDefine !NOSSL>
	<IfModule mod_ssl.c>

	    Listen 127.0.0.1:8443

	</IfModule>
    </IfDefine>
</IfDefine>
insserv apache2
rcapache2 start

Nginx

Основная статья: Nginx
zypper in nginx

Генерируем необходимые SSL-ключи [1]:

mkdir /etc/nginx/ssl && cd /etc/nginx/ssl
openssl genrsa -out e-learn.example.com.key 1024 
openssl req -new -x509 -key e-learn.example.com.key -out e-learn.example.com.crt

Правим /etc/nginx/nginx.conf

    server {
        server_name  www.e-learn.example.com;
        rewrite ^(.*) http://e-learn.example.com$1 permanent;
    }

    server {
	server_name e-learn.example.com;
        listen       443 default;
        listen  [::]:443 default ipv6only=on;
        ssl on;
        ssl_certificate     /etc/nginx/ssl/e-learn.example.com.crt;
        ssl_certificate_key /etc/nginx/ssl/e-learn.example.com.key;

        location / {
            root   /srv/www/htdocs/;
            index  index.html index.htm;
        }

	location /moodle/ {
            proxy_pass      http://127.0.0.1:8080/moodle/;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            client_max_body_size       50m;
            client_body_buffer_size    128k;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }
        
        location /openmeetings/ {
            proxy_pass         http://127.0.0.1:5080;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            client_max_body_size       50m;
            client_body_buffer_size    128k;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }
        
 	# phpMyAdmin
        location /phpMyAdmin/ {
            proxy_pass         http://127.0.0.1:8080/phpMyAdmin/;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            client_max_body_size       50m;
            client_body_buffer_size    128k;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;

            allow 127.0.0.1/32;
            allow 172.16.0.0/12;
            allow 91.203.180.0/22;
            allow 2a02:150:ffff::/48;
            deny all;
        }       

 	# php5-xcache
        location /xcache-admin/ {
            proxy_pass         http://127.0.0.1:8080/xcache-admin/;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            client_max_body_size       50m;
            client_body_buffer_size    128k;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;

            allow 127.0.0.1/32;
            allow 172.16.0.0/12;
            allow 91.203.180.0/22;
            allow 2a02:150:ffff::/48;
            deny all;
        }       
    }        

    server {
        listen       80 default;
        listen  [::]:80 default ipv6only=on;
        server_name  localhost e-learn.example.com;

        charset utf-8;

        #access_log  /var/log/nginx/host.access.log  main;

        location / {
            root   /srv/www/htdocs/;
            index  index.html index.htm;
        }

	location /moodle/ {
            proxy_pass      http://127.0.0.1:8080/moodle/;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            client_max_body_size       50m;
            client_body_buffer_size    128k;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }

        location /openmeetings/ {
            proxy_pass         http://127.0.0.1:5080;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            client_max_body_size       50m;
            client_body_buffer_size    128k;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }

	location /phpMyAdmin {
	    rewrite ^(.*) https://e-learn.example.com/phpMyAdmin permanent;
        }

	location /xcache-admin {
	    rewrite ^(.*) https://e-learn.example.com/xcache-admin permanent;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /srv/www/htdocs/;
        }
    }

Проверяем конф. файл на наличие ошибок:

nginx -t

Запускаем сервис и помещаем в авозагрузку:

insserv nginx
rcnginx start

MySQL

Основная статья: MySQL
zypper in mysql

Правим /etc/my.cnf (параметры для 4 Gb RAM)

# The MySQL server
[mysqld]
port            = 3306
socket          = /var/run/mysql/mysql.sock
# Change following line if you want to store your database elsewhere
datadir = /var/lib/mysql
skip-external-locking
key_buffer = 128M
max_allowed_packet = 1M
table_cache = 8192
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
query_cache_size = 32M
open_files_limit = 8192
max_heap_table_size = 32M
tmp_table_size = 32M

PhpMyAdmin

zypper in phpMyAdmin

Правим /srv/www/htdocs/phpMyAdmin/config.inc.php

В консоли генерируем случайную последовательность:

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 70| head -n 1

Заполняем переменную:

$cfg['blowfish_secret'] = ;

XCache

zypper ar http://download.opensuse.org/repositories/server:/php:/extensions/openSUSE_12.2/server:php:extensions.repo
zypper in php5-xcache

Правим /etc/php5/conf.d/xcache.ini - прописываем имя пользователя, пароль, необходимые параметры кеша.

Postfix

zypper in postfix yast2-mail

Входим в Yast и настраиваем почтовый сервер на пересылку почты через релей организации (mail.example.com)

Установка и настройка OpenMeetings

Зависимости OpenMeetings

В Yast подключаем репозиторий Packman (выбор из списка репозиториев сообщества). Для работы OpenMeetings подходят не все версии java. В нашем случае установленную версию пришлось заменить на версию 1.7 OpenJDK:

zypper in java-1_7_0-openjdk

Устанавливаем другие зависимости:

zypper in libreoffice swftools imagemagick ffmpeg sox

C версии 2.0.x для корректной работы сервера необязательно запускать LibreOffice (OpenOffice) в headless-режиме для конвертации документов, загружаемых на доску. Данную функцию будет осуществлять jodconverter.

Забираем с http://code.google.com/p/jodconverter/downloads/list и распаковываем в /opt/jodconverter. Для нормальной его работы необходимо сделать следующий симлинк:

ln -s /usr/lib64/libreoffice /opt/libreoffice

Установка OpenMeetings

Скачиваем заархивированный пакет:

wget http://www.sai.msu.su/apache/incubator/openmeetings/2.0-incubating/apache-openmeetings-incubating-2.0.0.r1361497-14-07-2012_1108.zip

Распаковываем содержимое пакета в папку /opt/openmeetings/. Непосредственный запуск сервера осуществляется запуском скрипта red5.sh, находящегося в папке установки. Для автоматического запуска сервиса вместе со стартом системы мы использовали следующий init-скрипт:

#! /bin/sh
#### BEGIN INIT INFO
# Provides:       red5
# Required-Start: $network mysql
# Required-Stop:  $network
# Default-Start:  3 5
# Default-Stop:   0 1 2 6
# Short-Description: RED5 Server
# Description:   RED5 server required for OpenMeetings service.
### END INIT INFO
set -e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="Red5 flash streaming server"
NAME=red5
DAEMON_HOME=/opt/openmeetings/
DAEMON=$DAEMON_HOME/$NAME.sh
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0

# Read config file if it is present.
if [ -r /etc/default/$NAME ]
then
  . /etc/default/$NAME
fi

# Function that starts the daemon/service.
d_start() {
  cd $DAEMON_HOME && $DAEMON > /dev/null 2>&1 &
}

# Function that stops the daemon/service.
d_stop() {
  killall rcred5 > /dev/null 2>&1 
}

case "$1" in
  start)
    echo -n "Starting $DESC: $NAME"
    d_start
    echo "."
    ;;
  stop)
    echo -n "Stopping $DESC: $NAME"
    d_stop
    echo "."
    ;;
  restart|force-reload)
    echo -n "Restarting $DESC: $NAME"
    d_stop
    sleep 1
    d_start
    echo "."
    ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
    exit 1
    ;;
esac

exit 0

Интеграция с LDAP / AD

Итеграция с SIP

Формулы в формате TeX

zypper in texlive-latex

и все будет.

Установка и настройка Moodle

Основная статья: Moodle

Обновление Moodle с версии 1.9 до версии 2.3

В данном случае мы использовали базу данных Moodle и уже существующие учебные курсы, для чего было необходимо мигрировать данные со старого сервера на новый. Для начала на новом сервере с помощью phpMyAdmin создаем пользователя moodle и даем ему права на соответствующую базу данных. Осуществляем миграцию базы данных moodle на новый сервер:

mysqldump -h old.server.ip.address --allow-keywords --opt --user=moodle -pMoodlePasswd moodle\
| ssh root@new.server.ip.address "mysql --user=moodle -pMoodlePasswd moodle"

Синхронизируем файлы учебных курсов:

rsync -av -e ssh /srv/www/moodledata/ new.server.ip.address:/srv/www/moodledata/

Нами производилось обновление Moodle с установленной версии 1.9.9 до версии 2.3.2. Экспериментальным путем было установлено, что осуществить этот процесс без ручного допиливания базы данных возможно лишь пошагово производя обновление до 2.1.8 (weekly build), затем до 2.2.5 (weekly build) и лишь потом до желаемой версии 2.3.2.

Скаченные с официального сайта пакеты последовательно распаковывались в папку /srv/www/htdocs/moodle, запускался скрипт install.php, после отработки которого содержимое папки /srv/www/htdocs/moodle удалялось и цикл повторялся со следующей версией moodle. Для избежания возникновения ошибки записи в конфигурационные файлы, находящиеся в данной папке, на время отработки скрипта install.php права на /srv/www/htdocs/moodle устанавливались в 777.

Конвертация БД из MyISAM в InnoDB

mysql -p -e "show tables in moodle;" | tail --lines=+2 | xargs -i echo "ALTER TABLE {} ENGINE=INNODB;" > /tmp/alter_table.sql
mysql --database=moodle -p -f -v < /tmp/alter_table.sql
rm /tmp/alter_table.sql

Проблема 2х модулей mod_assignment

Необходимо обновить курсы и выключить старый модуль:

OpenMeetings Plugin

С сайта Apache забираем плагин: http://incubator.apache.org/openmeetings/downloads.html

mkdir /usr/local/src/moodle/plugins/om/
cd /usr/local/src/moodle/plugins/om/
wget http://mirror.quintex.com/apache/incubator/openmeetings/moodle-plugin-1.4-incubating/apache-openmeetings-moodle-plugin-incubating-1.4.tar.gz

После этого нужно указать учетные данные администратора OpenMeetings в интерфейсе настроек планига в Moodle

CRON

Создаем файл:

touch /etc/cron.hourly/cron4moodle.sh
chmod 0755 /etc/cron.hourly/cron4moodle.sh

Пишем в него:

#!/bin/bash
/usr/bin/php /srv/www/htdocs/moodle/admin/cli/cron.php

HTTPS / SSL

HTTPS for logins can be enabled by an administrator in Settings > Site administration > Security > HTTP security [2].

ГЛЮЧИТ, надо разбираться.

CleanUp и настройка резервного копирования

Основная статья: Bacula

Настраиваем клиент Bacula на копирование критичных данных на сервер резервного копирования.

Удаляем неиспользуемые данные в moodle:

Settings > Site administration > Server > Cleanup

Работа с банками тестов и создание обучающих курсов

Основная статья: Создание обучающего курса в среде Moodle

Troubleshooting

После обновления системы не создаются темы у курсов с ошибкой БД:

Debug info: Unknown column 'revision'

Решение. добавить недостающие колонки в соотв. таблицы руками:

alter table mdl_book add revision bigint(10) not null after customtitles;
alter table mdl_book alter revision set default 0;
show fields from mdl_book;

alter table mdl_pdfpager add revision bigint(10) not null after customtitles;
alter table mdl_pdfpager alter revision set default 0;
show fields from mdl_pdfpager;

Подробнее о проблеме:

Примечания

  1. Generating SSL certificates yourself
  2. http://docs.moodle.org/23/en/HTTP_security

См. также

Ссылки

Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты