16   25 дн  
 13   25 дн  

Настройка на сервере NodeJS, Yarn для генерации ассетов Symfony

Актуальная версия NodeJS

apt remove nodejs
wget https://nodejs.org/dist/v14.15.0/node-v14.15.0-linux-x64.tar.xz
mkdir -p /usr/local/lib/nodejs
tar -xJvf node-v14.15.0-linux-x64.tar.xz -C /usr/local/lib/nodejs
mcedit ~/.profile

В конце файла:

# Nodejs
VERSION=v14.15.0
DISTRO=linux-x64
export PATH=/usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin:$PATH

Затем:

. ~/.profile
which node
node -v
npm version
npx -v

Yarn

npm install -g yarn

В проекте:

yarn install

Создание продакшн ассетов

npm run build
 26   1 мес  

Как исправить: не отображается и не зумируется график по дням в munin

Если munin установлен под nginx:

sudo apt-get install spawn-fcgi libcgi-fast-perl
sudo spawn-fcgi -s /var/run/munin/fcgi-graph.sock -U www-data -u www-data -g www-data /usr/lib/munin/cgi/munin-cgi-graph

После чего в хост /etc/nginx/sites-available/default (или подобный) добавьте правило:

location ^~ /munin-cgi/munin-cgi-graph/ {
                fastcgi_split_path_info ^(/munin-cgi/munin-cgi-graph)(.*);
                fastcgi_param PATH_INFO $fastcgi_path_info;
                fastcgi_pass unix:/var/run/munin/fcgi-graph.sock;
                include fastcgi_params;
        }

Перезагрузите nginx и munin:

sudo nginx -t
sudo service munin restart
sudo service nginx reload

Если munin установлен под Apache2:

sudo apt-get install libapache2-mod-fcgid
sudo a2enmod fcgid
sudo service apache2 restart
 186   1 мес  

Включение лога медленных запросов в 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

 28   1 мес  

Как установить 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/

 31   1 мес  

Свой сервер центральных 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 конечный_каталог
 32   1 мес  

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

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

  1. Копируем ссылку на бинарник под нужную систему https://bitbucket.org/tildeslash/monit/downloads/
  2. Например:
wget https://bitbucket.org/tildeslash/monit/downloads/monit-5.27.0-linux-x64.tar.gz
  1. Распаковываем
tar xvzf monit-5.27.0-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.0/bin/monit /usr/bin/monit -f
  1. Обновляем список демонов
systemctl daemon-reload

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

  1. Проверяем версию и корректность конфигурации
monit --version
monit validate
  1. Запускаем
service monit start
  1. Смотрим статус
monit status
 19   1 мес  
 40   2 мес  

Правильные глобальные хосты 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>
 40   2 мес  
Ранее Ctrl + ↓