Собственное корпоративное облако ownCloud с NGINX во frontend и несколькими серверами backend

в 13:26, , рубрики: linux, mysql, nginx, owncloud, высокая производительность, облако, Сетевые технологии, метки: , , ,

1. Схема

Имеем:

  • Frontend — NGINX проксирующий сервер для принятия и распределения нагрузки (IP — 1.2.3.4 — внешний, IP — 192.168.5.10 — внутренний DMZ) по хорошему он тоже должен стоять за firewall-ом, но тут схема для простоты понимания.
  • Два сервера с поднятыми ownCloud
  • cloud-1 IP — 192.168.1.11
  • cloud-2 IP — 192.168.1.12
  • Хранилище файлов NFS-storage IP — 192.168.1.20 для размещения данных пользователей с доступом по NFS.

image

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

Собственно все действия по мануалу и математика из репозиториев.
Система Ubuntu 12.03 LTS — LAMP (при установке LAMP не забудьте пароль root)
Для работы с LDAP необходимо доставить php5-ldap

$sudo apt-get	install php5-ldap

Для хранения данных мы используем отдельный сервер с доступом по NFS.
На сервере-хранилище NFS-storage ставим nfs сервер

$ sudo apt-get istall nfs-kernel-server

Правим /etc/exports добавляя строчку:

/var/owncloud 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)

Создаем папку и меняем ей права:

$sudo mkdir -p /var/owncloud
$sudo chown root:www-data /var/owncloud

Перепускаем nfs сервер:

$sudo /etc/init.d/nfs-kernel-server restart

С хранилкой закончили.
На серверах-клиентах nfs ставим:

$ sudo apt-get istall nfs-common

Правим vim /etc/rc.local перед exit 0 добавляем строчку: (для монтирования NFS папки при загрузке системы, пишу в этот файл потому как использование /etc/fstab вызывало тяжело преодолимые проблемы)

/bin/mount -t nfs -o user,rw,hard 192.168.1.20:/var/owncloud /var/cloud

Создаем папку /var/cloud и меняем ей права:

$sudo mkdir -p /var/cloud

$sudo chown root:www-data /var/owncloud

Для проверки монтирования

$sudo mount.nfs 192.168.1.20:/var/owncloud /var/cloud

Далее ставим собственно облако на два сервера.
Скачиваем и ставим ключ:

$wget http://download.opensuse.org/repositories/isv:ownCloud:community/xUbuntu_12.04/Release.key
$sudo apt-key add - < Release.key 

Добавляем репозитории и ставим облако.


$sudo sh -c "echo 'deb http://download.opensuse.org/repositories/isv:/ownCloud:/community/xUbuntu_12.04/ /' >> /etc/apt/sources.list.d/owncloud.list"
$sudo apt-get update
$sudo apt-get install owncloud

Заходим http://you_ip/owncloud/

  • Вписываем администратора “admin”
  • Придумываем пароль “password”
  • Путь где будут храниться файлы пользователей /var/cloud (эту папку мы подключаем по NFS с хранилища)
  • Выбираем MySQL
  • Пользователь MySQL “root” (или тот что завели сами)
  • Пароль пользователя root (который вводили при установке LAMP или от созданного пользователя)
  • Имя базы данных “cloud”
  • Сервер баз данных “localhost”

Жмем FINISH
И заходим под созданным пользователем admin в веб интерфейс owncloud.
Я правил /var/www/index.html для перенаправления на страницу входа на облако.

<html>
    <head>
        <meta HTTP-EQUIV="REFRESH" content="0; url=/owncloud/">
    </head>
</html>

Все это проделываем на обоих серверах CLOUD-1 и CLOUD-2.

3. Установка и настройка NGINX

На сервере NGINX

$sudo apt-get install nginx

Создаем файл конфигурации для сайта перенаправления

$ sudo vim /etc/nginx/sites-available/cloud

Правим до такого состояния.

upstream myCloud {
    ip_hash;						#что бы сохранялась сессия
    server 192.168.1.11:80;
    server 192.168.1.12:80;
}
server {
    listen       1.2.3.4:443 ssl;		# работаем через SSL
    server_name  owncloud.site.org;
    ssl_certificate     /etc/ssl/certs/site.pem;	# сертификат
    ssl_certificate_key /etc/ssl/private/site.key; # ключ сертификата
    client_max_body_size 200G; # максимальный файл для загрузки
    location / {
    proxy_pass   http://myCloud;
    proxy_set_header   Host   $host;
    proxy_set_header   X-Real-IP  $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
       }
 }

Создаем ссылку

$sudo ln -s /etc/nginx/sites-available/cloud.centr.by /etc/nginx/sites-enabled/cloud.centr.by

Правим страницу по умолчанию, перенаправляя все запросы на SSL.

$sudo vim /usr/share/nginx/www/index.html

<html>
    <head>
        <meta HTTP-EQUIV="REFRESH" content="0; url=https://owncloud.site.org/cloud/">
    </head>
</html>

Перпускаем nginx

$sudo /etc/init.d/nginx restart

Теперь при все запросы на http://owncloud.site.org будут перенаправлены на https://owncloud.site.org/cloud/

Сессия SSL устанавливается между клиентом и NGINX, между NGINX и облачными серверами обычный HTTP.

На этом этапе можно зайти на http://owncloud.site.org и должны попасть на приглашение ввода логина-пароля одного из наших cloud1(2) серверов.

После всех настроек мы получаем кластер но:
Когда пользователь настраивает свой профиль и выполняя действия с приложениями на сервере cloud-1 все эти данные хранятся в базе MySQL сервера cloud-1. При следующем входе он попадет на другой сервер кластера cloud-2 где ни действий ни настроек нет.
Для устранения этого нем необходимо синхронизация баз MySQL между серверами cloud-1 и cloud-2. Причем стандартная конфигурация репликации MySQL это master — slave, т.е. изменения на master реплицируются на slave но не наоборот. Нам же необходимо два равноправных сервера master — master.

Вариант: возможно настройка двух и более облаков на работу с одной MySQL базой на отдельном сервере баз данных, но в этом случае надо держать еще один сервер только для MySQL баз, что несколько усложняет схему и в случае введения еще одного облака необходимо делать бакап базы и востановление после установки (дабы не затереть данные). Каким путем пойти — Ваш выбор.

4. Настройка репликации master — master MySQL

На cloud1

# vim /etc/mysql/my.cnf 

добавляем строчки

[mysqld]
#Replication
log-bin=mysql-bin
binlog_format=mixed
server-id = 1      /* для каждого сервера уникальный */
slave-compressed = 1
binlog-do-db = cloud  /* название базы для репликации */
#bind-address           = 127.0.0.1 /* что бы можно было подулючаться с других машин*/

На cloud2

# vim /etc/mysql/my.cnf 

добавляем строчки

[mysqld]
#Replication
log-bin=mysql-bin
binlog_format=mixed
server-id = 2      /* для каждого сервера уникальный */
slave-compressed = 1
binlog-do-db = cloud  /* название базы для репликации */
#bind-address           = 127.0.0.1 /* что бы можно было подулючаться с других машин*/

Заводим пользователя для репликации на обоих серверах.
На cloud1
пользователь repl2 с доступом с IP 192.168.1.11 и паролем u_pass (должны быть права на базу cloud и привелегии SELECT, RELOAD, SUPER, REPLICATION SLAVE)

mysql> grant replication slave on *.* to 'repl2'@192.168.1.12 identified by 'u_pass';

На cloud2
пользователь repl1 с доступом с IP 192.168.1.12 и паролем u_pass (должны быть права на базу cloud и привелегии SELECT, RELOAD, SUPER, REPLICATION SLAVE)

mysql> grant replication slave on *.* to 'repl2'@192.168.1.11 identified by 'u_pass';

Далее приводим обе базы в идентичное состояние:
На cloud1

mysql> FLUSH TABLES WITH READ LOCK;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000009 |  107     | cloud        |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Делаем дамп базы cloud

#mysqldump -u root -p cloud > /home/user/cloud.sql
mysql> UNLOCK TABLES;

Копируем на cloud-2

$scp /home/user/cloud.sql user@192.168.1.12:/home/user/cloud.sql

На cloud2
далее настраиваем slave;

mysql> USE cloud;
mysql> SOURCE /home/user/cloud.sql 
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000009';
mysql> CHANGE MASTER TO MASTER_LOG_POS=107;
mysql> stop slave;
mysql> CHANGE MASTER TO MASTER_HOST='192.168.5.11', MASTER_USER='repl2', MASTER_PASSWORD='u_pass';

заметка

(здесь надо заметить что эти «CHANGE MASTER TO MASTER_HOST='192.168.5.11', MASTER_USER='repl2', MASTER_PASSWORD='u_pass';» данные раньше писались в файл MySQL /etc/mysql/my.cnf
master-host = 192.168.1.11
master-user = repl2
master-password = <пароль>
но были вынесены в отдельную команду в консоли MySQL)

mysql> start slave;
mysql> show slave status/G;

Должно быть что то типа этого:

лог

*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.11
Master_User: repl2
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000014
Read_Master_Log_Pos: 107
Relay_Log_File: mysqld-relay-bin.000017
Relay_Log_Pos: 210
Relay_Master_Log_File: mysql-bin.000014
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 107
Relay_Log_Space: 513
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 2
1 row in set (0.00 sec)

На cloud1
Поскольку базы сейчас одинаковые делать дамп и восстанавливать его нет необходимости.
Нам надо настроить cloud-1 как slave к cloud-2

mysql> USE cloud;
mysql> stop slave;
mysql> CHANGE MASTER TO MASTER_HOST='192.168.5.12', MASTER_USER='repl1', MASTER_PASSWORD='u_pass';
mysql> start slave;
mysql> show slave status/G;

Вывод должен быть подобен как на cloud-2

Параметры … должны быть YES на cloud-1 и cloud-2.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

На этом этапе есть небольшая проблема, вы можете зайти под локальным пользователем на сервер cloud-1 а cloud-2 говорит что пароль не верный (или наоборот) :(. Причина — СОЛЬ :)
Имеется файл /var/www/owncloud/config/config.php в котором есть переменная

'passwordsalt' => '6d84a4d8cb3cf5439c05647ceb45682a',

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

Для проверки заходим на 192.168.1.11 и 192.168.1.12 под одним пользователем и создаем в календаре событие на сервере cloud-1 а на cloud-2 оно должно появиться автоматически (F5).
Имеем на выходе:

  • NGINX во фронтэнде для динамического распределения нагрузки
  • Несколько серверов в бакэнде для повышения скорости отдачи при наплыве пользователей

5. Клиенты

  • Для Linux, Windows и MacOC — бесплатны (минус — нельзя указать несколько разных папок для синхронизации)
  • Для Android и iPhon/iPad — 0.99$

Воткактотак :)

6. Ссылки

www.opennet.ru/tips/info/1205.shtml
www.mysql.ru/docs/man/Replication_HOWTO.html
habrahabr.ru/post/86496/
google.com

Автор: Hoper

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js