Установка ffmpeg-php на Centos 6

yum -y groupinstall "Development Tools"
git clone https://github.com/tony2001/ffmpeg-php.git
cd ffmpeg-php
phpize
./configure
make && make install
30 января 2015, 00:40

Установка nginx_upload_module на centos 6

Придется всё собирать из исходников. Для начала ставим пакеты, работать будем в директори /root
cd /root
yum install git gcc-c++ pcre-devel zlib-devel make wget openssl-devel libxml2-devel libxslt-devel gd-devel perl-ExtUtils-Embed GeoIP-devel gperftools-devel
Качаем исходники nginx
wget http://nginx.org/download/nginx-1.6.2.tar.gz
tar -xvf nginx-1.6.2.tar.gz
Теперь качаем модуль, и не забываем переключить бранч на 2.2
git clone https://github.com/vkholodkov/nginx-upload-module.git
cd nginx-upload-module
git checkout 2.2
cd ..
Теперь нужно сконфигурировать
cd nginx-1.6.2
./configure --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 --user=nginx --group=nginx --with-file-aio --with-pcre --with-ipv6 --with-http_ssl_module --with-http_spdy_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --with-http_perl_module --with-mail --with-mail_ssl_module --with-pcre --with-debug --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,-E --add-module=/root/nginx-upload-module
Теперь устанавливаем
make install
Ну и не забываем про инит скрипт /etc/init.d/nginx
#!/bin/sh
#
# nginx        Startup script for nginx
#
# chkconfig: - 85 15
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# description: nginx is an HTTP and reverse proxy server
#
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop nginx
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

if [ -L $0 ]; then
    initscript=`/bin/readlink -f $0`
else
    initscript=$0
fi

sysconfig=`/bin/basename $initscript`

if [ -f /etc/sysconfig/$sysconfig ]; then
    . /etc/sysconfig/$sysconfig
fi

nginx=${NGINX-/usr/sbin/nginx}
prog=`/bin/basename $nginx`
conffile=${CONFFILE-/etc/nginx/nginx.conf}
lockfile=${LOCKFILE-/var/lock/subsys/nginx}
pidfile=${PIDFILE-/var/run/nginx.pid}
SLEEPMSEC=${SLEEPMSEC-200000}
UPGRADEWAITLOOPS=${UPGRADEWAITLOOPS-5}
RETVAL=0

start() {
    echo -n $"Starting $prog: "

    daemon --pidfile=${pidfile} ${nginx} -c ${conffile}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch ${lockfile}
    return $RETVAL
}

stop() {
    echo -n $"Stopping $prog: "
    killproc -p ${pidfile} ${prog}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}

reload() {
    echo -n $"Reloading $prog: "
    killproc -p ${pidfile} ${prog} -HUP
    RETVAL=$?
    echo
}

upgrade() {
    oldbinpidfile=${pidfile}.oldbin

    configtest -q || return
    echo -n $"Starting new master $prog: "
    killproc -p ${pidfile} ${prog} -USR2
    echo

    for i in `/usr/bin/seq $UPGRADEWAITLOOPS`; do
        /bin/usleep $SLEEPMSEC
        if [ -f ${oldbinpidfile} -a -f ${pidfile} ]; then
            echo -n $"Graceful shutdown of old $prog: "
            killproc -p ${oldbinpidfile} ${prog} -QUIT
            RETVAL=$?
            echo
            return
        fi
    done

    echo $"Upgrade failed!"
    RETVAL=1
}

configtest() {
    if [ "$#" -ne 0 ] ; then
        case "$1" in
            -q)
                FLAG=$1
                ;;
            *)
                ;;
        esac
        shift
    fi
    ${nginx} -t -c ${conffile} $FLAG
    RETVAL=$?
    return $RETVAL
}

rh_status() {
    status -p ${pidfile} ${nginx}
}

# See how we were called.
case "$1" in
    start)
        rh_status >/dev/null 2>&1 && exit 0
        start
        ;;
    stop)
        stop
        ;;
    status)
        rh_status
        RETVAL=$?
        ;;
    restart)
        configtest -q || exit $RETVAL
        stop
        start
        ;;
    upgrade)
        rh_status >/dev/null 2>&1 || exit 0
        upgrade
        ;;
    condrestart|try-restart)
        if rh_status >/dev/null 2>&1; then
            stop
            start
        fi
        ;;
    force-reload|reload)
        reload
        ;;
    configtest)
        configtest
        ;;
    *)
        echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|upgrade|reload|status|help|configtest}"
        RETVAL=2
esac

exit $RETVAL
 
29 января 2015, 19:08

mysqldump + gzip на удаленный сервер через ssh

mysqldump -u root -pPASSWORD -h localhost --lock-all-tables --disable-keys DBNAME | gzip -c | ssh root@xx.xx.xx.xx "cat > /home/database.core.sql.gz"
28 января 2015, 21:18

Как очистить очередь postfix

service postfix stop
postsuper -d ALL
service postfix start
25 января 2015, 14:29

Импорт базы MongoDb

Если бэкап в /home/backup/mongo
mongorestore --dbpath /var/lib/mongo /home/backup/mongo
Если не срабатывает, потому что версии разные, или еще почему, то придется экспортировать коллекции вручную
mongoexport --db databaseName --collection collectionName --out collectionName.json
Импортировать так
mongoimport --collection collectionName --file collectionName.json
25 января 2015, 00:44

ProFTPd - "530 Login incorrect" в Centos 6

Если замечаются проблемы с авторизацией, то может помочь комментирование этой строчки в /etc/proftpd.conf
#AuthOrder			mod_auth_pam.c* mod_auth_unix.c
Чтобы удобно дебажить можно запустить его в ручном режиме
proftpd -nd 10 
22 января 2015, 16:04

Отправка email при помощи SwiftMailer через внешний SMTP на примере mailgun.org

Для начала установим SwiftMailer (composer.phar можно скачать в гугле)
php composer.phar require swiftmailer/swiftmailer @stable
пример посылает емаил и аттачит файл
<?php
require __DIR__ . '/vendor/autoload.php';

// создаем транспорт
$transport = Swift_SmtpTransport::newInstance('smtp.mailgun.org', 587)
    ->setUsername('postmaster@snippets.pp.ru')
    ->setPassword('******');

$mailer = Swift_Mailer::newInstance($transport);

// создаем сообщение
$message = Swift_Message::newInstance('Тема')
    ->setFrom('mail@snippets.pp.ru')
    ->setTo('admin@snippets.pp.ru')
    ->setBody('<span style="color:red">Это текст сообщения</span>', 'text/html')
    ->attach(Swift_Attachment::fromPath('/home/file.pdf'));

// шлем сообщение
$result = $mailer->send($message);
var_dump($result);
?>
22 января 2015, 01:27

HEAD запрос через CURL (CLI)

Часто нужно посмотреть http заголовки
curl -X HEAD -i http://www.google.com
12 января 2015, 16:52

Mac HomeBrew Nginx [emerg]: bind() to 0.0.0.0:80 failed (13: Permission denied)

Порты меньше 1024 требуют запуска от рута, поэтому нужно переместить наш автозагрузчик в /System/Library/LaunchDaemons
sudo mv ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist  /System/Library/LaunchDaemons/homebrew.mxcl.nginx.plist
12 января 2015, 11:52

Получение реального ip адреса посетителя при использовании CloudFlare

Список сетей с которых проксирует CloudFlare https://www.cloudflare.com/ips
<?php
$cfIpRanges = [
    '199.27.128.0/21',
    '173.245.48.0/20',
    '103.21.244.0/22',
    '103.22.200.0/22',
    '103.31.4.0/22',
    '141.101.64.0/18',
    '108.162.192.0/18',
    '190.93.240.0/20',
    '188.114.96.0/20',
    '197.234.240.0/22',
    '198.41.128.0/17',
    '162.158.0.0/15',
    '104.16.0.0/12',
];

$cidr_match = function ($ip, $range) {
    list ($subnet, $bits) = explode('/', $range);
    $ip = ip2long($ip);
    $subnet = ip2long($subnet);
    $mask = -1 << (32 - $bits);
    $subnet &= $mask;
    return ($ip & $mask) == $subnet;
};

if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
    foreach ($cfIpRanges as $cfIpRange) {
        if ($cidr_match($_SERVER['REMOTE_ADDR'], $cfIpRange)) {
            $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
            break;
        }
    }
}
?>
11 января 2015, 12:48

Настройка https в nginx

Для начала надо сгенерить CSR файл (требуется для получения сертификата)
openssl genrsa -out server.key 2048
openssl req -new -sha256 -key server.key -out server.csr
При генерации будут спрашивать данные, вводим (смотрим подсказки, некоторые поля можно пустыми оставить) Country Name State or Province Name (full name) Locality Name (eg, city) Organization Name (eg, company) Organizational Unit Name (eg, section) Common Name (e.g. server FQDN or YOUR name) Email Address A challenge password An optional company name Затем со сгенеренным CSR идем покупать сертификат. Писать где не буду (чтобы не рекламить). Когда купите сертификат вам дадут CRT файл. Если у вас цепочка сертификатов, то нужно склеить их в один
cat server.crt intermediate.crt > server.crt
Затем добавить в nginx.conf следующее
http {
    #......всякое.......
    ssl_certificate server.crt;
    ssl_certificate_key server.key;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;

    server {
            listen       443;
            server_name  example.com;

            ssl on;
	    keepalive_timeout 70;
	    #......всякое.......
	}
}
6 января 2015, 21:07

Запрет входа по паролю в ssh

редачим конфиг /etc/ssh/sshd_conf
PasswordAuthentication no
ChallengeResponseAuthentication no
6 января 2015, 17:55

Качаем 1080p с youtube через youtube-dl со звуком

Как известно, через свои форматы ютуб отдает только 1280х720 Чтобы скачать лучшее качество нужно немного поизголяться. Для начала смотрим какие форматы есть вообще
$ youtube-dl 'http://www.youtube.com/watch?v=c9JoHd7xoPA' -F
[youtube] c9JoHd7xoPA: Downloading webpage
[youtube] c9JoHd7xoPA: Extracting video information
[youtube] c9JoHd7xoPA: Downloading DASH manifest
[info] Available formats for c9JoHd7xoPA:
format code extension resolution  note 
139         m4a       audio only  DASH audio   49k , audio@ 48k (22050Hz), 1.28MiB (worst)
140         m4a       audio only  DASH audio  129k , audio@128k (44100Hz), 3.39MiB
171         webm      audio only  DASH audio  131k , audio@128k (44100Hz), 3.17MiB
172         webm      audio only  DASH audio  195k , audio@256k (44100Hz), 4.59MiB
141         m4a       audio only  DASH audio  255k , audio@256k (44100Hz), 6.74MiB
278         webm      256x144     DASH video   91k , webm container, VP9, 15fps, video only, 1.54MiB
160         mp4       256x144     DASH video  111k , 15fps, video only, 2.79MiB
242         webm      426x240     DASH video  127k , 30fps, video only, 1.73MiB
133         mp4       426x240     DASH video  248k , 30fps, video only, 6.28MiB
243         webm      640x360     DASH video  233k , 30fps, video only, 3.10MiB
134         mp4       640x360     DASH video  603k , 30fps, video only, 8.29MiB
244         webm      854x480     DASH video  390k , 30fps, video only, 5.19MiB
135         mp4       854x480     DASH video  928k , 30fps, video only, 16.02MiB
247         webm      1280x720    DASH video  829k , 30fps, video only, 11.34MiB
136         mp4       1280x720    DASH video 1532k , 30fps, video only, 31.34MiB
248         webm      1920x1080   DASH video 1594k , 30fps, video only, 24.76MiB
137         mp4       1920x1080   DASH video 2785k , 30fps, video only, 55.71MiB
17          3gp       176x144     
36          3gp       320x240     
5           flv       400x240     
43          webm      640x360     
18          mp4       640x360     
22          mp4       1280x720    (best)
Видим что под номером 137 находится 1080p видосик, под номером 141 звуковая дорожка 256 кбит/с Ну чтоже, давайте их и скачаем, для мерджа необходим ffmpeg
$ youtube-dl 'http://www.youtube.com/watch?v=c9JoHd7xoPA' -f 137+141
[youtube] c9JoHd7xoPA: Downloading webpage
[youtube] c9JoHd7xoPA: Extracting video information
[youtube] c9JoHd7xoPA: Downloading DASH manifest
[download] Destination: Flash - Life in the Sky-c9JoHd7xoPA.f137.mp4
[download] 100% of 55.71MiB in 00:10
[download] Destination: Flash - Life in the Sky-c9JoHd7xoPA.f141.m4a
[download] 100% of 6.74MiB in 00:01
[ffmpeg] Merging formats into "Flash - Life in the Sky-c9JoHd7xoPA.mp4"
6 января 2015, 13:02

Блокируем доступ с опеределенного ip в iptables

Блочим
iptables -I INPUT -s 111.111.111.111  -j DROP
Смотрим
iptables -L INPUT --line-numbers
------------
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       all  --  111.111.111.111      anywhere
Отменяем брокировку (1 - это номер правила из предыдущей команды)
iptables -D INPUT 1
4 января 2015, 12:31

Установка MongoDb на Centos

Создаем файл /etc/yum.repos.d/mongodb.repo с таким содержимым
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
Инсталлим
yum install -y mongodb-org
chkconfig mongod on
service mongod start
4 января 2015, 12:27

Как отключить selinux в Centos 6

Отключение из консоли
setenforce 0
А чтобы опять не включилось после ребута vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 
3 января 2015, 07:33

Brew - Another version is already linked

Если пакет не хочет обновляться, то можно принудительно переключить версию
brew switch php55 5.5.20
28 декабря 2014, 03:53

Все актуальные доменные зоны

Взято отсюда
28 декабря 2014, 03:11

PDO mysql, как закрыть коннект

Заметил интересную особенность: чтобы закрыть коннект недостаточно занулить pdo объект
<?php
$db = new PDO(
    'mysql:host=localhost;dbname=test',
    'root',
    'root',
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);

$q = $db->prepare('select now()');
$q->execute();
$now = $q->fetch();
//без этой строчки соединение с базой не закроется! (смотреть ниже)
//кто не верит может закомментить эту строчку и посмотреть process list
unset($q);
var_dump($now);
//допустим, нам нужно закрыть соединение с базой, чтобы произвести какие-то действия
$db = null;
//собственно действия
sleep(100);
?>
27 декабря 2014, 06:09

Установка ssh на Centos

yum -y install openssh-server openssh-clients
26 декабря 2014, 11:23