Debian 7 (Wheezy) install PHP 7 + Redis

Установка второго препроцессора (или как там его) PHP параллельно с основной версией.

Перед сборкой самого PHP 7


Надо установить исходники для всяких дополнений
  1. 1
apt-get install libcurl4-openssl-dev libicu-dev libmcrypt-dev libpq-dev libxslt-dev libreadline6-dev


Скачиваем php, не важно откуда, я брал с оф.сайта. Распаковываем и начинаем конфигурировать
  1. 1
  2. 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. 1
  2. 2
make
make install


Если собирали не первый раз, то лучше сделать
  1. 1
make clean


  1. 1
update-alternatives --set php /usr/local/php7/bin/php


После этого


Отдельно скачиваем куда-нибудь и устанавливаем. Конфиг PHP обязательно должен быть указан, иначе пакет сконфигурируется для основной версии php.
  1. 1
  2. 2
  3. 3
  4. 4
git clone https://github.com/igbinary/igbinary.git
cd igbinary/
phpize
./configure --with-php-config=/usr/local/php7/bin/php-config


  1. 1
  2. 2
  3. 3
  4. 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. 1
/usr/local/php7/bin/php composer.phar up


01 марта 2018

 gedit cp1251

  1. 1
gsettings set org.gnome.gedit.preferences.encodings candidate-encodings "['UTF-8', 'WINDOWS-1251', 'KOI8-R', 'CURRENT', 'ISO-8859-15', 'UTF-16']"


30 ноября 2017

 ProFTPd

Создаем нового виртуального ftp-пользователя с логином test, идентификатором 1000, группой 1000 и домашним каталогом /var/www/jonel.net. (где 1000 — id реального пользователя, у которого есть доступ к указанной папке)

  1. 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. 1
ftpasswd --passwd --name=test --change-password

Перед этим надо перейти в директорию /etc/proftpd/, иначе ftpasswd не найдет файл ftpd.passwd.

В файле proftpd.conf надо добавить или раскомментировать строки, чтобы загрузить модуль (устанавливается и подключается он по умолчанию)
  1. 1
  2. 2
RequireValidShell off
AuthOrder mod_auth_file.c


В конце (обязательно после запроса модуля) того же файла добаляем строку:
  1. 1
AuthUserFile /etc/proftpd/ftpd.passwd


01 сентября 2017

 Небольшая заметка о почте для домена от Яндекс и 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 для разных отправителей (ящиков) выбирал свою аутификацию, я так и не понял.
Но есть простой путь как это сделать. На Яндексе создаешь один ящик, а все остальные указываешь как алиасы.


31 мая 2017

 Debian 7 (wheezy) PHP 5.4 upgrade to 5.6

Собсно, обновление PHP до версии 5.6

В репозитории седьмого debian PHP 5.6 нет.
Поэтому необходимо добавить дополнительный источник обновлений

  1. 1
  2. 2
  3. 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. 1
  2. 2
apt-get update
php -v

Если не сработало, то просто выполните установку. Apt-get сам все сделает.
  1. 1
  2. 2
apt-get install php5
php -v


Перезагружаем веб-сервер.
  1. 1
service apache2 restart

И видим множественные предупреждения (warning) о том, что нужно выставить временную зону.
Собсно, проверим действительно ли она не выставлена, исправим и снова перезагрузимся. Доступные значения timezone можно найти в документации PHP - http://php.net/manual/en/timezones.php
  1. 1
  2. 2
  3. 3
cat /etc/php5/apache2/php.ini | grep timezone
nano /etc/php5/apache2/php.ini
service apache2 restart


Сюрпризы


Вполне возможно, что после обновления "слетят" некоторые модули. Особенно это касается модулей установленных через PECL. Придется установить их заново.
Но будьте внимательны, pecl используется утилиту php-config, а она может использовать старые пути к модулям.

Найдем исполняемый файл
  1. 1
  2. 2
whereis php-config
php-config: /usr/bin/php-config

Этот файл является ничем иным, как обычным shell. Так что открываем и исправляем путь до расширений extension_dir.
Например,
/usr/lib/php5/20100525/ - старый путь
/usr/lib/php5/20131226/ - новый

Если посмотреть содержимое новой директории, то там можно найти установленные модули - mysql.so и т.п.
После установки модуля, например
  1. 1
pecl install sphinx-1.2.0
он появится в этой же директории.

Останется включить модуль
  1. 1
extension=sphinx.so

Добавив эту строку в файл php.ini или создав файл в /etc/php5/mods-available/ и добавив сим.линк на него в директории /etc/php5/apache2/conf.d/ (в случае веб-сервера Apache2) по аналогии с имеющимися там модулями. Второй вариант более правильный.
Кстати, неплохо добавить то же самое в /etc/php5/cli/.


26 сентября 2016

 Tar relative path

  1. 1
  2. 2
  3. 3
tar czf ~/backups/mysite.tar.gz \
      -C ~/www \
       public_html

устанавливает текущую директорию.
Что можно так же написать, как:
  1. 1
  2. 2
cd ~/www
tar czf ~/backups/mysite.tar.gz public_html


10 ноября 2015

 Отправка e-mail при успешной авторизации по SSH

Создаем файл /etc/ssh/sshrc со следующим содержимым:

  1. 1
  2. 2
  3. 3
  4. 4
  5. 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


10 ноября 2015

 Инструкция по созданию обратного SSH-туннеля

Инструкция писалась для RPi под управлением Raspian (Debian) для человека совершенно не знакомого с Linux.

Имеется: RPi за NAT'ом и удаленный сервер с внешним IP.
Надо: Иметь постоянный удаленный доступ к "малинке".


Начало


После загрузки Raspberry увидим черный экран и мигающий курсор - это консоль. Все команды выполняются именно здесь.
В консоле есть автодополнение - это клавиша Tab. По ней дописываются названия файлов, директорий, команды, если они есть в системе. Параметры к командам (-l, -r и т.п.) не дописываются!

Для большего понимая того, что делаем, вот команды, которые будем использовать:
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
pwd - показывает директорию (папку), в которой сейчас находишься
ssh-keygen - утилита создающая ключевую пару для доступа на удаленный сервер
ls - показывает содержание директории. Флаг -l добавляет некоторые данные к выводу
nano - текстовый редактор
chmod - установка прав доступа
ssh - подключение к серверу по протоколу SSH
crontab - планировщик заданий Linux


Убедимся, что мы в домашней директории:
  1. 1
pwd

На экран дожлно вывестись:
  1. 1
/home/user


Итак, приступим


Сгенерируем пару ключей для доступа на удаленный сервер, чтоб заходить на него без пароля
  1. 1
ssh-keygen

Здесь утилита задаст пару вопросов. На первый надо написать .ssh/tunnel и нажать Enter, на последующие просто Enter.
  1. 1
  2. 2
  3. 3
  4. 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. 1
ls -l .ssh/

На экран должны вывестись 2 строки или больше, но среди них должны быть
  1. 1
  2. 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. 1
ls -l

В общем, их надо обязательно найти. Потому что они нужны.

Далее, надо написать скрипт, который будет подключаться к удаленному серверу, если такого подключения нет:
  1. 1
nano autotunnel.sh

Откроется редактор nano. В нем надо написать следующие строки:
  1. 1
  2. 2
  3. 3
  4. 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. 1
chmod 744 autotunnel.sh


Теперь нам надо добавить публичный ключ на удаленный сервер. Чтоб он знал кто подключается.
Выведем публичный ключ на экран и скопируем его:
  1. 1
cat .ssh/tunnel.pub

Выделим его и нажмем Ctrl+Insert.

Заходим на сервер:
  1. 1
ssh user@jonel.net

Сервер спросит пароль.

После того, как попали на сервер надо добавить скопированный ключ в файл .ssh/authorized_keys
  1. 1
nano .ssh/authorized_keys

Снова откроется редактор nano. Возможно там уже есть какие-то строки. Нажимаем клавишу Page Down (возможно несколько раз), чтоб перейти в конец файла. Обязательно надо убедиться что находимся на новой строке или нажать Enter.
Теперь нажмем Shift+Insert. Должна вставиться длинная строка, которую копировали ранее. Что-то типа:
  1. 1
shh-rsa AAAA... 

Опять нажимаем Ctrl+X, Y, Enter
Проверим, что все сохранилось:
  1. 1
cat .ssh/authorized_keys

Наша строка должна быть в конце.
Выходим с сервера:
  1. 1
exit


Надо, конечно, проверить все ли работает. Но придется объяснять еще пару команд Linux. Думаю, ты не осилишь :-) Будем надеяться, что все правильно сделали.
Посмотрим лишь работает ли скрипт:
  1. 1
sh autotunnel.sh

Если пароль не просит, а просто переходит на следующую строку. То все должно работать как надо.

Теперь надо добавить задание в Cron, чтобы он выполнял проверку подключения и восстанавливал ssh-туннель, если соединение оборвалось.
  1. 1
crontab -e

Перейдем в конец - Page Down. Вставим следующую строку:
  1. 1
*/5 * * * * sh autotunnel.sh > /dev/null 2>&1

Теперь проверка подключения будет выполняться 1 раз в 5 минут.

На этом все.
Мы победили NAT и доступны с сервера к которому подключились.

UPD:
Как показала практика, соединение может быть мертвым, а процесс висящим. Поэтому лучше подключаться через ControlMaster:
  1. 1
ssh -i .ssh/tunnel -M -S tunnel_socket -N -f -R 2222:localhost:22 user@jonel.net

А далее проверять состояние соединения через этот же сокет:
  1. 1
  2. 2
  3. 3
  4. 4
  5. 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 выполнится на удаленном сервере. И мы можем проверить состояние порта. При необходимости убить текущий процесс и переподклоючиться.


28 октября 2015

 Автоочистка директории по кол-ву файлов и квоте

Очищает директорию от устарелых файлов, если указанный лимит количества файлов превышен. Также рекурсивно удаляет файлы, если места согласно указанной квоте осталось в 3 раза меньше, чем последний сохраненный файл в этой директории. Если это единственный файл, то выходит не удаляя.
x3 сделано из предположения, что размер следующего файла не будет на много больше предыдущего.
Можно доработать, чтоб переменные принимались как параметры скрипта, но в моем случае это не требуется. Кому понадобится, тот доделает. Это не сложно.
Этот скрипт создавался для создания автоматических бэкапов. Следить за квотами и старыми резервными копиями нет никакого желания и времени.

Актуально для Debian 7, 8

P.S. Если это можно автоматизировать, то это нужно автоматизировать.

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
  101. 101
  102. 102
  103. 103
  104. 104
  105. 105
  106. 106
  107. 107
  108. 108
  109. 109
  110. 110
  111. 111
  112. 112
  113. 113
  114. 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"


05 октября 2015

 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. 1
pecl install sphinx

Установил, перезапустил Apache, в тестовом файле сделал:
  1. 1
  2. 2
$SphinxClient = new SphinxClient();
$SphinxClient->setServer('localhost', 9312);

Ошибок нет, обрадовался. Но рано.
Попробовал что-нибудь найти, не ищет. Посмотрел ошибки, которые возвращает sphinx.
searchd error: client version is higher than daemon version (client is v.1.30, daemon is v.1.25)
Версия клиента больше версии демона, обалдеть.
Сначала я подумал, что это связано с тем, что я скачал последнюю версию Sphinx 2.2.9. И из него скомпилил libsphinxclient (api/libsphinxclient). Но через пару минут понял, что это бред. Pecl и libsphinxclient никак не связаны.

Удалил PECL Sphinx:
  1. 1
pecl uninstall sphinx

И тут я вспомнил, что при установке было нечто такое:
downloading sphinx-1.3.3.tgz

Решил попробовать сделать так:
  1. 1
pecl install sphinx-1.2.0

И оно заработало.

Вывод:

Не надо скачивать никакие исходники, компилировать их и искать зависимости.
Надо просто воспользоваться pecl.

libsphinxclient все же придется установить.
Но это просто:
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 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


15 июля 2015

Календарь

  • Сегодня
    17 Марта 2026, Вторник
    ПНВТСРЧТПТСБВС
    1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031

Авторизация