Архив метки: nginx

PeerTube установка на Rocky Linux

Установим и настроим децентрализованную платформу для организации видеохостинга и видеовещания под названием PeerTube на системe Rocky Linux. Лучший вариант для организации хранения и использования своих видеофайлов. Сети распространения контента на базе P2P-коммуникаций.

Предисловие

В современном мире сделать видеозапись не составляет никакого труда. Все сложности возникают когда надо поделится видео и выбрать место где хранить видеофайлы. Вариант с выгрузкой видео на «бесплатные» ресурсы я исключил сразу. Мне необходима 100% гарантия сохранности данных и удобное использование ресурса без сюрпризов.

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

Мои требования для организации базы видеофайлов были следующие:

  • Общий сервер куда пользователи могут загружать и просматривать видеофайлы,
  • Система администрирования как самой системы так и прав пользователей,
  • Удобный поиск нужных видео,
  • Обработка видеофайлов на самом сервере,
  • Загрузка видео по прямой ссылке на видео,
  • Добавление видео используя торрент-файл.

Все эти требования с легкостью осуществляет PeerTube.

Мне не надо теперь сидеть и часами обрабатывать видео для получения нужного качества и размера видеофайла. Например, при загрузке фидеофайла снятого на мобильном телефоне и имеющего общий размер в районе 8 Гиб я получаю на выходе видеофайл размером в районе 1,5 Гиб без потери качества видео.

Система активно развивается и с каждым выпуском возможности только расширяются.

Становитесь пользователями PeerTube и вы никогда об этом не пожалеете.

Системные требования

Почти сразу после публикации статьи сразу в комментариях появился вопрос о системных требованиях данного сервиса.

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

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

Исходные данные тестирования:

  • Система работает в виртуальной машине под управлением Proxmox c процессором Intel(R) Xeon(R) CPU E5620 @ 2.40GHz, DDR3, обычные HDD;
  • Во время всего тестирования пользователи активно пользовались системой в режиме просмотра ( 3-5 );
  • Для тестирования был выбран видеофайл размером 7.8 Гиб с разрешением 1920х816.

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

Сводная таблица времени транскодирования:

Intel(R) Xeon(R) CPU E5620 @ 2.40GHz, DDR3 Время транскодирования 816p Время транскодирования 480p
2 ядра и 4 Гиб памяти 2 часа 45 минут 1 час
8 ядер и 8 Гиб памяти 1 час 10 минут 30 минут

Вот такие параметры были в системе мониторинга Zabbix:

Самое приятное видеть как уменьшился размер видеофайла без потери качества. Вместо 7.8 Гиб стал 1.7 Гиб!

Раньше лежал у меня фильм и занимал места 7.8 Гиб и не важно в каком разрешении и на чем я его смотрел он качался всегда целиком. Теперь у меня два файл которые в сумме дают примерно 2.5 Гиб что почти в три раза меньше чем было. Смотрю на большом экране качается 1.7 Гиб, смотрю на мобильном телефоне качает 950 Миб. Можно транскадировать ещё в другие форматы и это все равно будет меньше чем был оригинал. Чудеса да и только 🙂

Предварительная подготовка

Написание статьи базировалось на официальной документации PeerTube в которой всё хорошо изложено и описано.

Установка Rocky Linux 8

Политика поддержки CentOS 8 поменялась и пока не могу однозначно сказать хорошо это или плохо, но лично у меня с ней стали возникать некоторые сложности. Хорошо что основатель CentOS взялся за разработку Rocky Linux которая будет развиваться в лучших традициях CentOS до момента перехода на Stream.

Подробно про установку и начальную настройку вы можете узнать в моей статье Rocky Linux 8 установка и настройка.

Подключение репозитория Epel

Подключаем и обновляем систему

dnf install epel-release dnf-utils
dnf update

Установка yarn и nodejs

Устанавливаем Nodejs 14 версии

dnf module install -y nodejs:14

Проверка по команде (у нужного должно стоять E)

dnf module list nodejs

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

Рекомендуется устанавливать Yarn через менеджер пакетов npm, который поставляется в комплекте с Node.js когда вы устанавливаете его в своей системе.

npm install --global yarn
=== вывод команды ===

> yarn@1.22.11 preinstall /usr/local/lib/node_modules/yarn
> :; (node ./preinstall.js > /dev/null 2>&1 || true)

/usr/local/bin/yarn -> /usr/local/lib/node_modules/yarn/bin/yarn.js
/usr/local/bin/yarnpkg -> /usr/local/lib/node_modules/yarn/bin/yarn.js
+ yarn@1.22.11
added 1 package in 2.811s

which yarn
=== вывод команды ===
/usr/local/bin/yarn

Необходимо сделать символическую ссылку на запуск yarn, иначе будет ошибка при установке PeerTube

ln -s /usr/local/bin/yarn /usr/bin/yarn

Проверим установленные версии

yarn --version
=== вывод команды ===
1.22.11

node -v
=== вывод команды ===
v14.17.3
npm --version
=== вывод команды ===
6.14.13

Установка ffmpeg

Подключаем необходимый репозиторий и устанавливаем

dnf --enablerepo=powertools install -y SDL2 SDL2-devel
dnf install -y --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-8.noarch.rpm
dnf install -y ffmpeg
dnf update -y

Проверяем установленную версию

ffmpeg -version
=== вывод команды ===
ffmpeg version 4.2.4 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 8 (GCC)
и тд. и тп.

Установка Python

Установим необходимую версию

dnf install python3

Проверим версию Python

python3 --version
=== вывод команды ===
Python 3.6.8

Создадим необходимую символическую ссылку для работы youtube-dl

ln -s /usr/bin/python3 /usr/bin/python

Установка PostgreSQL

Установим сервер базы данных с несколькими необходимыми пакетами

dnf install postgresql postgresql-server postgresql-contrib openssl gcc-c++ make wget redis git

Инициализируем базу данных PostgreSQL

sudo PGSETUP_INITDB_OPTIONS='--auth-host=md5' postgresql-setup --initdb --unit postgresql
=== вывод команды ===
* Initializing database in '/var/lib/pgsql/data'
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log

Включим в автозагрузку и запустим PostgreSQL и Redis

systemctl enable --now redis
systemctl enable --now postgresql

Создание пользователя PeerTube

Создадим пользователя PeerTube с домашней папкой /var/www/peertube и создадим ему пароль

mkdir /var/www
useradd -m -d /var/www/peertube -s /bin/bash -p peertube peertube
passwd peertube

Если потребуется удалить пользователя вместе с домашней папкой то выполните команду

userdel -r peertube

Создание базы данных PeerTube

Заходим под пользователем postgres

root@video.sevo44.loc ~ # sudo -i -u postgres
[postgres@video ~]$

Создаём базу данных и пользователя

createuser -P peertube
createdb -O peertube -E UTF8 -T template0 peertube_prod

Включаем расширения, необходимые для работы PeerTube

psql -c "CREATE EXTENSION pg_trgm;" peertube_prod
=== вывод команды ===
CREATE EXTENSION
psql -c "CREATE EXTENSION unaccent;" peertube_prod
=== вывод команды ===
CREATE EXTENSION

Поверяем правильность создания базы данных

psql
postgres=# \l
                                    Список баз данных
      Имя      | Владелец | Кодировка | LC_COLLATE  |  LC_CTYPE   |     Права доступа     
---------------+----------+-----------+-------------+-------------+-----------------------
 peertube_prod | peertube | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | 
 postgres      | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | 
 template0     | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | =c/postgres          +
               |          |           |             |             | postgres=CTc/postgres
 template1     | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | =c/postgres          +
               |          |           |             |             | postgres=CTc/postgres
(4 строки)

Не спешим выходить из под пользователя postgres. Создадим пароль для главного администратора базы данных иначе в последствии при смене прав доступа к базе система будет просить внести пароль которого у нас нет.

\password

Выходим на пользователя root

postgres=# \q
[postgres@video ~]$ exit
выход
root@video.sevo44.loc ~ #

Проверяем подключение к базе данных из под пользователя root

psql -U peertube -d peertube_prod
=== вывод команды ===
psql: ВАЖНО:  пользователь "peertube" не прошёл проверку подлинности (Peer)

Подключение не прошло. Необходимо настроит права доступа к базам данных.

Выполняем настройку доступа к SQL-серверу, разрешив доступ только с localhost по паролю

vim /var/lib/pgsql/data/pg_hba.conf
=== необходимые изменения ===
# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     password
# IPv4 local connections:
host    all             all             127.0.0.1/32            password
# Настройка необходимая для обновления PeerTube используя скрипт обновления
host    all             all             ::1/128                 password
# IPv6 local connections:
#host    all             all             ::1/128                 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     all                                     peer
#host    replication     all             127.0.0.1/32            ident
#host    replication     all             ::1/128                 ident

Перегружаем сервис и проверяем подключение к базе данных

systemctl restart postgresql
psql -U peertube -d peertube_prod
=== вывод команды ===
Пароль пользователя peertube: ПАРОЛЬ
psql (10.14)
Введите "help", чтобы получить справку.

peertube_prod=> \q  ВЫХОДИМ
root@video.sevo44.loc ~ #

Соединение по паролю прошло успешно.

Настройка FirewallD

Откроем необходимые порты для доступа к серверу, удалим ненужные и применим правила

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --permanent --zone=public --add-service=zabbix-agent
firewall-cmd --permanent --zone=public --add-port=1935/tcp
firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
firewall-cmd --permanent --zone=public --remove-service=cockpit
firewall-cmd --reload

Проверим параметры доступа

firewall-cmd --list-all --zone=public
public (active)
target: default
icmp-block-inversion: no
interfaces: ens18
sources: 
services: http https ssh zabbix-agent
ports: 1935/tcp
protocols: 
forward: no
masquerade: no
forward-ports: 
source-ports: 
icmp-blocks: 
rich rules:

Более подробно по работе с FirewaalD можно из статьи FirewallD базовая настройка.

Установка Peertube

Посмотрим какая будет установлена версия PeerTube

VERSION=$(curl -s https://api.github.com/repos/chocobozzz/peertube/releases/latest | grep tag_name | cut -d '"' -f 4) && echo "Latest Peertube version is $VERSION"
=== Вывод ===
Latest Peertube version is v3.4.0

Откроем домашний каталог пользователя peertube, создадим несколько необходимых каталогов и назначим необходимые права

cd /var/www/peertube
sudo -u peertube mkdir config storage versions
sudo -u peertube chmod 750 config/

Загрузим последнюю версию клиента Peertube, разархивируем ее и удалим архив zip

cd /var/www/peertube/versions
sudo -u peertube wget -q "https://github.com/Chocobozzz/PeerTube/releases/download/${VERSION}/peertube-${VERSION}.zip"
sudo -u peertube unzip peertube-${VERSION}.zip && sudo -u peertube rm peertube-${VERSION}.zip

Установим Peertube

cd /var/www/peertube
sudo -u peertube ln -s versions/peertube-${VERSION} ./peertube-latest
cd ./peertube-latest
sudo -H -u peertube yarn install --production --pure-lockfile
=== вывод команды ===
yarn install v1.22.11
[1/5] Validating package.json...
[2/5] Resolving packages...
[3/5] Fetching packages...
info fsevents@2.3.2: The platform "linux" is incompatible with this module.
info "fsevents@2.3.2" is an optional dependency and failed compatibility check. Excluding it from installation.
[4/5] Linking dependencies...
warning " > @typescript-eslint/eslint-plugin@4.29.3" has unmet peer dependency "@typescript-eslint/parser@^4.0.0".
warning " > marked-man@0.7.0" has incorrect peer dependency "marked@^0.7.0".
warning "swagger-cli > @apidevtools/swagger-cli > @apidevtools/swagger-parser@10.0.3" has unmet peer dependency "openapi-types@>=7".
[5/5] Building fresh packages...
$ test -n "$NOCLIENT" || (cd client && yarn install --pure-lockfile)
yarn install v1.22.11
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@2.3.2: The platform "linux" is incompatible with this module.
info "fsevents@2.3.2" is an optional dependency and failed compatibility check. Excluding it from installation.
info fsevents@1.2.13: The platform "linux" is incompatible with this module.
info "fsevents@1.2.13" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
warning " > @ng-bootstrap/ng-bootstrap@10.0.0" has incorrect peer dependency "rxjs@^6.5.5".
warning " > @ngx-i18nsupport/tooling@8.0.3" has incorrect peer dependency "@angular/common@^8.0.0".
warning " > @ngx-i18nsupport/tooling@8.0.3" has incorrect peer dependency "@angular/core@^8.0.0".
warning " > angular2-hotkeys@2.3.2" has incorrect peer dependency "rxjs@^5.5.0 || ^6.0.0".
warning " > angularx-qrcode@11.0.0" has incorrect peer dependency "@angular/core@^11.0.6".
warning " > bootstrap@4.6.0" has unmet peer dependency "jquery@1.9.1 - 3".
warning " > bootstrap@4.6.0" has unmet peer dependency "popper.js@^1.16.1".
warning " > linkifyjs@2.1.9" has unmet peer dependency "jquery@>= 1.11.0".
warning " > linkifyjs@2.1.9" has unmet peer dependency "react@>= 0.14.0".
warning " > linkifyjs@2.1.9" has unmet peer dependency "react-dom@>= 0.14.0".
warning " > ngx-uploadx@4.1.3" has incorrect peer dependency "rxjs@^6.3.0".
warning " > primeng@12.1.0" has incorrect peer dependency "rxjs@^6.0.0".
[4/4] Building fresh packages...
Done in 67.18s.
Done in 169.82s.

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

Вот перевод ответа: «Если вы имеете в виду все предупреждения Yarn, вы можете их игнорировать. Насколько я понимаю, это проблема Yarn, и она будет исправлена ​​в следующей версии.»

Конфигурация PeerTube

Создаем файл конфигурации с шаблона

cd /var/www/peertube && sudo -u peertube cp peertube-latest/config/production.yaml.example config/production.yaml

Произведем настройку указав свои параметры

vim /var/www/peertube/config/production.yaml
=== необходимые блоки для настройки ===
# Correspond to your reverse proxy server_name/listen configuration
webserver:
  https: true 
  hostname: 'video.sevo44.ru' # sevo44
  port: 443
 
# Your database name will be database.name OR "peertube"+database.suffix
database:
  hostname: 'localhost'
  port: 5432
  ssl: false
  suffix: '_prod'
  username: 'peertube'
  password: 'password' # sevo44
  pool:
    max: 5
 
# SMTP server to send emails
smtp:
  # smtp or sendmail
  transport: smtp
  # Path to sendmail command. Required if you use sendmail transport
  sendmail: null 
  hostname: smtp.yandex.ru # sevo44
  port: 465 # If you use StartTLS: 587
  username: 'video@sevo44.ru' # sevo44
  password: 'password'      # sevo44
  tls: true # If you use StartTLS: false
  disable_starttls: false
  ca_file: null # Used for self signed certificates
  from_address: 'video@sevo44.ru'  # sevo44

В настройках мы указали доменное имя на котором будет работать ресурс, параметры для работы почты через сторонний smtp.

Остальные параметры можно не править, так как при работе будет создан файл /var/www/peertube/config/local-production.json в котором будут указаны все параметры которые делаются в панели администратора.

Настройка Nginx

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

Приведу пример как производится проксирования сигнала до PeerTube средствами Nginx.

Ни в коем случае не пытайтесь настроить работу PeerTube на http так как будут глюки в работе как в отображении информации так и задержка при просмотре видео. Сервис заточен под работу на https и адаптировать его под работу http нет смысла. Проще добавить сертификат ssl. О том как это сделать узнаете ниже.

Более подробно про то как работать с Nginx вы можете из статьи NGINX установка и настройка.

Установка Nginx

Подключаем официальный стабильный репозиторий разработчиков Nginx и устанавливаем

vim /etc/yum.repos.d/nginx.repo
=== необходимый код ===
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

dnf install nginx

Сделаем копию и изменим главный файл настройки Nginx

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_orig

vim /etc/nginx/nginx.conf
=== необходимый код ===
# Пользователь и группа, от имени которых будет запущен процесс
user peertube;
 
# Число воркеров в новых версиях рекомендовано устанавливать параметр auto
worker_processes auto;
 
# Уровни лога debug, info, notice, warn, error, crit, alert или emerg
# перечислены в порядке возрастания важности. При установке определённого уровня
# в лог попадают все сообщения указанного уровня и уровней большей важности. 
# Например, при стандартном уровне error в лог попадают сообщения уровней error, crit, alert и emerg. 
# Если параметр не задан, используется error. 
error_log /var/log/nginx/error.log warn;
 
# Файл в котором будет храниться идентификатор основного процесса
pid /var/run/nginx.pid;
 
events {
# Максимальное количество соединений одного воркера
worker_connections 1024;
# Метод выбора соединений (для FreeBSD будет kqueue)
use epoll;
# Принимать максимально возможное количество соединений
multi_accept on;
}
 
http {
# Отключить вывод версии nginx в ответе
server_tokens off;
 
# Указываем файл с mime-типами и указываем тип данных по-умолчанию
include /etc/nginx/mime.types;
default_type application/octet-stream;
 
# Формат для лога доступа и путь к файлу
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
 
# Метод отправки данных sendfile эффективнее чем read+write
sendfile on;
 
# Ограничивает объём данных, который может передан за один вызов sendfile(). 
# Нужно для исключения ситуации когда одно соединение может целиком захватить воркер
sendfile_max_chunk 128k;
 
# Отправлять заголовки и начало файла в одном пакете
tcp_nopush on;
tcp_nodelay on;
 
# Параметр задаёт тайм аут, в течение которого keep-alive соединение с клиентом не будет закрыто со стороны сервера
keepalive_timeout 65;
 
# Сбрасывать соединение если клиент перестал читать ответ
reset_timedout_connection on;
 
# Разрывать соединение по истечению тайм аута при получении заголовка и тела запроса
client_header_timeout 3;
client_body_timeout 5;
 
# Разрывать соединение, если клиент не отвечает в течение 3 секунд
send_timeout 3;
 
# Задание буфера для заголовка и тела запроса
client_header_buffer_size 2k;
client_body_buffer_size 256k;
 
# Ограничение на размер тела запроса
client_max_body_size 8G;
 
# Подключение дополнительных конфигов
include /etc/nginx/conf.d/*.conf;
}

Мы специально указали пользователя peertube так как сервер создан для работы одного ресурса.

Добавим в автозагрузку и запустим сервис Nginx

systemctl enable --now nginx

Обязательно назначаем необходимого пользователя, иначе не будет простой загрузки видео

chown -R peertube:root /var/lib/nginx

Для того чтобы не запутаться и не делать лишних телодвижений необходимо следовать такому плану:

  1. Получаем сертификат для сервера PeerTube на проксирующем сервере;
  2. Создаём файл настройки на проксирующем сервере;
  3. Копируем сертификаты на сервер с PeerTube;
  4. Создаем файл Nginx для PeerTube.

В статье всё будет по такому плану.

О том как получать бесплатные сертификаты от Let’s Encrypt можно из статьи SSL бесплатный для сайта Nginx.

Nginx для проксирования PeerTube

На проксирующем сервере создаём необходимый файл

vim video-video.sevo44.ru.conf
=== необходимый код ===
### ssl video.sevo44.ru
server {
listen 80;
server_name video.sevo44.ru;
return 301 https://$server_name$request_uri; # редирект обычных запросов на https
}

server {
#listen 80;
listen 443 ssl http2;
server_name video.sevo44.ru;

### ssl
ssl_certificate /etc/letsencrypt/live/video.sevo44.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/video.sevo44.ru/privkey.pem;

location /.well-known/acme-challenge/ {
root /etc/nginx/cert-renewal/;
}

location / {
proxy_pass https://192.168.0.116:443;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 8G;
client_body_buffer_size 128k;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}

Проверяем и обновляем настройки Nginx

nginx -t
nginx -s reload

Nginx для PeerTube

Скопируем шаблон конфигурации

cp /var/www/peertube/peertube-latest/support/nginx/peertube /etc/nginx/conf.d/peertube.conf

Сделаем копию исходного файла и внесем необходимые правки в файл конфигурации

cp /etc/nginx/conf.d/peertube.conf /etc/nginx/conf.d/peertube.conf-orig

vim /etc/nginx/conf.d/peertube.conf
=== необходимый код с пометками ===
server {
  listen 80;
  listen [::]:80;
  server_name video.sevo44.ru; # sevo44

  # Для записи в log реальных ip  
  #192.168.0.101 адрес машины где работает proxy nginx
  set_real_ip_from 192.168.0.101;  
  real_ip_header X-Real-IP;

  access_log /var/log/nginx/video.sevo44.ru-80-access.log; # sevo44 
  error_log /var/log/nginx/video.sevo44.ru-80-error.log; # sevo44

# sevo44 Отключаем настройку для получения сертификата
#  location /.well-known/acme-challenge/ {
#    default_type "text/plain";
#    root /var/www/certbot;
#  }
 
  location / { return 301 https://$host$request_uri; }
}
 
server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name video.sevo44.ru; # sevo44

  # Для записи в log реальных ip
  #192.168.0.101 адрес машины где работает proxy nginx
  set_real_ip_from 192.168.0.101;
  real_ip_header X-Real-IP;

  access_log /var/log/nginx/video.sevo44.ru-443-access.log; # sevo44 
  error_log /var/log/nginx/video.sevo44.ru-443-error.log; # sevo44
 
  # For example with certbot (you need a certificate to run https)
  ssl_certificate      /etc/letsencrypt/live/video.sevo44.ru/fullchain1.pem; # sevo44
  ssl_certificate_key  /etc/letsencrypt/live/video.sevo44.ru/privkey1.pem;  # sevo44
 
  # Security hardening (as of 11/02/2018)
  ssl_protocols TLSv1.2; # TLSv1.3, TLSv1.2 if nginx >= 1.13.0
  ssl_prefer_server_ciphers on;
  # Remove ECDHE-RSA-AES256-SHA if you don't want compatibility with Android 4
  ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA';
  # ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0, not compatible with import-videos script
  ssl_session_timeout  10m;
  ssl_session_cache shared:SSL:10m;
  ssl_session_tickets off; # Requires nginx >= 1.5.9
  ssl_stapling on; # Requires nginx >= 1.3.7
  ssl_stapling_verify on; # Requires nginx => 1.3.7
  # HSTS (https://hstspreload.org), requires to be copied in 'location' sections that have add_header directives
  #add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
 
  # Configure with your resolvers
  # resolver $DNS-IP-1 $DNS-IP-2 valid=300s;
  # resolver_timeout 5s;
 
  # Enable compression for JS/CSS/HTML bundle, for improved client load times.
  # It might be nice to compress JSON, but leaving that out to protect against potential
  # compression+encryption information leak attacks like BREACH.
  gzip on;
  gzip_types text/css application/javascript;
  gzip_vary on;
 
  # If you have a small /var/lib partition, it could be interesting to store temp nginx uploads in a different place
  # See https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_temp_path
  # client_body_temp_path /var/www/peertube/storage/nginx/;
 
# sevo44 Отключаем настройку для получения сертификата
#  location ^~ '/.well-known/acme-challenge' {
#    default_type "text/plain";
#    root /var/www/certbot;
#  }
 
  # Bypass PeerTube for performance reasons. Could be removed
  location ~ ^/client/(.*\.(js|css|png|svg|woff2|otf|ttf|woff|eot))$ {
    add_header Cache-Control "public, max-age=31536000, immutable";
 
    alias /var/www/peertube/peertube-latest/client/dist/$1;
  }
 
  # Bypass PeerTube for performance reasons. Could be removed
  location ~ ^/static/(thumbnails|avatars)/ {
    if ($request_method = 'OPTIONS') {
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
      add_header 'Access-Control-Max-Age' 1728000;
      add_header 'Content-Type' 'text/plain charset=UTF-8';
      add_header 'Content-Length' 0;
      return 204;
    }
 
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
 
    # Cache 2 hours
    add_header Cache-Control "public, max-age=7200";
 
    root /var/www/peertube/storage;
 
    rewrite ^/static/(thumbnails|avatars)/(.*)$ /$1/$2 break;
    try_files $uri /;
  }
 
  location / {
    proxy_pass http://127.0.0.1:9000;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
    # This is the maximum upload size, which roughly matches the maximum size of a video file
    # you can send via the API or the web interface. By default this is 8GB, but administrators
    # can increase or decrease the limit. Currently there's no way to communicate this limit
    # to users automatically, so you may want to leave a note in your instance 'about' page if
    # you change this.
    #
    # Note that temporary space is needed equal to the total size of all concurrent uploads.
    # This data gets stored in /var/lib/nginx by default, so you may want to put this directory
    # on a dedicated filesystem.
    #
    client_max_body_size 8G;
 
    proxy_connect_timeout       600;
    proxy_send_timeout          600;
    proxy_read_timeout          600;
    send_timeout                600;
  }
 
  # Bypass PeerTube for performance reasons. Could be removed
  location ~ ^/static/(webseed|redundancy|streaming-playlists)/ {
    # Clients usually have 4 simultaneous webseed connections, so the real limit is 3MB/s per client
    set $peertube_limit_rate 800k;
 
    # Increase rate limit in HLS mode, because we don't have multiple simultaneous connections
    if ($request_uri ~ -fragmented.mp4$) {
      set $peertube_limit_rate 5000k;
    }
 
    # Use this with nginx >= 1.17.0
    # limit_rate $peertube_limit_rate;
    # Or this if your nginx < 1.17.0
    set $limit_rate $peertube_limit_rate;
    limit_rate_after 5000k;
 
    if ($request_method = 'OPTIONS') {
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
      add_header 'Access-Control-Max-Age' 1728000;
      add_header 'Content-Type' 'text/plain charset=UTF-8';
      add_header 'Content-Length' 0;
      return 204;
    }
 
    if ($request_method = 'GET') {
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
 
      # Don't spam access log file with byte range requests
      access_log off;
    }
 
    root /var/www/peertube/storage;
 
    # Use this in tandem with fuse-mounting i.e. https://docs.joinpeertube.org/#/admin-remote-storage
    # to serve files directly from a public bucket without proxying.
    # Assumes you have buckets named after the storage subdirectories, i.e. 'videos', 'redundancy', etc.
    #set $cdn <your S3-compatiable bucket public url mounted via fuse>;
    #rewrite ^/static/webseed/(.*)$ $cdn/videos/$1 redirect;
    #rewrite ^/static/redundancy/(.*)$ $cdn/redundancy/$1 redirect;
    #rewrite ^/static/streaming-playlists/(.*)$ $cdn/streaming-playlists/$1 redirect;
 
    rewrite ^/static/webseed/(.*)$ /videos/$1 break;
    rewrite ^/static/redundancy/(.*)$ /redundancy/$1 break;
    rewrite ^/static/streaming-playlists/(.*)$ /streaming-playlists/$1 break;
 
    try_files $uri /;
  }
 
  # Websocket tracker
  location /tracker/socket {
    # Peers send a message to the tracker every 15 minutes
    # Don't close the websocket before this time
    proxy_read_timeout 1200s;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:9000;
  }
 
  location /socket.io {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
 
    proxy_pass http://127.0.0.1:9000;
 
    # enable WebSockets
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}

Обращаю внимание на указание параметров сертификата ssl. Указан путь /etc/letsencrypt/live/video.sevo44.ru который соответствует пути расположения как на сервере где получаем сертификат.

Копирование сертификата

Настроим копирование сертификата с сервера где получаем сертификаты на сервер с peertube. Настроим подключение к серверу по сертификату, создадим необходимый скрипт который будет выполнять всё что нам необходимо и добавим его в автоматические задания по расписанию на сервере.

Более подробно о том как настраивать механизм подключения по сертификаты можете найти в статье RSA или авторизация SSH по ключу.

Создадим сертификат на сервере где получаем сертификат:

ssh-keygen -t rsa -b 2048
= часть вывода команды =
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:SxosbJySnbLBFmJ8s6HVFzaulNct6Wo0vePLp+5aU/4 root@video.sevo44.loc
The key's randomart image is:
............

Скопируем на сервер с PeerTube открытую часть ключа:

ssh-copy-id -i /root/.ssh/id_rsa.pub -p 22 root@192.168.0.116
= вывод команды =
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.116's password: ! вводим пароль

Number of key(s) added: 1

Now try logging into the machine, with: "ssh -p '22' 'root@192.168.0.116'"
and check to make sure that only the key(s) you wanted were added.

Создадим скрипт который будет копировать необходимый сертификат и выполнять необходимые действия на удаленном сервере:

vim /root/sert-video.sevo44.ru.sh
= необходимый код =
#!/bin/bash

# создаём необходимые папки
ssh root@192.168.0.116 mkdir -p /etc/letsencrypt/archive/video.sevo44.ru
ssh root@192.168.0.116 mkdir -p /etc/letsencrypt/live/video.sevo44.ru

# копируем необходимые папки
rsync -avz -e 'ssh -p 22' /etc/letsencrypt/archive/video.sevo44.ru/ root@192.168.0.116:/etc/letsencrypt/archive/video.sevo44.ru/
rsync -avz -e 'ssh -p 22' /etc/letsencrypt/live/video.sevo44.ru/ root@192.168.0.116:/etc/letsencrypt/live/video.sevo44.ru/

# обновляем конфигурацию nginx
ssh root@192.168.0.116 nginx -s reload

Делаем скрипт исполнительным:

chmod +x /root/sert-video.sevo44.ru.sh

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

# копируем ssl раз в неделю в полночь воскресенья
0 0 * * 0 root /root/sert-video.sevo44.ru.sh >/dev/null 2>&1

TCP/IP тюнинг для PeerTube

Производители рекомендуют выполнить оптимизацию и мы не будем игнорировать этим советом

cp /var/www/peertube/peertube-latest/support/sysctl.d/30-peertube-tcp.conf /etc/sysctl.d/
sysctl -p /etc/sysctl.d/30-peertube-tcp.conf

Запуск PeerTube

Самая большая часть настройки позади и нам осталось настроить Systemd для управления сервисом.

Скопируем шаблон конфигурации Systemd

cp /var/www/peertube/peertube-latest/support/systemd/peertube.service /etc/systemd/system/

Посмотреть с какими настройками создалась служба можно выполнив команду

cat /etc/systemd/system/peertube.service
=== Вывод команды ===
[Unit]
Description=PeerTube daemon
After=network.target postgresql.service redis-server.service

[Service]
Type=simple
Environment=NODE_ENV=production
Environment=NODE_CONFIG_DIR=/var/www/peertube/config
User=peertube
Group=peertube
ExecStart=/usr/bin/npm start
WorkingDirectory=/var/www/peertube/peertube-latest
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=peertube
Restart=always

; Some security directives.
; Mount /usr, /boot, and /etc as read-only for processes invoked by this service.
ProtectSystem=full
; Sets up a new /dev mount for the process and only adds API pseudo devices
; like /dev/null, /dev/zero or /dev/random but not physical devices. Disabled
; by default because it may not work on devices like the Raspberry Pi.
PrivateDevices=false
; Ensures that the service process and all its children can never gain new
; privileges through execve().
NoNewPrivileges=true
; This makes /home, /root, and /run/user inaccessible and empty for processes invoked
; by this unit. Make sure that you do not depend on data inside these folders.
ProtectHome=true
; Drops the sys admin capability from the daemon.
CapabilityBoundingSet=~CAP_SYS_ADMIN

[Install]
WantedBy=multi-user.target

Скажем Systemd перезагрузить его конфигурацию

systemctl daemon-reload

Добавим в автозагрузку и запустим

systemctl enable --now peertube

Смотрим что происходит

journalctl -feu peertube
=== вывод команды ===

Вывод должен быть примерно такой

systemd[1]: Started PeerTube daemon.
 peertube[8873]: > peertube@3.4.0 start /var/www/peertube/versions/peertube-v3.4.0
 peertube[8873]: > node dist/server
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:10.426 info: Database peertube_prod is ready.
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:22.405 info: Creating application account.
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:22.418 info: Creating a default OAuth Client.
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:22.424 info: Creating the administrator.
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:22.471 info: Client id: mt3lxarek0no3oq36b7udsegwhv10gc4
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:22.471 info: Client secret: 14zuSP6aeMjhJ8AnLLfStkTeJD4l6mlD
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:22.520 info: Generating a RSA key...
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:22.670 info: Generating a RSA key...
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:22.671 info: Generating a RSA key...
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.261 info: Username: root
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.261 info: User password: xelurocikokuyave
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.264 info: Using smtp.yandex.ru:465 as SMTP server.
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.268 info: Testing SMTP server...
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.478 info: Secure connection established to 77.88.21.158:465 {
 peertube[8873]:   "component": "smtp-connection",
 peertube[8873]:   "sid": "yKg9R1Vvcx0",
 peertube[8873]:   "tnx": "network",
 peertube[8873]:   "localAddress": "192.168.0.116",
 peertube[8873]:   "localPort": 42528,
 peertube[8873]:   "remoteAddress": "77.88.21.158",
 peertube[8873]:   "remotePort": 465
 peertube[8873]: }
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.602 info: User "video@sevo44.ru" authenticated {
 peertube[8873]:   "component": "smtp-connection",
 peertube[8873]:   "sid": "yKg9R1Vvcx0",
 peertube[8873]:   "tnx": "smtp",
 peertube[8873]:   "username": "video@sevo44.ru",
 peertube[8873]:   "action": "authenticated",
 peertube[8873]:   "method": "PLAIN"
 peertube[8873]: }
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.603 info: Successfully connected to SMTP server.
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.621 info: Cleaning HTML cache.
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.627 info: Connection closed {
 peertube[8873]:   "component": "smtp-connection",
 peertube[8873]:   "sid": "yKg9R1Vvcx0",
 peertube[8873]:   "tnx": "network"
 peertube[8873]: }
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.637 info: Server listening on localhost:9000
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.638 info: Web server: https://video.sevo44.ru

В выводе кода вы видите пароль от администратора сервиса! User password: xelurocikokuyave и больше его вывод никогда не покажет. Запишите его или потом сможете создать другой.

В выводе всё хорошо расписано и в случае ошибок сможете увидеть подсказки что не так настроено.

Настройка PeerTube

Настроек множество и описывать все не имеет смысла. Покажу те моменты на которые имеет смысл обратить особое внимание.

Настоятельно рекомендую для безопасности оставить главным администратором только пользователя root. Все главные параметры нет смысла менять часто а для обычного администрирования роли «Модератор» вполне достаточно.

Выбираем варианты как можно загружать видеофайлы.  Импорт с URL-адреса или торрент-файла очень удобен и отключать такую возможность не надо.

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

В моем случае выбраны разрешения для транскодирования 480p и 1080p мне этого хватает. В случае если происходит загрузка видеофайла разрешением менее 480р транскодирования производится не будет и в системе будет только этот видеофайла. При загрузке видеофайла разрешением больше 1080р будет произведено транскодирование в форматы 480p и 1080р.

Чем больше форматов тем системе легче работать, но платить за это приходится размером дисков для видеофалов.

Главный параметр PeerTube

Спустя какое то время я стал замечать что объем хранилища видео стал сильно увеличиваться когда я стал более активно добавлять видео. Как влияет на объём выбор вариантов разрешения все понятно а вот с выбором формата я сразу не разобрался и включал оба параметра.

Теперь мои параметры выглядят так:

При выводе информации понятно почему этот вариант гораздо предпочтительней.

Более подробно про параметры формата вывода можно прочитать в документации разработчика.

Расскажу что происходит на сервере когда включено оба параметра:

  1. После обработки видеофайл попадает в папку /var/www/peertube/storage/videos и имеет столько вариантов сколько вариантов разрешения вы выбрали;
  2. Потом видеофайлы попадают в папку /var/www/peertube/storage/streaming-playlists/hls и для каждого видео создаётся своя папка в которой помимо самих видеофайлов присутствуют технические файлы для работы с этой технологией.

Вот откуда идет двойное увеличение хранилища. В случае когда параметр «WebTorrent» выключен файлы всё равно во время транскодирования попадают в папку videos, но лишь временно на момент обработки файла. После окончания обработки файлы в папке videos удаляются.

Если после отключения параметра «WebTorrent» зайти и просто удалить файлы в папке videos то вы не сможете скачать видео которое было загружено с включением обоих параметров.

Обзор PeerTube

Особо расписывать нет смысла как работать в системе по причине понятного и дружественного интерфейса. Добавляйте пользователей создавайте каналы, закачивайте видео, подписывайтесь и получайте удовольствие от того что все ваше видео теперь находится в одном месте.

На фотках ниже вы увидите как система выглядит у меня.

Обновление PeerTube

В случае проблем в работе с некоторыми функциями PeerTube обновляйте если вышла новая версия.

Например, в какой то момент у меня перестала работать загрузка видео по адресу. После обновления все заработало.

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

Останавливаем сервис, переходим в нужное место и запускаем скрипт обновления

systemctl stop peertube
cd /var/www/peertube/peertube-latest/scripts
sudo -H -u peertube ./upgrade.sh

В конце выдаст информацию об изменениях сделанных в файле конфигурации по отношению к базовому.

В папке /var/www/peertube/config находится 3 файла:

  • default.yaml — базовая конфигурация. Обновляется после каждого обновления и имеет все настройки для новой версии;
  • local-production.json — настройки которые делаются в панели администратора и не меняются при обновлении версии;
  • production.yaml — настройки действующей версии.

Создадим копию файла из настроек что действуют на данный момент:

cp /var/www/peertube/config/production.yaml /var/www/peertube/config/production.yaml_old

Обновим из базовой новой конфигурации файл с настройками:

cp /var/www/peertube/config/default.yaml /var/www/peertube/config/production.yaml
= при вопросе пишем yes =

Обычно надо внести необходимые правки в следующих блоках:

# Correspond to your reverse proxy server_name/listen configuration (i.e., your public PeerTube instance URL)
webserver:
https: true
hostname: 'video.sevo44.ru'
port: 443

# Your database name will be database.name OR 'peertube'+database.suffix
database:
hostname: 'localhost'
port: 5432
ssl: false
suffix: '_prod'
username: 'peertube'
password: 'Sdthdfhdfhhf' 
pool:
max: 5

# SMTP server to send emails
smtp: 
# smtp or sendmail
transport: smtp
# Path to sendmail command. Required if you use sendmail transport
sendmail: null
hostname: smtp.yandex.ru
port: 465 # If you use StartTLS: 587
username: 'video@sevo44.ru'
password: 'tzZqAeu656ddsdfg2s6'
tls: true # If you use StartTLS: false
disable_starttls: false
ca_file: null # Used for self signed certificates
from_address: 'video@sevo44.ru'

# From the project root directory
storage:
tmp: '/var/www/peertube/storage/tmp/' # Use to download data (imports etc), store uploaded files before and during processing...
bin: '/var/www/peertube/storage/bin/'
avatars: '/var/www/peertube/storage/avatars/'
videos: '/var/www/peertube/storage/videos/'
streaming_playlists: '/var/www/peertube/storage/streaming-playlists/'
redundancy: '/var/www/peertube/storage/redundancy/'
logs: '/var/www/peertube/storage/logs/'
previews: '/var/www/peertube/storage/previews/'
thumbnails: '/var/www/peertube/storage/thumbnails/'
torrents: '/var/www/peertube/storage/torrents/'
captions: '/var/www/peertube/storage/captions/'
cache: '/var/www/peertube/storage/cache/'
plugins: '/var/www/peertube/storage/plugins/'
# Overridable client files in client/dist/assets/images:
# - logo.svg
# - favicon.png
# - default-playlist.jpg
# - default-avatar-account.png
# - default-avatar-video-channel.png
# - and icons/*.png (PWA)
# Could contain for example assets/images/favicon.png
# If the file exists, peertube will serve it
# If not, peertube will fallback to the default file
client_overrides: '/var/www/peertube/storage/client-overrides/'

Запускаем и смотрим информацию о сервисе

systemctl start peertube
journalctl -feu peertube

Без проблем прошли обновления 2.4.0 -> 3.0.0 -> 3.1.0 -> 3.2.1 -> 3.3.0 -> 3.4.0 -> 4.0.0 -> 4.1.0 -> 4.1.1

Переезд PeerTube

На новом сервере устанавливаем последнюю версию и переносим необходимые данные.

Обновлять версию на сервере с которого переезжаем нет необходимости. После переезда запускается скрипт обновления и всё обновится до необходимой версии.

При переносе на другой сервер нам необходимо перенести следующие данные:

  • Каталог /var/www/peertube/storage, в котором содержатся видео, миниатюры, предварительные просмотры и так далее,
  • Файл /var/www/peertube/config, содержащий конфигурацию,
  • База данных PostgreSQL (с использованием pg_dump).

Перед переездом останавливаем сервис на новом ресурсе

systemctl stop peertube

Копирование storage/ файлов

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

# 1 вариант
sudo -u peertube rsync -avz /var/www/peertube/storage/ peertube@192.168.0.114:~/storage/

# 2 вариант
sudo -u peertube rsync -avz -e 'ssh -p 2222' /var/www/peertube/storage/ peertube@192.168.0.114:~/storage/

Вам нужно будет повторно запустить эту команду, если какие-либо файлы на старом сервере изменятся. Вот почему лучше использовать rsync.

Копирование конфигурации

Можно перенести файл а можно сделать необходимые правки на основе действующей конфигурации на старом сервере находящиеся в файле

cat /var/www/peertube/config/production.yaml

Копирование базы данных

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

# 1 вариант
sudo -u peertube pg_dump -Fc peertube_prod > /tmp/peertube_prod-dump.db

# 2 вариант
sudo -i -u postgres
postgres@video:~$ pg_dump -Fc peertube_prod > /tmp/peertube_prod-dump.db
postgres@video:~$ exit
scp -P 2222 /tmp/peertube_prod-dump.db root@192.168.0.114:/tmp

На новом сервере разворачиваем базу данных

sudo -u postgres pg_restore -c -C -d postgres /tmp/peertube_prod-dump.db

Запуск после переноса PeerTube

Переходим в нужное место и запускаем скрипт обновления

cd /var/www/peertube/peertube-latest/scripts
sudo -H -u peertube ./upgrade.sh

После выполнения команды запускаем сервис и смотрим что происходит

systemctl start peertube
journalctl -feu peertube

При переносе для того чтобы не потерять данные которые появились во время переноса так же необходимо остановить сервис PeerTube.

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

Смена доменного имени PeerTube

При желании можно сменить доменное имя. После того как внесете правки в файл настройки PeerTube и поправите настройки Nginx необходимо выполнить следующие команды

cd /var/www/peertube/peertube-latest && su peertube 

[peertube@video peertube-latest]$ NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run update-host
=== вывод команды ===
> peertube@2.4.0 update-host /var/www/peertube/versions/peertube-v2.4.0
> node ./dist/scripts/update-host.js
 
Updating actors.
Updating actor http://video.sevo44.ru/video-channels/root_channel
Updating actor http://video.sevo44.ru/video-channels/sevo44_all
Updating actor http://video.sevo44.ru/accounts/root
Updating actor http://video.sevo44.ru/accounts/sevo44
Updating actor http://video.sevo44.ru/accounts/peertube
Updating video shares.
Updating video share http://video.sevo44.ru/videos/watch/9c178338-fa10-47b0-b2d1-f41af08179cc/announces/5
Updating video share http://video.sevo44.ru/videos/watch/9c178338-fa10-47b0-b2d1-f41af08179cc/announces/1
Updating video share http://video.sevo44.ru/videos/watch/c8dfa17f-ad7a-478a-83d0-6c53767f778a/announces/5
Updating video share http://video.sevo44.ru/videos/watch/c8dfa17f-ad7a-478a-83d0-6c53767f778a/announces/1
Updating video share http://video.sevo44.ru/videos/watch/2ef17574-dbc8-4111-936c-773c755141db/announces/5
Updating video share http://video.sevo44.ru/videos/watch/2ef17574-dbc8-4111-936c-773c755141db/announces/1
Updating video share http://video.sevo44.ru/videos/watch/753df8df-5bae-4bef-8d3c-5bb688a8c0fb/announces/5
Updating video share http://video.sevo44.ru/videos/watch/753df8df-5bae-4bef-8d3c-5bb688a8c0fb/announces/1
Updating video comments.
Updating video and torrent files.
Updating video 9c178338-fa10-47b0-b2d1-f41af08179cc
Updating torrent file 720 of video 9c178338-fa10-47b0-b2d1-f41af08179cc.
[video.sevo44.ru:443] 2020-12-28 00:35:39.659 info: Creating torrent /var/www/peertube/storage/torrents/9c178338-fa10-47b0-b2d1-f41af08179cc-720.torrent.
Updating video c8dfa17f-ad7a-478a-83d0-6c53767f778a
Updating torrent file 720 of video c8dfa17f-ad7a-478a-83d0-6c53767f778a.
[video.sevo44.ru:443] 2020-12-28 00:35:42.519 info: Creating torrent /var/www/peertube/storage/torrents/c8dfa17f-ad7a-478a-83d0-6c53767f778a-720.torrent.
Updating video 2ef17574-dbc8-4111-936c-773c755141db
Updating torrent file 720 of video 2ef17574-dbc8-4111-936c-773c755141db.
[video.sevo44.ru:443] 2020-12-28 00:35:45.303 info: Creating torrent /var/www/peertube/storage/torrents/2ef17574-dbc8-4111-936c-773c755141db-720.torrent.
Updating video 753df8df-5bae-4bef-8d3c-5bb688a8c0fb
Updating torrent file 304 of video 753df8df-5bae-4bef-8d3c-5bb688a8c0fb.
[video.sevo44.ru:443] 2020-12-28 00:35:51.759 info: Creating torrent /var/www/peertube/storage/torrents/753df8df-5bae-4bef-8d3c-5bb688a8c0fb-304.torrent.
[peertube@video peertube-latest]$

После успешного выполнения перезагрузите Nginx и PeerTube

nginx -s reload
systemctl start peertube

Смена пароля администратора PeerTube

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

cd /var/www/peertube/peertube-latest && NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run reset-password -- -u root

Заключение

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

Однозначно делайте резервную копию системы перед обновлением и тогда вам не страшны любые сюрпризы при обновлениях.

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

За время использования много раз слышал спасибо от родни за то что теперь они могут без проблем смотреть семейное видео и делится им.

Больше всего ушло на то чтобы вытащить со всех щелей семейное видео и загрузит в одно место.

GLPI установка на CentOS

Расскажу про установку системы GLPI на операционную систему CentOS. Удобней системы для ведения ИТ-инфраструктуры я не встречал. Кроме ведения заявок можно контролировать рабочие станции, вести справочную документацию и много чего ещё делать.

Введение

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

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

  • Удобное ведение поступивших заявок —  заявки поступившие в систему не забываются и не надо вести дополнительных блокнотов;
  • Хронология каждой заявки — в процессе решения собирается вся необходимая информация в одном месте;
  • История заявок — в случае проблем с заказчиком всегда можно посмотреть все события по заявке и освежить в памяти события которые со временем забываются.

Требования к системе предъявлялись следующие:

  • Свободная система работающая на свободных операционных системах;
  • Система должна активно развиваться и иметь возможность простого обновления;
  • Система должна работать на популярном языке программирования;
  • Возможность удобной подачи заявки и последующего ведения;
  • Ведение в одной системе разных организаций;
  • Гибкое администрирование уровня доступа пользователей;
  • Создание базы знаний для пользователей;
  • Использование доменных пользователей;
  • Личный планировщик заданий.

Перепробовал большое количество разных систем, но остановился на GLPI, так как эта система максимально удовлетворяет всем моим требованиям и позиционирует себя как свободный менеджер ИТ-инфраструктуры.

Основное что меня порадовало в системе GLPI это:

  • Систему GLPI можно установить на простой хостинг как обычный сайт так как он написан на PHP (при условии что можно сделать некоторые специфические настройки);
  • Настроек очень много и это позволяет реализовать практические любые пожелания;
  • Простота и продуманность обновления;
  • Информативность по выполняемым действиям очень радует, так как можно посмотреть подробную историю как действий пользователей так и автоматических заданий;
  • Расширение возможностей с помощью большого количества дополнений;
  • Почти во всех настройках есть история изменений где можно посмотреть кто и что делал;
  • Делать резервные копии базы данных перед серьезными настройками в системе GLPI.

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

Еще один из главных аргументов которые меня склонили к окончательному выбору системы это то что в разработке принимает активное участие Remi Collet и ведет поддержку GLPI в своем репозитории.

В статье вы узнаете полную версию установки на операционную систему CentOS c нуля.

Подготовка сервера

Дальнейшая информация в статье подразумевает что вы воспользовались статьёй CentOS 8 установка и настройка.

Скачивание последней версии GLPI

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

mkdir -p /var/www/support.sevo44.ru/log

-p -- создаст все отстутствующие папки в пути

Идем на сайт GLPI и смотрим последнюю версию версию.

В нашем случаем последняя стабильная версия GLPI version 9.4.4.

Переходим в корневую папки для сайта и скачиваем туда архив с исходниками GLPI:

cd /var/www/support.sevo44.ru
wget https://github.com/glpi-project/glpi/releases/download/9.4.4/glpi-9.4.4.tgz

Устанавливаем архиватор tar, если его нет:

dnf install tar

Распаковываем архив:

tar zxvf glpi-9.4.4.tgz

Переименовываем папку glpi в www:

mv glpi www

Переходим к настройки программного обеспечения необходимого для работы GLPI.

Настройка доступа по SFTP

Настроим удобный и безопасный доступ к файлам сайта.

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

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

В нашем случае мы настраиваем доступ к сайту support.sevo44.ru. Добавим пользователя с нужными параметрами и создадим ему пароль:

useradd -s /sbin/nologin support.sevo44.ru
passwd support.sevo44.ru

Добавляем пользователя nginx в группу support.sevo44.ru:

usermod -aG support.sevo44.ru nginx

Открываем конфигурационный файл ssh находящийся по пути /etc/ssh/sshd_config. Комментируем один параметр и добавим необходимый код:

vim /etc/ssh/sshd_config
= необходимые изменения и добавления =
# Закоментируем параметр
#Subsystem sftp /usr/lib64/misc/sftp-server

# Для работы sftp
Subsystem sftp internal-sftp
# Для support.sevo44.ru
Match User support.sevo44.ru
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
PermitTunnel no
ForceCommand internal-sftp
ChrootDirectory /var/www/support.sevo44.ru
# /support.sevo44.ru

Перезапускаем службу sshd:

systemctl restart sshd

Назначаем владельцем содержимого сайта пользователя которого мы создали выше:

chown -R support.sevo44.ru:support.sevo44.ru /var/www/support.sevo44.ru/

Возвращаем обратно рута владельцем корня сайта:

chown root. /var/www/support.sevo44.ru/
chown root. /var/www/support.sevo44.ru/log/

Все папки в пути /var/www/support.sevo44.ru/ должны быть пользователя root!

Только в таком варианте все будет корректно работать!

Для безопасности запретим пользователю редактировать папку log.

Редактирование будет возможно только в папке WWW где находятся все файлы сайта!

Даем необходимые права на папки и файлы

Найдём в папке /var/www/support.sevo44.ru/www все файлы (f) и выставим им права 644 а для всех папок (d) выставим права 755:

find /var/www/support.sevo44.ru/www -type f -exec chmod 644 {} \;
find /var/www/support.sevo44.ru/www -type d -exec chmod 755 {} \;

Подключаемся по sftp и если подключились продолжаем настройку дальше.

Установка PHP

Устанавливать версию PHP будем с репозитория Remi Collet. Более подробно как работать c репозиторием можно из статьи PHP от Remi для CentOS.

Подключаем репозиторий и активируем версию php 7.2:

dnf install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf module reset php
dnf module enable php:remi-7.2

Подключаем расширенный вариант репозитория Remi:

yum-config-manager --disable remi-safe
yum-config-manager --enable remi

С репозитория Remi можно установить GLPI, но настроен он будет для работы с Apache.

Установим Php версии 7.2 со всеми необходимыми пакетами. Возможно их больше чем необходимо, но именно они устанавливаются если устанавливать используя репозиторий Remi:

dnf install php php-psr-container php-symfony-common php-jsonlint php-mysqlnd php-composer-semver php-psr-simple-cache php-bcmath php-htmLawed php-intl php-sabre-xml2 php-zendframework-zend-stdlib php-symfony-config php-Monolog php-phpmailer6 php-symfony-browser-kit php-zendframework-zend-serializer php-symfony-event-dispatcher php-symfony3-debug php-pecl-imagick php-json php-fedora-autoloader php-process php-pdo php-container-interop php-symfony-class-loader php-symfony-process php-symfony-finder php-cli php-fpm php-symfony-css-selector php-symfony-expression-language php-composer-ca-bundle php-composer-spdx-licenses php-psr-cache php-sabre-uri2 php-seld-phar-utils php-ldap php-pecl-selinux php-iamcal-lib-autolink php-symfony-polyfill php-pecl-zip php-tidy php-imap php-xmlrpc php-mbstring php-zendframework-zend-servicemanager php-symfony-yaml php-symfony-dependency-injection php-simplepie php-elvanto-litemoji php-paragonie-random-compat php-sabre-vobject4 php-symfony-dom-crawler php-symfony-http-foundation php-zendframework-zend-json php-zendframework-zend-cache php-symfony-console php-symfony-http-kernel php-symfony3-common php-symfony3-console php-tcpdf php-common php-PsrLog php-pecl-apcu php-symfony-filesystem php-symfony-debug php-composer-xdebug-handler php-markdown php-sebastian-diff3 php-opcache php-xml php-zendframework-zend-eventmanager php-IDNA_Convert php-justinrainbow-json-schema5 php-scssphp php-true-punycode php-zendframework-zend-i18n php-gd php-symfony-var-dumper php-pear-CAS

На сайте разработчика GLPI вы можете посмотреть какие требования предъявляются для php.

Внесем необходимые изменения в файл настроек php.ini:

vim /etc/php.ini
= необходимые изменения =
# Запрет на исполнение произвольного кода на сервере с правами php процесса при загрузке файла.
cgi.fix_pathinfo=0
# Необходимая временная зона
date.timezone = "Europe/Moscow"

Запускаем php-fpm и добавляем в автозагрузку:

systemctl enable --now php-fpm

Запускать php-fpm будем через unix сокет. Для этого переименуем конфиг /etc/php-fpm.d/www.conf, создадим новый и приводим к следующему виду:

mv /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf_orig
vim /etc/php-fpm.d/www.conf
= необходимый код =
[www]
user = nginx
group = nginx

listen = /run/php-fpm/www.sock
listen.mode = 0660
listen.owner = nginx
listen.group = nginx

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

;pm.process_idle_timeout = 10s;
;pm.max_requests = 500

Назначим каталогу /var/lib/php правильное владение:

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

Перезапускаем php-fpm командой:

systemctl restart php-fpm

Проверяем, стартовал ли указанный сокет:

ll /run/php-fpm/www.sock
srw-rw---- 1 nginx nginx 0 фев 13 10:35 /run/php-fpm/www.sock

Всё успешно настроено.

Создадим отдельный пул для php-fpm, который будет обслуживать сайт support.sevo44.ru на котором и будет работать GLPI. Удобно когда для каждого сайта используется независимый пул в котором можно выставить необходимые значения.

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

cd /etc/php-fpm.d/
cp www.conf support.sevo44.ru.conf
vim /etc/php-fpm.d/support.sevo44.ru.conf
= необходимые параметры =
[support.sevo44.ru]
user = support.sevo44.ru
group = support.sevo44.ru

listen = /run/php-fpm/support.sevo44.ru.sock
listen.mode = 0660
listen.owner = support.sevo44.ru
listen.group = support.sevo44.ru

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

;pm.process_idle_timeout = 10s;
;pm.max_requests = 500

Перезапускаем:

systemctl restart php-fpm

Проверяем работу пула:

ll /run/php-fpm/support.sevo44.ru.sock
= вывод команды =
srw-rw---- 1 support.sevo44.ru support.sevo44.ru 0 ноя 10 16:34 /run/php-fpm/support.sevo44.ru.sock

Все работает как надо и в настройках Nginx для сайта мы укажем этот пул.

Установка NGINX

Более подробно как работать c Nginx можно из статьи NGINX установка и настройка.

Создадим файл использующий стабильный репозиторий:

vim /etc/yum.repos.d/nginx.repo
= необходимый код =
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

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

dnf install nginx

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

systemctl enable --now nginx

Проверяем работу:

curl http://localhost
= вывод команды =
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

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

vim /usr/share/nginx/html/index.html
= необходимый код =
<!DOCTYPE html>
<html>
<head>
<title>Welcome!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working.</p>
<p><em>lemp.sevo44.loc</em></p>
</body>
</html>

Переименуем главный конфигурационный файл Nginx и создадим новый с нужными параметрами:

mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf_orig
vim /etc/nginx/nginx.conf
= необходимый код c пояснениями=
# Пользователь и группа, от имени которых будет запущен процесс
user nginx nginx;
# Число воркеров в новых версиях рекомендовано устанавливать параметр auto
worker_processes auto;
# Уровни лога debug, info, notice, warn, error, crit, alert или emerg
# перечислены в порядке возрастания важности. При установке определённого уровня
# в лог попадают все сообщения указанного уровня и уровней большей важности.
# Например, при стандартном уровне error в лог попадают сообщения уровней error, crit, alert и emerg.
# Если параметр не задан, используется error.
error_log /var/log/nginx/error.log warn;
# Файл в котором будет храниться идентификатор основного процесса
pid /var/run/nginx.pid;

events {
# Максимальное количество соединений одного воркера
worker_connections 1024;
# Метод выбора соединений (для FreeBSD будет kqueue)
use epoll;
# Принимать максимально возможное количество соединений
multi_accept on;
}

http {
# Отключить вывод версии nginx в ответе
server_tokens off;
# Указываем файл с mime-типами и указываем тип данных по-умолчанию
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Формат для лога доступа и путь к файлу
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
# Метод отправки данных sendfile эффективнее чем read+write
sendfile on;
# Ограничивает объём данных, который может передан за один вызов sendfile().
# Нужно для исключения ситуации когда одно соединение может целиком захватить воркер
sendfile_max_chunk 128k;
# Отправлять заголовки и начало файла в одном пакете
tcp_nopush on;
tcp_nodelay on;
# Параметр задаёт таймаут, в течение которого keep-alive соединение с клиентом не будет закрыто со стороны сервера
keepalive_timeout 65;
# Сбрасывать соединение если клиент перестал читать ответ
reset_timedout_connection on;
# Разрывать соединение по истечению таймаута при получении заголовка и тела запроса
client_header_timeout 3;
client_body_timeout 5;
# Разрывать соединение, если клиент не отвечает в течение 3 секунд
send_timeout 3;
# Задание буфера для заголовка и тела запроса
client_header_buffer_size 2k;
client_body_buffer_size 256k;
# Ограничение на размер тела запроса
client_max_body_size 12m;
# Подключение дополнительных конфигов
include /etc/nginx/conf.d/*.conf;
}

Проверяем правильность настроек Nginx:

nginx -t
= вывод команды =
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Всё хорошо. Выполняем обновление правил без перезагрузки Nginx:

nginx -s reload

Конфигурационный файл Nginx для GLPI

Создаем фал Nginx для работы GLPI:

vim /etc/nginx/conf.d/support.sevo44.ru.conf
= необходимый код =
### support.sevo44.ru
server {
listen 80;
server_name support.sevo44.ru www.support.sevo44.ru;
root /var/www/support.sevo44.ru/www/;
index index.php index.html index.htm;

access_log /var/www/support.sevo44.ru/log/support.sevo44.ru-access.log;
error_log /var/www/support.sevo44.ru/log/support.sevo44.ru-error.log;

# Для записи в log реальных ip при использовании прокси nginx
set_real_ip_from 10.10.0.1;
real_ip_header X-Real-IP;

# Без него не грузит файлы больше 1 метра
client_max_body_size 10m;

keepalive_timeout 60;
add_header Strict-Transport-Security 'max-age=604800';

	location / {
	try_files $uri $uri/ =404;
	autoindex on;
	}

	location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {
	access_log off;
	expires max;
	}

	location /api {
	rewrite ^/api/(.*)$ /apirest.php/$1 last;
	}

	location ~ \.php$ {
	try_files $uri = 404;
	fastcgi_index index.php;
	fastcgi_pass unix:/run/php-fpm/support.sevo44.ru.sock;
	include fastcgi_params;
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	fastcgi_param SERVER_NAME $host;
	fastcgi_param HTTPS on;
	fastcgi_intercept_errors on;
    	fastcgi_ignore_client_abort off;
    	fastcgi_connect_timeout 60;
    	fastcgi_send_timeout 180;
    	fastcgi_read_timeout 180;
    	fastcgi_buffer_size 128k;
    	fastcgi_buffers 4 256k;
    	fastcgi_busy_buffers_size 256k;
    	fastcgi_temp_file_write_size 256k;
	fastcgi_param PHP_VALUE "
		memory_limit = 64M
		file_uploads = on
		max_execution_time = 600
		session.auto_start = off
		session.use_trans_sid = 0
        	";  
	}

	location = /favicon.ico {
	log_not_found off;
	access_log off;
	}

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

	location ~ /\.ht {
	deny all;
	}
}

В моем варианте сигнал проксируется с помощью Nginx прокси. Сертификат получаем на проксирующем сервере.

Более подробно про получение сертификата можно из статьи SSL бесплатный для сайта Nginx.

Проверяем и перезапускаем в случае успеха:

nginx -t
= вывод команды =
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

nginx -s reload

Установка MariaDB

Более подробно о там как работать с базой данных можно из статьи MariaDB оптимизация и установка.

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

vim /etc/yum.repos.d/mariadb.repo
= необходимый код =
# MariaDB 10.4 CentOS repository list - created 2019-10-24 18:16 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos8-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Установим MariaDB:

dnf install boost-program-options
dnf install MariaDB-server MariaDB-client --disablerepo=AppStream

Запустим и добавим в автозагрузку:

systemctl enable --now mariadb

Произведем начальную настройку:

/usr/bin/mysql_secure_installation

Для удобства работы с базой вы можете установить PhpMyAdmin и создать там базу или воспользоватся статьёй MariaDB работа из консоли и создать базу данных в консоли.

Установка и начальная настройка GLPI

Сам процесс установки и начальной настройке прост и понятен. Все дальнейшие «сюрпризы» и нюансы будут при настройке системы для работы.

Система настолько гибкая что порой начинаешь путаться во всех её возможных схемах работы.

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

Установка GLPI

Разработчики для безопасности рекомендуют вынести некоторые папки за рамки веб сервера для безопасности и об это рассказано тут.

В данном примере я не выношу папки за пределы веб сервера, хотя на практике это использую. Лишняя безопасность еще никому не вредила.

Запускаем установку введя в браузере адрес сайта.

Выбираем язык:

Соглашаемся с лицензией:

Выбираем  вариант установить:

Смотрим результат проверок:

На предупреждение не обращаем внимания так как мы не вынесли некоторые папки за пределы веб сервера по рекомендации разработчиков.

Вводим данные от базы данных:

Выбираем созданную ранее базу данных:

Проверка подключения к базе данных прошла успешно:

Соглашаемся с отправкой статистики использования если уважаем свободное программное обеспечение:

Если посмотрите по ссылке какие данные отправятся то увидите что ничего секретного там нет.

Продолжаем и при желании открываем страницу на которой сказано как можно помочь материально проекту:

В результате увидим сообщение об удачной установке и список всех пользователей по умолчанию с паролями:

Вот таким видом нас встретит страница авторизации GLPI:

Вот так выглядит главная страница при авторизации GLPI:

По рекомендации удаляем указанный файл и меняем пароль у пользователя glpi. У остальных пользователей или меняем пароль или просто отключаем их.

Настройка CRON для GLPI

Добавление в cron правильной команды один из главных моментов в GLPI, так как он будет обрабатывать все автоматические задачи.

Добавим файл с необходимым кодом:

vim /etc/cron.d/glpi
= необходимый код =
# GLPI core

# Run cron to execute task even when no user connected

*/5 * * * * root /usr/bin/php /var/www/support.sevo44.ru/www/front/cron.php

Где указаны следующие параметры:

  • */5 * * * * — задание выполняется каждые 5 минут;
  • support.sevo44.ru — пользователь которому принадлежит файл;
  • /usr/bin/php — с помощью чего обрабатывать файл;
  • /var/www/support.sevo44.ru/www/front/cron.php — путь до необходимого файла.

После добавления обязательно нужно проверить как он выполняется. Посмотрим логи cron:

cat /var/log/cron
= часть вывода кода =
Nov 10 21:57:01 support.sevo44.loc CROND[527]: (root) CMD (/usr/bin/php /var/www/support.sevo44.ru/www/front/cron.php)
Nov 10 21:58:01 support.sevo44.loc CROND[540]: (root) CMD (/usr/bin/php /var/www/support.sevo44.ru/www/front/cron.php)
Nov 10 21:59:01 support.sevo44.loc CROND[556]: (root) CMD (/usr/bin/php /var/www/support.sevo44.ru/www/front/cron.php)

Из вывода видно что задачи успешно выполняются каждую минуту.

Ротация логов

В системе GLPI присутствует свой хороший механизм логирования, но держать логи на уровне сайта не помешает.

Настроим сразу ротацию логов что бы при необходимости было удобно их просматривать.

Создадим необходимый файл:

vim /etc/logrotate.d/sites
= необходимый код =
/var/www/support.sevo44.ru/log/*.log
{
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 644 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}

Согласно кода ротация будет проводится раз в день, и хранить архивы будет 52 дня. Файлы будут сжиматься и иметь права 644.

Backup сайта GLPI

После настройки настоятельно рекомендую настроить резервное копирование файлов и базы данных. Посмотреть о том как я произвожу резервное копирование в подобных случаях можно из статьи Backup надежный и безопасный.

Изменения в файлах GLPI

Обычно я сторонник не вносить изменения в файлы разработчика, но в данном случае мне они кажутся разумными и снимают ненужные вопросы от пользователей системы.

Произведем изменении графики:

  • pics/favicon.ico — иконка сайта;
  • pics/fd_logo.png — логотип справа после авторизации;
  • pics/login_logo_glpi.png — логотип при авторизации.

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

Изменим заголовок сайта до авторизации:

index.php
=== примерно 76 строка ===
echo '<head><title>'.__('CЭВО:Техподдержка - Аутентификация').'</title>'."\n";

Изменим заголовок сайта после авторизации:

inc/html.class.php
=== примерно 1203 строка ===
echo "<!DOCTYPE html>\n";
echo "<html lang=\"{$CFG_GLPI["languages"][$_SESSION['glpilanguage']][3]}\">";
echo "<head><title>CЭВО:Техподдержка - ".$title."</title>";
echo "<meta charset=\"utf-8\">";

Замена в теме письма GPLI на Ticket:

inc/notificationtargetticket.class.php
=== примерно 63 строка ===
    if (empty($perso_tag)) {
       $perso_tag = 'Ticket';
     }
     return sprintf("[$perso_tag #%07d] ", $this->obj->getField('id'));
   }
   return parent::getSubjectPrefix();
}

Убираем внизу сообщений информацию Automatically generated by GLPI:

inc/notificationtemplate.class.php
=== По поиску в 2 местах меняем ===
Automatically generated by GLPI ---> Сгенерировано автоматически

Обновление GLPI

Механизм обновления разработчиками продуман и хорошо документируется. При правильном подходе проблем с обновлением не возникнет. Например, мне без проблем удается обновлять уже в течении трех лет.

Перед обновление обязательно посмотрите какие у Вас установлены плагины и проверьте будут ли они работать в новой версии. В случае если плагина для новой версии еще нет Вам необходимо отказаться от его использования или повременить с обновлением GLPI.

Не забудьте проверить какие требования к программному обеспечению новой версии GLPI.

Перед обновление обязательно делайте резервную копию файлов и базы данных.

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

О том как сделать доступ к сайту по паролю средствами Nginx Вы можете посмотреть тут.

Посмотреть какая последняя версия и сохранить себе путь можно на странице Downloads сайта разработчика.

Переходим в корневую папку, скачиваем туда новую версию и распаковываем:

cd /var/www/support.sevo44.ru 
wget https://github.com/glpi-project/glpi/releases/download/9.5.3/glpi-9.5.3.tgz
tar zxvf glpi-9.5.3.tgz

В результате у вас появиться папка glpi.

В папке www удаляем всё кроме нескольких папок:

  • files — все файлы что загружали;
  • plugins — все плагины;
  • config — настройки db.

Теперь всё что есть в папке glpi переносим в папку www. Например, я для подобных целей использую MC.

После того как всё перенесено необходимо выставить правильного пользователя и правильные права на файлы с папками:

chown -R support.sevo44.ru:support.sevo44.ru /var/www/support.sevo44.ru/www/
find /var/www/support.sevo44.ru/www -type f -exec chmod 644 {} \; 
find /var/www/support.sevo44.ru/www -type d -exec chmod 755 {} \;

Переходим на сайт и видим информацию об обновлении.

В данном обновление необходимо настроить работу с временными зонами и в документации про это сказано.

Инициализируем данные часовых поясов из часовых поясов нашей системы:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -p -u root mysql
Enter password: пароль пользователя root mariadb

Дадим необходимые права на чтение:

mysql -u root -p
Enter password: пароль пользователя root mariadb
GRANT SELECT (`Name`) ON `mysql`.`time_zone_name` TO 'support.sevo44.ru'@'%'; 
Query OK, 0 rows affected (0.082 sec)
FLUSH PRIVILEGES;
\q

Перезапустим сервис баз данных:

systemctl restart mariadb

Больше ошибок нет и переходим к обновлению базы данных.

Нажимаем кнопку «Обновление» и получим примерно такую картину:

Мы видим что обновление произошло с 9.4.4 до 9.5.3 и указало какие действия необходимо сделать.

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

Произведем необходимые действия:

cd /var/www/support.sevo44.ru/www/bin
php console glpi:migration:timestamps
=== вывод команды ===
Found 185 table(s) requiring migration.
Do you want to continue ? [Yes/no]y
185/185 [============================] 100%
Migration done.

Возможно после обновления расширений необходимо будет повторить действие которое описано выше.

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

Не забываем произвести изменения в файлах GLPI если это делалось ранее.

Заключение

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

Установка Zabbix 4.2

Расскажу как производится установка zabbix 4.2 на систему CentOS 7. Эта статья будет первая в цикле статей посвященных мониторингу Zabbix. Долго вникал в нюансы работы Zabbix и настало время поделится этими знаниями.

Введение

Устанавливать систему мониторинга будем в контейнере LXC работающем на CentOS 7. Установка Zabbix в контейнере LXC для меня самый оптимальный вариант. Перед обновлением можно сделать снимок и в случае проблем очень оперативно вернуть систему в рабочее состояние.

Более подробно о том как развернуть систему контейнеров LXC на операционной системе CentOS 7 можно из статьи LXC установка на CentOS 7. Узнать как производится работа с контейнерами можно из статьи Работа с LXC контейнерами.

Дальнейшая информация в статье будет изложена без детальных пояснений.

Подготовка системы для установки Zabbix

Отключение SELinux

Отключаем SELinux. Его использование и настройка в системе CentOS отдельный разговор.

vi /etc/sysconfig/selinux
= меняем значение =
SELINUX=disabled

Перезагрузим для применения изменений. После перезагрузки проверяем статус:

sestatus
= вывод команды =
SELinux status: disabled

Установка NGINX

Более детально о том как работать с Nginx вы можете из статьи NGINX установка и настройка.

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

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx

Запускаем nginx и добавляем в автозагрузку выполнив команды:

systemctl start nginx
systemctl enable nginx

В нашем случае Nginx работает в контейнере LXC. Введем в консоли команду:

curl http://localhost
= вывод команды =
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Как видим Nginx работает.

Установка PHP

Более детально о том как работать с PHP вы можете из статьи PHP от Remi для CentOS 7.

Устанавливать будет версию 7.2 используя репозиторий Remi. Для этого подключаем репозиторий remi и epel-release:

yum install epel-release
rpm -Uhv http://rpms.remirepo.net/enterprise/remi-release-7.rpm

Активируем php 7.2, для этого выполняем команды:

yum install yum-utils
yum-config-manager --enable remi-php72

Устанавливаем php 7.2 и необходимые модули выполнив команду:

yum install php72 php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-bcmath

Запускаем php-fpm и добавляем в автозагрузку выполнив команды:

systemctl start php-fpm
systemctl enable php-fpm

Настроим работу php-fpm через unix сокет. Открываем необходимый конфиг и приведем его к следующему виду:

# vim /etc/php-fpm.d/www.conf
[www]
user = nginx
group = nginx

;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php-fpm.sock
listen.mode = 0660
listen.owner = nginx
listen.group = nginx

listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/session
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache

Перезапускаем php-fpm:

systemctl restart php-fpm

Проверяем работу сокета:

ll /var/run/php-fpm/php-fpm.sock
= вывод команды =
srw-rw----. 1 nginx nginx 0 Oct  4 15:08 /var/run/php-fpm/php-fpm.sock

Все работает как надо.

Установка MariaDB

Более детально о том как работать с MariaDB вы можете из статьи MariaDB оптимизация и установка.

Подключаем свежий репозиторий создав необходимый файл следующего содержания:

vim /etc/yum.repos.d/mariadb.repo
= необходимый код =
# MariaDB 10.3 CentOS repository list - created 2018-10-04 12:10 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.3/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Устанавливаем последнюю версию MariaDB выполнив команду:

yum install MariaDB-server MariaDB-client

Запускаем mariadb и добавляем в автозагрузку выполнив команды:

systemctl start mariadb
systemctl enable mariadb

Запускаем скрипт начальной конфигурации mysql и задаем пароль для root выполнив команду:

/usr/bin/mysql_secure_installation

Откроем конфигурационный файл сервера MariaDB  и приводим его к следующему виду:

vim /etc/my.cnf.d/server.cnf
= необходимые добавления =
[mysqld]
bind-address = 0.0.0.0 # разрешает подключение со всех хостов
character_set_server=utf8
collation-server=utf8_bin
init_connect="SET NAMES utf8 collate utf8_bin"
port            = 3306

socket          = /var/lib/mysql/mysql.sock

innodb_file_format=barracuda
innodb_file_per_table=1
innodb_buffer_pool_size = 1G # установить примерно в 2 раза меньше объема оперативной памяти сервера
innodb_buffer_pool_instances=1
innodb_flush_log_at_trx_commit = 0
innodb_log_file_size = 512M
innodb_strict_mode = 0
innodb_log_files_in_group = 3

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

Перезапускаем MariaDB и проверяем статус работы:

systemctl restart mariadb
systemctl status mariadb.service

Установка Zabbix

Установка состоит из двух частей. Вначале надо установить сам сервер zabbix и позже настроить web лицо для работы в системе мониторинга.

Подключение репозитория Zabbix

Подключаем репозиторий версии Zabbix 4.2 выполнив необходимую команду:

rpm -Uvh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm
= вывод команды =
Загружается https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm
предупреждение: /var/tmp/rpm-tmp.W8KoVE: Заголовок V4 RSA/SHA512 Signature, key ID a14fe591: NOKEY
Подготовка...               ################################# [100%]
Обновление / установка...
   1:zabbix-release-4.2-1.el7         ################################# [100%]

Очищаем и пересоздаем кэш yum:

yum clean all
yum makecache

Установка Zabbix сервера

Произведем установку введя в консоли следующую команду:

yum install zabbix-server-mysql zabbix-web-mysql

Создание базы данных для Zabbix сервера

Создадим базу данных, пользователя zabbix и заполним базу необходимыми данными:

mysql -uroot -p
Enter password: указываем пароль root пользователя mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.14-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

= создание бызы zabbix с необходимыми параметрами =
MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
Query OK, 1 row affected (0.003 sec)

= создание пользователя zabbix с необходимиыми правами =
MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by 'password';
Query OK, 0 rows affected (0.008 sec)

MariaDB [(none)]> exit
Bye

= заполнение базы данных необходимыми параметрами =
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
Enter password: пароль пользователя zabbix
root@zabbix-lxc-lemp.sevo44.loc / #

Редактируем файл конфигурации сервера Zabbix. Прописываем данные для подключения к БД и некоторые другие параметры:

vim /etc/zabbix/zabbix_server.conf
= необходимые данные =
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=password
ListenIP=0.0.0.0
Timeout=10

Этих минимальных настроек достаточно, для работы сервера.

Параметр Timeout увеличен, так как он отвечает за время ожидания ответа от агента. Стандартного значения в 3 секунды бывает недостаточно, когда используется Zabbix proxy или скрипт который долго выполняется для получения метрики. В случае переодических отсутсвиях данных в графиках поиграйте с этим параметром.

Запускаем zabbix и добавляем в автозагрузку выполнив команды:

systemctl start zabbix-server
systemctl enable zabbix-server

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

cat /var/log/zabbix/zabbix_server.log
= вывод команды =
2373:20190416:222404.662 Starting Zabbix Server. Zabbix 4.2.0 (revision 91746).
  2373:20190416:222404.667 ****** Enabled features ******
  2373:20190416:222404.667 SNMP monitoring:           YES
  2373:20190416:222404.667 IPMI monitoring:           YES
  2373:20190416:222404.668 Web monitoring:            YES
  2373:20190416:222404.668 VMware monitoring:         YES
  2373:20190416:222404.669 SMTP authentication:       YES
  2373:20190416:222404.669 Jabber notifications:       NO
  2373:20190416:222404.670 Ez Texting notifications:  YES
  2373:20190416:222404.671 ODBC:                      YES
  2373:20190416:222404.671 SSH2 support:              YES
  2373:20190416:222404.672 IPv6 support:              YES
  2373:20190416:222404.672 TLS support:               YES
  2373:20190416:222404.673 ******************************
  2373:20190416:222404.673 using configuration file: /etc/zabbix/zabbix_server.conf
  2373:20190416:222404.720 current database version (mandatory/optional): 04020000/04020000
  2373:20190416:222404.721 required mandatory version: 04020000
  2373:20190416:222404.838 server #0 started [main process]
  2374:20190416:222404.846 server #1 started [configuration syncer #1]
  2375:20190416:222404.855 server #2 started [alerter #1]
  2379:20190416:222404.865 server #6 started [timer #1]
  2377:20190416:222404.872 server #4 started [alerter #3]
  2378:20190416:222404.882 server #5 started [housekeeper #1]
  2376:20190416:222404.891 server #3 started [alerter #2]
  2380:20190416:222404.899 server #7 started [http poller #1]
  2381:20190416:222404.907 server #8 started [discoverer #1]
  2393:20190416:222404.916 server #20 started [poller #4]
  2395:20190416:222404.934 server #22 started [unreachable poller #1]
  2384:20190416:222404.944 server #11 started [history syncer #3]
  2399:20190416:222404.954 server #26 started [trapper #4]
  2387:20190416:222405.009 server #14 started [proxy poller #1]
  2386:20190416:222405.018 server #13 started [escalator #1]
  2388:20190416:222405.030 server #15 started [self-monitoring #1]
  2389:20190416:222405.041 server #16 started [task manager #1]
  2390:20190416:222405.051 server #17 started [poller #1]
  2407:20190416:222405.064 server #34 started [lld manager #1]
  2392:20190416:222405.077 server #19 started [poller #3]
  2394:20190416:222405.089 server #21 started [poller #5]
  2409:20190416:222405.119 server #36 started [lld worker #2]
  2383:20190416:222405.152 server #10 started [history syncer #2]
  2396:20190416:222405.160 server #23 started [trapper #1]
  2385:20190416:222405.172 server #12 started [history syncer #4]
  2398:20190416:222405.187 server #25 started [trapper #3]
  2397:20190416:222405.198 server #24 started [trapper #2]
  2400:20190416:222405.208 server #27 started [trapper #5]
  2401:20190416:222405.215 server #28 started [icmp pinger #1]
  2403:20190416:222405.225 server #30 started [preprocessing manager #1]
  2402:20190416:222405.233 server #29 started [alert manager #1]
  2391:20190416:222405.241 server #18 started [poller #2]
  2408:20190416:222405.252 server #35 started [lld worker #1]
  2382:20190416:222405.260 server #9 started [history syncer #1]
  2406:20190416:222406.068 server #33 started [preprocessing worker #3]
  2404:20190416:222406.104 server #31 started [preprocessing worker #1]
  2405:20190416:222406.135 server #32 started [preprocessing worker #2]

Должен быть примерно такой вывод.

Настройка Nginx

Так как в контейнере будет работать только Zabbix мы отредактируем дефолтный файл приведя его к виду:

vim /etc/nginx/conf.d/default.conf
= необходимый код =
server {
    listen       80;
    server_name  zabbix.sevo44.loc;
    root /usr/share/zabbix;

    location / {
    index index.php index.html index.htm;
    }

    location ~ \.php$ {
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_param PHP_VALUE "
    max_execution_time = 300
    memory_limit = 128M
    post_max_size = 16M
    upload_max_filesize = 2M
    max_input_time = 300
    date.timezone = Europe/Moscow
    always_populate_raw_post_data = -1
    ";
    fastcgi_buffers 8 256k;
    fastcgi_buffer_size 128k;
    fastcgi_intercept_errors on;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
        }
}

Проверим конфиг на ошибки и если все в порядке, перезапустим Nginx:

nginx -t
= вывод команды =
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

= перезапустим nginx =
nginx -s reload

Настройка Nginx на хосте LXC

В нашем случаем на хосте на котором работает система LXC необходимо настроить Nginx для проксирования сигналов в контейнер.

В параметрах расписано два варианта работы. Параметры для работы с SSl закоментированны:

vim /etc/nginx/conf.d/proxy-zabbix.sevo44.loc.conf
= необходимый код =
# ssl zabbix.sevo44.loc
#server {
#listen 80;
#server_name zabbix.sevo44.loc www.zabbix.sevo44.loc;
#rewrite ^ https://$server_name$request_uri? permanent;
#}

server {
listen 80;
#listen 443 ssl http2;
server_name zabbix.sevo44.loc www.zabbix.sevo44.loc;

### ssl
#ssl on;
#ssl_certificate /etc/letsencrypt/live/zabbix.sevo44.loc/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/live/zabbix.sevo44.loc/privkey.pem;
#ssl_session_timeout 5m;
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#ssl_dhparam /etc/ssl/certs/dhparam.pem;
#ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
#ssl_prefer_server_ciphers on;
#ssl_session_cache shared:SSL:10m;

#location /.well-known/acme-challenge/ {
#root /var/www/ssl/zabbix.sevo44.loc/;
#}

# Включение сжатия GZIP
# Если используется NGINX proxy надо настраивать на нём!!!
gzip on;
gzip_static on;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/x-icon image/svg+xml application/x-font-ttf;
gzip_comp_level 6;
gzip_proxied any;
gzip_min_length 1000;
gzip_disable "msie6";
gzip_vary on;

location / {
proxy_pass http://10.10.0.6:80;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
# Вставил ниже когда было ограничение на зугрузку файлов свыше 1 метра
# так же нужна строчка в файле настройки сайта
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 6000;
proxy_read_timeout 6000;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}

Проверим конфиг на ошибки и если все в порядке, перезапустим Nginx:

nginx -t
= вывод команды =
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
nginx -s reload

В случае если вам захочется перевести работу сервера Zabbix на протокол https вам будет достаточно по статье SSL бесплатный для сайта Nginx получить бесплантый сертификат и подредактировать вышеизложенный конфиг.

Настройка Zabbix для работы с Nginx

Важный нюанс. Надо изменить права доступа на некоторые папки. Назначить владельца nginx. Этот шаг нужно будет проделывать после каждого обновления php или zabbix. Связано с тем, что по-умолчанию zabbix идет в комплекте с apache и рассчитан на работу с ним. Поэтому после установки или обновления, он делает его владельцем директории /etc/zabbix/web.

chown -R nginx:nginx /var/lib/php/session
chown -R nginx:nginx /etc/zabbix/web

Настройка DNS для работы с сервером Zabbix

Осталось добавить домен в DNS или как к моем случае добавим строчку в файл /etc/hosts на компьютере с которого будем открыват

vim /etc/hosts
= необходимый параметр =
192.168.0.103 zabbix.sevo44.loc

Порты работы Zabbix

Заостряю ваше внимание на том с какими портами работает Zabbix это важно если в работе вы будете использовать как активный так и пасивный агент. В татье про настройку Zabbix я более подробно распишу как это делается.

В система Zabbix используется два порта:

  • 10050 — порт по которому zabbix опрашивает клиентов (пасивный агент);
  • 10051 — порт на котором zabbix получает данные от активных клиентов (активный агент).

На сервере Zabbix должен быть открыт порт 10051, на клиенте порт 10050.

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

= открыть порт 10051 =
firewall-cmd --permanent --zone=public --add-service=zabbix-server

= применить изминения =
firewall-cmd --reload

Из статьи FirewallD базовая настройка вы можете узнать как настраиваются доступы.

Настройка Zabbix внешнего интерфейса

Переходим к настройки web лица. Вводим в браузере доменое имя нашего сервера Zabbix, в моем случае это http://zabbix.sevo44.loc

Видим страницу приветствия.

На следующей странице  происходит проверка параметров перед установкой. Все параметры должы иметь статус OK.

Указываем данные для работы с сервером MariaDB.

Детали Zabbix сервера можно не менять.

После вывода страници с параметами которые вы указали получите финальное сообщение об успешной устаноке web лица.

Окно авторизации Zabbix сервера.

Стандартная учетная запись для входа в web интерфейс zabbix следующая:

  • Admin — пользователь;
  • zabbix — пароль.

После авторизации вы увидите стандартный dashboard.

 

Установка и настройка Zabbix сервера закончена.

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

Заключение

Из статьи вы узнали как производится установка сервера Zabbix на операционную систему CentOS 7. Рассказывать про дальнейшую настройку сервера и агентов я специально не стал. Работаю с системой давно, но понять до конца как она работает и как настраивается я смог недавно. Статей про установку множество и про начальную настройку тоже, но вот понятным языком для людей которые только начинают заниматься администрированием систем я не нашел. Документация Zabbix хороша, но она написана техническим языком который могут понять далеко не все. Например, я долго разбирался с тем как настроить работу активного и пассивного клиента. Знаю точно, что если убрать небольшие сложности при начальном этапе внедрения системы мониторинга Zabbix эта система удовлетворит практически любые требования для мониторинга любых параметров в любой операционной системе.

В следующих статьях я детально расскажу:

Будет множество статей о том как производить мониторинг разных параметров.

NGINX установка и настройка

Установим и настроим Nginx на системе Rocky Linuxи или любого дистрибутива семейства RHEL. Рассмотрим разные варианты использования сервиса. Использование Nginx для web проектов работающих на бюджетных хостингах или железе — лучший вариант.

Введение

Из этой статьи вы узнаете про основные моменты работы с Nginx на системах CentOS, Rocky Linux и любого дистрибутива семейства любое семейство RHEL. Более подробно о работе с Nginx можно узнать на сайте разработчика в разделе документации. Долгое время лидирующие позиции занимал Apach, но новый продукт кардинально изменил подход к обработке команд и позволяет обслуживать высоко нагруженные сайты на бюджетном железе. Более детально узнать про автора Игоря Сысоева и ознакомится с принципами работы вы можете на просторах сети интернет. От себя лишь скажу что теперь это моя основная и любимая связка при организации веб сервера по причине быстроты и удобства работы.

Установка NGINX

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

Для установки самой свежей стабильной версии Nginx на СentOS или Rocky Linux (любое семейство RHEL) подключим родной репозиторий выполнив следующие действия:

= Установим необходимую зависимость =
dnf install yum-utils

= Создадим файл с репозиторием и обновим систему = 
vim /etc/yum.repos.d/nginx.repo
=== Необходимый код для внесения ===
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

= Обновим систему =
dnf update

Установим выполнив команду:

dnf install nginx

Перед установкой убеждаемся что установка идет с репозитория nginx.

Запустим и добавим в автозагрузку:

systemctl start nginx
systemctl enable nginx

= Можно одной командой =
systemctl enable --now nginx

Для проверки выполним команду в консоли:

curl http://localhost
= вывод команды =
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Видим код страницы. NGINX работает.

Например, мне не удобно видеть такую страницу по умолчанию и я привожу её к следующему виду:

vim /usr/share/nginx/html/index.html
= необходимый код =
<!DOCTYPE html>
<html>
<head>
<title>Welcome!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working.</p>

<p><em>lemp.sevo44.loc</em></p>
</body>
</html>

Используя такую страницу я всегда понимаю на какой сервер я попадаю.

Настройка NGINX

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

nginx -t

Варианты конфигурации для сайтов

Дальше надо определится как будем работать с настройкой сайтов.
Существует два пути:

  • редактирование всё в одном файле;
  • для каждого сайта сделать свой файл настроек.

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

Главный конфигурационный файл

Переименуем оригинальный конфигурационный фал Nginx и создадим новый внеся необходимый код:

mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf_orig
vim /etc/nginx/nginx.conf
= необходимый код =
user nginx;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 30000;
pid /var/run/nginx.pid;
pcre_jit on;

events {
worker_connections 8192;
multi_accept on;
}

http {
# Basic #######################
sendfile on;
tcp_nopush on;
tcp_nodelay on;
reset_timedout_connection on;
keepalive_timeout 120;
keepalive_requests 1000;
types_hash_max_size 2048;
server_tokens off;
send_timeout 30;
client_body_timeout 30;
client_header_timeout 30;
server_names_hash_max_size 4096;

# Limits ######################
client_max_body_size 10m;
client_body_buffer_size 128k;
client_body_temp_path /var/cache/nginx/client_temp;

proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 4k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_temp_path /var/cache/nginx/proxy_temp;

include /etc/nginx/mime.types;
default_type application/octet-stream;

# Logs ########################
log_format main '$remote_addr - $host [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'rt=$request_time ut=$upstream_response_time '
'cs=$upstream_cache_status';
log_format full '$remote_addr - $host [$time_local] "$request" '
'request_length=$request_length '
'status=$status bytes_sent=$bytes_sent '
'body_bytes_sent=$body_bytes_sent '
'referer=$http_referer '
'user_agent="$http_user_agent" '
'upstream_status=$upstream_status '
'request_time=$request_time '
'upstream_response_time=$upstream_response_time '
'upstream_connect_time=$upstream_connect_time '
'upstream_header_time=$upstream_header_time';

access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;

# Gzip ########################
gzip on; 
gzip_static on; 
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/x-icon image/svg+xml application/x-font-ttf;
gzip_comp_level 9;
gzip_proxied any;
gzip_min_length 1000;
gzip_disable "msie6";
gzip_vary on;

etag off;

# Cache #######################
#proxy_cache_valid 1m;
#proxy_cache_key $scheme$proxy_host$request_uri$cookie_US;
#proxy_cache_path /web/sites/nginx_cache levels=1:2 keys_zone=main:1000m;

# Zone limits ################
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_req_zone $binary_remote_addr zone=lim_5r:10m rate=5r/s; # lim for dynamic page
limit_req_zone $binary_remote_addr zone=lim_1r:10m rate=1r/s; # lim for search page
limit_req_zone $binary_remote_addr zone=lim_10r:10m rate=10r/s;

# SSL #########################
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets on;
ssl_protocols TLSv1.2 TLSv1.3;
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers 'TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:ECDHE:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
resolver 8.8.8.8;

include /etc/nginx/conf.d/*.conf;

# For monitoring ###########
#server {
#listen 127.0.0.1:80;
#server_name status.localhost;
#keepalive_timeout 0;
#allow 127.0.0.1;
#deny all;
#access_log off;

#location /server-status {
#stub_status on;
#}

#location /status {
#access_log off;
#allow 127.0.0.1;
#deny all;
#include fastcgi_params;
#fastcgi_pass unix:/run/php-fpm/www.sock;
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#}
#}
}

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

Конфигурации Nginx для сайтов

Связка c PHP осуществляется с использованием php-fpm. Узнать более подробно можно из статьи PHP от Remi для CentOS 7.

Рассмотрим на примере конфигурации для сайта на котором работает phpMyAdmin. Конфигурационный файл выглядит следующим образом:

#pma.sevo44.loc
server {
listen 80;
server_name pma.sevo44.loc www.pma.sevo44.loc;

access_log /var/www/pma.sevo44.loc/log/pma.sevo44.loc-access_log main;
error_log /var/www/pma.sevo44.loc/log/pma.sevo44.loc-error_log info;

root /var/www/pma.sevo44.loc/www/;
index index.php;

location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.socket;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
}

Запросы на ресурс будут осуществятся с проксирующего сервира Nginx. О том как перевести ресурс на работу по https вы узнаете ниже.

Доступ по IP адресу

Бывают случаи когда необходимо помимо домена попадать на ресурс по ip адресу и для этого достаточно добавить один параметр в файл настройки для ресурса.

= часть кода с примером =
server { 
listen 80 default_server; 
server_name pma.sevo44.loc www.pma.sevo44.loc;

Доступ к ресурсу по паролю

Иногда для безопасности необходимо закрыть ресурс на пароль. Сделаем это средствами Nginx используя механизм basic auth.

Добавим в секцию server необходимого сайта код:

= необходимый код =
### Авторизация по паролю используя basic auth
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;

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

=== Команда которая создаст пользователя pma ===
sh -c "echo -n 'pma:' >> /etc/nginx/.htpasswd"

=== Команда для создания пароля пользователю pma ===
sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"

= Вывод команды с пояснениями =
Password: пароль
Verifying - Password: повтор пароля

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

cat /etc/nginx/.htpasswd 
= вывод команды =
pma:$apr1$7xGrtwfB$fZNKV9J5fjr%fbvfMuhPvSFS0

Можно добавлять любое количество пользователей меняя только имя создаваемого пользователя.

Для смены текущего пароля пользователя достаточно выполнить команду по созданию пароля без добавления пользователя а потом зайти в файл и последнюю строчку вида $apr1$7xG6owfB$fZNKV9J5gjjj^YfMuhPvSFSв заменить пользователю которому меняем пароль.

После обновления конфигурации Nginx при попытке зайти на ресурс мы увидим простую форму где необходимо внести наши данные.

Параметры php для сайта

На одном сервере может быть разное количество сайтов которые используют одну версию php, но для каждого нужны своим определённые параметры. С решением этой задачи легко справляется Nginx. Например, я не редактирую базовый файл с настройками версии php а для каждого ресурса создаю свои персональные настройки. Кроме того, иногда нет возможно подправить базовый файл так чтобы он удовлетворял условиям всех сайтов.

Для просмотра действующих параметров php необходимо создать файл на требуемом ресурсе и добавить туда следующий код:

vim info.php
= необходимый код =
<?php
phpinfo();
?>

Теперь с учетом того что файл создали в корне сайте необходимо открыть его https://ваш домен/info.php и увидеть все реально действующие параметры для данного ресурса.

Смотрим те параметры что нам надо и добавляем их по аналогии к существующим в коде ниже.

Значения для параметров которые возможны всегда можно посмотреть в комментариях базового файла php.ini

Вот так добавив требуемый код в необходимый блок я задал свои параметры для размера загружаемых файлов и выставил необходимую локализацию:

location ~ \.php$ {
fastcgi_pass unix:/var/opt/remi/php80/run/php-fpm/sevo44.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param HTTPS on;
fastcgi_param PHP_VALUE "
# max_execution_time = 300
# short_open_tag = On
post_max_size = 12M
upload_max_filesize = 12M
# max_input_time = 300
date.timezone = Europe/Moscow
";
}

После необходимых изменений проверяем правильность кода и в случае успеха перегружаем Nginx:

nginx -t
= вывод команды =
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

nginx -s reload

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

Команды управления

Обновление параметров без перезагрузки сервиса (рекомендуемый вариант):

nginx -s reload
= или =
systemctl reload nginx

Полная перезагрузка сервиса

systemctl restart nginx

Остановка и запуск соответственно:

systemctl stop nginx
systemctl start nginx

Проксирования запросов на удаленный сервер

В локальной сети может работать множество сайтов. Самый лучший способ это настроить одну точку входа и оттуда переправлять запросы на ресурсы в локальной сети. Nginx прекрасно с этим справляется используя модуль ngx_http_proxy_module. Более подробно о том как можно настраивать проксирование запросов вы можете в документации разработчика.

Мне нравится использовать эту технологию так как она позволяет:

  • Работа всех ресурсов по https. На проксирующем сервере мы получаем сертификаты для всех ресурсов а перенапровление запросов идет по http. Контролировать получение сертификатов SSL в одном месте для всех сайтов локальной сети очень удобно;
  • Смена мест размещения ресурсов. Перевозить сервер на новое место не вызывает проблем. Достаточно настроить сайт на новом месте а потом просто поменять ip адресс на проксирующем Nginx.
  • Проксирование папок или фалов. Для оптимизации работы ресурса можно распределять нагрузку на разные ресурсы. Например, перенести загрузку определенных фалов (фотографии) или папок на другие сервера.

Для примера, так же будем использовать проксирование запросов для phpMyAdmin.

Параметры в используемом примере следующие:

  • pma.sevo44.ru — домен ресурса;
  • 10.10.0.1 — ip адрес ресурса с которого пересылается запрос. Проксирующий сервер работает на сервера в котором проксирование проходит на контейнеры LXC которые работают в своей сети 10.10.0.0/24;
  • 10.10.0.4 — ip ресурса на который происходит проксирование сигналов.

Настройка на проксирующем Nginx

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

Из приведенного примера ниже вы узнаете:

  • Как осуществлять редирект с http на https;
  • Включение сжатия GZIP для ресурса;
  • Настройки для работы https. Узнать более подробно о том как получать сертификат SSl можно из статьи «SSL бесплатный для сайта Nginx«;
  • Работа ресурса по http2;
  • Команды переправляющие ip адрес для правильного отображения в логах;
  • Настройка размера файлов которые можно загружать на проксируемый ресурс;
  • Папка которая будет использована для получения сертификата ssl.
### ssl pma.sevo44.ru
### Перенаправление с http на https
#server {
#listen 80;
#server_name pma.sevo44.ru www.pma.sevo44.ru;
#rewrite ^ https://$server_name$request_uri? permanent;
#}
server {
### Перевод работы ресурса на https c http2
#listen 443 ssl http2;
listen 80;
server_name pma.sevo44.ru www.pma.sevo44.ru;
### Включение сжатия GZIP
### Если используется NGINX proxy надо настраивать на нём!!!
#gzip on;
#gzip_static on;
#gzip_types text/plain text/css application/json application/x-#javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/x-icon image/svg+xml application/x-font-ttf;
#gzip_comp_level 6;
#gzip_proxied any;
#gzip_min_length 1000;
#gzip_disable "msie6";
#gzip_vary on;
### ssl
#ssl on;
#ssl_certificate /etc/letsencrypt/live/pma.sevo44.ru/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/live/pma.sevo44.ru/privkey.pem;
#ssl_session_timeout 5m;
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#ssl_dhparam /etc/letsencrypt/dhparam.pem;
#ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
#ssl_prefer_server_ciphers on;
#ssl_session_cache shared:SSL:10m;
### Папка используемая для получения сертификата ssl
location /.well-known/acme-challenge/ {
root /var/www/ssl/pma.sevo44.ru/;
}
location / {
### Ip адрес проксируемого ресурса
proxy_pass http://10.10.0.4:80;
### Настройки для передачи в логи проксируемых ресурсов реальных ip
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
### Код для указания размера максимальной зугрузки файлов 10 M
### так же нужна строчка в файле настройки сайта
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 6000;
proxy_read_timeout 6000;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}

Настройка на проксируемом ресурсе

Исходя из настроек на проксируещем сервере конфурационный файл проксируемого ресурса имеет следующий вид:

### pma.sevo44.ru
server {
listen 80;
server_name pma.sevo44.ru www.pma.sevo44.ru;

access_log /usr/share/phpMyAdmin/log/pma.sevo44.ru-access_log main;
error_log /usr/share/phpMyAdmin/log/pma.sevo44.ru-error_log info;

root /usr/share/phpMyAdmin/;
index index.php;

### Для записи в log реальных ip
set_real_ip_from 10.10.0.1;
real_ip_header X-Real-IP;

location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param HTTPS on;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
} 
}

Проксирование директории или файлов

Секции должны входить в блок server.

Например, проксируем папку foto находящуюся на другом ресурсе:

location /foto/ {
proxy_pass http://192.168.0.200:80; 
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect default;
}

Для проксирования файлов с форматом gif,jpg,png код будет иметь следующий вид:

location / {
proxy_pass http://192.168.0.200:80; 
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}

location ~ \.(gif|jpg|png)$ { 
root /web/sites/blog.zeroxzed.ru/www/images; 
}

Вывод

Каждый ресурс индивидуален. В статье приведены только самые основы и для того чтобы настроить работу ресурса максимально оптимально для работы вам придется используя документацию разработчика. Особое внимание следует уделить директивам кэширования proxy_cache так как они очень сильно могут влиять на скорость работы ресурса.

SFTP настройка для веб хостинга

SFTP удобное и безопасное подключение к файлам ресурса используя ssh. Инструкцию можно использовать для любых систем Linux. Отличие только в командах на перезапуск сервисов Nginx, Php-fpm, SSH и путях к файлам настройки.

Введение

Ранее я использовал для работы с файлами сайтов программу ProFTP, но отказался в пользу SFTP из за более стабильной работы и простоты настройки. Настройка показана на примере CentOS 7.

С статье на сайте можете узнать про настройку доступа по FTP к сайтам на сервере VDS под управлением CentOS 7 используя программу ProFTPd. Создание файловой базы пользователей для авторизации с правами от Nginx. Подключение с использованием сертификата для TLS.

Добавление пользователя

Создадим пользователя которому дадим права на файлы ресурса. Удобно использовать имя пользователя пересекающееся с названием сайта.

В нашем случае мы настраиваем доступ к сайту sevo44.ru. Добавим пользователя с нужными параметрами и создадим ему пароль:

useradd -s /sbin/nologin sevo44.ru 
passwd sevo44.ru

Добавляем пользователя nginx в группу sevo44.ru.

usermod -aG sevo44.ru nginx

Настройка SSH для SFTP

Открываем конфигурационный файл ssh находящийся по пути /etc/ssh/sshd_config. Комментируем один параметр и добавим необходимый код:

vim /etc/ssh/sshd_config
= необходимые изменения и добавления =
# Закоментируем параметр
#Subsystem sftp /usr/lib64/misc/sftp-server

# Для работы sftp
Subsystem sftp internal-sftp
# Для sevo44.ru
Match User sevo44.ru
 X11Forwarding no
 AllowTcpForwarding no
 AllowAgentForwarding no
 PermitTunnel no
 ForceCommand internal-sftp
 ChrootDirectory /var/www/sevo44.ru
# /sevo44.ru

Перезапускаем службу sshd:

systemctl restart sshd

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

Настройка прав на данные

Назначаем владельцем содержимого сайта пользователя которого мы создали выше:

chown -R sevo44.ru:sevo44.ru /var/www/sevo44.ru/

Возвращаем обратно рута владельцем корня chroot:

chown root. /var/www/sevo44.ru/
chown root. /var/www/sevo44.ru/log/

Внимание! Сначала мы рекурсивно назначаем права на все содержимое директорий, а потом возвращаем владельца root на корень сайта.

Все папки в пути /var/www/sevo44.ru/ должны быть пользователя root!

Только в таком варианте все будет корректно работать!

Для безопасности запретим пользователю редактировать папку log.

Редактирование будет возможно только в папке WWW где находятся все файлы сайта!

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

tail -n 10 /var/log/secure

Настройка Logrotate для сайтов

Для просмотра логом сайтов используя подключение по sftp необходимо создать файл со следующим кодом (на основе скопированного файла nginx):

cp /etc/logrotate.d/nginx /etc/logrotate.d/site
vim /etc/logrotate.d/site
= необходимый код =
/var/www/sevo44.ru/log/*.log
{
        daily
        missingok
        rotate 15
        compress
        delaycompress
        notifempty
        #create 640 nginx adm
        sharedscripts
        postrotate
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}

Сохраним и применим изменения без перезагрузки:

logrotate /etc/logrotate.conf

Настройка PHP-FPM

Создадим отдельный pool для php-fpm, который будет обслуживать сайт sevo44.ru. Использование отдельного пула для сайта так же может быть обусловлено специфическими настройками для ресурса. Удобно когда для каждого сайта используется независимый пул в котором можно выставить необходимые значения. Переходим в нужную папку, копируем существующий конфигурационный файл и делаем необходимые изменения:

cd /etc/php-fpm.d/
cp www.conf sevo44.ru.conf
vim /etc/php-fpm.d/sevo44.ru.conf
= необходимые параметры =
[sevo44.ru]
 user = sevo44.ru
 group = sevo44.ru
 listen = /run/php-fpm/php-fpm-sevo44.sock
 listen.owner = sevo44.ru
 listen.group = sevo44.ru
 pm = dynamic
 pm.max_children = 20
 pm.start_servers = 2
 pm.min_spare_servers = 1
 pm.max_spare_servers = 3

Осталось указать нужный параметр в настройки хоста для nginx.

Откроем необходимый файл и внесём необходимую настройку:

vim /etc/nginx/conf.d/sevo44.ru.conf
= необходимый параметр =
fastcgi_pass unix:/run/php-fpm/php-fpm-sevo44.sock;

Проверим правильность настройки Nginx и перезагрузим необходимые сервисы:

nginx -t
systemctl reload nginx
systemctl restart php-fpm

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

Заключение

В результате настроек мы получаем защищённый и удобный доступ для работы с файлами ресурса. Для работы я использую программу FileZilla. Кроме того, из статьи RSA или авторизация SSH по ключу вы можете узнать как используя программу FileZilla можно подключатся по файлу с ключом расширения ppk.

Cоllabora и настройка NextCloud

Рассмотрим некоторые моменты настройки NextCloud работающем на Calculate Linux. Установим Collabora Office и другие полезные приложения. Расскажу про основные моменты работы и настройки этого свободного облачного хранилища. Большой диапазон возможностей в использовании.

Введение

За основу была взята настройка свободного облачного хранилища из статьи NextCloud установка на Nginx.

Создание облачного хранилища для работы с файлами удобная и практичная технология. Облачное хранилище на базе NextCloud даёт воистину восхитительные возможности. В одном месте вы сможете настроить совместную работу с документами, безопасность, и общение. Облако позволит сократить количество стороннего программного обеспечения используемого пользователями. Разве не сказка использовать для работы практически любой браузер, смотреть видео, редактировать документы, делать видео звонки, общаться в чате, и много что ещё. Далеко не все рассказал в статье, так как это просто не возможно. Для работы со всеми форматами офисных документов рекомендую использовать Collabora Office, так как только он даст вам спокойно работать с любыми форматами офисных документов без конвертирования в формат docx, как это делает OnlyOffice. Устанавливайте, настраивайте и почувствуйте сами все прелести использования своего подконтрольного вам облачного хранилища.

Долго использовал работу NextCloud на дистрибутиве CentOS c базой данных MariaDB. При тестирования работы на Calculate Linux был приятно удавлен, что при одинаковых настройках производительность была лучше а после перехода на базу данных PosgreSQL расход памяти стал просто смешной.

Дизайн NextCloud

Разработчики предусмотрели желание пользователей произвести изменения внешнего вида. К сожалению не все можно поменять с панели управления. Некоторые изменения дизайна произведём в ручном режиме.

Темы оформления

Настройка дизайна производится на странице Администрирование — Темы оформления.

Вот так выглядит моя страница настройки:

В итоге я получил такую страницу приветствия:

Значок веб-сайта

Заменяем файл favicon.ico в папке согласно пути от корневой папки сайта ../core/img.

Существует множество сайтов предоставляющих возможность сделать файл значка веб-сайта. Рекомендую использовать Генератор пиктограмм, так как он позволяет делать иконки из картинок размером 5 Мб.

После замены незабываем дать права на файл:

chown nginx:nginx /var/www/nextcloud/htdocs/core/img/favicon.ico

Картинка для Telegram

Картинка ссылки что будет в чате Телеграм находится по пути ../core/img и называется favicon-fb.png.

После замены на свой файл с аналогичными параметрами не забываем дать необходимые права:

chown -R nginx:nginx /var/www/nextcloud/htdocs/core/img/favicon-fb.png

При обновлении NextCloud файлы с папки ../core/img будут заменены на стандартные!

Документы по умолчанию для пользователя

Папка где лежат файлы которые по умолчанию увидит новый созданный пользователь находится по пути ../core/skeleton. Создайте в папке все необходимые файлы и папки. Не забудьте дать необходимые права на все файлы и папки:

chown -R nginx:nginx /var/www/nextcloud/htdocs/core/skeleton

Основные моменты работы с NextCloud

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

Настройка почтового сервера NextCloud

Первым делом необходимо настроить почтовый сервер.

Без настройки почтового сервера с ресурса не будут отправляться почтовые сообщения которые используются в разных настройках и использовании ресурса.

Настройки сервера SMTP находится по пути Администрирование — Дополнительные настройки — Почтовый сервер. В моем случае настройки выглядят следующим образом:

Фоновые задания

Для оптимальной производительности важно правильно настроить выполнение задач в фоновом режиме. Для больших экземпляров рекомендуется использовать параметр «Cron».

Создадим необходимый файл с запуском от nginx:

cat /etc/cron.d/nextcloud_cron
= необходимый код =
# Global variables
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/

#Nextcloud
*/15 * * * * nginx php -f /var/www/nextcloud/htdocs/cron.php

Размер загружаемых файлов

В файле настроек Nginx для Nextcloud мы указали что размер загружаемого файла не может превышать 10 Gb. Добавим этот параметр на странице Администрирование — Дополнительные настройки — Управление файлами.

Подключение к базе пользователей LDAP

Используя дополнение LDAP user and group backend можно подключать как LDAP каталог так и AD от Windows. На практике подключал оба варианта. Проблема возникла только с аватарами пользователей.

Настройка очистки удалённых файлов

Корзина включена по умолчанию. Настройки корзины позволяют использовать два параметра, минимальное время хранения удалённых данных и максимальное время хранения. Минимальное время — это количество дней, в течение которых файлы будет сохранены, после чего они могут быть удалены. Максимальное время — это количество дней, в течение которых данные будут удалены. Как минимальное, так и максимальное время можно определить параметрами настройки.

По умолчанию данные в корзине NextCloud хранятся 30 дней и удаляются в случае необходимости свободного места на диске.

Доступные значения:

  • auto— настройки по умолчанию. Хранит файлы и папки в мусорном ведре в течение 30 дней и автоматически удаляет в любое время после этого, если требуется пространство (обратите внимание: файлы не могут быть удалены, если пространство не требуется)
  • D, auto—  хранит файлы и папки в мусорном ящике для дней D +, удаляет в любое время в случае необходимости (обратите внимание: файлы не могут быть удалены, если пространство не требуется)
  • auto, D — удалите все файлы в мусорном ящике, которые старше D дней автоматически, удаляют другие файлы в любое время, если необходимо пространство
  • D1, D2 — хранить файлы и папки в мусорном ведре не менее D1 дней и удалять, когда превышает D2 дней
  • disabled — корзина мусора автоматически очищена, файлы и папки будут сохранены навсегда

В моем случае я использую параметр:

vim /var/calculate/www/nextcloud/htdocs/config/config.php
= необходимое дополнение =
 'trashbin_retention_obligation' => '7, auto', 
); 

Разграничение прав пользователей

Вот основные параметры:

  • Возможно создавать группы пользователей;
  • Каждой группе или пользователю давать права отдельные на просмотр, запись, удаление;
  • Возможность временного интервала на определённые правила доступа;
  • Каждой группе можно назначать администратора;
  • Квота на дисковое пространство;
  • Возможность делится любым своим ресурсом;
  • Возможность предоставлять доступ с интернета на просмотр, редактирование фотографий или документов.

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

Возможности доступа к данным

К данным размешенным на облачном хранилище NextCloud вы можете получить доступ разными способами:

  • Через любой веб браузер;
  • Используя клиент синхронизации, который есть под операционные системы Windows, Linux, Android, и тд…;
  • Подключится используя протокол WebDAV.

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

Создание графиков и схем

Приложение Draw.io позволяет создавать разные схемы, графики и позволяет как импортировать так и экспортировать во все популярные форматы. Удобней и понятней программы для создания схем я не встречал.

После добавления документа вы увидите окно с выбором уже имеющихся шаблонов на основании которых вы можете построить свою схему.

Просмотр видео

К сожалению просматривать можно только формат mp4. Существует множество конвертеров по преобразованию файлов в нужный формат и даже онлайн сервисы. Будем надеяться что разработчики расширят количество форматов.

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

В Calculate Linux программа устанавливается командой:

emerge --ask media-video/handbrake

Видео звонки между пользователями

Приложение Talk позволяет добавить на ваше облачное хранилище возможность совершать видео звонки пользователям. Создание группового звонка увеличивает привлекательность приложения в разы. Вся связь осуществляется по технологии WebRTC. Проект WebRTC имеет открытый исходный код и активно продвигается компанией Google. Суть проекта это возможность использовать для организации видеоконференций веб браузер без использования сторонних программ и технологий.

Чат или Xmpp Client

Приложение JavaScript XMPP Chat позволяет добавить простой чат для общения пользователей с сохранением истории сообщений.

Существует три варианта использования:

  1. Internal — ограниченная функциональность: нет клиентов, кроме JSXC в Nextcloud, без многопользовательского чата, без серверных федераций,
  2. External —  подключится к собственному серверу XMPP,
  3. Managed (Beta service) — получить ваш собственный полнофункциональный XMPP-сервер, непосредственно размещенный основной командой JSXC.

Какой вариант использовать решать вам.

Календари

С приложением Calendar все просто и понятно. Можно создавать и давать доступ на созданный календарь. Вносить события с разными параметрами. Очень удобна возможность подключать сторонние календари по технологии iCal.

Подключение внешних хранилищ

Приложение External storage support пожалуй одно из моих самых любимых. Благодаря ему можно в своё хранилище подключить почти все имеющиеся варианты доступа к данным и настроить совместную работу.

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

Перечень протоколов и сервисов которые можно использовать для подключения:

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

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

При разрешении пользователям монтировать свои ресурсы настройка находится на странице настройке пользователя.

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

Мониторинг работы NextCloud

На странице по ссылке Администрирование — Мониторинг вы найдёте все реальны параметры работы облачного хранилища.

Параметры отображаемые на странице Мониторинг:

  • Загрузка процессора,
  • Использование памяти,
  • Активные пользователи,
  • Ресурсы общего доступа,
  • Хранилище (количество пользователей и файлов),
  • Параметры PHP,
  • База данных.

Журналирование работы NextCloud

Посмотреть логи вы можете зайдя по ссылке Администрирование — Журналирование. Присутствует возможность отсортировать по виду сообщений.

Collabora Office установка на Docker

К сожалению после установки NextCloud вы сможете просматривать и работать только с документами формата txt. Для того чтобы работать со всеми видами офисных документов необходимо установить приложение для работы с этими форматами. В моем случае используется свободная версия Collabora Office. Можно установить и ONLYOFFICE но он имеет ограничение на количество пользователей в свободной версии ( 20 пользователей ) и не поддерживается официально разработчиками NextCloud.

После установки и тестирования OnlyOffice выяснилось что в этом приложении можно работать только с некоторыми форматами документов: DOCX, XLSX, PPTX, TXT, CSV. В том что OnlyOffice может открывать и другие типы файлов полное вранье! Для того чтобы открыть ODT, ODS, ODP, DOC, XLS, PPT, PPS, EPUB, RTF, HTML, HTM разработчики предусмотрели вариант конвертирование их в «лучший» формат и уже с этим файлом в последствии работать. Вот такое отношение к свободным форматам файлов у разработчиков OnlyOffice и присутствует явное навязывание форматов от всем нам известной компании. В Collabora вы сможете открыть и работать с любыми форматам и это даёт вам полую свободу и удобство в работе.

Отсутствие проверки Русского языка

Не увидев наличия родного языка для проверки орфографии я не долго думая написал письмо разработчикам и в течении часа получил ответ (приведу часть ответа сделанного переводчиком):

» Привет Алекс,

Спасибо за Ваше сообщение и за ваш интерес к организации совместной работы в Интернете.

Для начала я хотел бы представиться. Меня зовут Элой Креспо, получила исполнительный на работу производительность труда. Я буду твоим лучшим Контактное лицо для сотрудничества производительности для любых вопросов или коммерческих потребностей, которые вы могли бы иметь.

Что касается ваших вопросов, проверка орфографии-это новая функция, которую мы добавили в наш код версии несколько месяцев назад. Теперь, мы работаем на других языках и, конечно, русский для нашего следующего выпуска кода. Мы выпустим наш следующий код версии в конце этого года 2017.»

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

Приятная новость! Как и обещали разработчики в конце года вышла новая версия в которой работает проверка орфографии для русского языка. Посмотреть информацию о версиях можно на странице https://www.collaboraoffice.com/news-releases/.

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

Установка Docker на Calculate Linux или Gentoo:

emerge --ask app-emulation/docker

Добавление в автозагрузку:

rc-update add docker default
= вывод команды =
* service docker added to runlevel default

Запуск Dockera:

/etc/init.d/docker start
docker | * Caching service dependencies ...            [ ok ]
docker | * /var/log/docker.log: creating file
docker | * /var/log/docker.log: correcting mode
docker | * /var/log/docker.log: correcting owner
docker | * Starting docker...                          [ ok ]

Установка Collabira Office в Docker

Скачиваем контейнер командой:

docker pull collabora/code
= вывод команды =
===
Using default tag: latest
Trying to pull repository docker.io/collabora/code ... 
latest: Pulling from docker.io/collabora/code
bd97b43c27e3: Pull complete 
6960dc1aba18: Pull complete 
2b61829b0db5: Pull complete 
1f88dc826b14: Pull complete 
73b3859b1e43: Pull complete 
2cb7a8fe8de9: Pull complete 
2458b914d686: Pull complete 
7470c2907839: Pull complete 
Digest: sha256:a89941eb0aa140b82e658f34f840ba3c35f47c3f3eec79694fc460ae9fced79d

Запустим контейнер докера заменив cloud\\.sevo44\\.ru на ваш домен сервера Nextcloud (с сохранением обратного слэша).

docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=cloud\\.sevo44\\.ru' -e "username=admin" -e "password=pass*" --restart always --cap-add MKNOD collabora/code

Необязательные параметры»username=admin» и»password=pass*» включают функцию консоли администратора Сollabora. Доступ к консоли администратора осуществляется по адресу https://<CODE-domain>/loleaflet/dist/admin/admin.html

Проверка работы контейнера Docker в системе

Посмотрим результат проделанных операций:

netstat -lnpt
= часть вывода =
tcp  0  0   127.0.0.1:9980    0.0.0.0:*   LISTEN   4582/docker-proxy 

Согласно вывода мы видим что контейнер работает на порту 9980 и ждёт к себе обращений для выполнения поставленных задач. Нам необходимо средствами Nginx настроить связь нашего облачного хранилища и контейнера Docker с Collabora Office.

Посмотрим состояние контейнеров Docker в сисетме:

docker ps -a
= часть вывода команды =
9558da76e647 collabora/code "/bin/sh -c 'bash ..." 2 weeks ago Up 42 hours 127.0.0.1:9980->9980/tcp relaxed_lovelace

Обновление Collabora Office в Docker

Скачиваем новое изображение докера:

docker pull collabora/code

Выводим список докеров в системе:

docker ps
= вывод команды =
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
37359809d296 collabora/code "/bin/sh -c 'bash ..." 2 weeks ago Up 4 minutes 127.0.0.1:9980->9980/tcp dreamy_hamilton

Останавливаем и удаляем изображение Докера Collabora Online:

docker stop 37359809d296
docker rm 37359809d296

Заново установим выполнив команду:

docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=cloud\\.sevo44\\.ru' -e "username=admin" -e "password=pass*" --restart always --cap-add MKNOD collabora/code

Новая версия установлена!

Внимание! Перед проверкой новой версии удалите кэш и куки интернет браузера.

Nginx для Collabora Office

При настройке я не стал устанавливать самоподписные сертификаты SSL, а сразу получил свободные от Let’s Еncrypt. Если кто пробовал настраивать с само подписными напишите пожалуйста в комментариях.

Создадим необходимую корневую папку необходимую для получения сертификата для Collabora и дадим необходимые права:

mkdir -p /var/www/office
chown nginx:nginx /var/www/office

Файл настройки Collabora для Nginx

Параметры для первого получения SSL сертификата:

vi /etc/nginx/conf.d/office.conf
= необходимый код =
server {
 listen 80;
 server_name office.sevo44.ru;
root /var/www/office;
}

Проверяем и перезапускаем Nginx:

nginx -t
= вывод команды = 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok 
nginx: configuration file /etc/nginx/nginx.conf test is successful 

/etc/init.d/nginx reload
= вывод команды =
nginx | * Checking nginx' configuration ...                [ ok ]
nginx | * Refreshing nginx' configuration ...              [ ok ]

Получение SSL для Collabora online Office

Более детально получение SSL описано в материале «Установка Let`s Encrypt для Calculate и Gentoo«. На его основе было произведено получение сертификата для домена office.sevo44.ru.

Файл настройки для работы с SSL сертификатом от Let’s Еncrypt в моем случае получил такой вид:

vim /etc/nginx/conf.d/office.conf 
= необходимые изменения с пояснениями =
# office.sevo44.ru
server { 
 listen 80; 
 server_name office.sevo44.ru; 
 rewrite ^ https://$server_name$request_uri? permanent; 
}

server {
 listen 443 ssl;
 server_name office.sevo44.ru;
 root /var/www/office;

ssl_protocols TLSv1.1 TLSv1.2;
 ssl_certificate /etc/letsencrypt/live/office.sevo44.ru/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/office.sevo44.ru/privkey.pem;

# static files
 location ^~ /loleaflet {
 proxy_pass https://localhost:9980;
 proxy_set_header Host $http_host;
 }

# WOPI discovery URL
 location ^~ /hosting/discovery {
 proxy_pass https://localhost:9980;
 proxy_set_header Host $http_host;
 }

# websockets, download, presentation and image upload
 location ^~ /lool {
 proxy_pass https://localhost:9980;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "Upgrade";
 proxy_set_header Host $http_host;
 }
}

Не забываем проверить и перезагрузить Nginx!

Осталось добавить приложением и указать нужные данные в режиме администратора Nextcloud.

Вывод

Облачное хранилище NextCloud это просто бездна возможностей. Каждый раз откладывал публикацию статьи так как находил всё новые и новые полезности. Скорей всего ещё не раз буду добавлять новое в эту статью. Буду признателен если в комментариях будут какие то нюансы в работе или рекомендации по приложениям. Последнее что мне не удаётся настроить это приложение PhoneTrack которое позволяет с устройств имеющих GPS получать данные о местоположении в реальном времени и видеть маршруты передвижения. Если кто настраивал поделитесь информацией.

LEMP сервер на Calculate Linux

Настроим веб-сервер LEMP использующий службы Nginx, MariaDB и PHP на сборке CSS от Calculate Linux (Gentoo). Давно успешно использую версии Calculate Linux на рабочих компьютерах и прошло время применения на рабочих серверах.

Введение

На своем рабочем компьютере я уже давно использую дистрибутивы Calculate Linux и вот добрались руки до внедрения этого дистрибутива на рабочие сервера. Работать с системой Gentoo без большого опыта в системах Linux очень сложно, но разработчики Calculate Linux сильно упростили установку и работу с системой и постоянно ведут работы по улучшению своих утилит. Пакеты как правило используются свежие что не может не радовать. Настроим первый рабочий сервер на сборке CSS на котором будут работать интернет ресурсы. СSS это самый минимальный набор очень похожий на то как выглядит дистрибутивы c понятием minimall в CentOS или netinst в Debian.

Настройка времени на LEMP сервере

За правильность времени отвечает локализация в системе. Смена локализации в дистрибутивах Calculate Linux выполняется командой:

cl-setup-locale --timezone Europe/Moscow 
= вывод команды =
 * Настройка локализации и времени ... [ ok ] 
 * Система настроена!

Проверим время на сервере lepm:

date
=вывод команды =
Пн ноя 13 19:14:56 MSK 2017

Время отстаёт на 3 часа. Посмотрим время UTC:

date -u
= вывод команды =
Пн ноя 13 16:15:04 UTC 2017

Видим что разница в 3 часа а значит локализация работает правильно остается только правильно настроить время UTC.

Установим пакет с помощью которого мы исправим время на правильное:

emerge -av net-misc/ntp

При установке любого пакета на lepm сервер добавляйте команду —ask! Команда выведет всю информацию перед установкой и ознакомившись с ней вам надо будет принять решение.

Произведем синхронизацию с сервером времени:

ntpdate pool.ntp.org

Настройка Iptables скриптом

По умолчанию iptables работает и полностью открыт в чем можно убедиться выполнив команду:

iptables -L -v -n
= вывод команды =
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination 

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination

Добавим скрипт в котором укажем правила для lemp сервреа и сохраним их чтобы после перезагрузки они остались:

vim /root/iptables.sh
= необходимые добавления =
#!/bin/bash 
# Очистка всех цепочек iptables
iptables -F 
iptables -X 
iptables -Z 
# Политики для трафика, не соответствующего ни одному правилу
iptables -P INPUT DROP 
iptables -P FORWARD DROP 
iptables -P OUTPUT ACCEPT 
# Разрешаем Ping
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Прочие настройки
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 
iptables -A INPUT -i lo -j ACCEPT 
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT 
iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT 
iptables -A INPUT -p icmp --icmp-type 12 -j ACCEPT 
iptables -A INPUT -p tcp --syn --dport 113 -j REJECT --reject-with tcp-reset 
# Доступ по ssh 
iptables -A INPUT -p TCP --dport 22 -j ACCEPT 
# Доступ к webserver по http и https
iptables -A INPUT -p TCP --dport 80 -j ACCEPT 
iptables -A INPUT -p TCP --dport 443 -j ACCEPT 
# Сохраняем правила 
#Calculate/Gentoo хранит в /var/lib/iptables/rules-save 
rc-service iptables save

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

chmod +x /root/iptables.sh

Осталось выполнить скрипт для внесения правил:

Будьте очень внимательны при составлении скрипта дабы не потерять доступ к серверу! Убедитесь что порт для доступа к ssh в скрипте соответствует работающему на сервере!

sh /root/iptables.sh     
= вывод команды =
iptables          | * Saving iptables state ...       [ ok ]

Просмотр правил iptables

Посмотрим правильность применения правил:

iptables -L -v -n 
= вывод команды =
Chain INPUT (policy DROP 31 packets, 2260 bytes) 
 pkts bytes target     prot opt in     out     source               destination          
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 0 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 3 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 11 
    6   504 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8 
   91  8220 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED 
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0            
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 3 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 11 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 12 
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:113 flags:0x17/0x02 reject-with tcp-reset 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 
 
Chain FORWARD (policy DROP 0 packets, 0 bytes) 
 pkts bytes target     prot opt in     out     source               destination          
 
Chain OUTPUT (policy ACCEPT 80 packets, 9864 bytes) 
 pkts bytes target     prot opt in     out     source               destination

Видим что все правила что нам надо выполнились.

Смена порта SSH сервера

Один из лучших вариантов защиты lemp сервера это смена порта службы которая делается в два этапа.

  • Меняется порт в файле настройки
vim /etc/ssh/sshd_config
= вывод команды с необходимыми изменениями =
#Port 22
Port 20000
  • Перезапускается сервис SSH
/etc/init.d/sshd restart 
= вывод команды =
sshd         | * Caching service dependencies ...     [ ok ] 
sshd         | * Stopping sshd ...                    [ ok ] 
sshd         | * Starting sshd ...                    [ ok ]

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

ssh -p 20000 root@192.168.0.100

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

Хорошую альтернативу Apach придумал Игорь Сысоев. Работать одно удовольствие, а главное все быстро и идеально подходит для высоко нагруженных сайтов. Для мало нагруженных увеличение скорости тоже очень важно. После перехода с Apach на Nginx скорость работы ресурсов приятно радует. Стараюсь везде использовать Lemp сервер в замену старому Lamp работающему на Apach.

За основу взяли инструкция с Wiki Gentoo. Всё на русском и очень подробно описано.

Установка Nginx

Установим главный компонент Lemp сервера:

emerge -av www-servers/nginx
= вывод команды =
Local copy of remote index is up-to-date and will be used.

* IMPORTANT: 2 news items need reading for repository 'gentoo'.
* Use eselect news read to view new items.

These are the packages that would be merged, in order:

Calculating dependencies... done!
[binary N ] www-servers/nginx-1.12.1 USE="http http-cache http2 ipv6 pcre ssl threads -aio -debug -libatomic (-libressl) -luajit -pcre-jit -rtmp (-selinux) -vim-syntax" NGINX_MODULES_HTTP="access auth_basic autoindex browser charset empty_gif fastcgi geo gzip limit_conn limit_req map memcached proxy referer rewrite scgi split_clients ssi upstream_hash upstream_ip_hash upstream_keepalive upstream_least_conn upstream_zone userid uwsgi -addition -auth_ldap -auth_pam -auth_request -cache_purge -dav -dav_ext -degradation -echo -fancyindex -flv -geoip -gunzip -gzip_static -headers_more -image_filter -lua -memc -metrics -mogilefs -mp4 -naxsi -perl -push_stream -random_index -realip -secure_link -security -slice -slowfs_cache -spdy -sticky -stub_status -sub -upload_progress -upstream_check -xslt" NGINX_MODULES_MAIL="-imap -pop3 -smtp" NGINX_MODULES_STREAM="-access -geo -geoip -limit_conn -map -realip -return -split_clients -ssl_preread -upstream_hash -upstream_least_conn -upstream_zone"

Would you like to merge these packages? [Yes/No] yes
>>> Emerging binary (1 of 1) www-servers/nginx-1.12.1::gentoo
>>> Installing (1 of 1) www-servers/nginx-1.12.1::gentoo
>>> Recording www-servers/nginx in "world" favorites file...
>>> Jobs: 1 of 1 complete Load avg: 0.49, 0.16, 0.06

* Messages for package www-servers/nginx-1.12.1:

*
* This nginx installation comes with a mitigation for the HTTPoxy
* vulnerability for FastCGI, SCGI and uWSGI applications by setting
* the HTTP_PROXY parameter to an empty string per default when you
* are sourcing one of the default
*
* - 'fastcgi_params' or 'fastcgi.conf'
* - 'scgi_params'
* - 'uwsgi_params'
*
* files in your server block(s).
*
* If this is causing any problems for you make sure that you are sourcing the
* default parameters _before_ you set your own values.
* If you are relying on user-supplied proxy values you have to remove the
* correlating lines from the file(s) mentioned above.
*
>>> Auto-cleaning packages...

>>> No outdated packages were found on your system.

* IMPORTANT: 2 news items need reading for repository 'gentoo'.
* Use eselect news read to view new items.

Запуск и проверка работы

Стандартная конфигурация nginx предполагает работу с корневым каталогом в /var/www/localhost/htdocs. Установка создаёт только каталог /var/www/localhost, без папки htdocs и индексного файла.

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

mkdir /var/www/localhost/htdocs
 echo 'Hello, sevo44!' > /var/www/localhost/htdocs/index.html

Пакет nginx включает в себя init-скрипт, позволяющий останавливать, запуска и перезапускать службу веб-сервера. Для запуска службы nginx выполним следующую команду:

/etc/init.d/nginx start
= вывод команды =
nginx  | * Checking nginx' configuration ...            [ ok ] 
nginx  | * Starting nginx ...                           [ ok ]

Добавим nginx в автозагрузку:

rc-update add nginx default

Чтобы проверить, что nginx работает и есть доступ, в консоли сервера выполним команду которая откроет страницу сайта воспользовавшись консольным веб-клиентом curl:

curl http://localhost
= вывод команды =
Hello, sevo44!

На сервере все работает, но если мы захотим соединиться с машины в локальной сети то ip адресу то получим ошибку:

curl: (7) Failed to connect to 192.168.0.141 port 80: В соединении отказано

Чтобы исправить ошибку необходимо внести исправления параметра listen для сайта. Вместо 127.0.0.1 указать порт 80 на котором работает ресурс.

Конечно лучше в сети иметь DNS сервер куда прописать пути для всех ресурсов работающих на lemp сервере. Если этого нет, то достаточно добавить код в нужный файл на локальном компьютере и доступ будет осуществлять по требуемому имени. Вот пример как будет выглядеть строка для моего PhpMyAdmin который будет работать по адресу pmalempcss.sevo44.loc на машине с ip адресов 192.168.0.141:

vim /etc/hosts
= необходимое добавление =
192.168.0.141 pmalempcss.sevo44.loc

Главный конфигурационный файл NGINX

Все настройки как самого Nginx так и ресурсов которые на нем работают прописываются в файле /etc/nginx/nginx.conf.

Перед редактированием любых файлов настройки я рекомендую всегда делать копии оригинальных настроек.

Скопируем оригинал и откроем его для изменения необходимых параметров параметры:

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_orig
vim /etc/nginx/nginx.conf
= часть вывода команды с пояснениями =
 user nginx nginx;
 worker_processes 4; --- выставляем по количеству процессоров

Варианты конфигурации для сайтов

Дальше надо определится как будем работать с настройкой сайтов.
Существует два пути:

  • редактирование всё в одном файле,
  • для каждого сайта сделать свой файл настроек.

По умолчанию после усатновке настрока сделана для настройки в одном файле. Мне не удобно работать с одним файлом я разобью настройку по ресурсам.

Для этого в файле /etc/nginx/nginx.conf в блоке http добавим в конце нужную строку и удалим блоки server. В результате получим такой код:

cat /etc/nginx/nginx.conf 
= вывод команды с информацией он необходимых изменениях =
user nginx nginx; 
worker_processes 4; 
 
error_log /var/log/nginx/error_log info; 
 
events { 
        worker_connections 1024; 
        use epoll; 
} 
 
http { 
        include /etc/nginx/mime.types; 
        default_type application/octet-stream; 
 
        log_format main 
                '$remote_addr - $remote_user [$time_local] ' 
                '"$request" $status $bytes_sent ' 
                '"$http_referer" "$http_user_agent" ' 
                '"$gzip_ratio"'; 
 
        client_header_timeout 10m; 
        client_body_timeout 10m; 
        send_timeout 10m; 
 
        connection_pool_size 256; 
        client_header_buffer_size 1k; 
        large_client_header_buffers 4 2k; 
        request_pool_size 4k; 
 
        gzip off; 

        # Скрываем версию nginx
        server_tokens off;
 
        output_buffers 1 32k; 
        postpone_output 1460; 
 
        sendfile on; 
        tcp_nopush on; 
        tcp_nodelay on; 
 
        keepalive_timeout 75 20; 
 
        ignore_invalid_headers on; 
 
        index index.html; 
 
        include /etc/nginx/conf.d/*.conf; 
 
}

Создадим папку где будет лежать файлы настройки для сайтов:

mkdir /etc/nginx/conf.d

Создадим файл настроек для localhost:

vim /etc/nginx/conf.d/local.conf
= необходимые добавления c комментариями =
 server {
# Порт на котором работает ресурс
 listen 80;
# Название ресурса по которому будет осуществляться доступ
 server_name localhost;
# Пути куда будут писаться логи
access_log /var/log/nginx/localhost.access_log main;
error_log /var/log/nginx/localhost.error_log info;
# Корневая папка ресурса
root /var/www/localhost/htdocs;
}

Перед тем как перезапускать службу nginx всегда выполняйте проверку правильности сделанных изменений в настройках выполнив команду nginx -t.

Проверим и произведем применение изменений:

nginx -t 
= вывод команды =
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok 
nginx: configuration file /etc/nginx/nginx.conf test is successful 

/etc/init.d/nginx reload 
= вывод команды =
nginx  | * Checking nginx' configuration ...             [ ok ] 
nginx  | * Refreshing nginx' configuration ...           [ ok ]

Команды управления Nginx

/etc/init.d/nginx stop - остановка
/etc/init.d/nginx start - запуск
/etc/init.d/nginx restart - перезагрузка
nginx -t - проверка изменений в файлах настройки
/etc/init.d/nginx reload - применение изменений

Предпочтительней использовать команду reload после изменения файлов настройки, так как в отличии от restart не обрывается доступ к ресурсам которые находятся в работе.

Установка PHP для NGINX

Для поддержки php в конфигурацию сайта работающего под nginx необходимо добавить определенный код. В данном примере nginx обменивается информацией с процессом PHP через UNIX-сокет. В блок server надо добавить блок location в котором и будут описаны правила работы с php.

 http {
 ...
 server {
 ...
 location ~ \.php$ {
 try_files $uri =404;
 include /etc/nginx/fastcgi.conf;
 fastcgi_pass unix:/run/php-fpm.socket;
 }
 }
 }

Установка  PHP

Перед установкой посмотрим какие версии PHP могут быть установлены:

eix dev-lang/php
= вывод команды =
* dev-lang/php
 Доступные версии: 
 (5.6) 5.6.33 5.6.34 ~5.6.35
 (7.0) 7.0.27 7.0.28 ~7.0.29
 (7.1) 7.1.13 ~7.1.14 7.1.15 ~7.1.16
 (7.2) ~7.2.4

Зелёным цветом помечены версии которые могут быть установлены и являются стабильными. Версии с тильдой являются не стабильными и замаскированы.

Версия PHP очень важна и лучше сделать так что бы при обновлениях вы не получили неожиданных проблем от установки новой версии.

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

vim /etc/portage/package.mask/custom
= необходимые данные =
>dev-lang/php-7.1

Согласно этого параметра установка версий выше 7.1 запрещена.

Для такой конфигурации Lepm сервера необходимо собрать PHP с поддержкой менеджера процессов FastCGI (dev-lang/php), включив USE-флаг fpm. Для дистрибутива Calculate Linux необходимо выполнить команду:

echo "dev-lang/php fpm" >> /etc/portage/package.use/custom

Советую сразу добавить флаг dev-lang/php mysqli иначе не будет работать PhpMyAdmin из за ошибки «Расширение mysqli не найдено. Пожалуйста, проверьте ваши настройки PHP.» и флагdev-lang/php postgres если планируйте работать с базами PostresQL. Сборка PHP не быстрая имейте это ввиду.

echo "dev-lang/php mysqli postgres" » /etc/portage/package.use/custom

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

echo "dev-lang/php mysqli -postgres" » /etc/portage/package.use/custom

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

Установим PHP с включенными USE-флагоми:

emerge -av dev-lang/php
= вывод части команды =
[binary N ] dev-lang/php-7.0.28:7.1::gentoo USE="acl berkdb bzip2 cgi cli crypt ctype curl exif fileinfo filter fpm ftp gd gdbm hash iconv intl ipv6 json mysql mysqli nls opcache pdo phar posix postgres readline session simplexml sockets ssl threads tokenizer truetype unicode webp xml xmlreader xmlwriter zip zlib -apache2 -bcmath -calendar -cdb -cjk -coverage -debug -embed -enchant (-firebird) -flatfile -gmp -imap -inifile -iodbc -kerberos -ldap -ldap-sasl -libedit -libressl -mhash -mssql -oci8-instant-client -odbc -pcntl -phpdbg -qdbm -recode (-selinux) -session-mm -sharedmem -snmp -soap -spell -sqlite (-systemd) -sysvipc {-test} -tidy -wddx -xmlrpc -xpm -xslt" 

Проверяем усатнавливаемую версию и правильность устанавливаемых параметров и если все верно запускам усатновку.
Процесс долгий! У меня длится в районе 1 часа!

Использование UNIX-сокета для взаимодействия Nginx c PHP является предпочтительным и рекомендуемым вариантом!

Информации о версии PHP

php -v
= вывод команды =
PHP 7.2.2 (cli) (built: Feb 19 2018 03:15:04) ( ZTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
 with Zend OPcache v7.2.2, Copyright (c) 1999-2018, by Zend Technologies

Информация о расширениях PHP

Вывод информации о всех имеющихся и работающих расширениях можно командой:

php -m 
= вывод команды =
[PHP Modules] 
bz2 
Core 
ctype 
curl 
date 
dba 
dom 
exif 
fileinfo 
filter 
ftp 
gd 
gettext 
hash 
iconv 
json 
libxml 
mbstring 
mcrypt 
mysqli 
mysqlnd 
openssl 
pcre 
PDO 
pdo_mysql 
pdo_sqlite 
Phar 
posix 
pspell 
readline 
Reflection 
session 
SimpleXML 
sockets 
SPL 
sqlite3 
standard 
tokenizer 
xml 
xmlreader 
xmlwriter 
Zend OPcache 
zip 
zlib 
 
[Zend Modules] 
Zend OPcache

Настройка php-fpm для Nginx

Главные настройки находятся в файле php-fpm.conf нам необходимо проверить только наличие необходимой строки:

cat /etc/php/fpm-php7.0/php-fpm.conf 
= необходимый параметр =
include=/etc/php/fpm-php7.0/fpm.d/*.conf

Скопируем и внесем изменения в файл настроек php.ini:

cp /etc/php/fpm-php7.0/php.ini /etc/php/fpm-php7.0/php.ini_orig
vim /etc/php/fpm-php7.0/php.ini
= необходимые изменения = 
# Запрет на исполнение произвольного кода на сервере с правами php процесса при загрузке файла.
cgi.fix_pathinfo=0
# Необходимая временная зона
date.timezone = "Europe/Moscow"

Перед запуском php-fpm на lemp сервере нам осталось скопировать оригинал и провести редактирование пула (pool) который будет обслуживать все сайты:

cp /etc/php/fpm-php7.0/fpm.d/www.conf /etc/php/fpm-php7.0/fpm.d/www.conf_orig
vim /etc/php/fpm-php7.0/fpm.d/www.conf
= результат после редактирования =
[www]
user = nginx
group = nginx
;Запуск PHP с поддержкой UNIX-сокета
listen = /run/php-fpm.socket
listen.owner = nginx
listen.group = nginx
pm = dynamic
pm.max_children = 20
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Параметры для работы с сокетом добавляем в пулы так как в последствии нам будет проще работать с необходимыми параметрами для работы разных ресурсов.

Запустим службу php-fpm:

/etc/init.d/php-fpm start 
= вывод команды =
php-fpm           | * Testing PHP FastCGI Process Manager configuration ...   [ ok ] 
php-fpm           | * Starting PHP FastCGI Process Manager ...                [ ok ]

Добавим php-fpm в автозагрузку:

rc-update add php-fpm default

Перезагрузим nginx с измененной конфигурацией:

/etc/init.d/nginx reload

Проверка работы php-fpm для Nginx

Самый простой способ это добавить файл с кодом который будет выводить информацию о php и запустить его. Добавим файл с кодом:

vim /var/www/localhost/htdocs/info.php
= необходимый код для добавления =
<?php phpinfo(); ?>

Теперь в браузере наберем нужный путь http://localhost/info.php и в случае успешной настройки увидим страницу с выводом обо всех параметрах php.

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

За основу взята инструкция с Wiki Gentoo.

Обычно я маскирую версию MariaDB по аналогии с версией PHP. У каждого ресурса использующего PHP и базу данных MySQL есть требования к версиям. Чтобы избежать проблемы после обновления лучше обновлять эти версии вручную.

Установим на Lemp сервер MariaDB командой:

emerge -av mariadb

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

emerge --config dev-db/mariadb
= вывод команды с пояснениями =
Configuring pkg... 
 
 * Trying to get password for mysql 'root' user from 'mysql' section ... 
 * Trying to get password for mysql 'root' user from 'client' section ... 
 * Please provide a password for the mysql 'root' user now 
 * or through the /root/.my.cnf file. 
 * Avoid ["'\_%] characters in the password 
    > вводим пароль для root
 * Retype the password 
    > повторяем пароль
 * Creating the mysql database and setting proper permissions on it ... 
 = часть вывода не показана =

Добавим в автозагрузку:

rc-update add mysql default
= вывод команды =
* service mysql added to runlevel default

Запустим:

rc-service mysql start
= вывод команды =
mysql  | * Checking mysqld configuration for mysql ...    [ ok ] 
mysql  | * Starting mysql ...                             [ ok ]

 Правила доступа к серверу MariaDB

Обычно в настройках стоит параметр который блокирует подключение к базе кроме локального. Изменим необходимый параметр для доступа:

vim /etc/mysql/my.cnf
= необходимое изминение =
# Доступ со всех компьютеров
bind-address = 0.0.0.0
# Доступ только с определеного компьютера
#bind-address = 10.10.0.2

Удаление бинарных лог-файлов MySQL

Очень быстро вы заметите что размер папки /var/lib/mysql с базами будет сильно увеликиватся. Увеличение размера дают бинарные лог-файлы MySQL (mysql-bin.000001, mysql-bin.000002 и тд.) для организации репликации, когда несколько баз данных и для восстановления данных в случае сбоя.

Решим эту проблемму очисткой данных свыше 5 дней добавив в секцию [mysqld] конфигурационного файла /etc/mysql/my.cnf, следующие параметры:

vim /etc/mysql/my.cnf
= необходимые параметры =
# Активируем бинарные логи.
log-bin
# Время хранения логов 5 дней
expire_logs_days = 5

После внесения всех изминений перезагрузим MariaDB выполнив команду:

rc-service mysql restart

Варианты работы с базами MariaDB

Возможно несколько вариантов работы с базами на сервере Lemp. Рассмотрим вариант работы с базами с помощью программы PhpMyAdmin работающую в любом браузере и работу с базами в консоли.

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

Ранее я описывал установку PhpMyAdmin для дистрибутива CentOS. Статья подойдет и для установки на любой другой дистрибутив.

Вначале я произвел установку командой emerge phpmyadmin но мне не понравился этот вариант и я установил всё руками.

Причины по которым я не стал устанавливать используя emerge:

  • Папка с файлами устанавливается без папки setup в которой лежат файлы для создания конфигурационного файла PhpMyAdmin,
  • Инструкция описывает настройку для Apach,
  • Файл настройки для Nginx не создается.

Создадим необходимые папки:

mkdir -p /var/www/pma/{logs,backup}

Перейдем в нужную папку и скачаем архив с последней версией PhpMyAdmin с сайта разработчика:

cd /var/www/pma
wget https://files.phpmyadmin.net/phpMyAdmin/4.7.5/phpMyAdmin-4.7.5-all-languages.zip

Установим пакет необходимый для распаковки zip архивов:

emerge -av unzip

Распакуем архив zip:

unzip /var/www/pma/phpMyAdmin-4.7.5-all-languages.zip -d /var/www/pma

Переименуем папку phpMyAdmin-4.7.5-all-languages в www:

mv /var/www/pma/phpMyAdmin-4.7.5-all-languages /var/www/pma/www

Дадим необходимые права на папку pma и все файлы и папки внутри:

chown -R nginx:nginx /var/www/pma

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

vim /etc/nginx/conf.d/pma.conf  
= вывод команды =
# pmalempcss.sevo44.loc
server { 
        listen 80; 
        server_name pmalempcss.sevo44.loc; 
 
        access_log /var/www/pma/logs/pma.access_log main; 
        error_log /var/www/pma/logs/pma.error_log info; 
 
        root /var/www/pma/www/; 
 
        index index.php index.html index.htm; 
 
 
        location ~ \.php$ { 
               try_files $uri =404; 
               include /etc/nginx/fastcgi.conf; 
               fastcgi_pass unix:/run/php-fpm.socket; 
           } 
 
}

Запустим http://pmalempcss.sevo44.loc/setup откроется страница с выбором параметров и последующим сохранением файла настроек phpmyadmin.

После того как файл настроек config.inc.php будет добавлен в корень сайта доступ к этой папке будет закрыт!

Создадим файл с необходимыми нам настройками PhpMyAdmin:

vim /var/www/pma/www/config.inc.php
= необходимый код для добавления =
<?php
/*
 * Generated configuration file
 * Generated by: phpMyAdmin 4.7.5 setup script
 * Date: Sat, 18 Nov 2017 15:51:14 +0000
 */

/* Servers configuration */
$i = 0;

/* Server: localhost [1] */
$i++;
$cfg['Servers'][$i]['verbose'] = '';
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['port'] = '';
$cfg['Servers'][$i]['socket'] = '';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = '';
$cfg['Servers'][$i]['password'] = '';

/* End of servers configuration */

$cfg['DefaultLang'] = 'ru';
$cfg['blowfish_secret'] = '5"+y<2TqP+qrobW`%c!!9"BRYdIVZGIL';
$cfg['ServerDefault'] = 1;
$cfg['UploadDir'] = '/var/www/pma/backup';
$cfg['SaveDir'] = '/var/www/pma/backup';
?>

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

chown nginx:nginx /var/www/pma/www/config.inc.php

Подключение к удаленному MariaDB серверу

PhpMyAdmin c легкостью позволяет подключатся к другим серверам баз данных. Необходимо добавить необходимые настройки в конфигурационный файл и не забыть дать доступ на сервере к которому подключемся. Добавим необходимый блок:

vim /var/www/pma/www/config.inc.php 
= необходимый код для добавления =
/* Server: glpi [2] */
$i++;
$cfg['Servers'][$i]['verbose'] = 'glpi';
$cfg['Servers'][$i]['host'] = '10.10.0.6';
$cfg['Servers'][$i]['port'] = '';
#$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['socket'] = '';
#$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = '';
$cfg['Servers'][$i]['password'] = '';

Колличество блоков может быть не ограниченно.

Работа с базами в консоли

Ранее я писал статью как работать с базами в консоли. Материал подойдет для любой версии дистрибутива.

Ротация логов сайтов

Перед настройкой убедитесь что установлен пакет app-admin/logrotate отвечающий за ротацию!

Проверка наличия

eix app-admin/logrotate
eix logrotate 
* app-admin/logrotate 
     Доступные версии:      3.9.1 3.12.3-r1 ~3.12.3-r2 3.13.0 {acl +cron selinux} 
     Домашняя страница:     https://github.com/logrotate/logrotate 
     Описание:              Rotates, compresses, and mails system logs 
 
Найдено 1 совпадение.

Видим что в версии CSS его нет. Установим:

emerge -av app-admin/logrotate

Настроим ротацию логов PhpMyAdmin раз в сутки и будем хранить 60 дней. По аналогии я настраиваю так же ротацию и для других веб ресурсов.

vim /etc/logrotate.d/sites
= необходимые параметры =
# Указываем в каждой строчке необходимый сайт
/var/www/pma/logs/*log
{
create 0644 nginx nginx
daily
rotate 60
missingok
notifempty
compress
sharedscripts
postrotate
test -r /run/nginx.pid && kill -USR1 `cat /run/nginx.pid`
 endscript
}

Для проверки можно запустить ротацию руками выполнив команду:

logrotate -f /etc/logrotate.conf

После выполнения команды смотрите необходимые вам лог файлы.

Настройка Cron

После установки app-admin/logrotate для работы устанавливается cronie работу которого можно проверить выполнив команду:

/etc/init.d/cronie status
= вывод команды =
 * status: started

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

Определили выполнив несколько действий. Определим что у нас установлено и отвечает за логи ротации:

eix -Ic app-admin/
= вывод команды =
[I] app-admin/apache-tools (2.4.27{tbz2}@10.08.2017): Useful Apache tools - htdigest, htpasswd, ab, htdbm
[I] app-admin/eselect (1.4.8@23.03.2017): Gentoo's multi-purpose configuration and management tool
[I] app-admin/logrotate (3.13.0{tbz2}@22.11.2017): Rotates, compresses, and mails system logs
[I] app-admin/metalog (3-r2{tbz2}@21.11.2017): A highly configurable replacement for syslogd/klogd
[I] app-admin/perl-cleaner (2.25@06.04.2017): User land tool for cleaning up old perl installs
Найдено 5 совпадение.

Выясняется что установлен app-admin/metalog. Проверим его состояние:

/etc/init.d/metalog status
= вывод команды =
 * status: stopped

Добавим его в автозагрузку и запустим:

rc-update add metalog default
/etc/init.d/metalog start

Теперь мы увидели папку /var/log/cron в которой находится файл где пишутся логи заданий cron. В моем случае файл выглядит так:

cat /var/log/cron/current
= часть вывода команды =
Nov 30 23:00:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)
Nov 30 23:00:01 [CROND] (nginx) CMD (php -f /var/www/nextcloud/htdocs/cron.php )
Nov 30 23:00:01 [run-crons] (root) CMD (/etc/cron.hourly/clocksync)
Nov 30 23:10:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)
Nov 30 23:10:01 [CROND] (nginx) CMD (php -f /var/www/nextcloud/htdocs/cron.php )
Nov 30 23:20:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)
Nov 30 23:20:01 [CROND] (nginx) CMD (php -f /var/www/nextcloud/htdocs/cron.php )
Nov 30 23:23:01 [CROND] (root) CMD (/usr/bin/nice -n19 /usr/bin/ionice -c3 /usr/sbin/cl-core --method update --schedule -p --wait-another-update off &>/dev/null)
Nov 30 23:30:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)
Nov 30 23:30:01 [CROND] (nginx) CMD (php -f /var/www/nextcloud/htdocs/cron.php )
Nov 30 23:40:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)
Nov 30 23:40:01 [CROND] (nginx) CMD (php -f /var/www/nextcloud/htdocs/cron.php )
 - Last output repeated twice -
Nov 30 23:50:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)

Лог быстро будет расти поэтому сразу сделаем ему ротацию создав необходимый файл с параметрами:

vim /etc/logrotate.d/cron
= необходимый код =
/var/log/cron/current
{
daily
rotate 60
missingok
notifempty
compress
}

Результат

Базовая настройка lemp сервера произведена без особых сложностей в системе Calculate Linux полностью совместимой с Gentoo . Основная задача настройки сводилась к тому чтобы в будущем установить облачное хранилище NextCloud на этом веб-сервере. В следующей статье NextCloud установка на Nginx будет рассказано про установку NextCloud. Расскажу как подключить бесплатный сертификат SSL. Настроим работу облачного хранилища как в локальной сети так и с интернета. Настроим дополнительные расширения которые сильно улучшают функционал облачного хранилища.

PHP 7 обновление в CentOS 7

Рассмотрим обновление на PHP 7-ой версии в системе CentOS 7 работающей с Nginx. Произведем настройку после обновления необходимых конфигурационных файлов для работы ресурсов использующих php. Процесс обновления сложный требующий внимания и ответственности.

Введение

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

Обязательно перед обновление сделайте резервную копию системы и после обновления максимально проверьте все ресурсы использующие PHP!

В моем случае я обновляю версию которую устанавливал в статье Установка и настройка PHP.

В другой статье вы узнаете как работать с PHP используя репозиторий Remi для CentOS 7.

Удаление старой версии PHP

Перед тем как установить новую версию нам надо определить какая стоит версия, какие пакеты и с какого репазитория.

Подготовка перед удалением

Проверим установленную версию:

php -v
= вывод команды =
PHP 5.6.30 (cli) (built: Jan 26 2017 00:22:46) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

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

rpm -qa | grep php
= вывод команды =
php-pecl-jsonc-1.3.10-2.el7.remi.5.6.x86_64
php-pdo-5.6.31-1.el7.remi.x86_64
php-pecl-memcache-3.0.8-4.el7.remi.5.6.x86_64
php-soap-5.6.31-1.el7.remi.x86_64
php-mbstring-5.6.31-1.el7.remi.x86_64
php-common-5.6.31-1.el7.remi.x86_64
php-xml-5.6.31-1.el7.remi.x86_64
php-cli-5.6.31-1.el7.remi.x86_64
php-pear-1.10.5-2.el7.remi.noarch
php-gd-5.6.31-1.el7.remi.x86_64
php-mysqlnd-5.6.31-1.el7.remi.x86_64
php-xmlrpc-5.6.31-1.el7.remi.x86_64
php-imap-5.6.31-1.el7.remi.x86_64
php-fpm-5.6.31-1.el7.remi.x86_64
php-snmp-5.6.31-1.el7.remi.x86_64
php-pecl-zip-1.15.1-1.el7.remi.5.6.x86_64
php-process-5.6.31-1.el7.remi.x86_64
php-odbc-5.6.31-1.el7.remi.x86_64
php-ldap-5.6.31-1.el7.remi.x86_64
php-opcache-5.6.31-1.el7.remi.x86_64

Исходя из вывода удалим все эти пакеты. Новую версию php мы будем устанавливать с другого репазитория. Репозиторий remi нам больше не нужен и мы его удалим.

Удаление PHP 5.6

Удалим одной командой:

yum remove php-pecl-jsonc php-pdo php-pecl-memcache php-soap php-mbstring php-common php-xml php-cli php-pear php-gd php-mysqlnd php-xmlrpc php-imap php-fpm php-snmp php-pecl php-process php-odbc php-ldap php-opcache

Внимательно смотрим лог обновления на предмет ошибок и предупреждений! Сохраните все ошибки и предупреждения. Уверяю в последствии это сильно сократит время в настройке после обновления!

Удаление репозитория Remi-safe

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

Выведем список всех используемых репозиториев:

yum repolist
= вывод части команды =
Загружены модули: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.yandex.ru
 * epel: mirror.yandex.ru
 * extras: mirror.yandex.ru
 * remi-safe: mirror.awanti.com
 * updates: mirror.yandex.ru
Идентификатор репозитория репозиторий состояние
!remi-safe Safe Remi's RPM repository for Enterprise Linux 7 - x86_64 2 509

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

yum-config-manager --disable remi-safe
В случае ошибки установите пакет yum-utils!
yum -y install yum-utils

После всех действий обновим систему чтобы окончательно всё подготовить к установке новой версии:

yum update

Установка новой версии PHP

Выбор репозитория и версии PHP 7

Вероятно есть разные варианты установки PHP 7 версии, но мне нравится репозиторий WebtaticEL про него и расскажу.

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

Перейдя по ссылке вы увидите все варианты версий возможных для установки а так же способы их установки в необходимую вам систему. Мой выбор пал на версию PHP 7.1 так как на данный момент это самая стабильная новая версия.

Добавление репозитория Webtatic

Добавим репозиторий в систему:

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

После добавления любого репазитория необходимо обновить список пакетов. В CentOS это можно сделать командой вывода всех репозиториев которая заодно и обновит весь список пакетов:

yum repolist

Установка PHP 7.1

Установим все нужные мне пакеты исходя из тех что удалял:

yum install php71w-fpm php71w-pdo php71w-soap php71w-mbstring php71w-common php71w-xml php71w-cli php71w-pear php71w-gd php71w-mysqlnd php71w-xmlrpc php71w-imap php71w-fpm php71w-snmp php71w-process php71w-odbc php71w-ldap php71w-opcache

Сознательно не стал ставить параметр с которым всё установится без вопросов. Лучше всегда быть на контроле таких сложных и ответственных обновлений.

Можем уставим все что есть, но решать вам самим что для вас лучше:

yum install php70w-cli php70w-common php70w-bcmath php70w-dba php70w-devel php70w-embedded php70w-fpm php70w-gd php70w-imap php70w-interbase php70w-intl php70w-ldap php70w-mbstring php70w-mcrypt php70w-mysql php70w-odbc php70w-opcache php70w-pdo php70w-pdo_dblib php70w-pear php70w-process php70w-pspell php70w-recode php70w-tidy php70w-xml php70w-xmlrpc

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

Проверка после обновления PHP

После обновления первым делом проверим какая версия php в системе:

php -v
= вывод команды =
PHP 7.1.8 (cli) (built: Aug 9 2017 19:19:49) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
 with Zend OPcache v7.1.8, Copyright (c) 1999-2017, by Zend Technologies

Видим что установилась новая версия, но почти со 100% уверенностью могу сказать что при попытке открыть свой интернет ресурс вы обнаружите что он не работает. Вот тут то и пригодятся все наши сохранённые предупреждения при удалении, обновлении и установке новых пакетов.

Ошибки в логах установки/удаления

В моем случае было несколько предупреждений:

  • warning: /etc/nsswitch.conf created as /etc/nsswitch.conf.rpmnew;
  • предупреждение: /etc/php-fpm.d/www.conf сохранен как /etc/php-fpm.d/www.conf.rpmsave;
  • предупреждение: /etc/php.ini сохранен как /etc/php.ini.rpmsave.

Как видите система сказала что в двух случаях она создала новые файлы а старые сохранила с пометкой rpmsave. В случае когда система не смогла создать новый файл она создала его с пометкой rpmnew.

Любыми удобными вам способами сохраните копии созданных новых рабочих файлов. Необходимый вам код из старых сохраненных обновлением файлов перенесите в новые рабочие файлы. Мне было необходимо отредактировать два файла /etc/php-fpm.d/www.conf и /etc/php.ini.

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

Настройка PHP-FPM после обновления

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

systemctl status php-fpm.service
● php-fpm.service - The PHP FastCGI Process Manager
 Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
 Active: inactive (dead)

Из вывода мы видим что служба остановлена и отсутствует в автозагрузке. Добавим в автозагрузку, запустим и посмотрим статус:

systemctl enable php-fpm.service
= вывод команды =
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.

systemctl start php-fpm.service
= вывод команды говорящей об ошибке запуска= 
Job for php-fpm.service failed because the control process exited with error code. See "systemctl status php-fpm.service" and "journalctl -xe" for details.

systemctl status php-fpm.service
= вывод части команды =
● php-fpm.service - The PHP FastCGI Process Manager
 Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
 Active: failed (Result: exit-code) since Пт 2017-09-15 22:00:06 MSK; 13s ago
 Process: 11678 ExecStart=/usr/sbin/php-fpm --nodaemonize --fpm-config /etc/php-fpm.conf (code=exited, status=78)
 Main PID: 11678 (code=exited, status=78)

[15-Sep-2017 22:00:06] ERROR: [/etc/php-fpm.d/www.conf:2] value is NULL for a ZEND_INI_PARSER_ENTRY
сен 15 22:00:06 lemp.sevo44.loc php-fpm[11678]: [15-Sep-2017 22:00:06] ERROR: Unable to include /etc/php-fpm.d/www.conf from /etc/php-fpm.conf at line 2
сен 15 22:00:06 lemp.sevo44.loc php-fpm[11678]: [15-Sep-2017 22:00:06] ERROR: failed to load configuration file '/etc/php-fpm.conf'

Из вывода команды мы видим ошибку во второй строке файла /etc/php-fpm.d/www.conf. Откроем и посмотрим код:

cat /etc/php-fpm.d/www.conf
= вывод команды =
[www]
#Используем порт 9000 по адресу 127.0.0.1
listen = 127.0.0.1:9000;
listen.allowed_clients = 127.0.0.1
#Пользователь и группа от которой работает php

Видим что вторая строке и отключена знаком #. Посмотрев в сохранном созданном установщиком новом файле увидим что все отключения идут знаком ;. Заменив все знаки # на ; сохраним и перезапустим службу и посмотрим статус:

systemctl restart php-fpm.service
= вывод пустой если нет ошибок =

systemctl status php-fpm.service
= вывод команды =
● php-fpm.service - The PHP FastCGI Process Manager
 Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
 Active: active (running) since Пт 2017-09-15 22:02:48 MSK; 4s ago
 Main PID: 11749 (php-fpm)
 Status: "Ready to handle connections"
 CGroup: /system.slice/php-fpm.service
 ├─11749 php-fpm: master process (/etc/php-fpm.conf)
 ├─11750 php-fpm: pool www

сен 15 22:02:48 lemp.sevo44.loc systemd[1]: Starting The PHP FastCGI Process Manager...
сен 15 22:02:48 lemp.sevo44.loc systemd[1]: Started The PHP FastCGI Process Manager.

Видим что служба находится в автозагрузке и работает.

Вывод всех параметров PHP 7

Последнее что нам осталось сделать для полного понимания проделанной работы это посмотреть вывод всей информации о версии php. Создадим на работающем ресурсе в корневой директории сайта файл info.php и поместим туда код:

<?php phpinfo(); ?>

Достаточно набрать в строке браузера http://IP или ИМЯ/info.php и вы увидите страницу примерно с таким содержанием:

PHP Version 7.1.8

System Linux lemp.sevo44.loc 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017 x86_64
Build Date Aug 9 2017 19:21:59
Server API FPM/FastCGI
Virtual Directory Support disabled
Configuration File (php.ini) Path /etc
Loaded Configuration File /etc/php.ini
Scan this dir for additional .ini files /etc/php.d

и тд. и тп.

Вывод

Судя по статье может показаться что обновление версии PHP не такое уж и сложное дело но уверяю что эта простота придет только с опытом. Многое зависит от того как долго не обновляли систему, какие ресурсы там работают и какие у каждого в отдельности требования к версии php. В случае если вам досталась система с которой работали разные люди и мало чего комментировали в коде сложностей может возникнуть очень много и единственное что вас спасет от головной боли в случае неправильной работы важных ресурсов это резервное копирование перед выполнением обновления. Лучшим вариантом при обновлении таких систем это сделать клон системы и производить все действия на нем. Конечно при работе с клоном может возникнуть дополнительные сложности но это уже другая тема.