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. Николай

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.