ownCloud на Fedora Linux (nginx + php-fpm + mariadb + selinux)

Развернем ownCloud на Fedora GNU/Linux с помощью nginx, php-fpm.
А заодно опровергнем фразу, которая опубликована на официальном ресурсе ownCloud:
«Fedora: Make sure SELinux is disabled or else the installation process might fail.»
«Fedora: Убедитесь, что SELinux отключен, иначе установка может завершится неудачно.»

Надеюсь, что установить Fedora в минимальном комплекте — сможет каждый.
В Fedora есть пакет, который так и называется owncloud.
Но мы будем ставить свежую версию с официального сайта. Просто я так хочу 😉

UPDATE! Данная инструкция подходит и для CentOS/Scientitic Linux 6.x/7.x
Для них я буду писать отдельно то, что отличается.

Итак, нам надо установить следующие основные компоненты:

  • веб-сервер nginx
  • сервер баз данных mariadb (mysql)
  • интерпретируемый язык PHP и его библиотеки

Установка

Для Fedora и CentOS/SL 7.x команда будет выглядеть так:

1
2
3
4
5
6
7
8
9
10
11
12
yum install php php-fpm php-gd php-curl \
php-dom php-exif php-gmp php-iconv php-fileinfo \
php-iconv php-session php-mysqlnd php-simplexml \
php-spl php-zip php-ZendFramework-Pdf \
php-ZendFramework-Search-Lucene php-getid3 \
php-PHPMailer php-phpass php-Pimple php-irodsphp \
php-filter php-pear-Crypt-Blowfish \
php-dropbox-php-Dropbox php-pear-Net-Curl \
php-pear-XML-Parser php-symfony-routing \
php-doctrine-dbal php-sabredav-Sabre_CalDAV \
php-sabredav-Sabre_CardDAV php-phpseclib-net-sftp \
nginx mariadb-server policycoreutils-python

Для CentOS/SL 6.x команда будет немного иной:

1
2
3
4
5
6
7
8
9
10
11
12
yum install php php-fpm php-gd php-curl \
php-dom php-exif php-gmp php-iconv php-fileinfo \
php-iconv php-session php-mysql php-simplexml \
php-spl php-zip php-ZendFramework-Pdf \
php-ZendFramework-Search-Lucene php-getid3 \
php-PHPMailer php-phpass php-Pimple php-cloudfiles \
php-filter php-pear-Crypt-Blowfish php-ldap \
php-dropbox-php-Dropbox php-pear-Net-Curl \
php-pear-XML-Parser php-symfony-routing \
php-doctrine-dbal php-sabredav-Sabre_CalDAV \
php-sabredav-Sabre_CardDAV \
nginx mysql-server policycoreutils-python

Настройка

Сперва условимся, что основной каталог для ownCloud у нас будет /srv/owncloud.
Если ты хочешь использовать другой каталог — просто меняй у себя в конфигах этот путь.

MariaDB (MySQL)

Запускаем установленный сервер баз данных.
Для Fedora и EL 7:

1
systemctl start mariadb

Для CentOS/SL 6.x:

1
service mariadb start

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

1
mysql_secure_installation

Я, обычно, отвечаю так:

1
2
3
4
5
6
7
8
Enter current password for root (enter for none): <enter>
Set root password? [Y/n] y
New password: ввожу пароль от рута
Re-enter new password: ввожу пароль от рута
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

Далее нам надо создать базу данных для ownCloud.
Запускаем оболочку mysql:

1
mysql -uroot -pТВОЙ_ПАРОЛЬ_ВВЕДЕННЫЙ_РАНЕЕ

Откроется приглашение оболочки. В нем вводим последовательно следующие команды:

1
2
3
4
create database owncloud;
create user 'owncloud'@'%' identified by 'owncloud';
grant all privileges on owncloud.* to 'owncloud'@'%';
flush privileges;
create database owncloud; создаст базу данных с именем owncloud
create user ‘owncloud’@’%’ identified by ‘owncloud’; создаст пользователя с именем owncloud и паролем owncloud, который сможет заходить отовсюду, % можно заменить на localhost, тогда пользователь сможет заходить только с данной конкретной машины
grant all privileges on owncloud.* to ‘owncloud’@’%’ команда дает доступ на все объекты базы данных owncloud (.*) для пользователя ‘owncloud’@’%’
flush privileges сбрасывает и обновляет привелегии

Выходим из оболочки mysql введя \q и нажав Enter.
На этом мы закончили с созданием базы данных.

php-fpm

Пакеты у нас установлены. Нам лишь надо немного настроить php и php-fpm для работы с nginx и ownCloud.

Открываем файл /etc/php-fpm.d/www.conf. Находим строки:

1
2
user = apache
group = apache

Исправляем их так:

1
2
user = nginx
group = nginx

Этим мы исправим пользователя и группу от которых будут работать процессы php-fpm.

Теперь исправим параметры PHP, открываем файл /etc/php.ini, находим в нем параметры:
upload_max_filesize
post_max_size
и исправляем их на 10G, а также параметр
upload_tmp_dir,
который раскомментируем и исправляем на «/srv/owncloud/data/tmp» (этот путь нам позже придется вручную создать)
как-то так:

1
2
3
upload_max_filesize = 10G
post_max_size = 10G
upload_tmp_dir = /srv/owncloud/data/tmp

Надо также изменить разрешения на каталог php-сессий:

1
chown -R root:nginx /var/lib/php/session

Закончили с PHP.

nginx

Веб-сервер у нас установлен. Надо лишь слегка его настроить.

Создаем файл /etc/nginx/conf.d/owncloud.conf с таким содержимым:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
upstream php-handler {
        server 127.0.0.1:9000;
        #server unix:/var/run/php5-fpm.sock;
}

server {
        listen 80;
        server_name ВСТАВЬ.ТУТ.ПОЛНОЕ.ИМЯ.ДОМЕНА;
        return 301 https://$server_name$request_uri;  # enforce https
}

server {
        listen 443 ssl;
        server_name ВСТАВЬ.ТУТ.ПОЛНОЕ.ИМЯ.ДОМЕНА;

        ssl_certificate /etc/ssl/owncloud/cloud.crt;
        ssl_certificate_key /etc/ssl/owncloud/server.key;

        # Path to the root of your installation
        root /srv/owncloud/;

        client_max_body_size 10G; # set max upload size
        fastcgi_buffers 64 4K;
        fastcgi_read_timeout    360s;
        fastcgi_send_timeout    360s;
        fastcgi_connect_timeout 60;

        error_log /var/log/nginx/owncloud-error.log debug;

        rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
        rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
        rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

        index index.php;
        error_page 403 /core/templates/403.php;
        error_page 404 /core/templates/404.php;

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

        #  location ~ ^/(data|config|\.ht|db_structure\.xml|README) {
        location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README) {
                deny all;
        }

        location / {
                 # The following 2 rules are only needed with webfinger
                rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
                rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

                rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
                rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;

                rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

                try_files $uri $uri/ index.php;
        }

        location ~ \.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 HTTPS on;
                fastcgi_pass php-handler;
        }


        # Optional: set long EXPIRES header on static assets
        location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
                expires 30d;
                # Optional: Don't log access to assets
                access_log off;
        }
}

ВНИМАНИЕ! В строках 8 и 14 надо заменить имя сервиса на свое.

Также, обращаем внимание на строки 16 и 17, в них описаны ключ и сертификат для SSL соединения. Создадим их!

Выполняем команды последовательно:

1
2
3
4
5
6
cd /etc/ssl
mkdir owncloud && cd owncloud
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out cloud.csr
<отвечаем на вопросы>
openssl x509 -req -days 365 -in cloud.csr -signkey server.key -out cloud.crt

Объясняю, что делают команды:
1) переходим в каталог, где хранятся данные SSL;
2) создаем каталог owncloud;
3) генерируем ключ;
4) генерируем запрос на самоподпись;
6) создаем подписанный сертификат используя ключ и запрос.

Закончили с nginx.

ownCloud

Открываем страничку с которой нам надо скачать UNIX tar.bz2 архив.
Скачиваем и размещаем в каталоге /root
Распакуем в ранее задуманный каталог и создадим каталог для временных загрузок:

1
2
3
cd /srv
tar xfv ~/owncloud-*.tar.bz2
mkdir -p owncloud/data/tmp

Теперь нам надо выдать разрешения на каталог /srv/owncloud таким образом, чтобы nginx и php-fpm могли работать с данными.

1
chown -R nginx:nginx /srv/owncloud

Готово.

SELinux

Разрешим в SELinux то, что нам нужно для работы ownCloud.

Разрешаем объектам веб-сервера соединяться с базой данных (будет работать некоторое время, где-то секунд 20-минуту):

1
setsebool -P httpd_can_network_connect=1 httpd_can_network_connect_db=1

А теперь нам надо прописать в SELinux чОткий контекст для веб-сервера на каталоге с ownCloud:

1
semanage fcontext -a -t httpd_sys_rw_content_t '/srv/owncloud(/.*)?'

А затем восстановить этот контекст на каталоге:

1
restorecon -R -v /srv/owncloud

Вот и все. Просто, правда? 😉

Ключ на старт

Запускаем все, что мы настроили.
Fedora, CentOS/SL 7.x:

1
systemctl start php-fpm nginx

CentOS/SL 6.x:

1
2
service php-fpm start
service nginx start

И проверяем вход по имени, указанному в строках 8 и 14 файла /etc/nginx/conf.d/owncloud.conf
Должны мы увидеть вот такую картинку:
owncloud-first-start
Где надо ввести свое имя пользователя, желаемый пароль.
Нажимаем на ссылку «Система хранения данных & база данных».
Я оставляю директорию с данными, как есть.
Выбираем MySQL/MariaDB в пункте «Настройка базы данных» и вносим по пунктам данные нашей базы данных из самого первого пункта. Если ничего не менялось, то это будет так:

Пользователь базы данных owncloud
Пароль базы данных owncloud
Название базы данных owncloud
Хост базы данных localhost

Нажимаем кнопку «Завершить установку».
Все. Дальше, я надеюсь, ты разберешься сам 😉

FireWall

Не забываем про это чудесное изобретение. В Fedora по-умолчанию идет новый firewalld.
В нем потребуется открыть порты http и https. Вот как это делается:

1
firewall-cmd --add-service=http --add-server=https

Для CentOS/SL 6.x потребуется отдельно выделить протоколы http/https в настроке firewall:

1
system-config-firewall

Финал

Проверили. Все работает.
Закрепляем успех, включаем все сервисы в автозагрузку при старте системы.
Для Fedora, CentOS/SL 7.x это будет выглядеть так:

1
systemctl enable mariadb nginx php-fpm

а для CentOS/SL 6.x так:

1
2
3
chkconfig mariadb on
chkconfig nginx on
chkconfig php-fpm on

А еще очень часто надо дописать имя из пунктов 8 и 14 конфигурационного файла nginx’а в /etc/hosts.
Собственно, если при первом пуске ownCloud ругается на ненастроенный WebDAV — то это тот самый случай.
Для CentOS/SL 6.x надо обязательно дописать имя в /etc/hosts.

Если есть верхний прокси-nginx

Вот в такой ситуации очень много всяких нюансов. Я долго все их собирал и тестировал.
А тебе они достаются просто так 😉
В конфигурационном файле nginx-прокси надо обязательно дописать такие вот строки:

1
2
3
4
5
client_max_body_size        10G;
proxy_connect_timeout       600;
proxy_send_timeout          600;
proxy_read_timeout          600;
send_timeout                600;

Иначе верхний nginx не будет пропускать большие файлы или будет выдавать «Gateway Time-out» при их загрузке.

Ну вот и все. Ошибки, оговорки и пр. пишите в комментариях.

ownCloud на Fedora Linux (nginx + php-fpm + mariadb + selinux): 1 комментарий

  1. Николай

    Спасибо, добрый друг! Совсем забыл, что кроме sys_content бывает sys_rw_content, бывает же такое!
    PS тоже всегда хочу сказать пару ласковых всем, кто советует отключить SeLinux ))

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