在 Debian Stretch 上安装 PHP 5.3 (9)

在 Debian Stretch 上安装 PHP 5.3 (9)

我正在将一个非常旧的服务器(Debian etch)迁移到 Debian Stretch,并且开发的每个应用程序都存在 PHP 问题,这是预料之中的。有些可以修复,有些则不能(如几个 drupal 6 站点)。将来,所有单个应用程序都将在 PHP7.0 下提供服务,但在那一天到来之前,我需要 PHP5.3 为它们提供服务。

我知道 Debian Stretch 对可共同安装的 PHP 版本有某种“本机”支持,但我发现的所有示例都是 PHP5.6(Jessie 的版本): https://pehapkari.cz/blog/2017/03/27/multiple-php-versions-the-easy-way/

另外,我还发现了一些 PHP5.3 和 PHP5.4 或 PHP5.6 在 Debian Jessie、Wheezy 等上协同工作的示例,但不适用于 Debian Stretch (PHP7.0): https://superuser.com/questions/913792/php-5-3-10-on-debian-jessie

所以,首先,我需要知道 PHP7.0 和 PHP5.3 是否可以在 apache2 上一起工作在 Debian Stretch 上。

第二,我需要弄清楚如何做到这一点

我不是系统管理员,所以我的 Debian 知识从头开始每天都在增长。

谢谢。

答案1

我偶然发现了类似的问题并设法使其发挥作用。

我必须安装一个带有 debian 9/nginx/php5.4 的服务器,所以虽然它与您的先决条件不完全匹配,但我认为解决方案是类似的。我将列出为我解决问题所采取的步骤。

基本上,您需要从源安装 php,如果您需要 openssl 支持(--with-openssl),这会带来问题,因为旧版本的 PHP(<7.0)不支持 openssl>=1.1.0,即debian 9 中的默认值。所以你必须构建一个旧的 openssl 版本(我使用了 1.0.1u)。

但让我们先安装一些依赖项。

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

然后我们将构建 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

作为连锁反应,您必须使用新构建的 openssl 构建 libcurl 和 libc-client(用于 imap 支持)。我们将从 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

然后,libc-client。我实际上使用了 debian 8 的源代码,因为它包含了一些补丁。构建本身失败了,但仍然生成了 c-client.a,这就是我所需要的。

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

有了这个,我就拥有了构建 PHP5.4 所需的一切。请注意,我在编译时对 postgresql 绑定发出了警告(因为本地与系统 openssl 版本不匹配),所以我认为如果您想使用它们,您将必须构建自己的 libpq。

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

剩下的唯一的事情就是创建 php.ini 和 php-fpm.conf 文件,这些文件都很简单,配置 php-fpm 套接字并创建 initscript (网上有很多示例,我无法发布完整的文件此处),以及网络服务器的配置(套接字上的 fastcgi)。

答案2

一周后,我设法让它发挥作用,但以不同的方式。我不再打扰主人并开始学习如何码头工人可以救我的命。

这篇文章给了我关键: Docker - 在不同网站的主机和容器上运行 Apache

我最初读到的关于 docker 的文章是这样的:使用 Docker 进行 PHP Web 开发

总而言之,我不需要在我的主机服务器中安装 apache2.2 和 PHP5.3,我可以拥有一个独立的容器,我可以在其中安装我需要的任何内容(通常是一项服务),并且忘记与主机操作系统版本可能不兼容的情况。 Docker 管理这一切。因此,我可以拥有一个包含 apache 2.2 + PHP 5.3 的容器,就像在 debian squeeze 操作系统中一样。另一个容器使用 apache 2.2 + PHP 5.4,就像在 Wheezy 中一样,另一个容器使用 apache 2.4 + PHP7.0,就像在 Stretch 中一样,等等。所有这些都同时工作并服务于不同的领域。为了实现后者,使主机上的 apache/nginx 作为反向代理工作,通过 docker 端口映射将每个域重定向到不同的 apache-php 容器。你甚至不需要在主机上安装 apache/nginx,它也可以在容器中。

docker 方式是将每个(微)服务放在一个容器中,这样你就可以将 mariaDB 放在另一个容器中,等等。

我的脚步(总结):(我只能发布链接,当我获得足够的声誉时,我将编辑并添加它们

0- 了解 docker(越多越好):如何使用 Dockerfile 构建镜像,最佳实践,docker内的网络,...

1- 安装 Docker:遵循官方指南总是。

2- 使用您未来的映像名称创建一个目录(例如 /home/user/docker/images/apache22php53 ),在里面创建您的 Dockerfile 和配置(在本例中为 virtualhost conf),我的 Dockerfile 是:

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

在目录中将虚拟主机配置文件放在路径中:conf/apache/virtualhosts/

3- 使用(目录中的上一个 cd)构建映像:

sudo docker build -t apache22php53 .

4- 使用以下命令启动容器:

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

Docker 会将 (-p) 2253 主机端口映射到 80 容器端口。我们还在 apache-container 文档根目录中安装(-v)我们的主机文档根目录(/var/www/html)(在squeeze中是/var/www)。还设置容器名称(--name)。

5- ssh 到容器:

sudo docker exec -ti apache22php53 /bin/bash

如果需要的话启动apache(就像我的例子)。 “exit”返回主机 cli。

6- 导航到 ...yourvhostdomain.com:2253,您应该看到您的 apache 正在加载 PHP5.3。

这是基础知识。之后,您将了解如何在容器内挂载主机数据(www、数据库等)、容器如何在它们之间以及与主机(docker 网络中的私有 IP)进行通信、如何使用 docker-compose 设置多个容器一次(网络、数据库等)、多个容器网络服务器的反向代理等。

相关内容