Перейти к собственно контенту

Блог@DeathStar.Name

Блог системного администратора

При попытке залить дамп базы данных через утилиту mysqldump столкнулся с ошибкой:
ERROR 2006 (HY000) at line 40283: MySQL server has gone away

Пофиксить можно следующим образом:
открываем файл my.cnf ( в Linux как правило /etc/my.cnf , во FreeBSD — /etc/my.cnf или же /usr/local/etc/my.cnf ), и добавляем следующие строки в секцию [mysqld]

wait_timeout = 6000
max_allowed_packet = 1G
, перезапускаем MySQL согласно той ОС которая у Вас стоит и пробуем залить дамп опять.
root@armfilm:/var/www/rg# mysql -p huid < 2017-11-02_04-35-42.sql Enter password: root@armfilm:/var/www/#
Дамп залит успешно

Случилось так, что у одного из сайтов появилось какое-то «левое» зеркало,  которое сильно подбило позиции в поисковике. Я думал что домен просто направили на IP того сервера, на который ссылался домен. Прописал в конфиг виртуального хоста строки, запрещающие доступ к сайту по IP адресу

if ($host !~ ^(example.com|www.example.com)$ ) {
return 403;
}

Но не помогло, так как выяснилось что сайт на «левом» зеркале парсился PHP скриптами через CURL. Сразу возникла идея просто запретить доступ по User Agent, но он был изменен на GoogleBot/2.1 , и если его забанить то и поисковые боты не смогут попасть на сайт. Осталось только 1 решение, сравнивать User Agent и IP адрес, с которого был запрос, и если это реальные IP адреса гуглобота, то пропускать, иначе отдавать ошибку 403. В конфиг nginx добавляем в секцию http следующие строки ( это все IP адреса и подсети, которые использует гуглобот и которые мне удалось найти, если есть чем дополнить пишите в коментариях ):

geo $googlebotip {
default 0;
64.18.0.0/20 1;
64.233.160.0/19 1;
66.102.0.0/20 1;
66.249.80.0/20 1;
72.14.192.0/18 1;
74.125.0.0/16 1;
108.177.8.0/21 1;
172.217.0.0/19 1;
173.194.0.0/16 1;
207.126.144.0/20 1;
209.85.128.0/17 1;
216.58.192.0/19 1;
216.239.32.0/19 1;
203.208.60.0/24 1;
66.249.64.0/20 1;
72.14.199.0/24 1;
209.85.238.0/24 1;
66.249.90.0/24 1;
66.249.91.0/24 1;
66.249.92.0/24 1;
2001:4860:4000::/36 1;
2404:6800:4000::/36 1;
2607:f8b0:4000::/36 1;
2800:3f0:4000::/36 1;
2a00:1450:4000::/36 1;
2c0f:fb50:4000::/36 1;
2001:4860:4801:1::/64 1;
2001:4860:4801:2::/64 1;
2001:4860:4801:3::/64 1;
2001:4860:4801:4::/64 1;
2001:4860:4801:5::/64 1;
2001:4860:4801:6::/64 1;
2001:4860:4801:7::/64 1;
2001:4860:4801:8::/64 1;
2001:4860:4801:9::/64 1;
2001:4860:4801:a::/64 1;
2001:4860:4801:b::/64 1;
2001:4860:4801:c::/64 1;
2001:4860:4801:d::/64 1;
2001:4860:4801:e::/64 1;
2001:4860:4801:2001::/64 1;
2001:4860:4801:2002::/64 1;
104.132.0.0/21 1;
104.132.12.0/24 1;
104.132.128.0/24 (далее…)

В дополнение к статье Собственный Dynamic DNS сервер на базе Bind решил написать статью, для тех у кого есть домен c использованием Clouflare.com. В настройках CF получаем API Key. Допустим zone называется deathstar.name , мне нужно было для домашнего файлохранилища как и в предыдущей статье менять IP по крону ( метод получения внешнего немного изменен, но можно и использовать метод с предыдущей статьи )

Скрипт находится тут

ID всех записей можно узнать командой:

curl https://www.cloudflare.com/api_json.html   -d 'a=rec_load_all'   -d 'tkn=ВАШ API ключ'   -d 'email=deathstar@deathstar.name'   -d 'z=deathstar.name'

тут находим запись netdisk.deathstar.name и левее названия будет rec_id. Ставим в крон аналогично предыдущей статьи и радуемся.

При включений режима PHP как CGI вместо страничек отображался код скриптов.

Исправляем так: ( на примере CentOS 6 )
создаем файл /etc/httpd/conf.d/php-cgi.conf со следующим содержимым:
ScriptAlias /local-bin /usr/bin
AddHandler application/x-httpd-php5 php
Action application/x-httpd-php /php-bin/php

Перезапускаем apache
[root@hz2 httpd]# /etc/init.d/httpd restart
И наслаждаемся рабочим PHP-CGI.

В дополнение к этой статье решил написать данный мануал. Заказчику потребовалось с выходом PHP 7 поставить эту версию как вторую. Сервер с CentOS 6 , ISPmanager 4 и PHP 5.4.45.

Качаем последнюю версию PHP 7.0.2, распаковываем
[root@hz2 ~]# wget http://php.net/get/php-7.0.2.tar.gz/from/this/mirror
[root@hz2 ~]# tar xzvf php-7.0.2.tar.gz
[root@hz2 ~]# cd ./php-7.0.2

Конфигурируем PHP:
[root@hz2 ~]# mkdir -p /opt/php70

[root@hz2 ~]# ./configure --prefix=/opt/php70 --with-zlib-dir --with-freetype-dir --enable-mbstring --with-libxml-dir=/usr --enable-soap --enable-calendar --with-curl --with-mcrypt --with-zlib --with-gd --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-zip --with-pcre-regex --with-pdo-mysql --with-mysqli --with-jpeg-dir=/usr --with-png-dir=/usr --enable-gd-native-ttf --with-openssl --with-libdir=lib64 --enable-ftp --with-imap --with-imap-ssl --with-kerberos --with-gettext --enable-cgi

Если появляются ошибки о нехватке необходимого ПО или сорцов ставим все это дело:
[root@hz2 ~]# yum install libxml2-devel bzip2-devel curl-devel libjpeg-devel libpng-devel libX11-devel gd-devel libc-client-devel libmcrypt-devel mysql-devel

Собираем и ставим
[root@hz2 ~]# make && make install

Нам нужно сделать, что бы при использовании php как модуля апача использовалась версия 5.4.45, а при втором варианте 7.0. Будет удобно если можно будет прям определять какая версия нужна для какого сайта и пользователя. Для этого нам нужно просто заменить файл php-cgi, что мы и сделаем, но для начала сбекапим старый.

[root@hz2 ~]# mv /usr/bin/php-cgi php-cgi.back
[root@hz2 ~]# ln -s /opt/php70/bin/php-cgi /usr/bin/php-cgi

На этом все!. Заходим в панель ISPmanager и выбираем «PHP как CGI», для того, что бы у вас использовалась версия php 7.0

Нужно было поставить PC-BSD на ПК, но кроме как OS X под рукой ничего не было, и болванок не было тоже, но была флешка на 8гб
Преобразуем файл .iso в .img используя опцию конвертировать в утилите hdiutil

hdiutil convert -format UDRW -o ~/Desktop/PCBSD10.2-RELEASE-08-19-2015-x64-DVD-USB.img ~/Desktop/PCBSD10.2-RELEASE-08-19-2015-x64-DVD-USB.iso
Видим следующее:
Читаю Driver Descriptor Map (DDM : 0)…
Читаю PCBSD_INSTALL (Apple_ISO : 1)…
Читаю Apple (Apple_partition_map : 2)…
Читаю PCBSD_INSTALL (Apple_ISO : 3)…
Читаю Gap0 (ISO9660_data : 4)…
Читаю HFSPLUS_Hybrid (Apple_HFS : 5)…
..............................................................................
Читаю Gap1 (ISO9660_data : 6)…
..............................................................................
Прошло времени: 2m 56.263s
Скорость: 23.7 Mб/с
Сохранений: 0.0 %
created: /Users/deathstar/Desktop/PCBSD10.2-RELEASE-08-19-2015-x64-DVD-USB.img.dmg

Переименовываем файл

mv /Users/deathstar/Desktop/PCBSD10.2-RELEASE-08-19-2015-x64-DVD-USB.img.dmg /Users/deathstar/Desktop/PCBSD10.2-RELEASE-08-19-2015-x64-DVD-USB.img

Примечание: OS X пытается подставить .dmg в выходной файл автоматически.

Вставляем флешку в мак

В терминале вводим команду
diskutil list
и ищем нашу флешку ( в моем случае это /dev/disk2 ):
/dev/disk0
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *500.1 GB disk0
1: EFI EFI 209.7 MB disk0s1
2: Apple_CoreStorage 499.2 GB disk0s2
3: Apple_Boot Recovery HD 650.0 MB disk0s3
/dev/disk1
#: TYPE NAME SIZE IDENTIFIER
0: Apple_HFS Macintosh HD *498.9 GB disk1
Logical Volume on disk0s2
(далее…)

Имеется сервер с Debian Wheezy, панелью управления сервером ISPmanager 4 и PHP 5.4, но заказчику понадобилось добавить туда поддержку PHP 5.3.
Устанавливаем все что необходимо для сборки PHP:
apt-get install -y build-essential git libfcgi-dev libfcgi0ldbl libjpeg62-dbg libmcrypt-dev libssl-dev libxml2-dev libssl-dev libbz2-dev libcurl3-dev libdb5.1-dev libjpeg-dev libpng-dev libXpm-dev libfreetype6-dev libt1-dev libgmp3-dev libc-client-dev libldap2-dev libmcrypt-dev libmhash-dev freetds-dev libz-dev libmysqlclient-dev ncurses-dev libpcre3-dev unixODBC-dev postgresql-server-dev-9.1 libsqlite-dev libaspell-dev libreadline6-dev librecode-dev libsnmp-dev libtidy-dev libxslt-dev libt1-dev libcurl4-openssl-dev libgdbm-dev libqdbm-dev libdb++-dev php-pear libmagickwand-dev libmagickcore-dev subversion
apt-get build-dep -y php5

ln -s /usr/include/qdbm/depot.h /usr/include/depot.h
ln -s /usr/lib/libc-client.a /lib/x86_64-linux-gnu/libc-client.a
ln -s /usr/lib/libc-client.a /usr/lib/x86_64-linux-gnu/libc-client.a

Копируем репозиторий исходники phpfarm:
git clone https://github.com/fpoirotte/phpfarm.git /usr/local/share/phpfarm/

Указываем опции для сборки ( создаем файл /usr/local/share/phpfarm/src/custom/options-5.3.sh с нижеуказанным содержимым ):
configoptions="\
--with-regex=php \
--disable-rpath \
--disable-static \
--with-pic \
--with-layout=GNU \
--enable-calendar \
--enable-sysvsem \
--enable-sysvshm \
--enable-sysvmsg \
--enable-bcmath \
--with-bz2 \
--enable-ctype \
--with-db4=/usr \
--with-qdbm=/usr \
--without-gdbm \
--with-cdb \
--with-iconv \
--enable-exif \
--enable-ftp \
--with-gettext \
--enable-mbstring \
--with-onig=/usr \
--with-pcre-regex=/usr \
--enable-shmop \
--enable-sockets \
--enable-wddx \
--with-libxml-dir=/usr \
--with-zlib \
--with-kerberos=/usr \
--with-openssl=/usr \
--enable-soap \
--enable-zip \
--with-mhash=yes \
--with-mysql-sock=/var/run/mysqld/mysqld.sock
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd (далее…)

Добавляем мультимедиа репозиторий и обновляем список пакетов:
echo "deb http://www.deb-multimedia.org wheezy main non-free" >> /etc/apt/sources.list
echo "deb-src http://www.deb-multimedia.org wheezy main non-free" >> /etc/apt/sources.list
apt-get update
apt-get install deb-multimedia-keyring # если вылезла ошибка то повторить
apt-get update

Переходим в каталог с исходниками:
cd /usr/local/src

Устанавливаем все необходимые зависимости
aptitude install -y libfaad-dev faad faac libfaac0 libfaac-dev libmp3lame-dev x264 libx264-dev libxvidcore-dev build-essential checkinstall

Устанавливаем все необходимые зависимости для сборки ffmpeg
apt-get build-dep ffmpeg

Скачиваем актуальный исходный код
apt-get source ffmpeg

Переходим в каталог с исходниками
cd ffmpeg-*

Задаем опции сборки:
./configure --enable-gpl --enable-nonfree --enable-libfaac --enable-libgsm --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-postproc --enable-swscale --enable-pthreads --enable-x11grab --enable-libdc1394 --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb

Делаем маленький фикс ))):
mkdir -p /usr/local/share/ffmpeg

Собираем .deb пакет:
checkinstall -D --install=no --pkgname=ffmpeg-full --autodoinst=yes -y

Если получили ошибку:
libavcodec/libx264.c:492: undefined reference to `x264_encoder_open_125'

то переходим на каталог выше, удаляем x264 и собираем из исходного кода и пытаемся повторить сборку ffmpeg:
cd ..
apt-get remove x264
git clone git://git.videolan.org/x264.git
cd x264
./configure --enable-static --enable-shared
make && make install
ldconfig
cd .. && cd ffmpeg*
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/src/x264/libx264.a ./configure --enable-gpl --enable-nonfree --enable-libfaac --enable-libgsm --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-postproc --enable-swscale --enable-pthreads --enable-x11grab (далее…)

В дополнение к этой статье я напишу как установить Redmine и при необходимости перенести данные на сервер с ОС CentOS 6.5 и панелью ISPmanager Lite.

У нас имеется один сервер с рабочим Redmine и второй с ISPmanager Lite на котороый и будет делать перенос.

1) Ставим пакеты для сборки сорцов:

# yum install gcc-c++ patch readline readline-devel zlib zlib-devel
# yum install libyaml-devel libffi-devel openssl-devel make
# yum install bzip2 autoconf automake libtool bison iconv-devel mysql-devel

2) Устанавливаем RVM ( Ruby Version Manager ):

# curl -L get.rvm.io | bash -s stable

3) Выставляем переменные окружения:

# source /etc/profile.d/rvm.sh

4) Ставим Ruby 1.9.3 и назначаем дефолтным в системе, проверяем работоспособность:

# rvm install 1.9.3
# rvm use 1.9.3 --default

Провеверям:

# ruby --version
ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-linux]

5) Ставим Passenger и добавляем поддержку в Nginx:

# gem install passenger

Качаем исходный код nginx:

# cd /tmp
# wget http://nginx.org/download/nginx-1.7.9.tar.gz && tar xvzf nginx-1.7.9.tar.gz

Смотри с какими параметрами был уже бинарик у нас собран:

# nginx -V
nginx version: nginx/1.7.9
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
TLS SNI support enabled
configure arguments: --user=nginx --group=nginx --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --with-debug --with-http_secure_link_module --with-http_random_index_module --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module (далее…)

Как правило у большинства домашних провайдеров всегда динамические IP адреса, а так как порой надо было иметь доступ к внешнему жесткому диску MyBookLive из интернета — было решено поднять свой DynDNS сервер.
Нам потребуется домен и DNS сервер который будет обслуживать домен.
Про настройку Bind в качестве Master и Slave сервера писать не буду — в интернете куча статей, у меня крутится Bind99 на FreeBSD в качестве Master + Slave с двумя внешними IP адресами на сервере.

На клиенте ( у меня это MyBookLive с Debian на борту ) генерируем ключи для возможности удаленного обновления зоны:
dnssec-keygen -a hmac-md5 -b 128 -n USER deathstar

Должно получится два файла Kdeathstar.+157+03649.private и Kdeathstar.+157+03649.key
Смотрим содержимое файла Kdeathstar.+157+03649.key
deathstar# cat Kdeathstar.+157+03649.key
deathstar. IN KEY 0 3 157 OoMn1WMkDFdAH/ZZ9ip0Imm==

На сервере создаем файл /etc/namedb/keys.conf с таким содержимым ( значение для строки secret берем выше из файла ключа Kdeathstar.+157+03649.key на клиенте ):
key deathstar {
algorithm hmac-md5;
secret "OoMn1WMkDFdAH/ZZ9ip0Imm==";
};

Затем на сервере в файл /etc/namedb/named.conf впишите в самый конец файла:
include "/etc/namedb/keys.conf";

и приводим зону в этом же файле к такому состоянию:
zone "deathstar.name" {
type master;
file "/etc/namedb/master/deathstar.name";
allow-update { key deathstar; };
allow-query { any; };
notify yes;
};

и перезапускаем bind
deathstar# /etc/rc.d/named restart

На клиенте создаем скрипт такого вида:
#!/bin/sh

# SETTINGS
TTL=10
SERVER=ns1.deathstar.name
HOSTNAME=netdisk.deathstar.name.
ZONE=deathstar.name
KEYFILE="/etc/Kdeathstar.+157+03649.private"

IP_FILE="/tmp/myBookLiveIP"
OLDIP="$(grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' $IP_FILE)"
IP="$(wget -q checkip.dyndns.org -O - | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}')"
DNSIP="$(host -t A $HOSTNAME | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}')"

if (далее…)