Мой блог - Установка облачного хранилища NextCloud в окружение Nginx+PHP-FPM

Установка облачного хранилища NextCloud в окружение Nginx+PHP-FPM

Представляем вашему вниманию подробную инструкцию по настройке NextCloud (с установкой плагинов и ssl-сертификатов для реализации защищенного https-протокола). Nextcloud - пакет клиент-серверного программного обеспечения для создания облачного хранилища. Фактически, программное обеспечение аналогично DropBox, Яндекс.Диск и GoogleDrive, но при этом является отрытым ПО и может быть установлено на вашем сервере и интегрироваться с сервисами компании, такими как Active Directory. Функционал облачного хранилища может быть расширен при помощи плагинов и при некотором желании из облачного хранилища можно построить небольшую CRM.

Фотография автора

Автор: Антон Черноусов
Опубликовано: 2 месяца, 2 недели (последние правки: 0 минут назад) - 0 комментариев
Категории записи: Linux, Nextcloud, Ubuntu, Популярное, Системное администрирование


Персональное облачное хранилище NextCloud

Nextcloud - пакет клиент-серверного программного обеспечения для создания облачного хранилища.

Фактически, программное обеспечение аналогично DropBox, Яндекс.Диск и GoogleDrive, но при этом является отрытым ПО и может быть установлено на вашем сервере и интегрироваться с сервисами компании, такими как Active Directory. Функционал облачного хранилища может быть расширен при помощи плагинов и при некотором желании из облачного хранилища можно построить небольшую CRM. Nextcloud, является форком ownCloud и на данный момент развивается гораздо активнее исходного проекта.

Подготовка LEMP-окружения для установки NextCloud

Использование PHP-FPM и Nginx по сравнению со связкой Apahe и ModPHP на тестах дало повышение производительности облачного хранилища на 25%. Установка Next Cloud с использованием Web-сервера Apache и типового модуля mod_php уже рассматривалась нами в статье "NextCloud 11 - Установка и настройка (Часть первая, подготовка сервера и установка приложения)", а базовая подготовка разного рода окружений PHP-FPM рассматривалась в статье "Типовые примеры настройки PHP-FPM + Nginx в Ubuntu Linux" и хотя на первый взгляд установить NextCloud в окружение PHP-FPM+Nginx особых трудностей не представляет мы обнаружили несколько специфичных подводных камней.

Стоит отметить, что примеров подобных решений в интернете довольно мало и все они требуют основательной доработки. Мы в свою очередь подготовили наиболее подробную пошаговую инструкцию и будем рады любым комментариям и дополнениям, но обратите внимание, что установка проводится в окружение LTS-версии Ubuntu server 16.04.3. Комментарии и уточнения принимаются только при использовании аналогичного окружения.

Начнем с установки Mysql-сервера:

# aptitude install mysql-server mysql-client

После установки произведите предварительную настройку безопасности, задав удаление демо-данных, анонимных пользователей и назначение пароля для супер-пользователя root, для этого используйте команду:

# mysql_secure_installation

Следующим этапом создайте пользователя и базу данных с которой будет работать облачное хранилище. Типовые Mysq-команды для создания пользователя и назначения прав доступа к базе мы уже рассматривали в статье "Типовые операции при работе с СУБД Mysql (MariaDB)".

# mysql -p
mysql> CREATE DATABASE `nextcloud_storage`;
mysql> CREATE USER 'cloud'@'localhost' IDENTIFIED BY 'SeretMysqlPassword';
mysql> GRANT ALL PRIVILEGES ON nextcloud_storage.* TO 'cloud'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> quit

Переходим к настройке окружения PHP-FPM + Nginx и как обычно устанавливаем необходимые пакеты:

# apt-get install php-gd php-json php-mysql php-curl php-mbstring 
# apt-get install php-intl php-mcrypt php-imagick php-xml php-zip
# aptitude install php-fpm nginx

В случае установки на Ubuntu Server, после установки пакетов будет автоматически настроена минимальная среда настроенная на выполнение PHP-скриптов и отдачу статических страниц из каталога /var/www/html/. Технически, мы можем оставить такое поведение "по умолчанию" и настроить виртуальный-хост который будет обслуживать выполнение web-приложения NextCloud.

Для этого, прежде всего создаем каталог для хранения php-файлов NextCloud, отдельно от каталога /var/www/html/:

# mkdir -p /var/www/vhosts/next-cloud/

И файл конфигурации /etc/nginx/sites-available/next-cloud.conf который будет выполнять обработку скриптов в этом каталоге:

upstream php-handler {
server unix:/var/run/php/php7.0-fpm.sock;
}

server {
listen 80;
server_name 10.253.0.78 cloud.help-me-24.com;
root /var/www/vhosts/next-cloud/;

access_log /var/log/nginx/cloud.help-me-24.com.log;
error_log /var/log/nginx/cloud.help-me-24.com-error.log;

add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;

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

rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json;

location = /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}

client_max_body_size 512M;
fastcgi_buffers 64 4K;

gzip off;

location / {
rewrite ^ /index.php$uri;
}

location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
deny all;
}
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}

location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_param PHP_VALUE "
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1";
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
}

location ~ ^/(?:updater|ocs-provider)(?:$|/) {
try_files $uri/ =404;
index index.php;
}

location ~* \.(?:css|js|woff|svg|gif)$ {
try_files $uri /index.php$uri$is_args$args;
access_log off;
}

location ~* \.(?:png|html|ttf|ico|jpg|jpeg)$ {
try_files $uri /index.php$uri$is_args$args;
access_log off;
}

}

Этот файл конфигурации наиболее правильно описывает среду необходимую для запуска современных версий облачного хранилища NextCloud и конечно выглядит он гораздо сложнее, чем Apache-реализации, но и работает такая схема быстрее, а следовательно может обслуживать больше клиентов на аналогичном по конфигурации железе.

Для активации созданного конфигурационного файла необходимо создать символическую ссылку из каталога sites-available в каталог sites-enabled и перезапустить web-сервер Nginx:

# ln -s /etc/nginx/sites-available/next-cloud.conf /etc/nginx/sites-enabled/next-cloud.conf
# /etc/init.d/nginx restart

Установка и настройка web-приложения NextCloud

Скачайте архив содержащий стабильную версию сервера NextCloud с официального сайта https://nextcloud.com/install/#instructions-server и распакуйте в каталог созданный в предыдущем разделе:

# wget https://download.nextcloud.com/server/releases/nextcloud-12.0.3.zip
# unzip ./nextcloud-12.0.3.zip
# cp -R ./nextcloud/* /var/www/vhosts/next-cloud/
# chown -R www-data:www-data /var/www/vhosts/next-cloud/

Дальнейшая настройка производится с использованием web-интерфейса и вам необходимо перейти в браузере по адресу http://<ip-адрес-сервера>/.

Web-интерфейс управления NextCloud

Данный адрес прописан в разделе server_name конфигурационного файла nginx и вам надо будет заменить его на ip-адрес вашего сервера на котором вы производите настройку. Настройка сложности не представляет и вам необходимо лишь указать параметры подключения к базе данных которые мы создали в начале статьи и задать имя/пароль пользователя который будет выполнять функции первого администратора системы. После непродолжительной установки автоматически откроется интерфейс авторизации в системе.

Интерфейс авторизации в NextCloud

Используя созданный логин/пароль администратора авторизуйтесь в системе и перейдите в интерфейс администрирования системы.

Интерфейс администратора NextCloud

Остновы администрирования NextCloud

Первое, что вы увидите перейдя в интерфейс администратора, это предупреждения системы безопасности о отсутствующей системе кэширования, отсутствии поддержки HTTPS и планировщик настроенный на использование AJAX и прочие мелочи которые сильно раздражают.

Настройка планировщика CRON

Так как я в некотором роде перфекционист, то я не могу смотреть на эти предупреждения и сейчас мы будем их исправлять, а начнем мы с планировщика CRON который необходимо переключить в режим Cron и добавить в файл /etc/crontab запись:

*/15    * * * * www-data php /var/www/vhosts/next-cloud/cron.php


Если все настроено корректно, то в графе "Фоновые задания" последнее выполнение не должно превышать 15 минут.

Устранение ошибки:

PHP был установлен неверно. Запрос getenv("PATH") возвращает пустые результаты.

Эта ошибка устраняется довольно просто и вам потребуется только в файле /etc/php/7.0/fpm/pool.d/www.conf раскомментировать строку:

env[PATH] = /usr/local/bin:/usr/bin:/bin

Так же вам необходимо перезапустить демона php-fpm командой:

# /etc/init.d/php7.0-fpm restart

Устранение ошибки:

Не настроена система кеширования. Для увеличения производительности сервера, по возможности, настройте memcache.

На выбор предлагается два вида кэширования, на базе memcached и на базе Redis, причем решение с использованием Redis позволяет избавиться от эффекта "File Locking" который очень активно проявляется в крупных многопользовательских установках с организованными общими каталогами отделов.

Устанавливаем memcached-сервер и PHP-модуль для подключения к memcached:

# aptitude install memcached 
# aptitude install php-memcached
# aptitude install php-apcu

Активируем PHP-модуль apcu:

# phpenmod apcu
# phpenmod memcached

Проверяем, что memcached работает и принимает подключения:

# ps ax | grep memcached
# telnet 127.0.0.1 11211

Добавляем параметры в конфигурацию config/config.php:

  'memcache.local' => '\OC\Memcache\APCu',
'memcache.distributed' => '\OC\Memcache\Memcached',
'memcached_servers' => array(
array('localhost', 11211),
),

Таким образом мы настроили работу с системой кэширования memcached, но как оказалось в процессе реальной эксплуатации требуется система кеширования на базе redis и настраивается она не намного сложнее, но и позволяет решить проблему с Lock-файлами.

Устанавливаем:

# aptitude install redis-server php-redis
# phpenmod redis

Добавляем в конфигурационный файл:

  'memcache.local' => '\OC\Memcache\Redis',
'redis' => array(
'host' => 'localhost',
'port' => 6379,
)

Таким образом мы заменили Memcache на Redis, но обратите внимание, что в распределенных кластерах NextCloud бы можете использовать одновременно Redis и memcached и для работы в таком режиме изменения в конфигурации будут выглядеть следующим образом:

  'memcache.local' => '\OC\Memcache\Redis',
'redis' => array(
'host' => 'localhost',
'port' => 6379,
),
'memcache.distributed' => '\OC\Memcache\Memcached',
'memcached_servers' => array(
array('localhost', 11211),
),

Как вы видите в такой конфигурации качестве локального кэша теперь используется Redis, а для распределенной системы облачных хранилищ используется Memcached.

Диагностика сбоев

Существует некоторая вероятность того, что после подключения модулей кеширования ваш сайт не откроется, а в логах Nginx будет пусто, на самом деле NextCloud переопределеяет лог для хранения ошибок в каталог /next-cloud/data/nextcloud.log и причину ошибки надо искать там.

Мы например, при ряде внедрений при установленном и включенном модуле Redis мы получали ошибку:

Memcache \\OC\\Memcache\\Redis not available for local cache

Эта проблема решается сборкой модуля при помощи pecl:

# aptitude purge php-redis
# aptitude install php-pear php-dev
# pecl install redis
# echo 'extension=redis.so' > /etc/php/7.0/mods-available/redis.ini
# phpenmod redis
# /etc/init.d/php7.0-fpm restart

Конечно с механихмами кэширования есть еще несколько особенностей, но этой теме тогда можно уделить отдельную статью.

И в завершение последняя ошибка:

Вы зашли на этот сайт через HTTP. Мы настоятельно рекомендуем настроить ваш сервер на использование HTTPS

По этому поводу в первой публикации по NextCloud в комментариях был небольшой холивар на тему почему я не рассказал про настройку сервера для работы в режиме HTTPS. Просто, в моем случае NextCloud исполняется в отдельном LXC-контейнере для безопасности, а за проксирование запросов из интернет к контейнеру и шифрование трафика отвечает отдельный Nginx и его конфигурация максимально простая:

server {
listen 80;
server_name cloud.help-me-24.com;
return 301 https://cloud.help-me-24.com$request_uri;
}

server {
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/cloud.help-me-24.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/cloud.help-me-24.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

server_name cloud.help-me-24.com;

access_log /var/log/nginx/cloud.help-me-24.com.log;
error_log /var/log/nginx/cloud.help-me-24.com-error.log;

#include /etc/nginx/block_list.dat;
add_header Strict-Transport-Security "max-age=63072000;";
client_max_body_size 10G;

location / {

proxy_pass http://10.253.3.201:80;
proxy_read_timeout 6h;
proxy_connect_timeout 600s;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;

proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Proto $scheme;

}

}

Как вы видите, Nginx на фронт-сервере принимает подключения на портах 80 и 443, после чего перенаправляет все не шифрованные подключения на порт 443 (HTTPS), а все подключения на HTTPS-порт он защищает сертификатом от Let's encrypt и направляет на Lxc-контейнер в котором мы собственно и производим настройку.

Установка доверительного домена NextCloud

При первом обращении по доменному имени вам будет предложено добавить домен в доверенные.

Основные нюансы предварительного конфигурирования

Наш NextCloud-сервер практически настроен и готов к работе, но есть еще несколько нюансов на которые необходимо обратить внимание. Как известно удобство работы складывается из мелочей и настроив эти казалось бы "мелочи", вы в дальнейшем сохраните свое время и нервы.

Настройка персонального оформления

Измените название вашего хранилища и фоновое изображение на стран

ице авторизации придав ему "корпоративный стиль", для этого перейдите в раздел "Администрирование" ->  "Темы оформления".

Корпоративное оформление NextCloud

Данные настройки прежде всего изменяют вид окна авторизации в системе и например в нашем случае у нас получилось "унифицированное оформление" с центральным сайтом.

Корпоративный стиль сайта NextCloud

Настройка подключения к почтовому серверу

NextCloud активно использует отправку сообщений по электронной почте например для оповещения пользователей о предоставлении совместного доступа к файлам или оповещении администраторов о выходе свежей версии и необходимости установки обновлений. Я не рекомендую устанавливать облачное хранилище напрямую на почтовый сервер и в наших внедрениях мы всегда используем отдельную учетную запись электронной почты для облачного хранилища и спользование протокола SMTP с авторизацией и шифрованием при работе с этой учетной записью.

Для настройки такого режима работы (использование внешнего SMTP-сервера) перейдите в раздел "Администрирование" -> "Дополнительные настройки" и выберите в способах отправки режим SMTP.

Использование яндекс-почты в NextCloud

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

Настройка максимального размера выгружаемого файла

Важный параметр про который довольно часто забывают и самое интересное, что он задается сразу в двух местах. Во первых, он ограничен параметрами конфигурации Nginx и это глобальное ограничение, а во вторых, он задается программной настройкой в том, же разделе где мы задавали параметры подключения к серверу электронной почты.

Максимальный размер файла

Для увеличения максимального размера выгружаемого файла измените следующие параметры в конфигурации Nginx и PHP-FPM:

        fastcgi_param PHP_VALUE "
upload_max_filesize = 16G
post_max_size = 16G
max_input_time 3600
max_execution_time 3600
....

Ограничения для новых пользователей облачного хранилища

По умолчанию, для новых пользователей не задана квота по используемому месту, что может вызвать быстрый расход доступного дискового пространства, поэтому если у вас разрешена самостоятельная регистрация на сервисах облачного хранилища, то настройте квоту по умолчанию.

Обязательно перейдите в раздел "Администрирование" -> "Пользователи" и нажмите значок шестерни в левом нижнем углу подписанный "Настройки", а  в открывшемся списке вы сможете установить квоту по умолчанию для нового пользователя.

Лимиты по размеру файла для новых пользователей

Пожалуйста, оцените мою статью (всего оценок 2, средняя оценка 5.00):

Комментарии к статье:

Пока комментариев нет

Оставьте комментарий:

обязательно

обязательно (не публикуется)

необязательно

обязательно

обязательно