在 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在 Debian Stretch 上的 apache2 上一起工作。
其次,我需要弄清楚如何做到這一點。
我不是系統管理員,所以我的 debian 知識每天都在從頭開始增長。
謝謝你。
一周後,我設法讓它工作,但以不同的方式。我停止了與主機的糾纏,並開始學習Docker如何挽救我的生命。
這篇文章給了我關鍵: Docker - 在不同網站的主機和容器上執行 Apache
我最初閱讀的有關 docker 的文章是:PHP Web Development with Docker
總而言之,我不需要在我的主機伺服器中安裝 apache2.2 和 PHP5.3,我可以有一個隔離的容器,我可以在其中安裝我需要的任何東西(通常是一項服務),並且忘記可能與主機作業系統版本不兼容的問題。Docker 管理這一切。所以我可以擁有一個帶有 apache 2.2 + PHP 5.3 的容器,就像在 debian 擠壓作業系統中一樣。另一個帶有 apache 2.2 + PHP 5.4 的容器,就像它在 Wheezy 中一樣,另一個帶有 apache 2.4 + PHP7.0 的容器,就像在拉伸中一樣,依此類推。所有這些都同時工作並服務於不同的域。為了實現後者,使主機上的 apache/nginx 作為反向代理工作,通過 docker 埠映射將每個域重定向到不同的 apache-php 容器。您甚至不需要在主機上安裝 apache/nginx,它也可以在容器中。
docker 方式是將每個(微)服務放在一個容器中,因此您可以將 mariaDB 放在另一個容器中,等等。
我的步驟(總結):(我只能發布連結,當我獲得足夠的聲譽時,我將編輯並添加它們)
0 - 了解 docker(越多越好):如何使用 Dockerfile 建構映像、最佳實踐、docker 內的網路、…
1 - 安裝 Docker:始終遵循官方指南。
2 - 使用您未來的圖像名稱創建一個目錄( /home/user/docker/images/apache22php53 例如),在裡面創建您的 Dockerfile 和配置(在這種情況下為虛擬主機配置)我的 Dockerfile 是:
FROM debian:squeeze LABEL maintainer="raguchi@gmail.com" # 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 文件放在路徑中: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)(擠壓是 /var/www )。還設置容器名稱(–name)。
5 - SSH 到容器:
sudo docker exec -ti apache22php53 /bin/bash
並在需要時啟動 apache(如我的情況)。“退出”以返回主機 cli。
6 - 導航到 …yourvhostdomain.com:2253,您應該看到您的 apache 執行時載入了 PHP5.3。
這是基礎。之後,您將了解如何在容器內掛載主機數據(www、數據庫等),容器如何在它們之間以及與主機(docker 網路中的私有 IP)進行通信,如何使用 docker-compose 設置多個容器一次(網路,數據庫等),多個容器網路伺服器的反向代理等。
我偶然發現了一個類似的問題並設法使它工作。
我必須使用 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 客戶端。我實際上使用了 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(網上有很多例子,我不能發布完整的文件這裡),以及你的網路伺服器的配置(socket上的fastcgi)。