Debian 7 (Wheezy) install PHP 7 + Redis
Установка второго препроцессора (или как там его) PHP параллельно с основной версией.
Перед сборкой самого PHP 7
Надо установить исходники для всяких дополнений
- 1
apt-get install libcurl4-openssl-dev libicu-dev libmcrypt-dev libpq-dev libxslt-dev libreadline6-devСкачиваем php, не важно откуда, я брал с оф.сайта. Распаковываем и начинаем конфигурировать
- 1
- 2
./buildconf --force
./configure --prefix=/usr/local/php7 --enable-mbstring --with-curl --with-openssl --with-xmlrpc --enable-soap --enable-zip --with-gd --enable-exif --enable-filter --with-jpeg-dir --with-iconv --enable-simplexml --enable-sockets --with-gettext --with-jpeg-dir --with-mcrypt --with-mhash --with-mysql-sock=/var/run/mysqld/mysqld.sock --with-png-dir --with-pgsql --enable-embedded-mysqli --with-freetype-dir --enable-intl --with-xsl --with-mysqli --with-pdo-mysql --with-pdo-pgsql --with-readline --enable-ftp --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-calendar --enable-xml --enable-dom --enable-wddx --enable-posix --enable-phar --enable-fileinfo --enable-xmlreader --enable-xmlwriter --enable-json --enable-ctype --enable-tokenizer --enable-shmop --with-zlib --enable-cli --enable-fpmСобираем и устанавливаем
- 1
- 2
make
make installЕсли собирали не первый раз, то лучше сделать
- 1
make clean- 1
update-alternatives --set php /usr/local/php7/bin/phpПосле этого
Отдельно скачиваем куда-нибудь и устанавливаем. Конфиг PHP обязательно должен быть указан, иначе пакет сконфигурируется для основной версии php.
- 1
- 2
- 3
- 4
git clone https://github.com/igbinary/igbinary.git
cd igbinary/
phpize
./configure --with-php-config=/usr/local/php7/bin/php-config- 1
- 2
- 3
- 4
git clone https://github.com/phpredis/phpredis.git
cd phpredis/
phpize
./configure --with-php-config=/usr/local/php7/bin/php-config --enable-redis-igbinaryВроде бы все.
Пользуемся всякой ерундой типа композера
- 1
/usr/local/php7/bin/php composer.phar up
gedit cp1251
- 1
gsettings set org.gnome.gedit.preferences.encodings candidate-encodings "['UTF-8', 'WINDOWS-1251', 'KOI8-R', 'CURRENT', 'ISO-8859-15', 'UTF-16']"
ProFTPd
Создаем нового виртуального ftp-пользователя с логином test, идентификатором 1000, группой 1000 и домашним каталогом /var/www/jonel.net. (где 1000 — id реального пользователя, у которого есть доступ к указанной папке)
- 1
ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=test --uid=1000 --gid=1000 --home=/var/www/jonel.net --shell=/bin/falseПосле выполнения команды система попросит ввести дважды пароль для нового пользователя.
В итоге, у нас появится файл /etc/proftpd/ftpd.passwd с записью о пользователе, напоминающий синтаксис /etc/passwd.
Подробнее о формате: http://www.proftpd.org/docs/howto/AuthFiles.html
Изменение пароля:
- 1
ftpasswd --passwd --name=test --change-passwordПеред этим надо перейти в директорию /etc/proftpd/, иначе ftpasswd не найдет файл ftpd.passwd.
В файле proftpd.conf надо добавить или раскомментировать строки, чтобы загрузить модуль (устанавливается и подключается он по умолчанию)
- 1
- 2
RequireValidShell off
AuthOrder mod_auth_file.cВ конце (обязательно после запроса модуля) того же файла добаляем строку:
- 1
AuthUserFile /etc/proftpd/ftpd.passwd
Небольшая заметка о почте для домена от Яндекс и Exim
Есть несколько ящиков на домене, например, redmine@bit7.cc и admin@bit7.cc. И нужно отправлять с них почту через сервис Яндекс.Почта для домена (ПДД).
Exim умеет это делать. Для этого есть файл passwd.client в директории exim (/etc/exim4/).
Для одного ящика это сделать не сложно - просто указываешь в этом файле что-то типа smtp.yandex.ru:user@domain.tld:pass, переконфигурируешь Exim (dpkg-reconfigure exim4-config) на smarthost и указанием релея smtp.yandex.ru:587 и готово.
А как сделать, чтоб Exim для разных отправителей (ящиков) выбирал свою аутификацию, я так и не понял.
Но есть простой путь как это сделать. На Яндексе создаешь один ящик, а все остальные указываешь как алиасы.
Debian 7 (wheezy) PHP 5.4 upgrade to 5.6
Собсно, обновление PHP до версии 5.6
В репозитории седьмого debian PHP 5.6 нет.
Поэтому необходимо добавить дополнительный источник обновлений
- 1
- 2
- 3
echo "deb http://packages.dotdeb.org wheezy-php56 all" >> /etc/apt/sources.list.d/dotdeb.list
echo "deb-src http://packages.dotdeb.org wheezy-php56 all" >> /etc/apt/sources.list.d/dotdeb.list
wget http://www.dotdeb.org/dotdeb.gpg -O- | apt-key add -Обновляемся и проверяем версию PHP
- 1
- 2
apt-get update
php -vЕсли не сработало, то просто выполните установку. Apt-get сам все сделает.
- 1
- 2
apt-get install php5
php -vПерезагружаем веб-сервер.
- 1
service apache2 restartИ видим множественные предупреждения (warning) о том, что нужно выставить временную зону.
Собсно, проверим действительно ли она не выставлена, исправим и снова перезагрузимся. Доступные значения timezone можно найти в документации PHP - http://php.net/manual/en/timezones.php
- 1
- 2
- 3
cat /etc/php5/apache2/php.ini | grep timezone
nano /etc/php5/apache2/php.ini
service apache2 restartСюрпризы
Вполне возможно, что после обновления "слетят" некоторые модули. Особенно это касается модулей установленных через PECL. Придется установить их заново.
Но будьте внимательны, pecl используется утилиту php-config, а она может использовать старые пути к модулям.
Найдем исполняемый файл
- 1
- 2
whereis php-config
php-config: /usr/bin/php-configЭтот файл является ничем иным, как обычным shell. Так что открываем и исправляем путь до расширений extension_dir.
Например,
/usr/lib/php5/20131226/ - новый
Если посмотреть содержимое новой директории, то там можно найти установленные модули - mysql.so и т.п.
После установки модуля, например
- 1
pecl install sphinx-1.2.0Останется включить модуль
- 1
extension=sphinx.soДобавив эту строку в файл php.ini или создав файл в /etc/php5/mods-available/ и добавив сим.линк на него в директории /etc/php5/apache2/conf.d/ (в случае веб-сервера Apache2) по аналогии с имеющимися там модулями. Второй вариант более правильный.
Кстати, неплохо добавить то же самое в /etc/php5/cli/.
Tar relative path
- 1
- 2
- 3
tar czf ~/backups/mysite.tar.gz \
-C ~/www \
public_html-С устанавливает текущую директорию.
Что можно так же написать, как:
- 1
- 2
cd ~/www
tar czf ~/backups/mysite.tar.gz public_html
Отправка e-mail при успешной авторизации по SSH
Создаем файл /etc/ssh/sshrc со следующим содержимым:
- 1
- 2
- 3
- 4
- 5
ip=`echo $SSH_CONNECTION | cut -d " " -f 1`
datestart=`date +'%F %T'`
logger -t ssh-wrapper $USER login from $ip
echo "$datestart: User $USER just logged in from $ip" | mail -aFrom:user@example.com -s "SSH Login" your.address@email.comРаботает в Debian 7, 8. На других дистрибутивах не тестировалось.
Что-то взято отсюда: http://askubuntu.com/questions/179889/how-do-i-set-up-an-email-alert-when-a-ssh-login-is-successful
Инструкция по созданию обратного SSH-туннеля
Инструкция писалась для RPi под управлением Raspian (Debian) для человека совершенно не знакомого с Linux.
Имеется: RPi за NAT'ом и удаленный сервер с внешним IP.
Надо: Иметь постоянный удаленный доступ к "малинке".
Начало
После загрузки Raspberry увидим черный экран и мигающий курсор - это консоль. Все команды выполняются именно здесь.
В консоле есть автодополнение - это клавиша Tab. По ней дописываются названия файлов, директорий, команды, если они есть в системе. Параметры к командам (-l, -r и т.п.) не дописываются!
Для большего понимая того, что делаем, вот команды, которые будем использовать:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
pwd - показывает директорию (папку), в которой сейчас находишься
ssh-keygen - утилита создающая ключевую пару для доступа на удаленный сервер
ls - показывает содержание директории. Флаг -l добавляет некоторые данные к выводу
nano - текстовый редактор
chmod - установка прав доступа
ssh - подключение к серверу по протоколу SSH
crontab - планировщик заданий LinuxУбедимся, что мы в домашней директории:
- 1
pwdНа экран дожлно вывестись:
- 1
/home/userИтак, приступим
Сгенерируем пару ключей для доступа на удаленный сервер, чтоб заходить на него без пароля
- 1
ssh-keygenЗдесь утилита задаст пару вопросов. На первый надо написать .ssh/tunnel и нажать Enter, на последующие просто Enter.
- 1
- 2
- 3
- 4
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): .ssh/tunnel
Enter passphrase (empty for no passphrase):
Enter same passphrase again:Удостоверимся что создались 2 файла:
- 1
ls -l .ssh/На экран должны вывестись 2 строки или больше, но среди них должны быть
- 1
- 2
-rw------- 1 user user 1679 Jun 30 16:57 tunnel
-rw-r--r-- 1 user user 415 Jun 30 16:57 tunnel.pubПервый файл содержит приватный ключ. А второй - публичный, который далее нам понадобится.
Если таковых нет, то посмотрим в текущей директории:
- 1
ls -lВ общем, их надо обязательно найти. Потому что они нужны.
Далее, надо написать скрипт, который будет подключаться к удаленному серверу, если такого подключения нет:
- 1
nano autotunnel.shОткроется редактор nano. В нем надо написать следующие строки:
- 1
- 2
- 3
- 4
#!/bin/sh
COMMAND="ssh -i .ssh/tunnel -N -f -R 2222:localhost:22 user@jonel.net"
pgrep -f -x "$COMMAND" > /dev/null 2>&1 || $COMMANDВнимание! Вставить по Ctrl+V не получится. Но можно вставить используя комбинацию клавиш Shift+Insert - это второй способ вставки. Или первый :-) Копирование работает по нажатию Ctrl+Insert.
Чтобы сохранить и выйти из редактора надо нажать комбинацию клавиш Ctrl+X. Nano внизу экрана задаст вопрос (на англ.) - Хотите сохранить? Надо нажать кнопку y (yes). Он спросит про название файла, здесь надо просто нажать Enter.
Если кратко: Ctrl+X, Y, Enter
Теперь надо выставить права на выполнение этого скрипта:
- 1
chmod 744 autotunnel.shТеперь нам надо добавить публичный ключ на удаленный сервер. Чтоб он знал кто подключается.
Выведем публичный ключ на экран и скопируем его:
- 1
cat .ssh/tunnel.pubВыделим его и нажмем Ctrl+Insert.
Заходим на сервер:
- 1
ssh user@jonel.netСервер спросит пароль.
После того, как попали на сервер надо добавить скопированный ключ в файл .ssh/authorized_keys
- 1
nano .ssh/authorized_keysСнова откроется редактор nano. Возможно там уже есть какие-то строки. Нажимаем клавишу Page Down (возможно несколько раз), чтоб перейти в конец файла. Обязательно надо убедиться что находимся на новой строке или нажать Enter.
Теперь нажмем Shift+Insert. Должна вставиться длинная строка, которую копировали ранее. Что-то типа:
- 1
shh-rsa AAAA... Опять нажимаем Ctrl+X, Y, Enter
Проверим, что все сохранилось:
- 1
cat .ssh/authorized_keysНаша строка должна быть в конце.
Выходим с сервера:
- 1
exitНадо, конечно, проверить все ли работает. Но придется объяснять еще пару команд Linux. Думаю, ты не осилишь :-) Будем надеяться, что все правильно сделали.
Посмотрим лишь работает ли скрипт:
- 1
sh autotunnel.shЕсли пароль не просит, а просто переходит на следующую строку. То все должно работать как надо.
Теперь надо добавить задание в Cron, чтобы он выполнял проверку подключения и восстанавливал ssh-туннель, если соединение оборвалось.
- 1
crontab -eПерейдем в конец - Page Down. Вставим следующую строку:
- 1
*/5 * * * * sh autotunnel.sh > /dev/null 2>&1Теперь проверка подключения будет выполняться 1 раз в 5 минут.
На этом все.
Мы победили NAT и доступны с сервера к которому подключились.
UPD:
Как показала практика, соединение может быть мертвым, а процесс висящим. Поэтому лучше подключаться через ControlMaster:
- 1
ssh -i .ssh/tunnel -M -S tunnel_socket -N -f -R 2222:localhost:22 user@jonel.netА далее проверять состояние соединения через этот же сокет:
- 1
- 2
- 3
- 4
- 5
ssh -S tunnel_socket user@jonel.net netstat -an | egrep "tcp.*:2222.*LISTEN"
if [ $? -ne 0 ] ; then
pkill -f -x "$COMMAND"
$COMMAND
fiВ этому случае netstat выполнится на удаленном сервере. И мы можем проверить состояние порта. При необходимости убить текущий процесс и переподклоючиться.
Автоочистка директории по кол-ву файлов и квоте
Очищает директорию от устарелых файлов, если указанный лимит количества файлов превышен. Также рекурсивно удаляет файлы, если места согласно указанной квоте осталось в 3 раза меньше, чем последний сохраненный файл в этой директории. Если это единственный файл, то выходит не удаляя.
x3 сделано из предположения, что размер следующего файла не будет на много больше предыдущего.
Можно доработать, чтоб переменные принимались как параметры скрипта, но в моем случае это не требуется. Кому понадобится, тот доделает. Это не сложно.
Этот скрипт создавался для создания автоматических бэкапов. Следить за квотами и старыми резервными копиями нет никакого желания и времени.
Актуально для Debian 7, 8
P.S. Если это можно автоматизировать, то это нужно автоматизировать.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
#!/bin/bash
#######################################################
# #
# control_limits.sh #
# Author: Skey #
# allmails.oth@gmail.com #
# 2015-11-18 #
# #
# Autoclean directories by limits #
#######################################################
HOME_DIR=`eval echo ~$USER`
TARGET_DIR="$HOME_DIR/load/"
LIMIT_FILES=7
LIMIT_QUOTA=$((1024*1024*1024*6)) #6Gb
if [ ! -d "$TARGET_DIR" ]; then
if mkdir -p "$TARGET_DIR"; then
echo "Created directory: $TARGET_DIR"
else
echo "Cannot create directory: $TARGET_DIR"
exit 1
fi
fi
control_limit_files() {
if [ ! -n "$1" ]; then
echo "Warning: Target directory is undefined"
return 1
fi
if [ ! -n "$2" ]; then
echo "Warning: Max files is undefined"
return 1
fi
local counter=`ls "$1" | wc -l`
local cnt
if [ $counter -gt $2 ]; then # >
echo "Warning: Limit count file is exceeded"
cnt=0
for file in `ls -t "$1"`
do
((cnt++))
if [ $cnt -gt $2 ]; then # >
rm -r $1$file
echo "Removed $1$file"
fi
done
fi
return 0
}
control_limit_quota() {
if [ ! -n "$1" ]; then
echo "Warning: Target directory is undefined"
return 1
fi
if [ ! -n "$2" ]; then
echo "Warning: Quota is undefined"
return 1
fi
local size_files=`du -sb "$1" | cut -f1`
if [ $size_files -gt $2 ]; then # >
echo "Warning: Quota is exceeded ($size_files > $2)"
if [ `ls "$1" | wc -l` -eq 1 ]; then
echo "Don't remove last file"
return 1
fi
local first_file=`ls -t $1 | tail -n1`
rm -r $1$first_file
echo "Removed $1$first_file"
control_limit_quota $1 $2
else
local last_file=`ls -t $1 | head -n1`
local size_last=`du -b $1$last_file | cut -f1`
if [ $(($size_last*3)) -gt $2 ]; then
echo "Warning: Not enough space ($(($size_last*3)) > $2)"
if [ `ls "$1" | wc -l` -eq 1 ]; then
echo "Don't remove last file"
return 1
fi
local first_file=`ls -t $1 | tail -n1`
rm -r $1$first_file
echo "Removed $1$first_file"
control_limit_quota $1 $2
fi
fi
return 0
}
control_limit_files $TARGET_DIR $LIMIT_FILES
control_limit_quota $TARGET_DIR $LIMIT_QUOTA
if [ $? -ne 0 ]; then
echo "Error quota"
exit 1
fi
echo "Success"
Sphinx & PHP
Предисловие
Решил я как-то поставить SphinxSearch. Последняя версия мне не нужна была, поэтому решил ставить из репозиториев Debian 7 - Sphinx 2.0.4.Установился без проблем. Тут писать не о чем.
Sphinx Client
Теперь нужна библиотека для работы с ним в PHP. Есть, конечно, sphinxapi.php, но мне не хотелось инклудить его, ну и еще по некоторым причинам я отказался от этого варианта и решил установить PECL-пакет.Тут то и начались проблемки, т.к. я никогда этого не делал.
Ты туда не ходи, ты сюда ходи
Значит скачал последнюю версию. Смотрю - это исходники. Ну думаю ок. Нашел на сайте PHP вот эту статейку. Выполнил все что там сказано. Конфигурирование не хочет работать - не хватает ему libsphinxclient. Последний есть в любых исходниках Sphinx. Wget -> tar -> configure --with-sphinx=/path/to/libsphinxclient. Все равно не видит.Ну думаю, ладно, пойду еще поищу. Нашел - можно установить через pecl:
- 1
pecl install sphinxУстановил, перезапустил Apache, в тестовом файле сделал:
- 1
- 2
$SphinxClient = new SphinxClient();
$SphinxClient->setServer('localhost', 9312);Ошибок нет, обрадовался. Но рано.
Попробовал что-нибудь найти, не ищет. Посмотрел ошибки, которые возвращает sphinx.
Сначала я подумал, что это связано с тем, что я скачал последнюю версию Sphinx 2.2.9. И из него скомпилил libsphinxclient (api/libsphinxclient). Но через пару минут понял, что это бред. Pecl и libsphinxclient никак не связаны.
Удалил PECL Sphinx:
- 1
pecl uninstall sphinxИ тут я вспомнил, что при установке было нечто такое:
Решил попробовать сделать так:
- 1
pecl install sphinx-1.2.0И оно заработало.
Вывод:
Не надо скачивать никакие исходники, компилировать их и искать зависимости.Надо просто воспользоваться pecl.
libsphinxclient все же придется установить.
Но это просто:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
wget http://sphinxsearch.com/files/sphinx-2.2.9-release.tar.gz
tar -xzf sphinx-2.2.9-release.tar.gz
cd sphinx-2.2.9-release
chmod -R 777 *
cd ./api/libsphinxclient/
./buildconf.sh
./configure && make installРаздел
Календарь
-
Сегодня
17 Марта 2026, ВторникПН ВТ СР ЧТ ПТ СБ ВС 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31