Running Multiple Versions of PHP Using Apache on Gentoo
I have a Gentoo Linux web server that serves a few PHP-based web applications using Apache. Most of the applications will run on the latest version of PHP (i.e. 7.2); however, one application needs to run on a very old version of PHP (i.e. 5.6). How can I run multiple versions of PHP simultaneously on the same web server?
- Gentoo (profile 17).
- Web Server is Apache 2.4.
- Need to run PHP 7.2 and PHP 5.6.
- Apache is currently configured to serve PHP 7.2 via mod_php but PHP 5.6 is also installed.
- Gentoo is configured to use
eselect
to change which version of PHP is used for Apache/mod_php.
apache-httpd php gentoo
add a comment |
I have a Gentoo Linux web server that serves a few PHP-based web applications using Apache. Most of the applications will run on the latest version of PHP (i.e. 7.2); however, one application needs to run on a very old version of PHP (i.e. 5.6). How can I run multiple versions of PHP simultaneously on the same web server?
- Gentoo (profile 17).
- Web Server is Apache 2.4.
- Need to run PHP 7.2 and PHP 5.6.
- Apache is currently configured to serve PHP 7.2 via mod_php but PHP 5.6 is also installed.
- Gentoo is configured to use
eselect
to change which version of PHP is used for Apache/mod_php.
apache-httpd php gentoo
add a comment |
I have a Gentoo Linux web server that serves a few PHP-based web applications using Apache. Most of the applications will run on the latest version of PHP (i.e. 7.2); however, one application needs to run on a very old version of PHP (i.e. 5.6). How can I run multiple versions of PHP simultaneously on the same web server?
- Gentoo (profile 17).
- Web Server is Apache 2.4.
- Need to run PHP 7.2 and PHP 5.6.
- Apache is currently configured to serve PHP 7.2 via mod_php but PHP 5.6 is also installed.
- Gentoo is configured to use
eselect
to change which version of PHP is used for Apache/mod_php.
apache-httpd php gentoo
I have a Gentoo Linux web server that serves a few PHP-based web applications using Apache. Most of the applications will run on the latest version of PHP (i.e. 7.2); however, one application needs to run on a very old version of PHP (i.e. 5.6). How can I run multiple versions of PHP simultaneously on the same web server?
- Gentoo (profile 17).
- Web Server is Apache 2.4.
- Need to run PHP 7.2 and PHP 5.6.
- Apache is currently configured to serve PHP 7.2 via mod_php but PHP 5.6 is also installed.
- Gentoo is configured to use
eselect
to change which version of PHP is used for Apache/mod_php.
apache-httpd php gentoo
apache-httpd php gentoo
asked 1 hour ago
Steve KalemkiewiczSteve Kalemkiewicz
148116
148116
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
This answer is specifically for Gentoo with Profile 17. It will probably work with a few versions plus and minus. I used Red Hat's PHP Configuration Tips page for inspiration. The same idea should work for other Linux distributions (of course the specific commands will differ).
The solution is to use PHP-FPM (FastCGI Process Manager). Each version of PHP gets its own PHP-FPM service that listens on a socket. Apache passes the PHP execution requests to a particular PHP-FPM service depending on which version of PHP is required.
You can use mod_php for one version of PHP and PHP-FPM for the other(s) but I decided to drop mod_php altogether. First, I read somewhere that you can save some memory overhead by disabling mod_php. Second, the solution seemed a little cleaner with all versions of PHP being handled in the same way. Third, it is always better to have the least amount of/only the necessary software installed from a security perspective.
Change your
USE
flags fordev-lang/php
to addfpm
and removeapache2
.
Current Gentoo convention is to create a file like
/etc/portage/package.use/php
and specify theUSE
flags here. If you specify exact versions in the file, make sure all versions of PHP you want to use pick up the theseUSE
flags.
Install/reinstall the versions of PHP you are going to be using.
# emerge -av =dev-lang/php-7.2.3
# emerge -av =dev-lang/php-5.6.7
Change your
APACHE2_MODULES
variable to build theproxy
andproxy_fcgi
Apache modules.
You specify what Apache modules using by adding/updating the
APACHE2_MODULES
variable in/etc/portage/make.conf
. LikeUSE
flags, Gentoo has some defaults already set-up for your profile. UnlikeUSE
flags, it seems that you need to explicitly tell Gentoo to start with the defaults by prepending$APACHE2_MODULES
to the variable:
APACHE2_MODULES="$APACHE2_MODULES proxy proxy_fcgi"
- Reinstall Apache.
# emerge -av apache
- Install PHP-FPM.
# emerge -av php-fpm
Create PHP-FPM startup scripts for each version of PHP you are using with Apache.
The PHP-FPM installation creates a single startup script (
/etc/init.d/php-fpm
) that allows you to to choose the version of PHP to run usingeselect
or by changing the script's file name suffix (e.g.php-fpm-php5.6
,php-fpm-php7.2
, etc.). Since we would only want to useeselect
if we only wanted to use a single version of PHP at a time or if we wanted to use no more than two versions with mod_php for one and PHP-FPM for the second, we will use the suffix method. Instead of copying the script, we want to symlink it (valid suffixes are those directory names fromls -ld /usr/lib64/php*
e.g.php5.6
,php7.2
, etc.):
# cd /etc/init.d
# ln -s php-fpm php-fpm-php5.6
# ln -s php-fpm php-fpm-php7.2
Change the PHP-FPM configuration so that each PHP version's service runs on a different port.
The specific file names vary between versions but you want to edit a config file for each PHP version in these general locations:
/etc/php/fpm-php*/*.conf
so that thelisten
directive has a different port for each.
Configure PHP-FPM services to start.
# rc-update add php-fpm-php5.6 default
# rc-update add php-fpm-php7.2 default
# /etc/init.d/php-fpm-php5.6 start
# /etc/init.d/php-fpm-php7.2 start
Edit the Apache start-up configuration to enable proxy modules.
Edit
/etc/conf.d/apache2
to add-D PROXY
and remove-D PHP
fromAPACHE2_OPTS
.
Edit the Apache configuration to tie specific directory locations to specific instances of PHP-FPM.
There are many ways to handle this depending on your specific Apache configuration. I decided to edit the
<Directory>
entry associated with my web root so that the default PHP handler was version 7.2 by adding:
<FilesMatch .php$>
SetHandler "proxy:fcgi://127.0.0.1:9972" # <-- Note port num.
</FilesMatch>
With PHP 5.6 used only by exception, I added <Directory>
directives for each application that needed to use the old version of PHP:
<Directory /var/www/oldapp>
<FilesMatch .php$>
Sethandler "proxy:fcgi:/127.0.0.1:9956" # <-- Note diff port num.
</FilesMatch>
</Directory>
Add
index.php
as a valid directory index file.
In Gentoo
/etc/apache2/modules.d/70_mod_php.conf
includes a directive to addindex.php
as a directory index file in the same wayindex.html
usually is. Since we disabled mod_php in Step 9,70_mod_php.conf
no longer exists to set this up. To fix this, addDirectoryIndex index.php
to the Apache configuration. Otherwise, if you visit paths like/oldapp/
you will get a 403 error.
Restart Apache.
# /etc/init.d/apache restart
Other Notes
- If you set-up specific configuration settings in your
php.ini
file (e.g. max POST values, timezone, etc), you will need to set these in all of your/etc/php/fpm-php*/php.ini
files (for each version). - PHP-FPM defaults to running as
user=nobody
/group=nobody
. You may need to change these (in/etc/php/fpm-php*/php-fpm.conf
) to match whatever your web server is running. - To handle multiple virtual hosts, perform Steps 10 and 11 for each.
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f505980%2frunning-multiple-versions-of-php-using-apache-on-gentoo%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
This answer is specifically for Gentoo with Profile 17. It will probably work with a few versions plus and minus. I used Red Hat's PHP Configuration Tips page for inspiration. The same idea should work for other Linux distributions (of course the specific commands will differ).
The solution is to use PHP-FPM (FastCGI Process Manager). Each version of PHP gets its own PHP-FPM service that listens on a socket. Apache passes the PHP execution requests to a particular PHP-FPM service depending on which version of PHP is required.
You can use mod_php for one version of PHP and PHP-FPM for the other(s) but I decided to drop mod_php altogether. First, I read somewhere that you can save some memory overhead by disabling mod_php. Second, the solution seemed a little cleaner with all versions of PHP being handled in the same way. Third, it is always better to have the least amount of/only the necessary software installed from a security perspective.
Change your
USE
flags fordev-lang/php
to addfpm
and removeapache2
.
Current Gentoo convention is to create a file like
/etc/portage/package.use/php
and specify theUSE
flags here. If you specify exact versions in the file, make sure all versions of PHP you want to use pick up the theseUSE
flags.
Install/reinstall the versions of PHP you are going to be using.
# emerge -av =dev-lang/php-7.2.3
# emerge -av =dev-lang/php-5.6.7
Change your
APACHE2_MODULES
variable to build theproxy
andproxy_fcgi
Apache modules.
You specify what Apache modules using by adding/updating the
APACHE2_MODULES
variable in/etc/portage/make.conf
. LikeUSE
flags, Gentoo has some defaults already set-up for your profile. UnlikeUSE
flags, it seems that you need to explicitly tell Gentoo to start with the defaults by prepending$APACHE2_MODULES
to the variable:
APACHE2_MODULES="$APACHE2_MODULES proxy proxy_fcgi"
- Reinstall Apache.
# emerge -av apache
- Install PHP-FPM.
# emerge -av php-fpm
Create PHP-FPM startup scripts for each version of PHP you are using with Apache.
The PHP-FPM installation creates a single startup script (
/etc/init.d/php-fpm
) that allows you to to choose the version of PHP to run usingeselect
or by changing the script's file name suffix (e.g.php-fpm-php5.6
,php-fpm-php7.2
, etc.). Since we would only want to useeselect
if we only wanted to use a single version of PHP at a time or if we wanted to use no more than two versions with mod_php for one and PHP-FPM for the second, we will use the suffix method. Instead of copying the script, we want to symlink it (valid suffixes are those directory names fromls -ld /usr/lib64/php*
e.g.php5.6
,php7.2
, etc.):
# cd /etc/init.d
# ln -s php-fpm php-fpm-php5.6
# ln -s php-fpm php-fpm-php7.2
Change the PHP-FPM configuration so that each PHP version's service runs on a different port.
The specific file names vary between versions but you want to edit a config file for each PHP version in these general locations:
/etc/php/fpm-php*/*.conf
so that thelisten
directive has a different port for each.
Configure PHP-FPM services to start.
# rc-update add php-fpm-php5.6 default
# rc-update add php-fpm-php7.2 default
# /etc/init.d/php-fpm-php5.6 start
# /etc/init.d/php-fpm-php7.2 start
Edit the Apache start-up configuration to enable proxy modules.
Edit
/etc/conf.d/apache2
to add-D PROXY
and remove-D PHP
fromAPACHE2_OPTS
.
Edit the Apache configuration to tie specific directory locations to specific instances of PHP-FPM.
There are many ways to handle this depending on your specific Apache configuration. I decided to edit the
<Directory>
entry associated with my web root so that the default PHP handler was version 7.2 by adding:
<FilesMatch .php$>
SetHandler "proxy:fcgi://127.0.0.1:9972" # <-- Note port num.
</FilesMatch>
With PHP 5.6 used only by exception, I added <Directory>
directives for each application that needed to use the old version of PHP:
<Directory /var/www/oldapp>
<FilesMatch .php$>
Sethandler "proxy:fcgi:/127.0.0.1:9956" # <-- Note diff port num.
</FilesMatch>
</Directory>
Add
index.php
as a valid directory index file.
In Gentoo
/etc/apache2/modules.d/70_mod_php.conf
includes a directive to addindex.php
as a directory index file in the same wayindex.html
usually is. Since we disabled mod_php in Step 9,70_mod_php.conf
no longer exists to set this up. To fix this, addDirectoryIndex index.php
to the Apache configuration. Otherwise, if you visit paths like/oldapp/
you will get a 403 error.
Restart Apache.
# /etc/init.d/apache restart
Other Notes
- If you set-up specific configuration settings in your
php.ini
file (e.g. max POST values, timezone, etc), you will need to set these in all of your/etc/php/fpm-php*/php.ini
files (for each version). - PHP-FPM defaults to running as
user=nobody
/group=nobody
. You may need to change these (in/etc/php/fpm-php*/php-fpm.conf
) to match whatever your web server is running. - To handle multiple virtual hosts, perform Steps 10 and 11 for each.
add a comment |
This answer is specifically for Gentoo with Profile 17. It will probably work with a few versions plus and minus. I used Red Hat's PHP Configuration Tips page for inspiration. The same idea should work for other Linux distributions (of course the specific commands will differ).
The solution is to use PHP-FPM (FastCGI Process Manager). Each version of PHP gets its own PHP-FPM service that listens on a socket. Apache passes the PHP execution requests to a particular PHP-FPM service depending on which version of PHP is required.
You can use mod_php for one version of PHP and PHP-FPM for the other(s) but I decided to drop mod_php altogether. First, I read somewhere that you can save some memory overhead by disabling mod_php. Second, the solution seemed a little cleaner with all versions of PHP being handled in the same way. Third, it is always better to have the least amount of/only the necessary software installed from a security perspective.
Change your
USE
flags fordev-lang/php
to addfpm
and removeapache2
.
Current Gentoo convention is to create a file like
/etc/portage/package.use/php
and specify theUSE
flags here. If you specify exact versions in the file, make sure all versions of PHP you want to use pick up the theseUSE
flags.
Install/reinstall the versions of PHP you are going to be using.
# emerge -av =dev-lang/php-7.2.3
# emerge -av =dev-lang/php-5.6.7
Change your
APACHE2_MODULES
variable to build theproxy
andproxy_fcgi
Apache modules.
You specify what Apache modules using by adding/updating the
APACHE2_MODULES
variable in/etc/portage/make.conf
. LikeUSE
flags, Gentoo has some defaults already set-up for your profile. UnlikeUSE
flags, it seems that you need to explicitly tell Gentoo to start with the defaults by prepending$APACHE2_MODULES
to the variable:
APACHE2_MODULES="$APACHE2_MODULES proxy proxy_fcgi"
- Reinstall Apache.
# emerge -av apache
- Install PHP-FPM.
# emerge -av php-fpm
Create PHP-FPM startup scripts for each version of PHP you are using with Apache.
The PHP-FPM installation creates a single startup script (
/etc/init.d/php-fpm
) that allows you to to choose the version of PHP to run usingeselect
or by changing the script's file name suffix (e.g.php-fpm-php5.6
,php-fpm-php7.2
, etc.). Since we would only want to useeselect
if we only wanted to use a single version of PHP at a time or if we wanted to use no more than two versions with mod_php for one and PHP-FPM for the second, we will use the suffix method. Instead of copying the script, we want to symlink it (valid suffixes are those directory names fromls -ld /usr/lib64/php*
e.g.php5.6
,php7.2
, etc.):
# cd /etc/init.d
# ln -s php-fpm php-fpm-php5.6
# ln -s php-fpm php-fpm-php7.2
Change the PHP-FPM configuration so that each PHP version's service runs on a different port.
The specific file names vary between versions but you want to edit a config file for each PHP version in these general locations:
/etc/php/fpm-php*/*.conf
so that thelisten
directive has a different port for each.
Configure PHP-FPM services to start.
# rc-update add php-fpm-php5.6 default
# rc-update add php-fpm-php7.2 default
# /etc/init.d/php-fpm-php5.6 start
# /etc/init.d/php-fpm-php7.2 start
Edit the Apache start-up configuration to enable proxy modules.
Edit
/etc/conf.d/apache2
to add-D PROXY
and remove-D PHP
fromAPACHE2_OPTS
.
Edit the Apache configuration to tie specific directory locations to specific instances of PHP-FPM.
There are many ways to handle this depending on your specific Apache configuration. I decided to edit the
<Directory>
entry associated with my web root so that the default PHP handler was version 7.2 by adding:
<FilesMatch .php$>
SetHandler "proxy:fcgi://127.0.0.1:9972" # <-- Note port num.
</FilesMatch>
With PHP 5.6 used only by exception, I added <Directory>
directives for each application that needed to use the old version of PHP:
<Directory /var/www/oldapp>
<FilesMatch .php$>
Sethandler "proxy:fcgi:/127.0.0.1:9956" # <-- Note diff port num.
</FilesMatch>
</Directory>
Add
index.php
as a valid directory index file.
In Gentoo
/etc/apache2/modules.d/70_mod_php.conf
includes a directive to addindex.php
as a directory index file in the same wayindex.html
usually is. Since we disabled mod_php in Step 9,70_mod_php.conf
no longer exists to set this up. To fix this, addDirectoryIndex index.php
to the Apache configuration. Otherwise, if you visit paths like/oldapp/
you will get a 403 error.
Restart Apache.
# /etc/init.d/apache restart
Other Notes
- If you set-up specific configuration settings in your
php.ini
file (e.g. max POST values, timezone, etc), you will need to set these in all of your/etc/php/fpm-php*/php.ini
files (for each version). - PHP-FPM defaults to running as
user=nobody
/group=nobody
. You may need to change these (in/etc/php/fpm-php*/php-fpm.conf
) to match whatever your web server is running. - To handle multiple virtual hosts, perform Steps 10 and 11 for each.
add a comment |
This answer is specifically for Gentoo with Profile 17. It will probably work with a few versions plus and minus. I used Red Hat's PHP Configuration Tips page for inspiration. The same idea should work for other Linux distributions (of course the specific commands will differ).
The solution is to use PHP-FPM (FastCGI Process Manager). Each version of PHP gets its own PHP-FPM service that listens on a socket. Apache passes the PHP execution requests to a particular PHP-FPM service depending on which version of PHP is required.
You can use mod_php for one version of PHP and PHP-FPM for the other(s) but I decided to drop mod_php altogether. First, I read somewhere that you can save some memory overhead by disabling mod_php. Second, the solution seemed a little cleaner with all versions of PHP being handled in the same way. Third, it is always better to have the least amount of/only the necessary software installed from a security perspective.
Change your
USE
flags fordev-lang/php
to addfpm
and removeapache2
.
Current Gentoo convention is to create a file like
/etc/portage/package.use/php
and specify theUSE
flags here. If you specify exact versions in the file, make sure all versions of PHP you want to use pick up the theseUSE
flags.
Install/reinstall the versions of PHP you are going to be using.
# emerge -av =dev-lang/php-7.2.3
# emerge -av =dev-lang/php-5.6.7
Change your
APACHE2_MODULES
variable to build theproxy
andproxy_fcgi
Apache modules.
You specify what Apache modules using by adding/updating the
APACHE2_MODULES
variable in/etc/portage/make.conf
. LikeUSE
flags, Gentoo has some defaults already set-up for your profile. UnlikeUSE
flags, it seems that you need to explicitly tell Gentoo to start with the defaults by prepending$APACHE2_MODULES
to the variable:
APACHE2_MODULES="$APACHE2_MODULES proxy proxy_fcgi"
- Reinstall Apache.
# emerge -av apache
- Install PHP-FPM.
# emerge -av php-fpm
Create PHP-FPM startup scripts for each version of PHP you are using with Apache.
The PHP-FPM installation creates a single startup script (
/etc/init.d/php-fpm
) that allows you to to choose the version of PHP to run usingeselect
or by changing the script's file name suffix (e.g.php-fpm-php5.6
,php-fpm-php7.2
, etc.). Since we would only want to useeselect
if we only wanted to use a single version of PHP at a time or if we wanted to use no more than two versions with mod_php for one and PHP-FPM for the second, we will use the suffix method. Instead of copying the script, we want to symlink it (valid suffixes are those directory names fromls -ld /usr/lib64/php*
e.g.php5.6
,php7.2
, etc.):
# cd /etc/init.d
# ln -s php-fpm php-fpm-php5.6
# ln -s php-fpm php-fpm-php7.2
Change the PHP-FPM configuration so that each PHP version's service runs on a different port.
The specific file names vary between versions but you want to edit a config file for each PHP version in these general locations:
/etc/php/fpm-php*/*.conf
so that thelisten
directive has a different port for each.
Configure PHP-FPM services to start.
# rc-update add php-fpm-php5.6 default
# rc-update add php-fpm-php7.2 default
# /etc/init.d/php-fpm-php5.6 start
# /etc/init.d/php-fpm-php7.2 start
Edit the Apache start-up configuration to enable proxy modules.
Edit
/etc/conf.d/apache2
to add-D PROXY
and remove-D PHP
fromAPACHE2_OPTS
.
Edit the Apache configuration to tie specific directory locations to specific instances of PHP-FPM.
There are many ways to handle this depending on your specific Apache configuration. I decided to edit the
<Directory>
entry associated with my web root so that the default PHP handler was version 7.2 by adding:
<FilesMatch .php$>
SetHandler "proxy:fcgi://127.0.0.1:9972" # <-- Note port num.
</FilesMatch>
With PHP 5.6 used only by exception, I added <Directory>
directives for each application that needed to use the old version of PHP:
<Directory /var/www/oldapp>
<FilesMatch .php$>
Sethandler "proxy:fcgi:/127.0.0.1:9956" # <-- Note diff port num.
</FilesMatch>
</Directory>
Add
index.php
as a valid directory index file.
In Gentoo
/etc/apache2/modules.d/70_mod_php.conf
includes a directive to addindex.php
as a directory index file in the same wayindex.html
usually is. Since we disabled mod_php in Step 9,70_mod_php.conf
no longer exists to set this up. To fix this, addDirectoryIndex index.php
to the Apache configuration. Otherwise, if you visit paths like/oldapp/
you will get a 403 error.
Restart Apache.
# /etc/init.d/apache restart
Other Notes
- If you set-up specific configuration settings in your
php.ini
file (e.g. max POST values, timezone, etc), you will need to set these in all of your/etc/php/fpm-php*/php.ini
files (for each version). - PHP-FPM defaults to running as
user=nobody
/group=nobody
. You may need to change these (in/etc/php/fpm-php*/php-fpm.conf
) to match whatever your web server is running. - To handle multiple virtual hosts, perform Steps 10 and 11 for each.
This answer is specifically for Gentoo with Profile 17. It will probably work with a few versions plus and minus. I used Red Hat's PHP Configuration Tips page for inspiration. The same idea should work for other Linux distributions (of course the specific commands will differ).
The solution is to use PHP-FPM (FastCGI Process Manager). Each version of PHP gets its own PHP-FPM service that listens on a socket. Apache passes the PHP execution requests to a particular PHP-FPM service depending on which version of PHP is required.
You can use mod_php for one version of PHP and PHP-FPM for the other(s) but I decided to drop mod_php altogether. First, I read somewhere that you can save some memory overhead by disabling mod_php. Second, the solution seemed a little cleaner with all versions of PHP being handled in the same way. Third, it is always better to have the least amount of/only the necessary software installed from a security perspective.
Change your
USE
flags fordev-lang/php
to addfpm
and removeapache2
.
Current Gentoo convention is to create a file like
/etc/portage/package.use/php
and specify theUSE
flags here. If you specify exact versions in the file, make sure all versions of PHP you want to use pick up the theseUSE
flags.
Install/reinstall the versions of PHP you are going to be using.
# emerge -av =dev-lang/php-7.2.3
# emerge -av =dev-lang/php-5.6.7
Change your
APACHE2_MODULES
variable to build theproxy
andproxy_fcgi
Apache modules.
You specify what Apache modules using by adding/updating the
APACHE2_MODULES
variable in/etc/portage/make.conf
. LikeUSE
flags, Gentoo has some defaults already set-up for your profile. UnlikeUSE
flags, it seems that you need to explicitly tell Gentoo to start with the defaults by prepending$APACHE2_MODULES
to the variable:
APACHE2_MODULES="$APACHE2_MODULES proxy proxy_fcgi"
- Reinstall Apache.
# emerge -av apache
- Install PHP-FPM.
# emerge -av php-fpm
Create PHP-FPM startup scripts for each version of PHP you are using with Apache.
The PHP-FPM installation creates a single startup script (
/etc/init.d/php-fpm
) that allows you to to choose the version of PHP to run usingeselect
or by changing the script's file name suffix (e.g.php-fpm-php5.6
,php-fpm-php7.2
, etc.). Since we would only want to useeselect
if we only wanted to use a single version of PHP at a time or if we wanted to use no more than two versions with mod_php for one and PHP-FPM for the second, we will use the suffix method. Instead of copying the script, we want to symlink it (valid suffixes are those directory names fromls -ld /usr/lib64/php*
e.g.php5.6
,php7.2
, etc.):
# cd /etc/init.d
# ln -s php-fpm php-fpm-php5.6
# ln -s php-fpm php-fpm-php7.2
Change the PHP-FPM configuration so that each PHP version's service runs on a different port.
The specific file names vary between versions but you want to edit a config file for each PHP version in these general locations:
/etc/php/fpm-php*/*.conf
so that thelisten
directive has a different port for each.
Configure PHP-FPM services to start.
# rc-update add php-fpm-php5.6 default
# rc-update add php-fpm-php7.2 default
# /etc/init.d/php-fpm-php5.6 start
# /etc/init.d/php-fpm-php7.2 start
Edit the Apache start-up configuration to enable proxy modules.
Edit
/etc/conf.d/apache2
to add-D PROXY
and remove-D PHP
fromAPACHE2_OPTS
.
Edit the Apache configuration to tie specific directory locations to specific instances of PHP-FPM.
There are many ways to handle this depending on your specific Apache configuration. I decided to edit the
<Directory>
entry associated with my web root so that the default PHP handler was version 7.2 by adding:
<FilesMatch .php$>
SetHandler "proxy:fcgi://127.0.0.1:9972" # <-- Note port num.
</FilesMatch>
With PHP 5.6 used only by exception, I added <Directory>
directives for each application that needed to use the old version of PHP:
<Directory /var/www/oldapp>
<FilesMatch .php$>
Sethandler "proxy:fcgi:/127.0.0.1:9956" # <-- Note diff port num.
</FilesMatch>
</Directory>
Add
index.php
as a valid directory index file.
In Gentoo
/etc/apache2/modules.d/70_mod_php.conf
includes a directive to addindex.php
as a directory index file in the same wayindex.html
usually is. Since we disabled mod_php in Step 9,70_mod_php.conf
no longer exists to set this up. To fix this, addDirectoryIndex index.php
to the Apache configuration. Otherwise, if you visit paths like/oldapp/
you will get a 403 error.
Restart Apache.
# /etc/init.d/apache restart
Other Notes
- If you set-up specific configuration settings in your
php.ini
file (e.g. max POST values, timezone, etc), you will need to set these in all of your/etc/php/fpm-php*/php.ini
files (for each version). - PHP-FPM defaults to running as
user=nobody
/group=nobody
. You may need to change these (in/etc/php/fpm-php*/php-fpm.conf
) to match whatever your web server is running. - To handle multiple virtual hosts, perform Steps 10 and 11 for each.
edited 1 hour ago
answered 1 hour ago
Steve KalemkiewiczSteve Kalemkiewicz
148116
148116
add a comment |
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f505980%2frunning-multiple-versions-of-php-using-apache-on-gentoo%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown