Рубрика: *web

Несколько версий php на одном сервере freebsd

Здравствуйте

Вот столкнулся с кучей грабель которые так любят делать разработчики привязывающиеся к определенной версии php в итоге у знакомого не работало то что ему хотелось так как на сервере установлена на теперешний момент версия php5.4 которая ну никак не хотела работать с его движком подумав что в принципе что такое php интерпритатор  что он фактически не отличается от другого софта с которым можно сделать так ))) потому конечно и можно установить несколько версий просто в разные папки ) конечно придется повозиться с некоторыми вещами для того что бы все заработало но тем не менее оно работает ) но так как apache я уже давно перестал брать во внимание лично для себя и для знакомых ) буду описывать установку и настройку для nginx то есть php-fpm

версий 5.2, 5.3, 5.4

поехали :

для начало установим обычную версию php которая актуальна для данного момента :

cd /usr/ports/lang/php5

make config выбираем поддержку FPM + CGI + CLI

пишем make && make install

ждем пока установиться дальше установим расширения для php

cd /usr/pors/lang/php5-extensions

make config выбираем нужное

дальше как обычно make && make install

предположим что все установилось

теперь нам нужно это все настроить но думаю это вы и сами сможете 😉

потому начну сразу с установки младших версий :

берем php53

cd /usr/ports/lang/php53

make config выбираем CLI+CGI + FPM остальное по вкусу )

и пишем такую вот строку :

make -D FORCE_PKG_REGISTER PREFIX=/usr/local/php53 PHPBASE=/usr/local/php53 install

ждем пока соберется )  и ловим ошибку ))

для того что бы её победить переходим в директорию

cd work

и пишем :

pkg_add -f php53-5.3.28.tbz

после повторяем наши конвульсии :

make -D FORCE_PKG_REGISTER PREFIX=/usr/local/php53 PHPBASE=/usr/local/php53 install

на сей раз все собралось теперь давайте посмотрим работает ли )

/usr/local/php53/bin/php -v
PHP 5.3.28 with Suhosin-Patch (cli) (built: Apr 11 2014 03:39:19)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies

ну версию во всяком случае показало

попробуем узнать какие пакеты установило :

/usr/local/php53/bin/php -m

на выхлопе у меня получилось такое :

/usr/local/php53/bin/php -m
[PHP Modules]
Core
date
ereg
libxml
mysqlnd
pcre
Reflection
SPL
standard

[Zend Modules]

 

если у вас  все так же то  переходим к следующему пункту установке

более старого и древнего php52

для php-fpm он требует установленную libevent

cd /usr/ports/devel/libevent

пишем make && make install

переходим к установке

cd /usr/ports/lang/php52

make config Выбираем CLI+CGI+ FPM остальное по вкусу

make -D FORCE_PKG_REGISTER PREFIX=/usr/local/php52 PHPBASE=/usr/local/php52 install

запускаем установку и ловим ошибку ))

у меня ошибка вылезла такого вот вида :

Creating bzip’d tar ball in ‘/usr/ports/lang/php52/work/php52-5.2.17_14.tbz’
tar: bin/php: Cannot stat: No such file or directory
tar: bin/php-cgi: Cannot stat: No such file or directory

получаем  балалайки но в папке /usr/local/php52 есть файлы и бинарники ) те которые нам нужны

теперь самое интересное переходим к настройке php-fpm что бы nginx мог использовать разные версии php

и так путей у нас есть 2 каждый знает что php-fpm может использовать либо listen 127.0.0.1 порт тратата  либо listen /var/run/php-fpm.sock я для себя предпочел 1й вариант то есть listen 127.0.0.1:9001

теперь определимся с портами для разных версий :

listen 127.0.0.1:9001 это у нас будет php54 правим наш конфиг php-fpm для него то есть либо тут /usr/local/etc/php-fpm.conf либо /usr/local/etc/php54/php-fpm.conf в зависимости от того куда его устанавливали …

listen 127.0.0.1:9002 это у нас будет php53 правим наш конфиг php-fpm для него файл /usr/local/php53/etc/php-fpm.conf

кроме этого нам нужно ещё в этой же папке перейти в директорию rc.d и поправить там стартовый файл  php-fpm:

заходим в него и ищем строку :

по умолчанию она имеет такой вид :

 

pidfile=»/var/run/php-fpm.pid»

но если на сервере уже есть установленный php-fpm то данный файл для них будет одинаков что не есть гуд и работать ничего не будет … что нужно сделать конечно же изменить его название для себя решил сделать вот так :

pidfile=»/var/run/php-fpm53.pid» и сохраняем наш файл

 

теперь переходим к настройке php-fpm для php52 :

фактически все так же за исключением того что у меня не оказалось стартового файла для php52-fpm  и + конфиг выглядит несколько иначе но это не мешает нам исправить те же строки которые правили раньше )

строку :

<value name=»pid_file»>/var/run/php-fpm/php-fpm.pid</value>

приводим к виду :

<value name=»pid_file»>/var/run/php-fpm52.pid</value>

ищем секцию pool

строку :

<value name=»listen_address»>127.0.0.1:9000</value>

приводим к виду :

<value name=»listen_address»>127.0.0.1:9003</value>

сохраняем наш файл

и переходим к созданию стартового скрипта:
touch /usr/local/php52/etc/rc.d/php-fpm

chmod +x /usr/local/php52/etc/rc.d/php-fpm

и редактируем данный файл :

#!/bin/sh

# PROVIDE: phpfpm
# KEYWORD: shutdown

#
# Add the following lines to /etc/rc.conf to enable php-fpm:
#
#phpfpm_enable=»YES»
#
#

. /etc/rc.subr

name=phpfpm
rcvar=`set_rcvar`

command=»/usr/local/php52/bin/php-cgi»
command_args=»»
pidfile=/var/run/php-fpm52.pid
required_files=/usr/local/php52/etc/php-fpm.conf

# set defaults

phpfpm_enable=${phpfpm_enable:-«NO»}

start_cmd=»phpfpm_start»
stop_cmd=»phpfpm_stop»
restart_cmd=»phpfpm_restart»

phpfpm_start()
{
if [ -f ${pidfile} ]
then
echo «php-fpm already running!»
exit 1;
fi
echo «Starting php-fpm server…»
/usr/local/php52/bin/php-cgi —fpm
}
phpfpm_stop()
{
if [ ! -f ${pidfile} ]
then
echo «${name} is not running or pidfile not found!»;
exit 1;
fi
echo «stopping ${name}…»
kill -SIGQUIT `cat ${pidfile}`
}
phpfpm_restart()
{
if [ ! -f ${pidfile} ]
then
echo «${name} is not running or pidfile not found!»;
exit 1;
fi
echo «sending SIGUSR2 to php-fpm master»
kill -SIGUSR2 `cat ${pidfile}`
}

load_rc_config ${name}
run_rc_command «$1″

сохраняем и прописываем в /etc/rc.conf

phpfpm_enable=»YES»

теперь пробуем что у нас получилось 😉

/usr/local/etc/rc.d/php-fpm start

/usr/local/php53/etc/rc.d/php-fpm start

/usr/local/php52/etc/rc.d/php-fpm start

у нас должны запуститься 3 версии php-fpm слушающих на нужных нам портах

теперь нужно в nginx описать конфигурацию под разные версии пхп )

в конфиге nginx в секции http {

прописываем :

upstream php54 {

server 127.0.0.1:9001;

}

upstream php53 {

server 127.0.0.1:9002;

}

 

upstream php52 {

server 127.0.0.1:9003;

}

 

для того что бы использовать определенную версию нам нужно будет в секции server {

в location ~ \.php$ {

указать

fastcgi_pass php54; вместо php54 может быть и php53 или php52

}

так с этим разобрались теперь

нам нужны extensions для php53 и php52

ставим их для php53

cd /usr/ports/lang/php53-extensions

make config и выбираем нужные нам

затем пишем :

make -D FORCE_PKG_REGISTER PREFIX=/usr/local/php53 PHPBASE=/usr/local/php53

и ждем пока установиться

когда установилось смотрим есть ли все они )

/usr/local/php53/bin/php -m

[PHP Modules]
bcmath
Core
ctype
curl
date
dba
dom
ereg
exif
fileinfo
filter
gd
hash
iconv
imap
json
libxml
mbstring
mcrypt
mhash
mysql
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_sqlite
Phar
posix
Reflection
session
SimpleXML
snmp
soap
sockets
SPL
SQLite
sqlite3
standard
tokenizer
xml
xmlreader
xmlrpc
xmlwriter
zip
zlib

[Zend Modules]

у меня вот такой вот список получился )

то есть ура php53 готов к работе )

теперь php52 производим те же действия

cd /usr/ports/lang/php52-extensions

make config выбираем нужные нам

и пишем

make -D FORCE_PKG_REGISTER PREFIX=/usr/local/php52 PHPBASE=/usr/local/php52

и тут нас ждут балалайки такого вида :

«/usr/ports/Mk/bsd.php.mk», line 368: Malformed conditional (${_USE_PHP_VER${PHP_VER}:Mctype} != «»)

и эти балалайки я обходил так :

мне нужны только вот эти расширения :
curl iconv json mbstring mysql  openssl pcre pdo pdo-mysql sessions snmp sockets spl sqlite xml xmlreader xmlwriter zip zlib

установим их вручную ) раз простым путем не хочет, а там видать косяк ))

cd /usr/ports/ftp/php52-curl

make -D FORCE_PKG_REGISTER PREFIX=/usr/local/php52 PHPBASE=/usr/local/php52 && make -D FORCE_PKG_REGISTER PREFIX=/usr/local/php52 PHPBASE=/usr/local/php52 install

остальное по аналогии )

в итоге у нас на сервере стоят 3 разных версии пхп каждая со своими расширениями )

на этом буду прощаться 😉 удачных вам установок )

 

 Внимание при копировании данной статьи авторство должно сохраняться

 ссылка должна быть активной и открытой для следования роботов ! 

Спасибо за внимание ! 

P.s. Уважайте чужой труд ! 

Nginx и proxy на другой домен через location

Здравствуйте товарищи !

сегодня речь пойдет о нетривиальной задаче когда нужно

сделать так что бы по ссылке /tratata открылся другой сайт и с ним можно было бы работать в пределах того же домена без обхода ограничений которые вызываются в работе с другим доменом …

так вот задача простая для её решения убил 3 минуты времени )

итак для решения данной задачи:

прописываем location tratata:

location /tratata  {

rewrite /tratata/(.*) /$1 break;
proxy_pass http://domain.example.net;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}

Как бы не хотелось все усложнить но все просто =) как сами видите единственное с чем пришлось повозится это передача корректного адреса на хост domain.example.net для этого используем mod_rpaf для apache и в нем пропишем :

RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 1.1.1.1 2.2.2.2
RPAFheader X-Forwarded-For

Где 127.0.0.1 localhost где 1.1.1.1 внешний ип адрес локального сервера того же что и localhost

где 2.2.2.2 внешний ип сервера с nginx для того что бы получать корректный ип на удаленной стороне )

Используйте на здоровье =)

udpxy nginx FreeBSD

Здравствуйте 😉

те кто привык смотреть тв хотят видеть его и по wifi и ещё и на телефоне … )

что бы не ходить вокруг да около скажу что роутеры wifi болезненно относятся к  udp трафику он может нафиг положить их процессор и в итоге роутер перестанет вообще работать либо картинка будет сплошная каша и радости от такого IPTV не будет … за сим народом было придумано множество вариантов как же все таки смотреть iptv на wifi мы будем рассматривать самый хороший как по мне udpxy в связке с nginx для удобства фильтрации )

в примере используется последняя версия udpxy

и так что нужно сделать с чего начать )

с проверки фаервола у меня это pf на наличие правил которые могут не пропускать udp трафик

то проще всего будет добавить такие строки :

pass in quick proto { igmp udp } from any to { 224.0.0.0/4 } allow-opts modulate state

pass in quick proto igmp all allow-opts
pass out quick proto igmp all allow-opts

Дальше систему нужно тюнинговать да бы при нагрузке не получить кваканье и квадратики

для этого :
sysctl kern.ipc.maxsockbuf=16384000

sysctl net.inet.udp.recvspace=4096000

sysctl net.inet.tcp.sendspace=1648576

+ желательно нафиг выключить на сетевых всякие rxcsum txcsum

ifconfig em0 -rxcsum -txcsum

ifconfig em1 -rxcsum -txcsum

теперь собственно udpxy сразу дает возможность смотреть через себя мультики но тогда зачем nginx ?) например что бы настроить откуда могут смотреть с помощью geoIP

Итак запускаем udpxy

/usr/local/bin/udpxy -p 4022 -S -m 172.16.33.1 -a 127.0.0.1

где -p 4022 порт который слушает udpxy

где -m 172.16.33.1  ип интерфейса откуда получаем мультикаст

где -a 127.0.0.1 где будет слушать udpxy

ну и теперь сам nginx

server {
listen 1.1.1.1:4022;
server_name localhost;

proxy_redirect off;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;

location / {
proxy_pass http://127.0.0.1:4022;

allow 172.16.101.0/24;
deny all;

}

}

 

тут думаю все понятно окромя объясню зачем у меня есть allow и deny

allow 172.16.101.0/24; разрешает  мою домашнюю сеть

deny all; запрещает всех остальных

с GeoIP опишу позже )

на этой ноте можно попробовать посмотреть мультики …

объяснение http://1.1.1.1:4022 ип адрес и порт нашего сервера @239.3.3.3:1234 ип и порт iptv канала нужно заменить их на свои.

открываем vlc вводим http://1.1.1.1:4022/udp/@239.3.3.3:1234  и ничего не работает

а ларчик просто открывается 😉

route add 224.0.0.0/4 172.33.33.1 и вуаля тестируем ещё раз и получаем картинку 😉

как это все добавить в автозагрузку :

touch /usr/local/etc/rc.d/iptv.sh

chmod +x /usr/local/etc/rc.d/iptv.sh

Редактируем файл iptv.sh

ee /usr/local/etc/rc.d/iptv.sh

Туда кладем содержимое :

#!/bin/sh

/usr/local/bin/udpxy -p 4022 -S -m 172.16.33.1 -a 127.0.0.1

route add 224.0.0.0/4 172.33.33.1

сохраняем  и все 😉

Всем спасибо все свободны =)