Rose debug info
---------------

Later Ctrl + ↑

Включение лога медленных запросов в MySQL

Определяем месторасположение локального конфига MySQL (установка mlocate может занять длительное время):

apt install mlocate
locate my.cnf

Допустим он расположен по /etc/mysql/my.cnf. Редактируем:

apt install mc
mcedit /etc/mysql/my.cnf

В конце файла добавляем:

[mysqld]
slow_query_log = 1
slow_query_log_file  = /var/log/mysql/mysql-slow.log
long_query_time = 1

Где long_query_time -- это время в секундах, выполнение дольше которого считается медленным.

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

service mysql restart

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

mysql -p
SHOW VARIABLES LIKE '%slow%';

Должно быть что-то вроде:

| slow_query_log            | ON                            |
| slow_query_log_file       | /var/log/mysql/mysql-slow.log |

Лог медленных запросов теперь можно смотреть по адресу /var/log/mysql/mysql-slow.log

 No comments    119   2020  

Как установить Let’s Encrypt на Ubuntu с nginx

Установка

apt install software-properties-common

add-apt-repository ppa:certbot/certbot

apt update

apt upgrade

apt install letsencrypt

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

mcedit /etc/letsencrypt/cli.ini

В нём:

post-hook = service nginx reload

Далее в консоли:

certbot register --email ваш_email

Настройка для домена

Редактируем хост:

mcedit /etc/nginx/sites-available/...

Добавляем правило:

location ~ /.well-known {
    root /var/www/well-knowns/домен;
}

Далее в консоли:

mkdir -p /var/www/well-knowns/домен/.well-known

Создаём тестовый файл:

mcedit /var/www/well-knowns/домен/.well-known/test.txt

Перезагружаем nginx:

service nginx reload

Открываем в браузере http://домен/.well-known/test.txt

Удалить тестовый файл, если всё хорошо.

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

letsencrypt certonly --dry-run -d домен -d www.домен

При запросе webroot указываем /var/www/well-knowns/домен/

Если всё ок, то создаём уже сертификат по-настоящему:

letsencrypt certonly -d домен -d www.домен

Проверка

openssl x509 -text -in /etc/letsencrypt/live/домен/cert.pem

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

ssl_certificate /etc/letsencrypt/live/домен/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/домен/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/домен/chain.pem;
ssl_ciphers EECDH:+AES256:-3DES:RSA+AES:RSA+3DES:!NULL:!RC4;

В файле /etc/cron.d/certbot должен быть автозапрос продления сертификатов.

OCSP stapling

Браузеры, кроме Chrome, имеют свойство обращаться к CA для сверки со списком отозванных сертификатов, задерживая открытие страниц на секунды. Устранить эту задержку можно прикладывая подписанный ответ OCSP сервера к ответу при создании нового соединения.

tee /etc/nginx/conf.d/ssl_stapling.conf <<EOF
resolver 127.0.0.1;
ssl_stapling on;
ssl_stapling_verify on;
EOF

Если у вас нет локального кеширующего DNS сервера, в директиве resolver следует указать IP фактически используемого DNS сервера.

nameserver=$(grep nameserver /etc/resolv.conf | head -1 | cut -f2 -d" ")
sed -i s/127.0.0.1/$nameserver/ /etc/nginx/conf.d/ssl_stapling.conf
grep resolver /etc/nginx/conf.d/ssl_stapling.conf

Заметка основана на https://habrahabr.ru/post/318952/ и https://www.alexeykopytko.com/2017/free-ssl-from-letsencrypt/

 No comments    111   2020  

Свой сервер центральных Git-репозиториев

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

apt install git-core

Репозитории

Условимся, что у нас будет mygit пользователь, содержащий центральные Git репозитории. Клиенты будут подключаться к mygit пользователю через Git по SSH, однако напрямую по SSH доступ следует отключить.

Сперва создадим mygit пользователя:

adduser mygit

Создание репозитория

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

su mygit
cd
mkdir название_репозитория.git
cd название_репозитория.git/
git init --bare

Когда все репозитории созданы, выходим из пользователя mygit:

exit

Работа без ввода пароля

Сейчас любое соединение клиента требует ввода пароля пользователя mygit. Чтобы клиенты могли работать с Git репозиториями пользователя без ввода пароля, необходимо добавить публичные ключи клиентов (содержимое файлов id_rsa.pub) в ~/.ssh/authorized_keys.

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

apt install ssh

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

С помощью редактора mcedit (или nano, в случае mcedit требуется сперва установить mc) откроем файл /etc/ssh/sshd_config:

mcedit /etc/ssh/sshd_config

Убедитесь, что следующий параметр имеет указанное значение:

PermitEmptyPasswords no

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

ssh -p ПОРТ логин@сервер

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

service ssh restart

Чтобы в последующем не вводить логин, сервер и порт, можно задать пресет ssh в .ssh/config, например,
так:

Host preset1
HostName IP_адрес_или_домен
User имя_пользователя
Port порт

и уже авторизоваться по

ssh preset1

Клиенты

У пользователей, которые будут подключаться к серверу через SSH или Git (по SSH), должен быть установлен SSH клиент и сгенерированы ключи. Проверить, сгенерирован ли ключ, можно по наличию файла ~/.ssh/id_rsa.pub . В случае отсутствия, необходимо его сгенерировать, например, с помощью следующей команды:

ssh-keygen -t rsa -C "email@сервер"

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

Затем добавьте ключ в ssh-agent:

ssh-add ~/.ssh/id_rsa

Авторизация по ключу

Чтобы при каждом соединении с SSH и Git (он будет у нас работать тоже через SSH) не вводить пароль, нужно создать файл /home/mygit/.ssh/authorized_keys на сервере.

Обратите внимание: для создания каталога .ssh (если таковой отсутствует) и файла authorized_keys необходимо быть авторизованным под самым тем пользователем, в домашнем каталоге которого осуществляются действия, то бишь под mygit. Либо после установить соответствующие права, группу и владельца.

В этом файле на каждой строке должно быть содержимое публичного ключа (~/.ssh/id_rsa.pub) клиентов этого пользователя. В конце файла authorized_keys должна быть пустая строка.

Иными словами, если у нас имеется server_user_1, к которому будет осуществляться доступ через ssh клиентами client_user_1 и client_user_2, то в домашнем каталоге пользователя server_user_1 файл ~/.ssh/authorized_keys должен иметь три строки:

содержимое id_rsa.pub client_user_1
содержимое id_rsa.pub client_user_2
(пустая строка)

Отключаем прямой доступ к SSH

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

Здесь и далее работаем от имени root. Узнаем полный путь к оболочке git-shell:

which git-shell

И запоминаем.

Затем открываем файл /etc/passwd в mcedit (или в другом редакторе, например, nano):

mcedit /etc/passwd

Находим (скорее всего в конце файла) строчку, начинающуюся на mygit, и вместо /bin/bash (или /bin/sh, далее буду указывать /bin/bash) оболочки указываем полный адрес оболочки git-shell. Например, /usr/bin/git-shell. Не удалите перенос строки в конце файла. Сохраняем.

Теперь доступ к пользователю mygit через SSH разрешён только для Git.

Однако ранее использованная команда «su mygit» тоже работать не будет! Поэтому, когда необходимо добавить новый публичный ключ в authorized_keys или создать новый центральный репозиторий, то сперва потребуется в файле /etc/passwd заменить git-shell на прежнюю оболочку (/bin/bash), войти под пользователем (su mygit), произвести необходимые изменения, выйти к root (exit), и затем снова заменить оболочку пользователя в файле /etc/passwd на git-shell. Довольно не удобно, думаю, что в этой ситуации следует поступить как-то иначе, но пока не знаю как.

Развернуть репозиторий на клиенте

На клиентах развёртывать репозиторий просто:

git clone mygit@сервер:название_репозитория.git конечный_каталог

Если порт отличается от стандартного, то уже так:

git clone ssh://mygit@сервер:порт/home/mygit/название_репозитория.git конечный_каталог
 No comments    91   2020  

Обновление monit на старой системе

Загрузка последней версии

  1. Копируем ссылку на бинарник под нужную систему https://bitbucket.org/tildeslash/monit/downloads/
  2. Например:
wget https://bitbucket.org/tildeslash/monit/downloads/monit-5.27.1-linux-x64.tar.gz
  1. Распаковываем
tar xvzf monit-5.27.1-linux-x64.tar.gz

Установка

  1. Останавливаем сервис monit
service monit stop
  1. В файле /etc/init.d/monit заменить путь конфигурации /etc/monit/monitrc на /etc/monitrc
mcedit /etc/init.d/monit
  1. Чтобы было так:
CONFIG=/etc/monitrc
  1. Перемещаем конфиг
mv /etc/monit/monitrc /etc/monitrc
  1. Находим, где расположен monit
which monit
  1. Допустим он расположен по адресу /usr/bin/monit. Заменяем установленный в системе бинарник monit на новый:
cp monit-5.27.1/bin/monit /usr/bin/monit -f
  1. Обновляем список демонов
systemctl daemon-reload

Запускаем сервис

  1. Проверяем версию и корректность конфигурации
monit --version
monit validate
  1. Запускаем
service monit start
  1. Смотрим статус
monit status
 No comments    90   2020  
 No comments    170   2020  

Правильные глобальные хосты Apache2 по умолчанию

<VirtualHost _default_:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/localhost/
        <Directory /var/www/localhost>
                Options Indexes FollowSymLinks
                php_admin_value open_basedir /tmp:/var/www/localhost/
                AllowOverride All
                Require all granted
        </Directory>
        ErrorLog /var/www/logs/localhost-error.log
        LogLevel warn
        CustomLog /var/www/logs/localhost-access.log combined
</VirtualHost>

<VirtualHost _default_:443>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/localhost/
    ErrorLog /var/www/logs/localhost-ssl-error.log
    CustomLog /var/www/logs/localhost-ssl-access.log combined

    SSLEngine on

    SSLCertificateFile  /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

    <Directory /var/www/localhost>
            Options Indexes FollowSymLinks
            php_admin_value open_basedir /tmp:/var/www/localhost/
            AllowOverride All
            Require all granted
    </Directory>
</VirtualHost>
 No comments    96   2020  
 No comments    139   2020  

Как измерить средний размер записей в MySQL

Следующий запрос вернёт количество обработанных строк, средний размер данных в столбце MESSAGE и максимальный размер данных в столбце MESSAGE для данных за июнь 2020 года из таблицы COMMENTS:

SELECT COUNT(*) count, AVG(CHAR_LENGTH(`MESSAGE`)) avg_length, MAX(CHAR_LENGTH(`MESSAGE`)) max_length
FROM `COMMENTS`
WHERE (`DATE_POSTED` >= '2020-06-01') AND (`DATE_POSTED` < '2020-07-01');
 No comments    91   2020  

Полезные команды и настройки postfix

1. Как очистить очередь email сообщений:

sudo postsuper -d ALL deferred

2. Как посмотреть значение параметра postfix по умолчанию:

sudo postconf -d параметр

3. Как посмотреть установленное значение параметра postfix:

sudo postconf | grep 'параметр'

4. Как сохранять заголовок письма в /var/log/mail.log:

  1. В основном конфигурационном файле postfix /etc/postfix/main.cf задайте следующий параметр:
header_checks = regexp:/etc/postfix/header_checks
  1. В файле /etc/postfix/header_checks (необходимо создать, если отсутствует) добавьте на новой строке следующее:
/^Subject:/     WARN
  1. Теперь этот файл нужно превратить в индексированную БД и перезагрузить postfix с помощью следующих команд:
sudo postmap /etc/postfix/header_checks
sudo postfix reload

5. Как ограничить количество сообщений, отправляемых через postfix, в час:

В конфиге /etc/postfix/main.cf задайте следующие параметры:

anvil_rate_time_unit = 1h
smtpd_client_message_rate_limit = 200
smtpd_client_recipient_rate_limit = 30
smtpd_client_connection_rate_limit = 20

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

Перезагрузите postfix:

sudo postfix reload

6. Как изменить время, через которое неотправленные письма повторно отправляются в postfix, и как долго будут храниться в очереди неотправленные сообщения:

В конфиге /etc/postfix/main.cf задайте следующие параметры:

#время, через которое проверяется очередь postfix'ом, по умолчанию 300s
queue_run_delay = 5m

#время, на которое откладывается письмо в случае ошибки, но не позже следующего параметра, по умолчанию 300s
minimal_backoff_time = 10m

#по умолчанию 4000s
maximal_backoff_time = 15m

#максимальное время хранения неотправленного письма, по умолчанию 5d
maximal_queue_lifetime = 1d
bounce_queue_lifetime = 1d

Перезагрузите postfix:

sudo postfix reload

7. Как ограничить время отправки сообщения в postfix:

В конфиге /etc/postfix/main.cf задайте следующие параметры:

#ограничение времени, затрачиваемого для отправки сообщения, по умолчанию 600s
smtp_data_done_timeout = 600s

#ограничение времени, затрачиваемого на отправку команды SMTP DATA с получением ответа от удалённого сервера, по умолчанию 120s
smtp_data_init_timeout = 120s

#ограничение времени на отправку тела письма, по умолчанию 180s
smtp_data_xfer_timeout = 180s

Перезагрузите postfix:

sudo postfix reload
 No comments    430   2020  

How to fix several compatibility issues with new MySQL versions

Let’s see how to solve some problems after updating MySQL server. All ones fixes in one place by one method, so I show detailed only first solve and next will be more short.

... which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by

Find path of mysqld program:

which mysqld

Find file which you can use for change mysqld options. Change mysqld path in command if you need.

sudo /usr/sbin/mysqld --verbose --help | grep -A 1 "Default options"

Remember printed filenames. Actually remember anyone filename e. g. “/etc/mysql/my.cnf”.

Next you need to know active sql modes:

sudo mysql -u root -p -e "select @@sql_mode"

Copy printed constants to somewhere. Drop “ONLY_FULL_GROUP_BY” constant from list. Next go to open filename of mysqld options file:

sudo mcedit /etc/mysql/my.cnf

And after “!includedir” put “[mysqld]” section (if it missing) and write into [mysqld] section:

sql_mode = "YOUR_NEW_CONSTANTS_LIST"

Save file and restart mysql server:

sudo service mysql restart

Incorrect integer value

Open options file like above and from constants list drop “STRICT_TRANS_TABLES” constant. Save file and restart mysql server.

Incorrect datetime value: ‘0000-00-00 00:00:00’

Again, open options file and now drop constant “NO_ZERO_DATE” from list. Save file and restart mysql server.

 No comments    333   2019  
Earlier Ctrl + ↓