bitrix ошибка : Mysql query error: Unknown or incorrect time zone: 'Europe/Moscow' (400)

bitrix выдает ошибку при открытии сайта на CentOS 7
Mysql query error: Unknown or incorrect time zone: 'Europe/Moscow' (400)

Лечение - создать базу timezone в mysql сервере:
# mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql

Windows 2016 GPT EFI deploy из под Linux rescue

В статье пойдет речь о том, как подготовить образ windows для развертывания из под Linux systemrescuecd

Производите установку VirtualBox, он позволяет осуществлять загрузку с EFI
Используйте iso-образ windows SW_DVD9_Win_Svr_STD_Core_and_DataCtr_Core_2016_64Bit_English_-3_MLF_X21-30350.ISO и Linux диск systemrescuecd-x86-5.1.1.iso

Создаем виртуальный сервер в virtualbox с диском в 20 Gb (система умещается в 13, а в архиве и того в 5, но потребуется запас для запуска на новом сервере, под дополнительные драйвера или программы если будете их устанавливать)

В настройках виртуального сервера ставите галочку на вкладке Система - Включить EFI

Загружаетесь с iso-образа, он нормально запустится с EFI загрузчика

На этапе когда инсталлятор выведет окно разметки жесткого диска необходимо будет нажать shift+f10 и в окне cmd которое откроется конвертировать диск в GPT

diskpart
sel dis 0
clean
convert gpt
exit


После чего просто нажмите Далее и система поставится на диск с GPT разметкой

Запомните пароль администратора сервера и включите доступ по RDP - включается в Server Manager - Local Server - Remote desktop - Enabled

Установите скрипт через политики безопасности который будет запускаться при старте системы (без логина пользователя в отличие от классической автозагрузки в реестре через HKLM)
Для этого запустите

gpedit.msc -
Computer configuration - Windows Settings - Scripts (Startup/Shutdown) - Startup - c:\run.cmd

Если есть необходимость в дополнительных сетевых драйверах или программах - установите их

Теперь корректно выключите виртуальный сервер и загрузите его с systemrescuecd (кстати, он тоже поддерживает efi boot)

После чего снимите образ через dd over ssh на какой-либо свой внешний сервер который будет хранилищем попутно сжимая его через gzip

dd if=/dev/sda bs=64k | pv | gzip | ssh storage@storage.com "cat > /storage/windows2016"

Сжатый образ будет занимать 5 Gb

Затем пишем скрипт установки сервера который будет выкачивать образ по ssh c storage.com и распаковывать на новом сервере и производить настройку статического ip адреса и активацию ОС, я привожу его максимально упрощенную версию
Также его можно использовать и для windows 2012 с отличиями в запуске netsh

#!/bin/bash

ssh storage@storage.com dd if=/storage/windows2016 bs=64k | gunzip | pv | dd of=/dev/sda bs=64k


blockdev --rereadpt /dev/sda
sleep 5


mount /dev/sda4 /mnt

cat <<EOF > /mnt/run.cmd
@echo off
SetLocal EnableExtensions EnableDelayedExpansion


Reg Add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce /V ClearDll /D "cmd /C Del /F /Q C:\run.cmd" /f

for /f "delims=" %%a in ('netsh interface ip show interface ^| find /i "1500" ^| find /i " connect"') do (set "string=%%a")

for /f "tokens=5,6" %%a in ('echo %string%') do (set "name=%%a %%b")

netsh interface ipv4 set address name="%name%" static `ifconfig | grep 'inet ' | grep -v 127.0.0.1 | awk '{print $2}'` `ifconfig | grep 'inet ' | grep -v 127.0.0.1 | awk '{print $4}'` `netstat -nr |awk -F ' ' '{print $2}' |egrep -v 'IP|Gateway|0.0.0.0'`
netsh interface ipv4 set dnsservers name="%name%" static 8.8.8.8 primary

timeout 10 > NUL

%windir%\system32\slmgr.vbs -ipk XXXX-XXXX-XXXX-XXXX
%windir%\system32\slmgr.vbs -ato

del c:\run.cmd
EOF

unix2dos /mnt/run.cmd

umount /mnt

Далее для развертывания системы просто загружаем исходный сервер в Linux rescue и выполняем это скрипт

После успешного копирования образа перезагружаемся и включаем в BIOS загрузку с UEFI

После загрузки Windows 2016 необходимо зайти в Управление дисками и там увеличить размер диска c: до необходимого вам

Известные баги скрипта:
Если интерфейс на сервере один и не сменит имя (это маловероятно так как windows найдет все равно новую сетевую карту) (скажем будет называться "Ethernet"), то скрипт настроить его не сможет, так как будет искать "Ethernet " поскольку пробел в (set "name=%%a %%b") ставится искусственно (иначе будет пытаться настраивать "Ethernet2" вместо "Ethernet 2"

rbd to qcow2 file format

# rbd export vm5891121 vm5891121.img -p volumes
# qemu-img convert -f raw -O qcow2 vm5891121.img vm5891121.qcow2

nginx с ngx_pagespeed и поддержкой alpn для centos / debian / ubuntu

Готовая сборка Nginx с модулем ngx_pagespeed (google pagespeed) для популярных операционных систем CentOS 6.9, 7.4 / Debian 7, 8, 9 / Ubuntu 14.04/16.04 x86_64

Также для CentOS 6 / Debian 7,8 / Ubuntu 14.4 nginx собран с openssl 1.0.2 (--with-openssl=/root/openssl-1.0.2l) чтобы была поддержка ALPN для http2, в CentOS 7.4 и других системах системный OpenSSL поддерживает ALPN начиная с версии 1.0.2

В CentOS 7.3 (в дистрибутиве openssl 1.0.1e) и меньших версиях необходимо для запуска nginx обновить пакет openssl (yum install openssl обновит до 1.0.2k-8) иначе будет ошибка запуска nginx связанная со старой библиотекой в системе

Для Debian 7 новые версии pagespeed не поддерживаются, новый nginx 1.13.6 также не собирается со старым ngx_pagespeed, поэтому используется nginx 1.12.2 stable и pagespeed старой версии 1.11.33.1-beta (bash <(curl -f -L -sS https://ngxpagespeed.com/install) -n 1.12.2 -v 1.11.33.1).
Настоятельно рекомендую мигрировать на более новую версию операционной системы

Ссылки на бинарный файл nginx - его надо просто положить в /usr/sbin/nginx вместо исходного файла (предварительно установив nginx через пакетный менеджер системы):

https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-pagespeed-1.12.34.2-openssl-1.0.2l-centos6
https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-pagespeed-1.12.34.2-centos7
https://dl.ispsystem.info/nginx-binary/nginx-1.12.2-pagespeed-1.11.33.1-openssl-1.0.2l-debian7
https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-pagespeed-1.12.34.2-openssl-1.0.2l-debian8
https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-pagespeed-1.12.34.2-debian9 
https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-pagespeed-1.12.34.2-openssl-1.0.2l-ubuntu14.04
https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-pagespeed-1.12.34.2-ubuntu16.04

Также собраны бинарники для замены /usr/sbin/nginx с openssl 1.0.2 без модуля pagespeed для старых операционных систем где openssl не имеет поддержки alpn (требуется для http2):

https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-openssl-1.0.2l-centos6
https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-openssl-1.0.2l-debian7
https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-openssl-1.0.2l-debian8
https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-openssl-1.0.2l-ubuntu14.04

Ключи сборки соответствуют стандартным с официального репозитория nginx (посмотреть как nginx -V), за исключением опции компиляции и линковки при использовании внешнего openssl
Debian 7/8:
--with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'
изменено на
--with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --with-openssl=/root/openssl-1.0.2l

CentOS 6:
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
изменено на
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --with-openssl=/root/openssl-1.0.2l

Так как иначе openssl не собирается с ошибками
/usr/bin/ld: /root/openssl-1.0.2l/.openssl/lib/libssl.a(s23_meth.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/root/openssl-1.0.2l/.openssl/lib/libssl.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
objs/Makefile:365: recipe for target 'objs/nginx' failed


Возможно, это пригодится кому-либо при компиляции nginx с собственным openssl

Подключается pagespeed в nginx.conf секции http - собственно включение, запрет оптимизировать phpmyadmin, путь к каталогу кэша nginx и ограничения.
Процесс очистки кэша будет запускаться раз в час и очищаться если размер превысит 512Mb или 100000 inodes

pagespeed on;
pagespeed Disallow */phpmyadmin/*; 
pagespeed FileCachePath /var/cache/ngx_pagespeed/;
pagespeed FileCacheSizeKb            524288;
pagespeed FileCacheInodeLimit        100000;
pagespeed FileCacheCleanIntervalMs   3600000;

Далее необходимо просто создать директорию
mkdir /var/cache/ngx_pagespeed/

После перезапуска nginx в ней появятся поддиректории с файлами кэша

Подключается http2 просто добавлением http2 в server
listen 443 ssl http2;

При использовании ISPmanager 5 можно отредактировать шаблон /usr/local/mgr5/etc/templates/default/nginx-vhosts-ssl.template

заменить

listen {% $NGINX_SSL_LISTEN_ON %} default_server;
на
listen {% $NGINX_SSL_LISTEN_ON %} ssl http2 default_server;

listen {% $NGINX_SSL_LISTEN_ON %}
на
listen {% $NGINX_SSL_LISTEN_ON %} ssl http2;

Чтобы не переписывался при обновлениях файл /usr/bin/nginx можно сделать в Debian/Ubuntu:

# dpkg-divert --divert /usr/sbin/nginx.unuse --rename /usr/sbin/nginx
# mv /usr/sbin/nginx.unuse /usr/sbin/nginx
 
В CentOS:
# yum install yum-plugin-versionlock
# yum versionlock nginx


Полезные ссылки:
https://www.modpagespeed.com/doc/build_ngx_pagespeed_from_source 
https://habrahabr.ru/post/301452/
http://nginx.org/ru/download.html

ЧПУ в nginx php-fpm в server

listen 188.112.121.100:80;
    location / {
        try_files $uri $uri/ @handler;
        location ~ [^/]\.ph(p\d*|tml)$ {
            try_files /does_not_exists @php;
        }
    }
    location @handler {
        rewrite ^(.*) /index.php?$1 last;
    }

    location @php {
        fastcgi_index index.php;
        fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f webmaster@example.ru";
        fastcgi_pass unix:/var/www/php-fpm/www-root.sock;
        fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
        try_files $uri =404;
        include fastcgi_params;
    }


Редирект на https
return 301 https://$host:443$request_uri;

Сжатие - кэширование
    gzip on;
    gzip_comp_level 3;
    gzip_disable "msie6";
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
    expires 8d;

Как очистить базу HSTS в google chrome и firefox

chrome://net-internals/#hsts

в firefox это делается в истории (ctrl+h) правой кнопкой - забыть об этом сайте

Насаждаем cp1251 кодировку на сайте вместо utf8 в debian

# cat .htaccess
AddDefaultCharset windows-1251
php_value default_charset "cp1251"


Обычного включения в свойствах WWW домена в ISPmanager недостаточно

Ubuntu отключить отправку сообщений об ошибках

sudo sed -i "s/enabled=1/enabled=0/g" '/etc/default/apport'
или
sudo apt purge apport

Высокая нагрузка на cpu от процессов kidle_inject

Иногда бывает, что система практически висит, а в top наблюдается картина вида

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6098 root -51 0 0 0 0 S 55,8 0,0 4:04.49 kidle_inject/1
6099 root -51 0 0 0 0 S 55,8 0,0 4:04.20 kidle_inject/2 


Процессы kidle_inject запускаются при throttling, как правило от перегрева, и не могут часто быть остановлены, есть баг https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1389077 который долгое время не могут исправить

Решение: отключить данный механизм снижения нагрузки на cpu (может привести в принципе к проблемам при перегреве

# rmmod intel_powerclamp
# echo "blacklist intel_powerclamp" > /etc/modprobe.d/disable-powerclamp.conf

Полезные ссылки:
https://wiki.ubuntu.com/Kernel/PowerManagement/ThermalIssues
https://lwn.net/Articles/528131/

Про новые ядра и xorg в Ubuntu 16.04 LTS

Desktop
1. Устанавливаем с образа 16.04 или 16.04.1 - получаем ядро 4.4.0 (метапакет linux-generic), которое будет постоянно с новыми security fixes всё время жизни дистрибутива

2. Устанавливаем с образа 16.04.2 и выше - получаем hwe ядро на сегодня 4.4.8 и выше (метапакет linux-generic-hwe-16.04) по модели rolling updates, то есть при выходе новых версий будет обновляться (на сегодня 4.4.10)

Xorg тоже ставится hwe (и ставить по идее надо с новым ядром всегда, а не одно ядро или иксы), пример команды для перехода
sudo apt-get install --install-recommends linux-generic-hwe-16.04 xserver-xorg-hwe-16.04

3. Устанавливаем пакет linux-generic-hwe-16.04-edge - получаем совсем свежее ядро 4.4.11 и все самое свежее (и, возможно, не тестированное)

Server
В инсталляторе при загрузке с iso присутствует выбор - ставить hwe или нет, по-умолчанию ставится 4.4.0
Можно обновить ядро перейдя на hwe
sudo apt-get install --install-recommends linux-generic-hwe-16.04

Полезные ссылки
https://wiki.ubuntu.com/Kernel/RollingLTSEnablementStack
https://wiki.ubuntu.com/Kernel/LTSEnablementStack
http://ubuntuhandbook.org/index.php/2017/02/install-remove-enablement-stacks-ubuntu-16-04/

Что ставить
Все же большинство десктопов, судя по всему, живут на свежих ядрах и свежем xorg, поэтому ставить hwe на десктоп и если используются несвободные драйвера, то иметь ввиду, что при апдейтах могут быть проблемы с графикой (но как правило, все решается через update-initramfs -u или переустановкой пакета типа nvidia-375 при загрузке в текстовом режиме), на сервер если всё работает, то скорее всего новые ядра вам не нужны, также kernel livepatch не поддерживает hwe

перенос почтовых ящиков imapsync создание через ispmanager api

Создаем почтовые ящики через ISPmanager API

cat /tmp/1 | while read i ; do echo `echo $i | awk '{print $2}'` ; /usr/local/mgr5/sbin/mgrctl -m ispmgr email.edit domainname=`echo $i | awk '{print $2}' | cut -d '@' -f 2` greylist=on hidegreylist=on passwd=`echo $i | awk '{print $1}'` name=`echo $i | awk '{print $2}' | cut -d'@' -f 1` sok=ok ; done

Переносим почтовые ящики через imapsync

j=0 | cat /tmp/1 | while read i ; do let "j=$j+1"; echo 'синкаю' $j 'из 87 ящиков, сейчас синкаю' `echo $i | awk '{print $2}'` ; imapsync --host1 10.10.10.10 --user1 `echo $i | awk '{print $2}'` --password1 `echo $i | awk '{print $1}'` --host2 20.20.20.20 -user2 `echo $i | awk '{print $2}'` --password2 `echo $i | awk '{print $1}'` 2>&1 >> /tmp/imap.log; done