Menginstal PHP 5.3 pada Debian Stretch (9)

8

Saya memigrasikan server yang sangat lama (Debian etch) ke Debian Stretch dan setiap aplikasi yang dikembangkan memiliki masalah PHP, seperti yang diharapkan. Beberapa dapat diperbaiki, beberapa tidak dapat (karena beberapa situs drupal 6). Di masa depan aplikasi tunggal akan dilayani di bawah PHP7.0 tetapi sampai hari itu tiba saya perlu PHP5.3 melayani mereka.

Saya tahu bahwa Debian stretch memiliki semacam dukungan "asli" untuk versi PHP yang dapat diinstal bersama tetapi semua contoh yang saya temukan adalah dengan PHP5.6 (versi Jessie): https://pehapkari.cz/blog/2017/03/27 / multiple-php-versi-cara-mudah /

Juga, saya telah menemukan beberapa contoh PHP5.3 dan PHP5.4 atau PHP5.6 bekerja bersama di Debian Jessie, Wheezy, dll tetapi tidak untuk Debian Stretch (PHP7.0): /superuser/913792 / php-5-3-10-on-debian-jessie

Jadi, pertama, saya perlu tahu apakah mungkin untuk memiliki PHP7.0 dan PHP5.3 bekerja bersama pada apache2 pada Debian Stretch.

Kedua, saya perlu mencari tahu bagaimana ini bisa dilakukan .

Saya tidak sysadmin sehingga pengetahuan debian saya tumbuh hari demi hari dari awal.

Terima kasih.

Raguchi
sumber
Apakah ada persyaratan khusus untuk bermigrasi ke Stretch? Jessie masih didukung, Anda bisa bermigrasi ke sana.
Stephen Kitt
Di sini saya memiliki server internal yang bekerja dengan PHP 5 dan 7. Saya setuju dengan Stephen, Jessie adalah jalan yang lebih mudah. Apakah Anda bersedia hidup dengan masalah keamanan?
Rui F Ribeiro
Sayangnya peregangan adalah persyaratan, saya "menerima" pengguna root dari server virtual dengan SO diinstal (debian 9), semua hal terserah saya. Saya mengetahui masalah keamanan dengan PHP5.3, itu akan menjadi solusi sementara karena saya dapat memigrasi semua aplikasi untuk bekerja dengan PHP7.0
raguchi
Saya menyerah dengan Debian Stretch, tidak ada cara untuk memiliki PHP 5.3. @RuiFRibeiro, versi PHP5 Anda adalah 5.6, bukan? Mungkin saya bisa memiliki PHP5.3 dan PHP7.0 di debian Jessie tetapi saya tidak bisa melihat cara yang mudah seperti dengan 5.6 (apt-get install php7.0-fpm php5-fpm).
Raguchi
5.6 tepatnya. Ini lebih merupakan hack daripada yang lain, tidak akan menggunakannya di server Internet.
Rui F Ribeiro

Jawaban:

5

Saya menemukan masalah yang sama dan berhasil membuatnya bekerja.

Saya harus menginstal server dengan debian 9 / nginx / php5.4, jadi walaupun tidak sama persis dengan prasyarat Anda, saya menganggap solusinya mirip. Saya akan membuat daftar langkah-langkah yang saya ambil yang menyelesaikannya untuk saya.

Pada dasarnya, Anda perlu menginstal php dari sumber, dan ini menimbulkan masalah jika Anda memerlukan dukungan openssl (--with-openssl), karena PHP versi lama (<7.0) tidak mendukung openssl> = 1.1.0, yang merupakan default di debian 9. Jadi, Anda harus membangun versi openssl yang lebih lama (saya mengambil 1.0.1u).

Tapi mari kita instal beberapa dependensi terlebih dahulu.

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

Kemudian kita akan membangun 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

Sebagai reaksi berantai, Anda harus membangun libcurl dan libc-client (untuk dukungan imap) dengan openssl yang baru Anda buat. Kami akan mulai dengan 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

Kemudian, libc-client. Saya benar-benar menggunakan sumber dari debian 8, karena itu termasuk beberapa tambalan. Build itu sendiri gagal tetapi masih menghasilkan c-client.a, yang saya butuhkan.

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

Dengan ini, saya memiliki semua yang saya butuhkan untuk membangun PHP5.4. Harap dicatat bahwa saya memiliki peringatan untuk binding postgresql dalam kompilasi (karena sistem vs versi lokal tidak cocok dengan versi openssl), jadi saya pikir Anda harus membuat libpq Anda sendiri jika Anda ingin menggunakannya.

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

Satu-satunya hal yang tersisa adalah pembuatan file php.ini dan php-fpm.conf, yang keduanya sepele, konfigurasi soket php-fpm dan pembuatan skrip init (ada banyak contoh online, saya tidak dapat memposting file lengkap di sini), dan konfigurasi server web Anda (fastcgi pada socket).

Arza
sumber
Saya mendapatkan masalah dengan baris emake dari kompilasi uw-imap_2007f. Ada banyak masalah dalam deklarasi utama /usr/local/imap-2007f/ipopd/ipop2d.c
dubis
Ya, ini diharapkan. Itu masih harus menghasilkan file c-client / c-client.a, yang Anda butuhkan untuk langkah selanjutnya.
Arza
Pada tahun 2020, uw-imap_2007f \ ~ dfsg-7.debian.tar.xz dan uw-imap_2007f \ ~ dfsg-7.dsc saat ini (patch 2 tidak lagi tersedia). Saya juga memiliki konflik dengan /usr/lib/libc-client.a yang sudah ada yang tidak saya pecahkan. Saya memilih untuk melewati imap.
Martin M
5

Satu minggu kemudian saya berhasil membuatnya bekerja tetapi dengan cara yang berbeda. Saya berhenti bermain-main dengan tuan rumah dan mulai belajar bagaimana Docker dapat menyelamatkan hidup saya.

Posting ini memberi saya kunci: Docker - Jalankan Apache pada host dan wadah untuk situs web yang berbeda

Baca iniciatic saya tentang buruh pelabuhan adalah ini: PHP Web Development dengan Docker

Meringkas, saya tidak perlu menginstal apache2.2 & PHP5.3 di server host saya, saya dapat memiliki wadah terisolasi di mana saya dapat menginstal apa pun yang saya butuhkan (biasanya satu layanan) dan melupakan kemungkinan tidak kompatibel dengan versi OS host. Docker mengelola semuanya. Jadi saya dapat memiliki satu wadah dengan apache 2.2 + PHP 5.3 karena akan berada dalam OS squeeze debian. Wadah lain dengan apache 2.2 + PHP 5.4 karena akan berada dalam Wheezy, yang lain dengan apache 2.4 + PHP7.0 seperti dalam peregangan dan sebagainya. Semua bekerja sebagai waktu yang sama dan melayani berbagai domain. Untuk mencapai yang terakhir, buat apache / nginx pada host agar berfungsi sebagai proxy terbalik yang mengarahkan ulang setiap domain ke wadah apache-php yang berbeda berkat pemetaan port docker. Anda bahkan tidak perlu memiliki apache / nginx pada host, bisa juga dalam wadah.

Cara buruh pelabuhan adalah memiliki masing-masing layanan (mikro) dalam sebuah wadah, sehingga Anda dapat memiliki mariaDB di wadah lain, dll.

Langkah-langkah saya (dirangkum): ( Saya tidak dapat memposting lebih dari ke tautan, ketika saya mendapatkan reputasi yang cukup, saya akan mengedit dan menambahkannya )

0 - Baca tentang buruh pelabuhan (semakin banyak semakin baik): cara membuat gambar dengan Dockerfile , praktik terbaik , jaringan di dalam buruh pelabuhan, ...

1 - Instal Docker: ikuti panduan resmi selalu.

2 - Buat dir dengan nama gambar masa depan Anda (misalnya / home / user / docker / images / apache22php53), di dalam buat Dockerfile Anda dan konfigurasi (virtualhost conf dalam hal ini) Dockerfile saya adalah:

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"]

Di dalam dir, letakkan file conf virtualhost di dalam path: conf / apache / virtualhosts /

3 - membangun gambar dengan (cd sebelumnya di dalam dir):

sudo docker build -t apache22php53 .

4 - luncurkan wadah dengan:

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

Docker akan memetakan (-p) 2253 port host ke 80 port container. Kami sedang memasang (-v) juga root dokumen host kami (/ var / www / html) di root dokumen apache-container (dalam squeeze adalah / var / www). Pengaturan are juga nama wadah (--name).

5 - ssh ke wadah dengan:

sudo docker exec -ti apache22php53 /bin/bash

dan mulai apache jika diperlukan (seperti dalam kasus saya). "keluar" untuk kembali ke host cli.

6 - navigasikan ke ... yourvhostdomain.com:253 dan Anda akan melihat apache Anda berjalan dengan PHP5.3 dimuat.

Ini adalah dasar-dasarnya. Setelah itu Anda akan belajar tentang cara me-mount data host (www, database, dll) di dalam kontainer, bagaimana kontainer dapat berkomunikasi di antara mereka dan dengan host (IP privat dalam jaringan buruh pelabuhan), cara menggunakan komposisi buruh pelabuhan untuk mengatur beberapa wadah sekaligus (web, database, dll), membalikkan proxy untuk beberapa webserver wadah, dll.

Raguchi
sumber
Saya menandai jawaban saya sendiri sebagai yang diterima karena itu satu-satunya solusi yang saya coba dan berhasil untuk saya.
raguchi