Instalando o PHP 5.3 no Debian Stretch (9)

8

Estou migrando um servidor muito antigo (Debian etch) para o Debian Stretch e todos os aplicativos desenvolvidos têm problemas de PHP, era esperado. Alguns podem ser corrigidos, outros não (como vários sites do drupal 6). No futuro, um único aplicativo será veiculado no PHP7.0, mas até esse dia chegar, preciso do PHP5.3.

Eu sei que o Debian Stretch tem algum tipo de suporte "nativo" para versões PHP co-instaláveis, mas todos os exemplos que encontrei são no PHP5.6 (versão de Jessie): https://pehapkari.cz/blog/2017/03/27 / multiple-php-versões-da-maneira-fácil /

Além disso, encontrei alguns exemplos de PHP5.3 e PHP5.4 ou PHP5.6 trabalhando juntos no Debian Jessie, Wheezy, etc., mas não no Debian Stretch (PHP7.0): /superuser/913792 / php-5-3-10-on-debian-jessie

Então, primeiro, eu preciso saber se é possível ter o PHP7.0 e o PHP5.3 trabalhando juntos no apache2 no Debian Stretch.

Segundo, preciso descobrir como isso pode ser feito .

Eu não sou sysadmin, então meu conhecimento do debian está crescendo dia a dia do zero.

Obrigado.

raguchi
fonte
Existe um requisito específico para migrar para o Stretch? Jessie ainda é suportada, você pode migrar para isso.
Stephen Kitt
Eu tenho aqui um servidor interno trabalhando com PHP 5 e 7. Eu concordo com Stephen, Jessie é um caminho mais fácil. Você está disposto a conviver com os problemas de segurança?
Rui F Ribeiro
Infelizmente, esticar é um requisito, eu "recebo" o usuário root de um servidor virtual com o SO instalado (debian 9), tudo depende de mim. Estou ciente dos problemas de segurança com PHP5.3, seria uma solução temporária como eu pode migrar todos os aplicativos para trabalhar com PHP7.0
raguchi
Eu desisto do Debian Stretch, não há como ter o PHP 5.3. @RuiFRibeiro, sua versão do PHP5 é 5.6, não é? Talvez eu possa ter o PHP5.3 e o PHP7.0 no debian Jessie, mas não consigo ver uma maneira fácil como na versão 5.6 (apt-get install php7.0-fpm php5-fpm).
Raguchi
5.6 exatamente. É mais um hack do que qualquer outra coisa, não o usaria em um servidor da Internet.
Rui F Ribeiro

Respostas:

5

Eu me deparei com um problema semelhante e consegui fazê-lo funcionar.

Eu tive que instalar um servidor com o debian 9 / nginx / php5.4, portanto, embora ele não corresponda exatamente aos seus pré-requisitos, presumo que a solução seja semelhante. Vou listar os passos que tomei que resolveram para mim.

Basicamente, você precisa instalar o php a partir das fontes, e isso representa um problema se você precisar do suporte ao openssl (--with-openssl), porque as versões antigas do PHP (<7.0) não suportam o openssl> = 1.1.0, que é o padrão no debian 9. Então você tem que construir uma versão mais antiga do openssl (peguei a 1.0.1u).

Mas vamos instalar algumas dependências primeiro.

apt install build-essential checkinstall zip autoconf
apt install libfcgi-dev libfcgi0ldbl libmcrypt-dev libssl-dev libc-client2007e-dev libkrb5-dev libcurl4-openssl-dev
apt install libxml2-dev libcurl4-openssl-dev libpcre3-dev libbz2-dev libjpeg-dev libpng-dev libfreetype6-dev libmcrypt-dev libmhash-dev freetds-dev libmariadbclient-dev-compat unixodbc-dev libxslt1-dev

Então vamos construir o openssl.

cd /opt/
wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1u.tar.gz
tar xzf openssl-1.0.1u.tar.gz
cd openssl-1.0.1u
./config shared --openssldir=/usr/local/openssl/ enable-ec_nistp_64_gcc_128
make depend
make
make install
ln -s /usr/local/openssl/lib /usr/local/openssl/lib/x86_64-linux-gnu

Como uma reação em cadeia, você terá que criar o libcurl e o libc-client (para suporte ao imap) com o seu openssl recém-construído. Vamos começar com libcurl.

cd /opt/
wget https://curl.haxx.se/download/curl-7.26.0.tar.gz
tar xzf curl-7.26.0.tar.gz
cd curl-7.26.0
env PKG_CONFIG_PATH=/usr/local/openssl/lib/pkgconfig LDFLAGS=-Wl,-rpath=/usr/local/openssl/lib ./configure --with-ssl=/usr/local/openssl --with-zlib --prefix=/usr/local/curl
make
make install

Então, libc-client. Na verdade, eu usei os fontes do debian 8, pois ele incluía alguns patches. A compilação em si falhou, mas ainda produziu c-client.a, que é tudo o que eu precisava.

cd /tmp/
wget http://http.debian.net/debian/pool/main/u/uw-imap/uw-imap_2007f\~dfsg-2.dsc
wget http://http.debian.net/debian/pool/main/u/uw-imap/uw-imap_2007f\~dfsg.orig.tar.gz
wget http://http.debian.net/debian/pool/main/u/uw-imap/uw-imap_2007f\~dfsg-2.debian.tar.gz
dpkg-source -x uw-imap_2007f\~dfsg-2.dsc imap-2007f
mv imap-2007f /usr/local/
cd /usr/local/imap-2007f/
touch {ipv6,lnxok}
make slx SSLINCLUDE=/usr/local/openssl/include/ SSLLIB=/usr/local/openssl/lib EXTRAAUTHENTICATORS=gss
mkdir lib include
cp c-client/*.c lib/
cp c-client/*.h include/
cp c-client/c-client.a lib/libc-client.a
ln -s /usr/lib/libc-client.a /usr/lib/x86_64-linux-gnu/libc-client.a

Com isso, eu tinha tudo o que precisava para construir o PHP5.4. Observe que eu recebi um aviso para ligações do postgresql na compilação (por causa da incompatibilidade de versão openssl local x sistema), então acho que você precisará criar sua própria libpq se desejar usá-las.

cd /opt/
PHP_VER=5.4.45
wget http://museum.php.net/php5/php-${PHP_VER}.tar.gz
tar xzf php-${PHP_VER}.tar.gz
cd php-${PHP_VER}
LDFLAGS="-Wl,-rpath=/usr/local/openssl/lib,-rpath=/usr/local/curl/lib" './configure'  --prefix=/usr/local/php-${PHP_VER} '--with-zlib-dir' '--with-freetype-dir' '--enable-fpm' '--enable-mbstring' '--with-libxml-dir=/usr' '--enable-soap' '--enable-calendar' '--with-curl=/usr/local/curl' '--with-mcrypt' '--with-zlib' '--with-gd' '--disable-rpath' '--enable-inline-optimization' '--with-bz2' '--with-zlib' '--enable-sockets' '--enable-sysvsem' '--enable-sysvshm' '--enable-mbregex' '--with-mhash' '--enable-zip' '--with-pcre-regex' '--with-mysql' '--with-pdo-mysql' '--with-mysqli' '--with-jpeg-dir=/usr' '--with-png-dir=/usr' '--enable-gd-native-ttf' '--enable-cgi' '--with-pear' '--enable-memcache' '--with-openssl=/usr/local/openssl' '--with-imap=/usr/local/imap-2007f' '--with-kerberos' '--with-imap-ssl' '--with-libdir=lib/x86_64-linux-gnu'
LDFLAGS="-Wl,-rpath=/usr/local/openssl/lib,-rpath=/usr/local/curl/lib" make
make install

As únicas coisas restantes são a criação dos arquivos php.ini e php-fpm.conf, que são triviais, a configuração do soquete php-fpm e a criação de um initscript (há muitos exemplos online, não posso postar o arquivo completo aqui) e a configuração do seu servidor da web (fastcgi no soquete).

Arza
fonte
Estou tendo problemas com a linha emake da compilação uw-imap_2007f. Existem muitos problemas na declaração principal de /usr/local/imap-2007f/ipopd/ipop2d.c
dubis
Sim, isso é esperado. Ele ainda deve gerar um arquivo c-client / c-client.a, que é tudo o que você precisa para as próximas etapas.
Arza
A partir de 2020, uw-imap_2007f \ ~ dfsg-7.debian.tar.xz e uw-imap_2007f \ ~ dfsg-7.dsc estarão atualizados (o patch 2 não está mais disponível). Também tive um conflito com um /usr/lib/libc-client.a existente que não resolvi. Eu escolho pular o imap.
Martin M
5

Uma semana depois, consegui fazê-lo funcionar, mas de uma maneira diferente. Parei de mexer com o host e comecei a aprender como o Docker pode salvar minha vida.

Esta postagem me deu a chave: Docker - Execute o Apache no host e no contêiner para diferentes sites

Minha leitura inicial sobre docker foi esta: PHP Web Development with Docker

Resumindo, não preciso instalar o apache2.2 e o PHP5.3 no servidor host, posso ter um contêiner isolado onde posso instalar tudo o que preciso (geralmente um serviço) e esquecer possíveis incompatibilidades com a versão do SO host. O Docker gerencia tudo. Então, eu posso ter um contêiner com o apache 2.2 + PHP 5.3, como seria em um sistema operacional squeeze debian. Outro contêiner com o apache 2.2 + PHP 5.4 como seria em um Wheezy, outro com o apache 2.4 + PHP7.0 como no stretch e assim por diante. Todos trabalhando ao mesmo tempo e servindo domínios diferentes. Para conseguir isso, faça com que o apache / nginx no host funcione como proxy reverso, redirecionando cada domínio para um contêiner apache-php diferente, graças ao mapeamento da porta do docker. Você nem precisa ter apache / nginx no host, ele também pode estar em um contêiner.

A maneira do docker é ter cada (micro) serviço em um contêiner, para que você possa ter o mariaDB em outro contêiner, etc.

Minhas etapas (resumidas): ( não posso postar mais do que links, quando tiver reputação suficiente, vou editá-las e adicioná-las )

0 - Leia sobre o docker (quanto mais, melhor): como criar imagens com o Dockerfile , práticas recomendadas , redes dentro do docker, ...

1 - Instale o Docker: siga sempre o guia oficial .

2 - Crie um diretório com o nome da sua imagem futura (/ home / user / docker / images / apache22php53, por exemplo), por dentro, crie seu Dockerfile e configs (virtualhost conf neste caso) meu Dockerfile foi:

FROM debian:squeeze

LABEL maintainer="[email protected]"

# squeeze new mirrors
RUN echo "deb http://archive.debian.org/debian/ squeeze contrib main non-free" > /etc/apt/sources.list

RUN apt-get update
# Common packages
RUN apt-get update && \
    apt-get install -y --force-yes curl wget

RUN apt-get update && \
    apt-get install -y --force-yes \
            apache2 \
            libapache2-mod-php5 \
            ntp \
        php5 \
        php5-curl \
        php5-gd \
        php5-ldap \
        php5-mcrypt \
        php5-mysql \
        vim

RUN a2enmod \
            php5 \
        rewrite \
        ssl


ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP    www-data
ENV APACHE_LOG_DIR  /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
# RUN     chown -R www-data:www-data /var/www
COPY     conf/apache/virtualhosts /etc/apache2/sites-enabled

# disable default virtualhost
RUN a2dissite 000-default

EXPOSE 80
EXPOSE 443

CMD     ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

Dentro do diretório, coloque seu arquivo conf virtualhost dentro do caminho: conf / apache / virtualhosts /

3 - construa a imagem com (cd anterior dentro do diretório):

sudo docker build -t apache22php53 .

4 - lance o contêiner com:

sudo docker run -ti -d -p 2253:80 -v /var/www/html:/var/www --name apache22php53 apache22php53 /bin/bash

O Docker mapeará a porta do host (-p) 2253 para a porta do contêiner 80. Também estamos montando (-v) a raiz do documento host (/ var / www / html) na raiz do documento apache-container (no squeeze é / var / www). Também estão definindo o nome do contêiner (--name).

5 - ssh para contêiner com:

sudo docker exec -ti apache22php53 /bin/bash

e inicie o apache, se necessário (como no meu caso). "exit" para voltar ao host cli.

6 - navegue até ... yourvhostdomain.com:2253 e você verá o seu apache rodando com o PHP5.3 carregado.

Este é o básico. Depois disso, você aprenderá sobre como montar dados do host (www, bancos de dados etc.) dentro de contêineres, como os contêineres podem se comunicar entre eles e com o host (IPs privados na rede docker), como usar o docker-compose para configurar vários contêineres de uma só vez (web, banco de dados etc.), proxy reverso para vários servidores web de contêineres etc.

raguchi
fonte
Marquei minha própria resposta como a aceita, porque é a única solução que tentei e funcionou para mim.
Raguchi