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

update:
актуальные бинарники доступны по ссылке https://dl.ispsystem.info/nginx-binary/lasted/


Готовая сборка 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 и админ-панель сайтов на bitrix (с ними работает некорректно), путь к каталогу кэша nginx и ограничения.
Процесс очистки кэша будет запускаться раз в час и очищаться если размер превысит 512Mb или 100000 inodes

pagespeed on;
pagespeed Disallow */phpmyadmin/*;
pagespeed Disallow */bitrix/admin/*;
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

Улучшаем работу с whois

$ cat /etc/whois.conf
\.pro$    whois.afilias.net


$ grep whois .bashrc
alias whois='whois -H'


Смотреть whois сервера можно по ссылке https://www.iana.org/domains/root/db

exim: увеличить timeout на отправку почты с сервера в мир

В разделе transport опции:
remote_smtp:
driver = smtp
connect_timeout = 3m
command_timeout = 3m
data_timeout = 3m