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

MediaWiki c VisualEditor на CentOS 7

Установка и настройка MediaWiki c визуальным редактором VisualEditor на CentOS 7. Удобная работа с ресурсом как в локальной сети так и с интернета. Подключим сертификат SSL. Удобное добавление информации гарантия хорошего наполнения сайта.

Введение

Для меня работа с любым сайтом это прежде всего удобство добавления нужной информации. Стандартный редактор добавления статей в MwdiaWiki не удобный, так как всё отображение вносимого текста строится вводом определенных знаков. Добавление редактора WikiEditor немного улучшает вид самой панели но не решает проблему с отображением вводимой информации. Существует замечательное дополнение VisualEditor но при установки оно требует наличия на сервере сервиса Parsoid который необходим для работы. Готового решения для установки его на CentOS 7 из пакетов нет. В статье мы и рассмотрим как установить Parsoid и MediaWiki на одной машине с CentOS 7. Работать ресурс будет на базе Nginx в локальной сети. Для удобной работы с ресурсом как в локальной сети так и с интернета мы сделаем запись в DNS необходимого домена указав нужный статический IP.

Установка MediaWiki на Nginx

Нравится мне работать с Nginx поэтому и стараюсь везде его использовать где это возможно.

Для начала нам надо определиться с версиями которые мы будем устанавливать. На сайте из документации по расширению Extension:VisualEditor сказано что стабильная работа гарантирована на версии MediaWiki  1.28. Можно попробовать установить и на тестовых версиях, но я не сторонник такого подхода, поэтому будем прислушиваться к рекомендациям и устанавливать стабильные версии.

Из предыдущих статей вы можете узнать все необходимое перед установкой MediaWiki:

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

На сайте разработчика вы найдёте всю необходимую информацию.

Перейдем в необходимую папку на сервере.

cd /web/sites/wiki.sevo44.ru

Скачаем необходимую нам версию.

wget https://releases.wikimedia.org/mediawiki/1.28/mediawiki-1.28.2.tar.gz
= вывод команды =
--2017-09-10 14:30:11-- https://releases.wikimedia.org/mediawiki/1.28/mediawiki-1.28.2.tar.gz
Распознаётся releases.wikimedia.org (releases.wikimedia.org)... 91.198.174.217, 2620:0:862:ed1a::3:d
Подключение к releases.wikimedia.org (releases.wikimedia.org)|91.198.174.217|:443... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа... 200 OK
Длина: 32965916 (31M) [application/x-gzip]
Сохранение в: «mediawiki-1.28.2.tar.gz»

100%[======================================>] 32 965 916 2,35MB/s за 11s

2017-09-10 14:30:23 (2,77 MB/s) - «mediawiki-1.28.2.tar.gz» сохранён [32965916/32965916]

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

tar -zxvf mediawiki-1.28.2.tar.gz

Переименовываем папку mediawiki-1.28.2 в www.

mv mediawiki-1.28.2 www

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

chown -R nginx:nginx /web/sites/wiki.sevo44.ru

Параметры настройки MediaWiki для Nginx c SSL

Создадим необходимые настройки для работы MediaWiki в Nginx c SSL сертификатом.

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

vi /etc/nginx/conf.d/wiki.sevo44.conf
= необходимые параметры =
# wiki.sevo44.ru
server {
# Переводим на nttps. http2 - включит работу сайта по этому протоколу!
listen 443 ssl http2;
#listen 80;
server_name wiki.sevo44.ru www.wiki.sevo44.ru;
root /web/sites/wiki.sevo44.ru/www/;
index index.php index.html index.htm;
access_log /web/sites/wiki.sevo44.ru/log/access.log main;
error_log /web/sites/wiki.sevo44.ru/log/error.log;
# Для ssl
ssl_certificate /etc/letsencrypt/live/wiki.sevo44.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/wiki.sevo44.ru/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#### ssl_ciphers "HIGH:!RC4:!aNULL:!MD5:!kEDH";
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_dhparam /etc/ssl/certs/dhparam.pem;
add_header Strict-Transport-Security 'max-age=604800';
#/ Для ssl
location / {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
rewrite ^/(.*)$ /index.php?title=$1&$args;
}
location ^~ /maintenance/ {
return 403;
}
 
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
try_files $uri /index.php;
expires max;
log_not_found off;
}
location = /_.gif {
expires max;
empty_gif;
}
location ^~ /cache/ {
deny all;
}
#gzip on; #включаем сжатие gzip для ускорения отдачи страниц
#gzip_min_length 1000;
#gzip_proxied expired no-cache no-store private auth;
#gzip_types text/plain application/xml;
location ~ \.php$ {
#try_files $uri $uri/ /index.php?$args;
fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/var/run/php-fpm/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param DOCUMENT_ROOT /web/sites/wiki.sevo44.ru/www/;
fastcgi_param SCRIPT_FILENAME /web/sites/wiki.sevo44.ru/www$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED /web/sites/wiki.sevo44.ru/www$fastcgi_script_name;
fastcgi_param PHP_VALUE "
max_execution_time = 30
memory_limit = 256M
post_max_size = 32M
upload_max_filesize = 32M
max_input_time = 60
date.timezone = Europe/Moscow
#always_populate_raw_post_data = -1
";
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;
}
}
# Редирект с http
server {
listen 80;
server_name wiki.sevo44.ru www.wiki.sevo44.ru;
rewrite ^ https://wiki.sevo44.ru$request_uri? permanent;
}

Проверим правильность.

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

Применим изменения.

systemctl reload nginx.service

Непосредственная установка MediaWiki

Теперь для начала установки нам надо либо добавить наш сайт на DNS сервер или прописать нужную строчку в необходимый файл на компьютере с которого будем работать с сайтом. Для систем с Linux надо сделать следующее:

cat /etc/hosts
= необходимое дополнение =
192.168.1.101 wiki.sevo44.ru

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

Набрав в браузере необходимый адрес wiki.sevo44.ru мы попадем на страницу установки MediaWiki.

Внимание! В случае появления ошибки при попытке установки
/wiki/mw-config/index.php MediaWiki\Services\ServiceDisabledException from line 340 of /storage/c/12/69/colegiovertice3/public_html/wiki/includes/services/ServiceContainer.php: Service disabled: DBLoadBalancer
Выполните действия

cd /var/lib/php/
chown nginx:nginx session/

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

Настройка файла LocalSettings.php для MediaWiki

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

Свой логотип на сайт MediaWiki

Файл должен иметь размер 160х160 пикселей.

vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php 
= необходимое изминение =
$wgLogo = "https://wiki.sevo44.ru/wiki_sevo44.png";

Убираем index.php из URL

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

vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php
= необходимое дополнение =
# Скрываем index.php из url
$wgArticlePath = "/$1";
# /Скрываем index.php из url

Добавляем ico на сайт MediaWiki

Загружаем файл favicon.ico в корень сайта и добавляем строчку в файл настройки.

vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php
= необходимое дополнение = 
$wgFavicon = "../favicon.ico";

Запрет редактирование не авторизованным пользователям

Добавим нужный код в файл настройки MediaWiki.

vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php
= необходимое дополнение =
# Запрет редактирования не авторизованным
$wgGroupPermissions['*']['createaccount'] = true;
$wgGroupPermissions['*']['read'] = true;
$wgGroupPermissions['*']['edit'] = false;
$wgGroupPermissions['*']['createpage'] = false;
$wgGroupPermissions['*']['createtalk'] = false;
# /Запрет редактирования не авторизованным

Установка дополнения WikiEdit

При установке я сознательно не выбирал установку расширений. Сделаем это вручную. Всю необходимую документацию вы можете найти на странице Extension:WikiEditor/ru.

Согласно документации нам необходимо добавить в файл настроек  LocalSettings.php небольшой код.

vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php
= необходимое дополнение =
# Extension WikiEditor
wfLoadExtension( 'WikiEditor' );
# Расширение включено по умолчанию, однако пользователь может отключить его в настройках.
$wgDefaultUserOptions['usebetatoolbar'] = 1;

# Enables link and table wizards by default but still allows users to disable them in preferences
$wgDefaultUserOptions['usebetatoolbar-cgd'] = 1;

# Показывает вкладки «Предпросмотра» и «Изменений»
$wgDefaultUserOptions['wikieditor-preview'] = 1;

# Показывает кнопки «Публикации» и «Отмены» справа сверху
$wgDefaultUserOptions['wikieditor-publish'] = 1;
# / Extension WikiEditor

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

# Extension WikiEditor — говорит о начале правки кода.

# / Extension WikiEditor — говорит о конце добавляемого кода.

Установка дополнения VisualEditor

Вся документация по установке находится по ссылке Parsoid/Setup но к сожалению готового пакета для CentOS 7 нет. Мы будем использовать документацию Parsoid/Developer Setup в которой указаны варианты установки на другие системы. Все что надо для работы VisualEditor указано в документации по настройке Extension:VisualEditor. На мой взгляд документация немного не точна и размыта.

Установка Parsoid на CentOS 7

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

Установим все необходимые пакеты.

yum install nodejs npm vim-enhanced git policycoreutils-python
= вывод команды =
Ошибка: Пакет: 1:nodejs-6.11.1-1.el7.x86_64 (epel)
 Необходимо: http-parser >= 2.7.0
Ошибка: Пакет: 1:nodejs-6.11.1-1.el7.x86_64 (epel)
 Необходимо: libhttp_parser.so.2()(64bit)

Как видим установить не удалось из за того что http-parser должен быть >= 2.7.0.

Установим необходимый пакет.

yum install https://kojipkgs.fedoraproject.org//packages/http-parser/2.7.1/3.el7/x86_64/http-parser-2.7.1-3.el7.x86_64.rpm

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

yum -y install nodejs npm vim-enhanced git policycoreutils-python

После установки проверим необходимую версию node.

node --version
v6.11.1

Создадим папку opt в корне сервера куда и будем устанавливать.

mkdir /opt
cd /opt

Выполним клонирование.

git clone https://gerrit.wikimedia.org/r/p/mediawiki/services/parsoid
= вывод команды =
Cloning into 'parsoid'...
remote: Counting objects: 502, done
remote: Finding sources: 100% (124/124)
remote: Getting sizes: 100% (69/69)
remote: Compressing objects: 100% (2232324/2232324)
remote: Total 49985 (delta 46), reused 49937 (delta 40)
Receiving objects: 100% (49985/49985), 12.28 MiB | 1.72 MiB/s, done.
Resolving deltas: 100% (40561/40561), done.

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

cd /opt/parsoid
npm install
= вывод части команды =
npm WARN prefer global jshint@2.9.4 should be installed with -g

> dtrace-provider@0.8.5 install /opt/parsoid/node_modules/dtrace-provider
> node scripts/install.js

parsoid@0.7.1 /opt/parsoid
├── abbrev@1.0.9 
├── accepts@1.3.3 
├── acorn@5.0.3 

и тд. и тп.

Произведем тестирование.

npm test
= часть вывода команды =
Везде должно быть - No errors logged. 
В дальнейшем выводе везде должны стоять зелёные галочки!

В моем случае тестирование длилось 8 минут.

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

vi /etc/hosts
192.168.1.101 wiki.sevo44.ru

Отредактируем файл localsettings.js для обратной совместимости, и поддержки не статическиx настроек. Сделаем копию и приведем файл к необходимому виду.

cp localsettings.example.js localsettings.js
vi localsettings.js
= вывод команды с необходимыми изменениями =
'use strict';

exports.setup = function(parsoidConfig) {
 // Do something dynamic with `parsoidConfig` like,
 parsoidConfig.setMwApi({
 uri: 'http://wiki.sevo44.ru/api.php',
 });
};

По пути wiki.sevo44.ru/api.php у вас обязательно должна открыться страница с заголовком «Справка MediaWiki API». Без открытия этой страницы работать Parsoid не будет.

Скопируем образец и настроим конфигурационный файл Parsoid.

cp config.example.yaml config.yaml
vi config.yaml
= вывод команды с необходимыми настройками =
worker_heartbeat_timeout: 300000

logging:
 level: info

services:
 - module: lib/index.js
 entrypoint: apiServiceWorker
 conf:
 # For backwards compatibility, and to continue to support non-static
 # configs for the time being, optionally provide a path to a
 # localsettings.js file. See localsettings.example.js
 localsettings: ./localsettings.js

# Set your own user-agent string
 # Otherwise, defaults to:
 # 'Parsoid/<current-version-defined-in-package.json>'
 #userAgent: 'My-User-Agent-String'

# Configure Parsoid to point to your MediaWiki instances.
 mwApis:
 - # This is the only required parameter,
 # the URL of you MediaWiki API endpoint.
 uri: 'http://wiki.sevo44.ru/api.php'
 # The "domain" is used for communication with Visual Editor
 # and RESTBase. It defaults to the hostname portion of
 # the `uri` property above, but you can manually set it
 # to an arbitrary string. It must match the "domain" set
 # in $wgVirtualRestConfig.
 domain: 'wiki.sevo44.ru' # optional

Запустим Parsoid выполнив команду из папки /opt/parsoid.

cd /opt/parsoid
npm start
= вывод команды =
> parsoid@0.7.1 start /opt/parsoid
> service-runner

{"name":"parsoid","hostname":"lemp.sevo44.loc","pid":3320,"level":30,"levelPath":"info/service-runner","msg":"master(3320) initializing 4 workers","time":"2017-09-10T15:14:18.866Z","v":0}
Domain should be unique in ParsoidConfig#setMwApi calls: wiki.sevo44.loc
(It doesn't have to be an actual domain, just a unique string.)
{"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid":3330,"level":30,"levelPath":"info","msg":"loading ...","time":"2017-09-10T15:14:22.615Z","v":0}
{"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid":3330,"level":30,"levelPath":"info","msg":"ready on :8000","time":"2017-09-10T15:14:22.711Z","v":0}
Domain should be unique in ParsoidConfig#setMwApi calls: wiki.sevo44.loc
(It doesn't have to be an actual domain, just a unique string.)
{"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid":3340,"level":30,"levelPath":"info","msg":"loading ...","time":"2017-09-10T15:14:26.381Z","v":0}
/
Domain should be unique in ParsoidConfig#setMwApi calls: wiki.sevo44.loc
(It doesn't have to be an actual domain, just a unique string.)
{"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid":3360,"level":30,"levelPath":"info","msg":"loading ...","time":"2017-09-10T15:14:34.026Z","v":0}
{"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid":3360,"level":30,"levelPath":"info","msg":"ready on :8000","time":"2017-09-10T15:14:34.108Z","v":0}
{"name":"parsoid","hostname":"lemp.sevo44.loc","pid":3320,"level":40,"levelPath":"warn/service-runner","msg":"Startup finished","time":"2017-09-10T15:14:34.111Z","v":0}

Самое главное в выводе это отсутствие ошибок и фраза Startup finished говорящая о том что Parsoid успешно запущен.

Оставляем эту консоль в покое и открываем новую где и будем устанавливать VisualEditor. При работе или ошибках в работе визуального редактора мы сможем увидеть всё в выводе консоли. При настройке такой способ очень удобный. В последствии мы настроим автоматический запуск в системе CentOS 7 создав юнита parsoid.service для работы в systemd.

Создание сервиса parsoid.service для работы в SystemD

Создадим файл с необходимыми настройками.

vi /etc/systemd/system/parsoid.service
= необходимые данные =
[Unit]
Description=Mediawiki Parsoid web service on node.js
Documentation=http://www.mediawiki.org/wiki/Parsoid
Wants=local-fs.target network.target
After=local-fs.target network.target

[Install]
WantedBy=multi-user.target

[Service]
Type=simple
User=nobody
Group=nobody
WorkingDirectory=/opt/parsoid
#EnvironmentFile=-/etc/parsoid/parsoid.env
ExecStart=/usr/bin/node /opt/parsoid/bin/server.js
KillMode=process
Restart=on-success
PrivateTmp=true
StandardOutput=syslog

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

systemctl enable parsoid.service
systemctl start parsoid.service

Проверим как работает сервис.

systemctl status parsoid.service
● parsoid.service - Mediawiki Parsoid web service on node.js
 Loaded: loaded (/etc/systemd/system/parsoid.service; enabled; vendor preset: disabled)
 Active: active (running) since Вс 2017-09-10 23:29:06 MSK; 1min 4s ago
 Docs: http://www.mediawiki.org/wiki/Parsoid
 Main PID: 908 (node)
 CGroup: /system.slice/parsoid.service
 ├─ 908 /usr/bin/node /opt/parsoid/bin/server.js
 ├─2324 /usr/bin/node /opt/parsoid/node_modules/service-runner/service-runner.js
 ├─2384 /usr/bin/node /opt/parsoid/node_modules/service-runner/service-runner.js
 ├─2394 /usr/bin/node /opt/parsoid/node_modules/service-runner/service-runner.js
 └─2409 /usr/bin/node /opt/parsoid/node_modules/service-runner/service-runner.js

сен 10 23:29:28 lemp.sevo44.loc node[908]: {"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid"...":0}
сен 10 23:29:32 lemp.sevo44.loc node[908]: Domain should be unique in ParsoidConfig#setMwApi calls: ....loc
сен 10 23:29:32 lemp.sevo44.loc node[908]: (It doesn't have to be an actual domain, just a unique string.)
сен 10 23:29:32 lemp.sevo44.loc node[908]: {"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid"...":0}
сен 10 23:29:32 lemp.sevo44.loc node[908]: {"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid"...":0}
сен 10 23:29:36 lemp.sevo44.loc node[908]: Domain should be unique in ParsoidConfig#setMwApi calls: ....loc
сен 10 23:29:36 lemp.sevo44.loc node[908]: (It doesn't have to be an actual domain, just a unique string.)
сен 10 23:29:36 lemp.sevo44.loc node[908]: {"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid"...":0}
сен 10 23:29:36 lemp.sevo44.loc node[908]: {"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid"...":0}
сен 10 23:29:36 lemp.sevo44.loc node[908]: {"name":"parsoid","hostname":"lemp.sevo44.loc","pid":908,...":0}
Hint: Some lines were ellipsized, use -l to show in full.

Видим что все хорошо.

Установка и настройка VisualEditor

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

cd /web/sites/wiki.sevo44.ru/www/extensions/
git clone -b REL1_28 https://gerrit.wikimedia.org/r/p/mediawiki/extensions/VisualEditor.git
= вывод команды =
Cloning into 'VisualEditor'...
remote: Counting objects: 2101, done
remote: Finding sources: 100% (109865/109865)
remote: Getting sizes: 100% (9091/9091)
remote: Compressing objects: 100% (368092/368092)
remote: Total 109865 (delta 87211), reused 109794 (delta 87171)
Receiving objects: 100% (109865/109865), 20.18 MiB | 1.18 MiB/s, done.
Resolving deltas: 100% (87211/87211), done.

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

cd ./VisualEditor
git submodule update --init
= вывод команды =
Submodule 'lib/ve' (https://gerrit.wikimedia.org/r/p/VisualEditor/VisualEditor.git) registered for path 'lib/ve'
Cloning into 'lib/ve'...
remote: Counting objects: 3549, done
remote: Finding sources: 100% (108614/108614)
remote: Getting sizes: 100% (5062/5062)
remote: Compressing objects: 100% (468795/468795)
remote: Total 108614 (delta 91819), reused 108561 (delta 91798)
Receiving objects: 100% (108614/108614), 20.37 MiB | 1.29 MiB/s, done.
Resolving deltas: 100% (91819/91819), done.
Submodule path 'lib/ve': checked out '5fc8c7f0fe9da80aa97c456fa323acb8685bb792'

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

Добавим необходимые настройки в конфугационный файл.

vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php
= Необходимое дополнение =
# Extension VisualEditor
wfLoadExtension ( 'VisualEditor' );

// Включение по умолчанию для всех , 
$wgDefaultUserOptions['visualeditor-enable'] = 1;

// Дополнительно: Набор VisualEditor по умолчанию для анонимных пользователей 
// в противном случае им придется перейти на VE 
// $wgDefaultUserOptions['visualeditor-editor'] = "visualeditor";

// Не позволяют пользователям отключить его 
$wgHiddenPrefs[] = 'visualeditor-enable';

// ВАРИАНТ: Включить экспериментальный код VisualEditor о функциях 
#$wgDefaultUserOptions['visualeditor-enable-experimental'] = 1;

# Для Parsoid
$wgVirtualRestConfig['modules']['parsoid'] = array(
 // URL to the Parsoid instance
 // Use port 8142 if you use the Debian package
 'url' => 'http://wiki.sevo44.ru:8000',
 // Parsoid "domain", see below (optional)
 'domain' => 'wiki.sevo44.ru',
 // Parsoid "prefix", see below (optional)
 'prefix' => 'wiki.sevo44'
);
# /Для Parsoid
# /Extension VisualEditor

После всех проделанных действий вы увидите напротив статьи две ссылки «Править» и «Править вики-текст». Дальше рассказывать нет смысла сами всё поймёте.

Доступ к локальному сайту из интернета

Для доступа с интернета необходимо сделать следующее:

  1. Иметь статический IP;
  2. Пробросить до локальной машины необходимый 443 порт;
  3. Сделать запись в DNS указав необходимый IP и доменное имя.

Предпочитаю использовать DNS для домена компании Yandex. Достаточно добавить запись «wiki — A — IP» и через несколько часов всё заработает.

Вывод

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

SSL бесплатный для сайта Nginx

Получим и настроим автоматическое обновление бесплатного сертификата SSL для сайта от компании  Lets`Encrypt. Срок сертификата 90 дней. Настроить получение сертификатов возможно на любой операционной системе Linux. Стабильная и удобная работа с сервисом.

Введение

С января 2017 года Firefox и Chrome маркируют как надежные только сайты с SSL-сертификатами. Это одна из причин по которой следует использовать этот сертификат.

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

Мной было найдено два ресурса выдающие бесплатные SSL для сайтов:

  • StartCom — у этого ресурса проблемы с разработчиками браузеров и чем все это закончится не понятно. Удобно что выдается на 3 года и можно установить на любой обычный хостинг.
  • Let’s Encrypt is — все работает и никаких проблем нет. Для установки нужен свой VDS хостинг. Хоть сертификат и выдается на 90 дней, но при настройке автоматического обновления никаких проблем не возникает.

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

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

Установка Certbot от Let’s Encrypt

На сайте компании есть инструкция об установке и использованию. По ссылке вы можете увидеть инструкцию для установки SSL на Nginx под управлением CentOS 8 = Rocky Linux 8. Можете указать свои системы и получить инструкцию для них.

Разработчик рекомендует использовать пакетную систему Snap. Ее смысл заключается в том, что в пакет с приложением входит полный набор компонентов, необходимых для запуска данного приложения. Такие пакеты можно устанавливать в систему не заботясь о зависимостях, так как все зависимости уже включены в пакет. Пакетная система Snap была созданная компанией Canonical и изначально появилась в дистрибутиве Ubuntu Linux.

При установке на дистрибутивы которые используют не стабильные репозитории это очень оправдано и понятно почему. В нашем случае устанавливать в таком виде не имеет смысла. Лично у меня на протяжении лет 5 проблем не возникало.

Для использования Certbot, необходимо сначала добавить репозиторий Epel . Подключим необходимый репозиторий:

dnf -y install epel-release

Установим без вопросов Certbot от Let’s Encrypt:

yum -y install certbot

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

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

  1. Ответы на вопросы от разработчика;
  2. Вносим необходимые настройки в конфигурацию Nginx.

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

Ответы на вопросы от разработчика

Запускаем получение сертификата, но получать его не будем. Необходимо ответить на несколько вопросов от разработчика:

certbot certonly
= вывод команды =
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Spin up a temporary webserver (standalone)
2: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Enter email address (used for urgent renewal and security notices)
= в случае проблем с получением сертификата на эту почту будут приходить сообщения =
= можно указать выдуманный =
(Enter 'c' to cancel): info@sevo44.ru

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
= подтверждаем что ознакомились с условиями предоставления услуг =
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
= Просят поделиться своим адресом электронной почты с Фондом Electronic Frontier,
партнером-основателем проекта Let's Encrypt и некоммерческой организацией, которая
разрабатывает Certbot. Отказываюсь. =
(Y)es/(N)o: N
Account registered.

= Выходим по Ctrl + C =

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

  1. Spin up a temporary webserver (standalone) — при таком варианте сертификат будет получен с использованием тестового сервера разработчика. Этот вариант подходит при условии что сайт уже где то работает и нам его надо перенести. После переезда нам надо заходить в настройки получения сертификата и менять параметры. Мне такой вариант не нравится и ниже вы узнаете почему;
  2. Place files in webroot directory (webroot) — при этом варианте сервис проверяет доступ к серверу и если он есть выдает сертификат. Основное преимущество данного вида в том что мне не надо в последствии править настройки получения сертификата. Достаточно с работающего сервера взять действующие сертификаты положить их в свое место и прописать пути в настройках Nginx. После реального переезда сайта достаточно получить сертификаты и указать в настройках Nginx новые пути.

Вносим необходимые настройки в конфигурацию Nginx

В конфигурации Nginx для сайта должны быть добавлены следующие строки:

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

Создадим необходимую папку:

mkdir /etc/nginx/cert-renewal/

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

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

  1. Внести все основные настройки для работы сайта с сертификатом в главный файл настройки Nginx а в настройках для самого сайта указывать только пути для сертификата;
  2. Не трогать главный файл и все настройки прописывать в настройках для сайта.

Лично я предпочитаю первый вариант и именно он будет описан ниже.

Вот пример моего файла настроек главного конфигурационного файла Nginx:

cat /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;
}
}
}

В случае отсутствия /etc/ssl/certs/dhparam.pem генерируем  ключ необходимый для настройки:

openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Процесс не быстрый. Ждите.

Получение бесплатного SSL-сертификата

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

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

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

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

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

location / {
proxy_pass http://192.168.0.112:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#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;
}
}

В этом файле два блока server. Первый отвечающий за работы http мы закомментировали, второй отвечающий за https перевели на работу по http и закомментировали пути к сертификату.

Обязательно проверяем правильность настроек 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

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

Не знаю какие ограничения на установку, но я спокойно установил SSL сертификат на домен и 5 его поддоменов.

Пример получения сертификата SSL:

certbot certonly
= вывод команды с действиями =
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
-------------------------------------------------------------------------------
1: Spin up a temporary webserver (standalone)
2: Place files in webroot directory (webroot)
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Please enter in your domain name(s) (comma and/or space separated) (Enter 'c'
to cancel):sevo44.ru
Requesting a certificate for sevo44.ru
Input the webroot for sevo44.ru: (Enter 'c' to cancel):/etc/nginx/cert-renewal
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0014_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0014_csr-certbot.pem

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
 /etc/letsencrypt/live/sevo44.ru/fullchain.pem. Your cert will
 expire on 2021-12-14. To obtain a new or tweaked version of this
 certificate in the future, simply run certbot again. To
 non-interactively renew *all* of your certificates, run "certbot
 renew"
 - If you like Certbot, please consider supporting our work by:

 Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
 Donating to EFF: https://eff.org/donate-le

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

Получение одного сертификата на домен с WWW и без

При попытке зайти по ссылке https://www.sevo44.ru мы получим сообщение об ошибке сертификата:

curl -I https://www.sevo44.ru
= вывод команды =
curl: (51) SSL: no alternative certificate subject name matches target host name 'www.sevo44.ru'

В настройках DNS для домена обязательно должен быть прописаны параметры его работы по адресу www.sevo44.ru!

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

Команда выглядит следующим образом:

certbot certonly --webroot --expand -d sevo44.ru -d www.sevo44.ru

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

  • certbot certonly — команда на получение сертификата;
  • webroot — способ получения сертификата;
  • expand — ключ для получения на один сертификат несколько доменов.

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

curl -I https://www.sevo44.ru
= вывод команды =
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Tue, 06 Aug 2019 20:26:56 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/7.2.20
Vary: Accept-Encoding, Cookie
X-Redirect-By: WordPress
Location: https://sevo44.ru/

Ошибок больше нет.

Установка SSL-сертификата на сайт c Nginx

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

Все полученные сертификаты будут лежать в папке /etc/letsencrypt/live/ согласно доменным именам вводимым при получении.

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

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

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

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

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

location / {
proxy_pass http://192.168.0.112:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#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;
}
}

Мы разкоментировали все строчки что ранее закомментировали и переключили второй блок на работу по https с указанием путей к сертификатам. Как вы заметил http2 протокол включается простым добавлением этой записи.

Сделаем проверку настроек и обновим настройки Nginx:

nginx -t
nginx -s reload

Ресурсы проверки SSL и Http2 сайта

Проверим сторонними ресурсами как установился наш SSL-сертификат.

  • SSLChecker — cервис проверки настройки SSL,
  • SSLReport — сервис проверки SSL но более детальный.

Проверим работу http2 протокола:

  • HTTP/2 Test — сервис показывающий проверяющий работу http2.

Продление SSL-сертификата

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

Ручной режим

Проверим автоматическое продление сертификатов, выполнив эту команду:

certbot renew --dry-run
= вывод команды =
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/sevo44.ru.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator webroot, Installer None
Simulating renewal of an existing certificate for sevo44.ru
Performing the following challenges:
http-01 challenge for sevo44.ru
Waiting for verification...
Cleaning up challenges

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/sevo44.ru/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/sevo44.ru/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Видим что все хорошо.

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

certbot renew 
= вывод команды =
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/sevo44.ru.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
 /etc/letsencrypt/live/sevo44.ru/fullchain.pem (skipped)
No renewals were attempted.

Обновлять ничего.

Автоматический режим

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

vim /etc/crontab
= необходимое варианты добавление =
# Cert Renewal
# запись в лог файл
30 2 0 * * root /usr/bin/certbot renew --post-hook "nginx -s reload" >> /var/log/letsencrypt/cron-renew.log

=== или ===
# без записи в лог файл
30 2 0 * * root /usr/bin/certbot renew --post-hook "nginx -s reload" >> /dev/null 2>&1

Согласно этой настройке команда будет выполняться по воскресеньям в 2:30 после выполнения произойдёт reload nginx.

Удаление сертификата

Удаление сертификата состоит из двух частей:

  1. Аннулирование сертификатов на серверах Let`s Enscrypt;
  2. Удаление сертификатов на сервере.

Аннулируем сертификат:

certbot revoke --cert-path /etc/letsencrypt/archive/sevo44.ru/cert1.pem
= вывод команды =
Saving debug log to /var/log/letsencrypt/letsencrypt.log
An unexpected error occurred:
The client lacks sufficient authorization :: Certificate is expired
Please see the logfiles in /var/log/letsencrypt for more details.

В выводе говориться что сертификат просрочен и удалять нечего.

Удалим сертификат на сервере:

certbot delete --cert-name sevo44.ru
= вывод команды =
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
The following certificate(s) are selected for deletion:

* sevo44.ru

Are you sure you want to delete the above certificate(s)?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y - подтверждаем удаление
Deleted all files relating to certificate sevo44.ru.

Принудительное обновление сертификата

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

Вот варианты команд которые можно использовать:

= Для принудительного обновления всех сертификатов =
certbot --force-renewal

= Выборочное принудительное обновление сертификатов =
= через запятую указываются все необходимые доменные имена =
certbot --force-renewal -d www.itsecforu.ru,itsecforu.ru

Заключение

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

Если захочется посмотреть более подробно инструкцию выполните команду:

certbot --help

certbot --help all
Например можете отфильтруйте опцию обновления, используя команду grep / egrep:
certbot --help all | grep -i force
certbot --help all | egrep -i 'renewal|force'

Virtual Hosts на web-сервере NGINX

Virtual Hosts или добавление виртуального хоста на web-сервере под управлением NGINX для операционной системы CentOS 7. Возможность добавлять виртуальные хосты позволяет запускать несколько web-сайтов на одном физическом сервере. Рассмотрим основные моменты создания.

Введение

Начальную настройку Nginx в операционной системе CentOS 7 мы произвели в статье NGINX на web сервер CentOS 7. Все дальнейшие действия будем производить с учетом этой информации.

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

Структура каталогов

Первое что необходимо сделать для последующей работы с web-сервером, это определится со структурой каталогов где будут лежать данные сайтов. В моем случае папка с данными сайта будет называться sevo44.ru по аналогии с доменным именем. Название папки может быть любое.  В конфигурационном файле nginx прописывается путь до необходимой папки.

В моем случае структура выглядит так:

  • web — папка в корне сервера,
  • web/sites — папка где лежат все виртуальные хосты (сайты),
  • web/sites/sevo44.ru — папка где лежат файлы конкретного сайта,
  • web/sites/sevo44.ru/www — папка с файлами сайта,
  • web/sites/sevo44.ru/log — папка с логами сайта.

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

mkdir /web && mkdir /web/sites && mkdir /web/sites/sevo44.ru && mkdir /web/sites/sevo44.ru/www && mkdir /web/sites/sevo44.ru/log

Можем закачать в папку web/sites/sevo44.ru/www необходимый нам движок для установки.

Как скачать необходимый движок в консоли вы можете узнать из статьи PhpMyAdmin на Nginx для CentOS 7.

Не забываем дать нужные права для файлов сайта! Это действие нужно выполнять каждый раз как только вы добавляете файлы не из под пользователя nginx!

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

chown -R nginx:nginx /web/sites/sevo44.ru

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

Обработка сессий PHP

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

Создадим необходимую папку с нужными правами:

cd /var/lib/php/
mkdir session
chown nginx:nginx session/

Virtual Hosts для NGINX

Настройка Virtual Hosts в Nginx подразумевает два варианта указания настроек для виртуальных сайтов:

  • Все правила для сайтов писать в конфигурационном файле /etc/nginx/nginx.conf,
  • Создать для каждого виртуального сайта свой файл в /etc/nginx/conf.d с названием имя сайта.conf.

Мне удобней работать с файлами настроек для каждого сайта. Чтобы такая возможность была необходимо в главном файле присутствие строки include /etc/nginx/conf.d/*.conf.

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

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

mcedit /etc/nginx/conf.d/sevo44.conf
= необходимые данные с пояснениями =
# sevo44.ru
server {
# Вариант работы сайта http или https
#listen 443 ssl http2;
listen 80;

server_name sevo44.ru www.sevo44.ru;
# Путь до файлов сайта
root /web/sites/sevo44.ru/www/;
index index.php index.html index.htm;
# Путь до логов сайта
access_log /web/sites/sevo44.ru/log/access.log main;
error_log /web/sites/sevo44.ru/log/error.log;

keepalive_timeout 60;

location / {
try_files $uri $uri/ /index.php?$args;
}

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

location ~ \.php$ {
try_files $uri $uri/ /index.php?$args;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param DOCUMENT_ROOT /web/sites/sevo44.ru/www/;
fastcgi_param SCRIPT_FILENAME /web/sites/sevo44.ru/www$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED /web/sites/sevo44.ru/www$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_param HTTPS on;
# Параметры php
fastcgi_param PHP_VALUE "
max_execution_time = 90
memory_limit = 128M
post_max_size = 32M
upload_max_filesize = 32M
short_open_tag = On
max_input_time = 180
#date.timezone = Europe/Moscow
#always_populate_raw_post_data = -1
";
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;
}

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

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

location ~ /\.ht {
deny all;
}
}
# Используется для переадресации с 80 на 443 порт
#server {
#listen 80;
#server_name sevo44.ru www.sevo44.ru;
#rewrite ^ https://sevo44.ru$request_uri? permanent;
#}

С данными параметрами сайт успешно работает.

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

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

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

mcedit /etc/logrotate.d/sites
= ввод необходимых параметров =
# Указываем в каждой строчке необходимый сайт
/web/sites/sevo44.ru/log/*log
/web/sites/test.ru/log/*log
{
create 0644 nginx nginx
daily
rotate 60
missingok
notifempty
compress
sharedscripts
postrotate
/bin/kill -USR1 cat /run/nginx.pid 2>/dev/null 2>/dev/null || true
endscript
}

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

logrotate /etc/logrotate.conf

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

Результат

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

Web сервер CentOS 7

Установим и настроим web сервер на базе операционной системы CentOS 7 со связкой Nginx, MariaDB и PHP. Коротко такая связка функционала называется LEMP и дает возможность работать с сайтами использующими эти технологии.

Введение

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

Компоненты web сервера

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

  • Nginx — по сути это и есть сам веб сервер который будет обрабатывать все запросы и выдавать информацию пользователям,
  • MariaDB — база данных в которой будут хранится данные сайтов. MariaDB ответвление от популярной mysql и полностью с ней совместима,
  • PHP — язык программирования, который чаще всего применяется веб разработчиками.

Теперь обо всех этих компонентах расскажу подробно.

Дальнейшие действия производим с учетом начальной настройки сервера CetnOS 7 на Айхор Хостинге. Все действия будут правильны для других хостингов и серверов где необходимо развернуть данный функционал на операционной системе CentOS 7.

Настройка FirewallD

Установка и настройка

Проверим наличие firewalld:

systemctl status firewalld
= вывод команды =
Unit firewalld.service could not be found.

Если устанавливали с минимальной версии CentOS то Firewalld там не установлен.

Установим FirewallD вез вопросов командой:

yum -y install firewalld

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

systemctl enable firewalld
systemctl start firewalld

Проверим статус:

systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
 Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
 Active: active (running) since Чт 2017-04-13 20:22:40 MSK; 14s ago
 Docs: man:firewalld(1)
 Main PID: 2099 (firewalld)
 CGroup: /system.slice/firewalld.service
 └─2099 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

апр 13 20:22:39 nginx.sevo44.loc systemd[1]: Starting firewalld - dynamic firewall daemon...
апр 13 20:22:40 nginx.sevo44.loc systemd[1]: Started firewalld - dynamic firewall daemon.

Или короткой командой:

firewall-cmd --state
= вывод команды =
running

Всё хорошо. Можно приступать к настройке доступа к серверу.

Открытие портов http и https

Добавим сразу 80 и 443 порты в наш FirewallD:

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https

Перезагрузим правила FirewallD:

firewall-cmd --reload
= вывод команды =
success

Проверим:

firewall-cmd --permanent --list-all
public
 target: default
 icmp-block-inversion: no
 interfaces: 
 sources: 
 services: dhcpv6-client http https ssh
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules:

Мне не нужны лишние допуски поэтому удалю dhcpv6-client командой:

firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
= вывод команды =
success

Перезагрузим и проверим:

firewall-cmd --reload
= вывод команды =
success
firewall-cmd --permanent --list-all
= вывод команды =
public
 target: default
 icmp-block-inversion: no
 interfaces: 
 sources: 
 services: http https ssh
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules:

Все прошло успешно. Теперь открыт доступ к серверу по нужным нам портам.

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

Установка

Установим самую свежую стабильную версию из репозитория NGINX для CentOS 7:

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

Можно создать файл с необходимым репозиторием:

vim /etc/yum.repos.d/nginx.repo
= необходимо добавить =
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

Установку выполним без вопросов:

yum install -y nginx

Создадим ссылку на автозагрузку:

systemctl enable nginx

Запустим сервис:

systemctl start nginx

Проверка работы

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

netstat -tulpn | grep nginx
= вывод команды =
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1119/nginx: master

Для работы netstat нужно установить необходимый пакет:

yum -y install net-tools

Проверим статус запущенного сервиса:

systemctl status nginx
= вывод команды =
● nginx.service - nginx - high performance web server
 Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
 Active: active (running) since Чт 2017-04-13 22:17:32 MSK; 4min 38s ago
 Docs: http://nginх.org/en/docs/
 Process: 1160 ExecStart=/usr/sbin/nginх -c /etc/nginх/nginх.conf (code=exited, status=0/SUCCESS)
 Process: 1153 ExecStartPre=/usr/sbin/nginх -t -c /etc/nginх/nginх.conf (code=exited, status=0/SUCCESS)
 Main PID: 1163 (nginх)
 CGroup: /system.slice/nginх.service
 ├─1163 nginх: master process /usr/sbin/nginх -c /etc/nginх/nginх.conf
 └─1164 nginx: worker process

апр 13 22:17:32 ih378645.vds.myihor.ru systemd[1]: Starting nginx - high performance web server...
апр 13 22:17:32 ih378645.vds.myihor.ru nginх[1153]: nginх: the configuration file /etc/nginх/nginх.conf syntax is ok
апр 13 22:17:32 ih378645.vds.myihor.ru nginх[1153]: nginх: configuration file /etc/nginх/nginх.conf test is successful
апр 13 22:17:32 ih378645.vds.myihor.ru systemd[1]: Failed to read PID from file /run/nginх.pid: Invalid argument
апр 13 22:17:32 ih378645.vds.myihor.ru systemd[1]: Started nginх - high performance web server.

Исправление ошибки Invalid argument

Видим что присутствует ошибка. При этой ошибке все работает но я решил её убрать.

Причина ошибки в том что pid указан два раза:

  • /usr/lib/systemd/system/nginx.service — строка PIDFile=/run/nginx.pid
  •  /etc/nginx/nginx.conf — строка pid /var/run/nginx.pid;

Где убрать этот параметр решать вам. Мой выбор это комментирование параметра в файле /etc/nginx/nginx.conf.

Перезагружаем сервер:

reboot

Проверяем:

systemctl status nginx
= вывод команды =
● nginx.service - nginx - high performance web server
 Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
 Active: active (running) since Чт 2017-04-13 23:33:19 MSK; 8s ago
 Docs: http://nginх.org/en/docs/
 Process: 1386 ExecStop=/bin/kill -s QUIT $MAINPID (code=exited, status=0/SUCCESS)
 Process: 1368 ExecReload=/bin/kill -s HUP $MAINPID (code=exited, status=0/SUCCESS)
 Process: 1390 ExecStart=/usr/sbin/nginx -c /etc/nginх/nginх.conf (code=exited, status=0/SUCCESS)
 Process: 1389 ExecStartPre=/usr/sbin/nginх -t -c /etc/nginх/nginх.conf (code=exited, status=0/SUCCESS)
 Main PID: 1394 (nginx)
 CGroup: /system.slice/nginх.service
 ├─1394 nginх: master process /usr/sbin/nginх -c /etc/nginх/nginх.conf
 └─1395 nginх: worker process

апр 13 23:33:19 ih378645.vds.myihor.ru systemd[1]: Starting nginх - high performance web server...
апр 13 23:33:19 ih378645.vds.myihor.ru nginх[1389]: nginх: the configuration file /etc/nginх/nginх.conf syntax is ok
апр 13 23:33:19 ih378645.vds.myihor.ru nginx[1389]: nginx: configuration file /etc/nginх/nginх.conf test is successful
апр 13 23:33:19 ih378645.vds.myihor.ru systemd[1]: Started nginх - high performance web server.

Видим что всё у нас хорошо. Сервис работает и стартует при перезагрузке.

Для окончательной проверки мы можем набрать в браузере http://ip сервера и увидеть приветственное сообщение.

Файлы для настройки

Все необходимые нам файлы для настройки находятся в папке /etc/nginx. По умолчанию корневая папка находится по пути usr/share/nginx/html и именно оттуда берется приветственное сообщение.

Работать мы будем с виртуальными сайтами и тут есть два варианта работы:

  • Все правила для сайтов писать в конфигурационном файле /etc/nginx/nginx.conf,
  • Создать для каждого виртуального сайта свой файл в /etc/nginx/conf.d с названием имя сайта.conf.

Мне удобней работать с файлами настроек для каждого сайта. Чтобы такая возможность была необходимо в главном файле присутствие строки include /etc/nginx/conf.d/*.conf.

Настройка nginx.conf

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

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.orig

Основное и главное отличие в работе по сравнению с Apach, это то что Nginx не работает с файлами .htaccess.

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

cat /etc/nginx/nginx.conf 
= вывод команды с пояснениями = 
# nginx version:1.14.0
# Пользователь и группа, от имени которых будет запущен процесс
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;
  
    # Включение сжатия 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 9;
    #gzip_proxied any;
    #gzip_min_length 1000;
    #gzip_disable "msie6";
    #gzip_vary on;

    # Подключение дополнительных конфигов
    include /etc/nginx/conf.d/*.conf;
}

Настройка default.conf

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

Сделаем резервную копию оригинала файла default.conf:

cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.orig

Посмотрим как выглядит файл default.conf:

cat /etc/nginx/conf.d/default.conf
= вывод команды с необходимыми изменениями =
server {
listen 80;
server_name localhost;

#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;

location / {
# Путь до файлов
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
# Разрешим использование php 
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param DOCUMENT_ROOT /usr/share/nginx/html/;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}

# deny access to .htaccess files, if Apache's document root
# concurs with one

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

Мы добавили index.php и отредактировали секцию  location ~ \.php$ отвечающую за обработку файлов php.

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

Проверка и команды сервиса

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

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

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

Видим что все хорошо.

Перезагрузим сервис:

systemctl reload nginx
или
nginx -s reload

Варианты команд при работе с сервисом.

systemctl [start-stop-restart-reload-status] nginx

Для перезагрузки лучше использовать «reload» так как перезагрузка произойдет не прерывая работу сервиса.

В случае если что то пошло не так, вы всегда можете посмотреть логи находящиеся в папке /var/log/nginx.

Установка и настройка MariaDB

Установка

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

yum install -y mariadb mariadb-server

Создадим ссылки на автозагрузку:

systemctl enable mariadb.service
= вывод команды =
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.

Запустим службу:

systemctl start mariadb.service

Начальная настройка

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

mysql_secure_installation

Сразу при старте попросит указать пароль! Так как его просто нет нажимаем Enter. На все вопросы обычно отвечаю Y.

Проверка и команды сервиса

Проверим сервис MariaDB:

netstat -tap | grep mysql
= вывод команды =
tcp 0 0 0.0.0.0:mysql 0.0.0.0:* LISTEN 769/mysqld

Проверим статус:

systemctl status mariadb.service
= вывод команды =
● mariadb.service - MariaDB database server
 Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
 Active: active (running) since Чт 2017-03-23 04:59:53 MSK; 1 day 16h ago
- часть вывода не указана -

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

Варианты команд при работе с MariaDB

systemctl [start-stop-restart-status] mariadb.service

В случае если что то пошло не так, вы всегда можете ознакомится посмотрев логи в папке /var/log/mariadb.

Установка и настройка PHP

Выбор версии PHP

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

Nginx не содержит PHP, необходимо установить php-fpm (менеджер процессов FastCGI). Nginx будет передавать PHP-запросы на обработку данному программному обеспечению. Обязательно необходим еще пакет php-mysql, позволяющий PHP взаимодействовать с бэкэндом базы данных.

По умолчанию в CentOS ставится версия PHP 5.4. Не понимаю почему до сих пор не обновили до версии 5.6 хотя во многих дистрибутивах она уже идёт по умолчанию.

Узнать актуальную версию вы всегда сможете перейдя по ссылке, которая тут указана. Версия 5.6 будет актуальная до 31 декабря 2018 года.

Установка PHP 5.6

После переезда на нового провайдера обнаружил что ресурс webtatic.com не доступен. После небольшого футбола с провайдерами получил ответ: «104.24.6.38  заблокирован Роскомнадзором, тут уже ничего не поделать». На слово верить я уже давно перестал. Задал вопрос Роскомнадзору. Жду ответ. Ну а пока жду ответа добавил как установить PHP 5.6 из репозитория Remi.
16.04.2017 года ресурс Webtatic.com переехал на новый IP адрес и снова доступен для России. Более подробно можете прочитать в статье WebtaticEL или блокировка в России.

Для репозитория WebtaticEL по ссылке вы можете ознакомиться с инструкцией по установке для операционной системы CentOS 7.

Для начала проверим чтобы в системе не присутствовал php:

php -v
-bash: php: command not found

Отлично php нет в системе.

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

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

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

Для репозитория Remi:

wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm
rpm -Uvh remi-release-7*.rpm

В дистрибутив PHP теперь входит opcode который называется ZendOPcache. Данное расширение сохраняет компилированный байт код скрипта и повышает производительность скриптов. Это дополнение необязательно, вы можете выбрать любое другое, но поскольку данное дополнение входит в состав исходного дистрибутива PHP, и оно поддерживается разработчиком, именно его мы и будем использовать. Скорость еще никому не вредила.

Установим необходимый нам вариант php вместе с opcache и всем необходимым для WebtaticEL:

yum install php56w-fpm php56w-opcache php56w-mysql php56w-cli php56w-gd php56w-ldap php56w-odbc php56w-pdo php56w-pecl-memcache php56w-pear php56w-xml php56w-xmlrpc php56w-mbstring php56w-snmp php56w-soap php56w-imap

Установим необходимый нам вариант php вместе с opcache и всем необходимым для Remi:

yum --enablerepo=remi,remi-php56 install php-fpm php-opcache php-mysql php-cli php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-imap

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

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

Вся настройка осуществляется редактированием 3 файлов а именно:

  • /etc/php.ini — главный конфигурационный файл php,
  • /etc/php-fpm.conf — главный файл настройки php-fpm,
  • /etc/php-fpm.d/www.conf — наш файл настройки php-fpm.

Настройка файла php.ini

Настроим главный конфигурационный файл php:

mcedit /etc/php.ini
= необходимые изменения =
# Запрет на исполнение произвольного кода на сервере с правами php процесса при загрузке файла.
cgi.fix_pathinfo=0
# Избежим ошибок часового пояса в файле /var/log/php-fpm/www-error.log
date.timezone = "Europe/Moscow"

Остальные параметры можно не трогать, так как их настройка будет осуществлена средствами настройки Nginx.

Настройка файла /etc/php-fpm.conf

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

Откроем файл:

cat /etc/php-fpm.conf
= вывод команды и проверка необходимых параметров =
;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix.

; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
; Разрешаем подгружать необходимые нам файлы настроек
include=/etc/php-fpm.d/*.conf

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Default Value: none
pid = /var/run/php-fpm/php-fpm.pid

; Error log file
; Default Value: /var/log/php-fpm.log
; Путь куда пишутся логи ошибок
error_log = /var/log/php-fpm/error.log

; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
;log_level = notice

; If this number of child processes exit with SIGSEGV or SIGBUS within the time
; interval set by emergency_restart_interval then FPM will restart. A value
; of '0' means 'Off'.
; Default Value: 0
;emergency_restart_threshold = 0

; Interval of time used by emergency_restart_interval to determine when 
; a graceful restart will be initiated. This can be useful to work around
; accidental corruptions in an accelerator's shared memory.
; Available Units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;emergency_restart_interval = 0

; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;process_control_timeout = 0

; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
; Default Value: yes
daemonize = yes

;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ; 
;;;;;;;;;;;;;;;;;;;;

; See /etc/php-fpm.d/*.conf

Все остальные параметры мы будем делать в файле /etc/php-fpm.d/www.conf

Настройка файла /etc/php-fpm.d/www.conf

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

Посмотрим файл:

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
user = nginx
group = nginx
# Как будут создаваться новые рабочие процессы
pm = dynamic
# Максимальное количество рабочих процессов
pm.max_children = 20
# Число запущенных процессов при старте сервера
pm.start_servers = 6
# Минимальное и максимальное количество процессов в простое
pm.min_spare_servers = 4
pm.max_spare_servers = 8
# Логи работы
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
pm.status_path = /status

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

Можно использование Unix сокет в PHP-FPM, но какие он дает преимущества я так и не понял. Для применения необходимо в файле /etc/php-fpm.d/www.conf вместо строчки listen = 127.0.0.1:9000 прописать строку listen = /var/run/php-fpm/php5-fpm.sock и не забыть применить этот параметр в файлах настройки виртуальных сайтов.

Также будет необходимо создать папку с правами где будут находится наши данные сессии:

cd /var/lib/php/
mkdir session
chown nginx:nginx session/

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

Запуск, проверка, команды работы с PHP-FPM

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

systemctl enable php-fpm.service

Запустим командой:

systemctl start php-fpm.service

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

netstat -tulpn | grep php-fpm
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 443/php-fpm: master

Если вы используйте сокет то вывод проверки будет пустой и необходимо проверить работу выводом статуса php-fpm.

Выведем статус сервиса:

systemctl status php-fpm
● 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-03-23 04:59:50 MSK; 2 days ago
- часть вывода не указана -

Видим что сервис запущен и стартует при перезагрузки сервера.

Варианты команд при работе с Php-fpm

systemctl [start-stop-restart-status] php-fpm.service

Если пошло что то не так, всегда можно посмотреть логи находящиеся по адресу /var/log/php-fpm.

Вывод информации о версии PHP

Последнее что нам осталось это проверить как браузер обрабатывает php файлы и для этого в стандартной папке nginx мы создадим файл info.php который выведет нам информацию о версии php со всеми параметрами.

Создадим файл info.php указав в нем необходимый код:

mcedit /usr/share/nginx/html/info.php
= необходимый код =
<?php phpinfo(); ?>

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

chown -R nginx:nginx /usr/share/nginx/html

 

Откроем в браузере наш файл указав http://ip адрес сервера/info.php

Результат

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