четверг, 29 декабря 2016 г.

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

Задача: создать локальный репозиторий и пушить его в приватный репозиторий на Bitbucket.
В качестве примера покажу на примере конфигов для Ansible.

воскресенье, 11 декабря 2016 г.

Порядок установки цепочки сертификатов Comodo

Сами DV-сертификаты тут: https://support.comodo.com/index.php?/Default/Knowledgebase/Article/View/979/108/domain-validation-sha-2

Запишу сюда, постоянно забываю порядок.
$ cat www_example_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > ssl-bundle.crt

воскресенье, 13 ноября 2016 г.

Ищем баги в shell-скриптах с помощью ShellCheck

Репозиторий проекта: https://github.com/koalaman/shellcheck
Там же написано как его использовать, я решил его попробовать для своего редактора Sublime Text 3.
Выглядит это примерно так:

В моем случае сделать такое можно за 1 минуту.
1. В Sublime Text устанавливаем SublimeLinter (Preferences - Package Control - Install Package - SublimeLinter)
2. Ставим shellcheck:
$ sudo apt-get install shellcheck
3. Снова в Sublime Text устанавливаем теперь уже SublimeLinter-shellcheck (Preferences - Package Control - Install Package - SublimeLinter-shellcheck)
4. Перезапускаем Sublime Text
После перезапуска все работает.

вторник, 1 ноября 2016 г.

Некорректный перезапуск httpd в logrotate

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

В error.log:
[Sun Oct 30 04:33:05 2016] [notice] SIGHUP received.  Attempting to restart
[Sun Oct 30 04:33:05 2016] [notice] seg fault or similar nasty error detected in the parent process

Если запустить вручную service httpd restart, то апач поднимается и нормально работает.

понедельник, 24 октября 2016 г.

Вход в админу битрикс без пароля

В корне сайта создаем php-файл:
$ vim enter.php
<? require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php"); 
global $USER; 
$USER->Authorize(1); 
@unlink(__FILE__); 
LocalRedirect("/bitrix/admin/"); 
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?> 

Переходим в браузере по ссылке например https://site.ru/enter.php и авторизуемся в админку без пароля.
Это может пригодиться например для сброса пароля от админки, если забыл.
Также может быть полезно для техподдержки, чтобы не спрашивать у клиента доступы к админке.

via.

понедельник, 19 сентября 2016 г.

WordPress 4.6: cURL error 23: Failed writing body

После недавнего обновления WordPress до 4.6 возникли проблемы с cURL (например при обновлении плагинов, которые используют cURL):
cURL error 23: Failed writing body (373 != 449)

Судя по форуму, в 4.6 cURL поломали, а в 4.6.1 до сих пор этот фикс не выкатили.
Решение исправить строку:
if (!function_exists(‘curl_init’) || !function_exists(‘curl_exec’)) {
на
if (true || !function_exists('curl_init') || !function_exists('curl_exec')) {
в файле ./wp-includes/Requests/Transport/cURL.php

Еще один вариант решения, описанный на форуме, который я не проверял, это отключить func_overload:
mbstring.func_overload = "0"

понедельник, 12 сентября 2016 г.

Решение проблемы с редиректом страницы на порт 80

У некоторых клиентов на шареде, в котором использутся связка Nginx+Apache, может возникать проблема с редиректом (часто встречается на CMS битрикс):
$ curl -I http://site.ru/bitrix/admin
HTTP/1.1 301 Moved Permanently
Server: nginx
Location: http://site.ru:80/bitrix/admin/

Т.е. видим, что идет некорректный редирект на https://site.ru:80/bitrix/admin/
Если же напрямую со слешем отправляем запрос, то все ок:
$ curl -I http://site.ru/bitrix/admin/ --silent | head -1
HTTP/1.1 200 OK

суббота, 10 сентября 2016 г.

Странный баг в Thunderbird+Lightning

Использую расширение Lightning в Thunderbird для календаря и уведомлений и случайно заметил баг.

Если создать новое событие в календаре, с названием "ДР":

То после нажатия на кнопку сохранения оно каким-то образом трансформируется в белеберду:

Если же написть не "ДР", а например "ДРа" или "ДД", то все отображается нормально:

Что это за баг я так и не понял, получилось воспроизвести только на "ДР", на других сочетаниях букв все в порядке.
Интересно у меня одного такой баг?

Thunderbird 45, Lightning 4.7b3

пятница, 2 сентября 2016 г.

Некоторые полезные ссылки из закладок

http://www.layoutit.com/ -- построить интерфейс без единой строчки кода с помощью Bootstrap
http://www.opennet.ru/docs/RUS/bash_scripting_guide/ -- ABSG (руководство по Bash)
http://www.opennet.ru/docs/RUS/iptables/ -- хоть и старое, но хорошее руководство по IPTables
https://regex101.com/ -- проверка различных регулярок
https://events.yandex.ru/lib/talks/?audience=administratoryi -- библиотека видео от Яндекс по теме администрирования
http://theasder.github.io/learning/2014/12/06/google-recommendations-for-learning.html -- рекомендации Google по изучению программирования
http://paste.ubuntu.com/ -- симпатичный аналог pastebin
http://ruhighload.com/ -- много интересных вещей по построению сайтов, масштабированию и оптимизации
http://xgu.ru/xen/manual/ -- руководство по Xen
https://12factor.net/ru/ -- перевод методологии 12 факторов для создания приложений
https://park.mail.ru/materials/video/ -- различные видеолекции от Mail.ru
https://galaxy.ansible.com/ -- много интересных и полезных ролей для Ansible
http://ocw.mit.edu/courses/audio-video-courses/#electrical-engineering-and-computer-science -- открытые лекции от MIT по CS&E
http://firstwiki.ru/index.php/Поиск_и_профилактика_защиты_от_вредоносного_ПО -- тут все ясно
http://www.gurkin33.ru/ -- небольшой курс по Cisco basic, switches, routers
http://ruhighload.com/post/Отказоустойчивость+и+Failover -- заметка по failover на разных уровнях
http://www.crimeflare.com/cfs.html -- сервис позволяет для некоторых случаев раскрыть настоящий адрес за Cloudflare
https://vulners.com/#audit -- база уязвимостей
http://www.texample.net/tikz/examples/ -- примеры для работы с TikZ и PGF в LaTeX
http://docs.w3cub.com/ -- документация по некоторым проектам, связанных с Web
http://mxtoolbox.com/SuperTool.aspx -- удобный инструмент для проверки и мониторинга блеклистов и вещей связанных с почтой
https://prostovpn.org/ -- простой и удобный VPN-сервис
https://www.antiplagiat.ru/ -- проверка текста или документа на плагиат

среда, 31 августа 2016 г.

Вывод расширенной информации о домене в зоне name

Стандартный вывод whois:
$ whois amet13.name
...
 Domain Name ID: 12267187_DOMAIN_NAME-VRSN
 Domain Name: AMET13.NAME
 Sponsoring Registrar: REGISTRAR OF DOMAIN NAMES REG.RU LLC
 Sponsoring Registrar IANA ID: 1606
 Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited

Расширенный вывод:
$ whois -h whois.nic.name 'domain = amet13.name'
или
$ whois domain=amet13.name
...
   Domain Name ID: 12267187_DOMAIN_NAME-VRSN
   Domain Name: AMET13.NAME
   Sponsoring Registrar: REGISTRAR OF DOMAIN NAMES REG.RU LLC
   Sponsoring Registrar IANA ID: 1606
   Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
   Registrant ID: 12052366_CONTACT_NAME-VRSN
   Admin ID: 12052366_CONTACT_NAME-VRSN
   Tech ID: 12052366_CONTACT_NAME-VRSN
   Billing ID: 12052366_CONTACT_NAME-VRSN
   Name Server: CHAN.NS.CLOUDFLARE.COM
   Name Server ID: 2629506_HOST_NAME-VRSN
   Name Server: PLATO.NS.CLOUDFLARE.COM
   Name Server ID: 2603988_HOST_NAME-VRSN
   Created On: 2013-09-29T15:53:31Z
   Expires On: 2017-09-29T15:53:31Z
   Updated On: 2016-07-21T17:08:44Z

вторник, 16 августа 2016 г.

Проблемы с eaccelerator (Invalid opcode, Unable to change cache directory)

Кривой eaccelerator, который нужно патчить при каждом чихе.
Например могут встретиться такие ошибки:
[error] [client 1.1.1.1] eAccelerator: Unable to change cache directory /var/cache/php-eaccelerator permissions
или
Fatal error: Invalid opcode 153/1/8. in /var/www/.../pdofetch.class.php on line 494

Для устранения первой ошибки мне помог этот патч:
# diff -U 0 eaccelerator.c_old eaccelerator.c
--- eaccelerator.c_old 2016-08-16 14:17:15.331786184 +0300
+++ eaccelerator.c 2016-08-16 13:34:36.592906639 +0300
@@ -1770 +1770 @@
-        if (buffer.st_mode != 777) {
+        if (buffer.st_mode != 040777) {

Для второй:
# diff -U 0 optimize.c_old optimize.c
--- optimize.c_old 2016-08-08 12:00:02.000000000 +0300
+++ optimize.c 2016-08-08 12:00:43.000000000 +0300
@@ -3503,0 +3504,11 @@
+    /* do not optimize if opcodes have "closures" */
+    zend_op* op = op_array->opcodes;
+    int len = op_array->last;
+    int line_num;
+
+    for (line_num = 0; line_num < len; op++,line_num++) {
+        if (op->opcode == ZEND_DECLARE_LAMBDA_FUNCTION) {
+            return;
+        }
+    }
+

Также можно еще в /etc/php.d/eaccelerator.ini попробовать сменить значение переменной eaccelerator.cache_dir:
eaccelerator.cache_dir = "/tmp"
;eaccelerator.cache_dir = "/var/cache/php-eaccelerator"

пятница, 12 августа 2016 г.

Блокировка по User-Agent с помощью IPTables

Блокируем все соединения на 80 и 81 порты, в которых есть совпадения с нужным UA:
# iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string "compatible; MSIE 6.0; Windows NT 5.1; SV1" -j DROP
# iptables -A INPUT -p tcp --dport 81 -m string --algo bm --string "compatible; MSIE 6.0; Windows NT 5.1; SV1" -j DROP

пятница, 22 июля 2016 г.

HTTPS для кастомного домена в blogger

Вдохновившись идеей автора блога https://www.stableit.ru/2016/06/cloudflare.html решил для своего блога наконец-таки включить HTTPS, потому что от Google я наверное уже не дождусь нативной поддержки.

Все что нужно было сделать, сменить DNS'ы на cloudflare'овские и включить SSL, больше мне ничего не нужно было.
А еще добавил правила редиректа с HTTP на HTTPS.

воскресенье, 26 июня 2016 г.

Знакомство с OpenStack

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

Сервис TryStack позволяет использовать уже готовое окружение OpenStack без развертывания сложной инфраструктуры на локальных серверах.

Для регистрации на сервисе необходимо иметь аккаунт в Facebook и вступить в группу TryStack.
Ведется разработка OpenStackID для авторизации на сервисе с помощью OAuth2, однако регистрация возможна только через Facebook.

вторник, 21 июня 2016 г.

Сброс пароля IPMI Supermicro

Устанавливаем ipmitool:
# apt-get install ipmitool

Если во время установки в конце появляются ошибки:
ipmievd: using pidfile /var/run/ipmievd.pid0
Could not open device at /dev/ipmi0 or /dev/ipmi/0 or /dev/ipmidev/0: No such file or directory
Unable to open interface
invoke-rc.d: initscript ipmievd, action "start" failed.
Unable to start ipmievd during installation.  Trying to disable.
значит надо подключить модули ядра для работы IPMI:
# lsmod | grep ipmi
# modprobe ipmi_devintf
# modprobe ipmi_si
# lsmod | grep ipmi
ipmi_si                26764  0 
ipmi_devintf            4029  0 
ipmi_msghandler        22871  2 ipmi_si,ipmi_devintf
# vim /etc/modules
ipmi_devintf
ipmi_si

Рестартим сервис и меняем пароль:
# service ipmievd restart
# ipmitool -I open user set password 2 P@$$w0rd
в данном случае цифра 2 означает ID пользователя ADMIN.

суббота, 11 июня 2016 г.

Подключение IP-адресов в CentOS 7 для работы SSH-туннеля

Задача: на сервере с CentOS 7 нужно добавить дополнительные IP-адреса, для каждого пользователя, который соединяется к SSH-туннелю исходящий трафик должен идти со своего адреса.
Например для user1 адрес должен быть 192.168.0.1, а для user2 192.168.0.2.

пятница, 10 июня 2016 г.

Беспарольный push в репозиторий на GitHub

Для того, чтобы не вводить каждый раз пароль при пуше на GitHub можно добавить публичный SSH-ключ в настройках репозитория, вот тут:

Затем идем изменяем url для репозитория и делаем тестовый push:
$ cd amet13.github.io/
$ git remote set-url origin [email protected]:Amet13/amet13.github.io.git
$ git push -u origin master
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 600 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To [email protected]:Amet13/amet13.github.io.git
   5e47dcf..c062630  master -> master
Branch master set up to track remote branch master from origin.

среда, 8 июня 2016 г.

Замена дисков с сохранением информации и расширение ФС в software RAID1

На сервере в software RAID1 установлены 2 диска по 1Тб, задача состоит в том, чтобы заменить эти два диска на диски 2Тб с сохранением всей информации.
Оригинал заметки отсюда.

Исходные данные:
# cat /proc/mdstat 
Personalities : [raid1] 
md1 : active raid1 sda3[0] sdb3[1]
      967979584 blocks super 1.2 [2/2] [UU]
md0 : active raid1 sda1[0] sdb1[1]
      262080 blocks [2/2] [UU]

суббота, 4 июня 2016 г.

cURL/yum и https в CentOS: Illegal instruction

С недавнего времени curl не может работать с https:
# curl https://google.com
Illegal instruction
# echo $?
132
# curl -v https://amet13.name
* About to connect() to amet13.name port 443 (#0)
*   Trying 103.203.90.2... connected
* Connected to amet13.name (103.203.90.2) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
Illegal instruction

У yum такая же проблема.

Баг описан тут: https://bugs.centos.org/view.php?id=10930
Там же есть и воркэраунды.

Пример:
# export NSS_DISABLE_HW_GCM=1
# curl -I https://google.com
HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: https://www.google.ru/?gfe_rd=cr&ei=Qd1SV6fINcWDZNuIjVA
Content-Length: 256
Date: Sat, 04 Jun 2016 13:53:05 GMT
Alternate-Protocol: 443:quic
Alt-Svc: quic=":443"; ma=2592000; v="34,33,32,31,30,29,28,27,26,25"

суббота, 14 мая 2016 г.

Автостарт Nginx в CentOS 7

После перезагрузки контейнера с CentOS 7 не поднимается автоматически nginx.
В логах ошибка:
nginx: [emerg] bind() to 0.0.0.0:443 failed (99: Cannot assign requested address)

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

Сделал так:
# vim /etc/systemd/system/multi-user.target.wants/nginx.service
#After=network.target remote-fs.target nss-lookup.target
After=network.target remote-fs.target nss-lookup.target network-online.target

После перезагрузки nginx стал нормально подниматься.

суббота, 30 апреля 2016 г.

cPanel: (XID kvww8n) You do not have an email account named "[email protected]"

При попытке удаления почтового ящика в cPanel может появляться такая ошибка:
cPanel: (XID kvww8n) You do not have an email account named "[email protected]"

Фиксится так, в файлах:
/var/www/myuser/etc/domain.com/passwd
/var/www/myuser/etc/domain.com/shadow
удаляем строки с юзером user111

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

вторник, 19 апреля 2016 г.

Оптимизация почтового сервера и решение некоторых проблем

Есть хост-нода с KVM'ными виртуалками, в виртуалках развернуты окружения с почтовым сервером, которые занимаются массовой рассылкой почты.
Тут я буду описывать некоторые решенные проблемы в ходе работы с почтовиком.

1. В виртуалке с почтовиком подключено >1000 IP-адресов.
В нашем случае, после запуска виртуалки с >1000 адресов сеть поднималась очень долго (больше часа по времени).
В ходе расследования было выяснено, что это из-за проверки arping перед поднятием каждого алиаса для сетевого интерфейса.
Решение:
в виртуалке необходимо отключить проверку arping:
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
ARPCHECK="no"
# service network restart

2. При большом количестве коннектов к почтовому серверу, сильно начинает лагать хост-нода.
Первым делом нужно пойти в лог (на хост-ноде и в виртуалке) и посмотреть, что там можно найти:
# tail -f /var/log/messages
localhost kernel: net_ratelimit: 4618 callbacks suppressed

В ядре Linux есть механизм предотвращения DDoS-атак под названием rate limit. (https://bani.com.br/2015/06/linux-getting-rid-of-net_ratelimit-n-callbacks-suppressed-messages/)
Лимиты можно посмотреть тут:
# cat /proc/sys/kernel/printk_ratelimit
5
# cat /proc/sys/kernel/printk_ratelimit_burst
10
Решение:
идея в том, чтобы снять эти лимиты, возможно это поможет снять нагрузку с хост-ноды:
# echo "net.core.message_cost=0" >> /etc/sysctl.conf
# sysctl -w net.core.message_cost=0

Команды следует выполнить как на хост-ноде, так и в виртуалке.
Также производительность сети может увеличиться путем эмуляции e1000 вместо дефолтного virtio.

3. Забивается arp таблица.
Решение:
# vim /etc/sysctl.conf
net.ipv4.neigh.default.gc_thresh1=2048
net.ipv4.neigh.default.gc_thresh2=4096
net.ipv4.neigh.default.gc_thresh3=8192

понедельник, 18 апреля 2016 г.

Пропали www-домены в ISPmanager 4

В ISPmanager 4 пропали www-домены для некоторых пользователей.

Попробуем разобраться, в чем проблема.
В первую очередь смотрим в лог:
# echo 9 > /usr/local/ispmgr/etc/ispmgr.debug
# killall ispmgr
# tail -f /usr/local/ispmgr/var/ispmgr.log
Apr 18 23:20:11 [ 1690:5] WARNING unable to determine the ownership of 'site.com www.site.com'
Apr 18 23:20:11 [ 1690:5] WARNING vhost 'site.com' not found in main config. Skip it

Проверям права пользователя на виртуальный хост:
# grep site.com /etc/httpd/conf/httpd.conf | grep DocumentRoot
DocumentRoot /var/www/user777/data/www/site.com
# ls -l /var/www/user777/data/www/
total 4096
drwxr-xr-x 26 root root      4096 Apr 18 21:47 site.com
# chown -R user777:user777 /var/www/user777/data/www/site.com/
# killall ispmgr

Снова заходим в панель и проверяем. Все должно быть ок.

понедельник, 11 апреля 2016 г.

Удаление избранной конференции в Skype

Такое бывает если уже вышел из конференции, но закладка висит в избранном.

Skype 4.3 for Linux

Отключаем на время Skype.
Затем:
$ sudo apt-get install sqlite3
$ sqlite3 /home/user/.Skype/username/main.db
SQLite version 3.8.2 2013-12-06 14:53:30
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> SELECT id, displayname FROM Conversations WHERE is_bookmarked=1 AND displayname LIKE '%SomeConference%';
339|SomeConference
sqlite> UPDATE Conversations SET is_bookmarked=0 WHERE id=339;

Включаем снова Skype.

пятница, 8 апреля 2016 г.

Nginx: open() "/var/lib/nginx/tmp/proxy/*" failed (13: Permission denied)

При загрузке страницы бывает ситуация, когда страница загружается не полностью, а только ее часть.
Если включен error.log nginx'а, то можно увидеть такие записи:
# tail -f /var/log/nginx/error.log
2016/04/08 15:20:26 [crit] 31014#0: *311 open() "/var/lib/nginx/tmp/proxy/7/07/0000000077" failed (13: Permission denied) while reading upstream, client: 1.1.1.1, server: site.ru, request: "GET /1.jpg HTTP/1.1", upstream: "http://2.2.2.2:81/1.jpg", host: "site.ru", referrer: "http://site.ru/"

Это проблема с правами на каталог /var/lib/nginx.
Проверяем под каким юзером запущен nginx:
# grep ^user /etc/nginx/nginx.conf
user apache;

Смотрим права на каталог:
# ls -l /var/lib/ | grep nginx
drwx------ 3 nginx   nginx   4096 Nov 11  2014 nginx

Исправляем:
# chown apache:apache -R /var/lib/nginx
# service nginx restart

После этого все должно быть ок.

пятница, 1 апреля 2016 г.

Установка SSL-сертификата на Apache Tomcat

Имеем:
# ls /root -1
intermidiate.ca  - промежуточный сертификат
root.ca  - корневой сертификат
domain.crt  - сертификат домена
domain.key - ключ

Нужно для сайта установить SSL-сертификат, на порт по умолчанию (443).

воскресенье, 27 марта 2016 г.

Переброс интерфейса на другую сетевую карту

Проблемы с основной сетевой картой (eth0). Задача состоит в том, чтобы перекинуть все на вторую сетевую карту, которая не используется (eth1), свободных портов на циске нет, поэтому придется еще и сбросить таблицу MAC-адресов.

ISPmanager 4: server registration result = 'ERROR 9 : MySQL error

Довелось мне на Debian 7 обновить MySQL с версии 5.5 на версию 5.7.
Обновление вроде как самое обычное:
# echo "deb http://repo.mysql.com/apt/debian/ wheezy mysql-5.7" > /etc/apt/sources.list
# apt-get update
# apt-get install mysql-server mysql-client libmysqlclient20

Но после этого в панели перестала отображаться вкладка "Базы данных".
Зайдя в "Возможности" я обновил список пакетов и панель увидела, что MySQL 5.7 установлен, но не включен. Попытки включить через панель не получались.

В логах наткнулся на такую строчку:
# tail -f /usr/local/ispmgr/var/pkgctl.log
Mar 27 01:24:35 [20551:0] ../../src/mgr/install/pkgmysql.cpp:381 ESC[1;33mDEBUG server registration result = 'ERROR 9 : MySQL error

Решается это так:
# mysql_upgrade -u root -p

После этого снова попробовал включить MySQL через панель, получилось. Вкладка в панели тоже появилась.

пятница, 25 марта 2016 г.

Сборка PHP 7 в Debian

Установка зависимостей:
# apt-get install git checkinstall \
   apache2-threaded-dev libxml2-dev \
   libcurl4-openssl-dev libjpeg-dev \
   libpng-dev libxpm-dev \
   libmysqlclient-dev libpq-dev \
   libicu-dev libfreetype6-dev \
   libldap2-dev libxslt-dev \
   build-essential autoconf \
   bison libbz2-dev \
   libgmp-dev libmcrypt-dev \
   libpspell-dev librecode-dev php-pear

Собираем пакет:
# cd /root
# git clone https://git.php.net/repository/php-src.git 
# cd php-src
# ./buildconf
# ./configure --prefix=/opt/php7 \
   --with-config-file-path=$HOME/tmp/usr/etc \
   --enable-fpm --enable-mbstring --enable-zip --enable-bcmath \
   --enable-pcntl --enable-ftp --enable-exif --enable-calendar \
   --enable-sysvmsg --enable-sysvsem \
   --enable-sysvshm --enable-wddx --with-curl --with-mcrypt \
   --with-iconv --with-gmp --with-pspell --with-gd \
   --with-jpeg-dir=/usr --with-png-dir=/usr \
   --with-zlib-dir=/usr --with-xpm-dir=/usr \
   --with-freetype-dir=/usr --enable-gd-native-ttf \
   --enable-gd-jis-conv --with-openssl \
   --with-pdo-mysql=/usr --with-gettext=/usr \
   --with-zlib=/usr --with-bz2=/usr \
   --with-recode=/usr --with-mysqli=/usr/bin/mysql_config
# make
# checkinstall -D make install
# тут нужно исправить "Version" со значения "src" на  "7"

Если нужно сохранить пакет:
# mv ./php7-1_amd64.deb /root/php7-1_amd64.deb

Если используется селектор в ISPmanager 4, то нужно не забыть про /etc/phpversion

via.

понедельник, 21 марта 2016 г.

cPanel 500 error "Out of memory!"

При попытке просмотра списка поддоменов в cPanel появилась ошибка 500.
Если во время воспроизведения ошибки посмотреть в лог, то можно увидеть, что не хватает памяти панели:
# tail -f /usr/local/cpanel/logs/error_log
Out of memory!
Cpanel::FHTrap was not closed properly and was unable to return the result: []
[2016-03-21 19:01:37 +0300] warn [cpsrvd] The subprocess (cpanel (cpanel)) exited with an error: The subprocess reported error number 1 when it ended. at /usr/local/cpanel/Cpanel/Server/Handlers/SubProcess.pm line 155.
Cpanel::Server::Handlers::SubProcess::_report_subprocess_errors(Cpanel::Server::Handlers::SubProcess=HASH(0x26064d0)) called at /usr/local/cpanel/Cpanel/Server/Handlers/SubProcess.pm line 72
Cpanel::Server::Handlers::SubProcess::handler(Cpanel::Server::Handlers::SubProcess=HASH(0x26064d0), "subprocess_name", "cpanel (cpanel)", "subprocess_read_handle", IO::Handle=GLOB(0x2605eb8), "subprocess_write_handle", IO::Handle=GLOB(0x26062c0), "api_type", "html", ...) called at cpsrvd.pl line 6421
cpanel::cpsrvd::cpHandler("app", "cpanel", "document", "./frontend/x3/subdomain/index.html") called at cpsrvd.pl line 2387
cpanel::cpsrvd::dodoc_cpaneld() called at cpsrvd.pl line 1645
cpanel::cpsrvd::dodoc(HASH(0x1802ea0)) called at cpsrvd.pl line 1328
cpanel::cpsrvd::handle_one_connection() called at cpsrvd.pl line 844
cpanel::cpsrvd::script() called at cpsrvd.pl line 339

Смотрим сколько памяти у нас выделено под панель:
# grep maxmem /var/cpanel/cpanel.config
maxmem=2048

Немного добавим памяти:
# vim /var/cpanel/cpanel.config
maxmem=2548
# service cpanel restart

Ошибка исчезает.

воскресенье, 20 марта 2016 г.

суббота, 19 марта 2016 г.

tlstest.paypal.com cURL error

При попытке подключения к tlstest.paypal.com появляется ошибка:
# php -r '$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://tlstest.paypal.com/"); var_dump(curl_exec($ch));'
bool(false)

# curl -v https://tlstest.paypal.com/
* About to connect() to tlstest.paypal.com port 443 (#0)
*   Trying 23.77.253.128... connected
* Connected to tlstest.paypal.com (23.77.253.128) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* NSS error -5961
* Closing connection #0
* SSL connect error
curl: (35) SSL connect error

Такая ошибка может появляться, если на сервере отключена уязвимая SSLv3.
В таком случаем можно коннектиться по безопасному TLSv1:
# curl -v https://tlstest.paypal.com/ --tlsv1
* About to connect() to tlstest.paypal.com port 443 (#0)
*   Trying 23.77.253.128... connected
* Connected to tlstest.paypal.com (23.77.253.128) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* SSL connection using TLS_RSA_WITH_AES_256_CBC_SHA256
* Server certificate:
* subject: CN=tlstest.paypal.com,OU=CDN Support,O="PayPal, Inc.",STREET=2211 N 1st St,L=San Jose,ST=California,postalCode=95131-2021,C=US,serialNumber=3014267,businessCategory=Private Organization,incorporationState=Delaware,incorporationCountry=US
* start date: Nov 06 00:00:00 2015 GMT
* expire date: Oct 26 23:59:59 2017 GMT
* common name: tlstest.paypal.com
* issuer: CN=Symantec Class 3 EV SSL CA - G3,OU=Symantec Trust Network,O=Symantec Corporation,C=US
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: tlstest.paypal.com
> Accept: */*

< HTTP/1.1 200 OK
< Content-Type: text/html
< Content-Length: 20
< Date: Sat, 19 Mar 2016 10:26:09 GMT
< Connection: keep-alive

* Connection #0 to host tlstest.paypal.com left intact
* Closing connection #0

# php -r '$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://tlstest.paypal.com/"); curl_setopt($ch, CURLOPT_SSLVERSION, "1" ); var_dump(curl_exec($ch));'
PayPal_Connection_OK
bool(true)

четверг, 17 марта 2016 г.

ISPmanager: Этот IP адрес используется одним из почтовых доменов и не может быть удален

Если при попытке удаления IP-адреса в панели появляется подобная надпись, то нужно пойти в панель и сменить везде где используется этот адрес на другой.
В моем случае почтовых доменов было очень много и мне нужно было узнать какой именно домен использует этот адрес.
Сделать это можно так:
# cat /etc/exim/domainips | grep 1.2.3.4
site123.ru:1.2.3.4;

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

Проверка нескольких условий if в nginx

Имеется вот такой виртуальный хост:
server {
   server_name site.ru m.site.ru www.site.ru www.m.ste.ru;
...
}

Нужно сделать редирект http->https только для site.ru и для www.site.ru, но не для m.site.ru и www.m.site.ru:
set $flag 0;
if ($host = site.ru) {
   set $flag A;
}
if ($host != m.site.ru) {
   set $flag "${flag}B";
}
if ($scheme = http) {
   set $flag "${flag}C";
}
if ($flag = ABC) {
   return 301 https://$server_name$request_uri;
}

В .htaccess у меня прописан редирект с www на non-www:
RewriteCond %{HTTP_HOST} ^www.site.ru$ [NC]
RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^www.m.site.ru$ [NC]
RewriteRule ^(.*)$ http://m.site.ru/$1 [R=301,L]

Проверка:
$ curl -I http://site.ru --silent | grep Loca
Location: https://site.ru/
$ curl -I http://www.site.ru --silent | grep Loca
Location: http://site.ru/
$ curl -I http://www.m.site.ru --silent | grep Loca
Location: http://m.site.ru/
$ curl -I http://m.site.ru --silent | grep Loca

среда, 9 марта 2016 г.

Ansible: nginx+php-fpm+mariadb+wordpress в контейнере Virtuozzo 7

Продолжаю разбираться с Ansible.
Тут вводная заметка по нему: http://blog.amet13.name/2016/02/ansible.html
А тут я устанавливал nginx на разные дистрибутивы: http://blog.amet13.name/2016/02/ansible-playbook-nginx.html

В этот раз задача была развернуть окружене на базе nginx+php-fpm+mariadb+wordpress в контейнере Virtuozzo. В принципе у меня это получилось. Текущий результат тут: https://github.com/Amet13/ansible-vz-wordpress

понедельник, 7 марта 2016 г.

Делист IP-адреса из черных списков Microsoft

Если приходит отбойник типа такого:
This message was created automatically by mail delivery software.

A message that you sent could not be delivered to one or more of its
recipients. This is a permanent error. The following address(es) failed:

[email protected]
   host mx2.hotmail.com [65.54.188.126]
   SMTP error from remote mail server after MAIL FROM:<[email protected]> SIZE=2119269:
   550 SC-001 (BAY004-MC4F31) Unfortunately, messages from 1.2.3.4 weren't sent. Please contact your Internet service provider since part of their network is on our block list. You can also refer your provider to http://mail.live.com/mail/troubleshooting.aspx#errors.

Делистнуть можно тут.

суббота, 5 марта 2016 г.

Google Chrome: Unable to find expected entry 'main/binary-i386/Packages' in Release file

В Google Chrome недавно выпилили поддержку i386, после этого при попытке обновления списка пакетов появлялась ошибка:
$ sudo apt-get update
...
W: Failed to fetch http://dl.google.com/linux/chrome/deb/dists/stable/Release  Unable to find expected entry 'main/binary-i386/Packages' in Release file (Wrong sources.list entry or malformed file)
E: Some index files failed to download. They have been ignored, or old ones used instead.

Решение:
$ sudo sed -i -e 's/deb http/deb [arch=amd64] http/' "/etc/apt/sources.list.d/google-chrome.list"
$ sudo sed -i -e 's/deb http/deb [arch=amd64] http/' "/opt/google/chrome/cron/google-chrome"

И снова сделать update.

среда, 2 марта 2016 г.

Exim: retry time not reached for any host after a long failure period

Ошибка может появиться, если бьются базы exim'а.
# exim -Mvl 1ab5H4-0004J9-5c
2016-03-02 14:49:02 Received from [email protected] U=webmaster P=local S=50407
2016-03-02 14:49:02 [email protected] R=dnslookup T=remote_smtp defer (-53): retry time not reached for any host

Решение:
# cd /var/spool/exim/db
# rm retry retry.lockfile wait-remote_smtp wait-remote_smtp.lockfile
# service exim restart

среда, 24 февраля 2016 г.

Ansible: playbook установки nginx

Тут я рассказывал, как я первый раз устанавливал ansible: http://blog.amet13.name/2016/02/ansible.html

В этой части я создам свой первый полезный playbook.

В предыдущей части я использовал так называемый Ad-Hoc режим.
Для Ad-Hoc режима используется команда /usr/bin/ansible.
Для плейбуков используется команда /usr/bin/ansible-playbook. Плейбуки - это файлы в формате YAML (.yml) которые содержат описание необходимых для выполнения операций.

суббота, 20 февраля 2016 г.

Ansible: введение

Первое мое знакомство с ansible, крутая штука.
В этой заметке оставлю основные выдержки из вводной документации: http://docs.ansible.com/ansible/intro.html

В VirtualBox развернул Virtuozzo 7, а в нем окружение, в котором я буду тестировать ansible.
Выглядит это так, ansible.host.tld - мастер-сервер ансибла, остальные три виртуалки подопытые кролики:
[[email protected] ~]# prlctl list -o name,ip,ostemplate,hostname
NAME           IP_ADDR         OSTEMPLATE             HOSTNAME
ansible-c7     192.168.0.151   .centos-7-x86_64       ansible.host.tld
centos7        192.168.0.154   .centos-7-x86_64       centos7.host.tld
debian8        192.168.0.153   .debian-8.0-x86_64     debian8.host.tld
ubuntu14       192.168.0.152   .ubuntu-14.04-x86_64   ubuntu14.host.tld

воскресенье, 14 февраля 2016 г.

ERROR 1010 (HY000): Error dropping database (can't rmdir './foodb', errno: 39)

При попытке удаления БД возникает ошибка:
mysql> drop database foodb;
ERROR 1010 (HY000): Error dropping database (can't rmdir './foodb', errno: 39)

Решение:
# cd /var/lib/mysql
# rm -fr foodb
# mysql -uroot -ppass -e 'drop database foodb;'
ERROR 1008 (HY000): Can't drop database 'foodb'; database doesn't exist
# mysql -uroot -ppass -e 'create database foodb;'
Query OK, 1 row affected (0.00 sec)
# mysql -uroot -ppass -e 'drop database foodb;'
Query OK, 0 rows affected (3.38 sec)

via.

среда, 10 февраля 2016 г.

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

Имеется куча серверов с хостнеймами а-ля:
ns1.domain1.com
ns2.domain1.com
isp1.domain1.com
isp2.domain1.com
cpanel1.domain2.com
cpanel2.domain2.com
mx1.domain2.com
mx2.domain2.com
и т.д.

Гораздо удобнее использовать сетевые утилиты (ping/host/traceroute/mtr/dig...) не к полному хостнейму, а только к части домена.
Например вместо:
ping ns1.domain1.com
писать:
ping ns1

Тут нам помогут поисковые домены.
В Ubuntu/Mint сделать это просто:
$ sudo echo "search domain1.com domain2.com" >> /etc/resolvconf/resolv.conf.d/base

После этого нужно перезагрузить сеть (я это делаю включением/отключением иконки на панели задач в MATE).

Проверка:
$ ping ns1
PING ns1.domain1.com (192.168.0.44) 56(84) bytes of data.

$ host isp1
isp1.domain1.com has address 192.168.0.45

$ traceroute mx1
traceroute to mx1 (192.168.0.46), 30 hops max, 60 byte packets

четверг, 4 февраля 2016 г.

Не работает квота в ISPmanager

При попытке установить для юзера дисковую квоту возникает ошибка. Все это в контейенере OpenVZ.
В логах ISPmanager примерно такое:
Feb  3 22:37:14 [1039:161] account ERROR Failed to set quota: 'setquota: Cannot stat() mounted device simfs: No such file or directory
setquota: Mountpoint (or device) / not found or has no quota enabled.
setquota: Not all specified mountpoints are using quota.

Решение проблемы для ISPmanager 5:
# ln -s /simfs /usr/local/mgr5/simfs

Для ISPmanager 4:
# ln -s /simfs /usr/local/ispmgr/simfs

Если это не помогает, то можно попробовать так:
# mv /simfs /simfs_
# ln -s /dev/simfs /simfs
# unlink /usr/local/mgr5/simfs
# ln -s /dev/simfs /usr/local/mgr5/simfs
# killall core

Если и это не помогло, то значит дело в квотах OpenVZ.
# vzctl stop $CTID
# vzquota drop $CTID
# vzctl start $CTID

воскресенье, 17 января 2016 г.

Массовое переименование файлов по шаблону в Linux

Есть много файлов вида:
$ ls -1 | head -6
Фото-0069.jpg
Фото-0166.jpg
Фото-0167.jpg
Фото-0168.jpg
Фото-0174.jpg
Фото-01751.jpg

Необходимо заменить "Фото" на "Photo":
$ ls -1 | xargs -i rename 's/Фото/Photo/' {}
$ ls -1 | head -6
Photo-0069.jpg
Photo-0166.jpg
Photo-0167.jpg
Photo-0168.jpg
Photo-0174.jpg
Photo-01751.jpg

суббота, 9 января 2016 г.