MP08 - UF1: Servidors web i de transferència de fitxers
Apache i Nginx - Configuració php: Multiversió
Fixeu-vos bé que, en Apache, només podem tenir habilitat un mòdul de php en el nostre servidor web i que aquest és global per a tot el Site. Llavors, no puc tenir instal·lades altres versions de php per si el software (CSS) que vull instal·lar en necessita una altra?
La resposta a aquesta pregunta és: Sí que podem tenir diferents versions de php en el mateix servidor, però caldrà utilitzar el php-fpm (FastCGI Process Manager (FPM)). Alguns altres servidors web, com ara Nginx, només utilitzen aquest mètode.
Com funciona php en Apache?
Ara que ja hem treballat amb Apache sota el rol de servidor d'aplicacions entrarem en detall sobre com executa aquesta tasca. Recordem que les peticions HTTP arriben al servidor i aquest les ha de passar a un intèrpret del codi corresponent. En el nostre cas, PHP.
Això es fa a través del MPM (mòduls de multiprocessament).
En la instal·lació per defecte (servidor web convencional amb pàgines estàtiques) es treballa en mode event. Només cal tenir en compte que es van creant processos fill a mesura que arriben peticions i aquests les gestionen a través de diferents threads.
Si voleu consultar amb quin MPM treballa Apache en aquell moment sempre podeu llançar la següent comanda:
apache2ctl -V | grep MPM
Server MPM: prefork
Quan s'instal·la el mòdul de PHP, tal com hem fet fins ara, es passa a treballar amb el MPM prefork.
Es creen diferents processos independents per a gestionar les diferents peticions (tècnica de forking).
Quan arranca Apache en mode prefork es creen diversos processos fill i cadascun respon a una petició.
A /etc/apache2/mods-enabled
també sempre veureu el que està actiu, i on podreu fer el set up dels seus valors de configuració.
A /etc/apache2/mods-available
també sempre veureu els que podem activar, i on podreu fer el set up dels seus valors de configuració.
ls /etc/apache2/mods-available/*mpm*
/etc/apache2/mods-available/mpm_event.conf /etc/apache2/mods-available/mpm_prefork.load
/etc/apache2/mods-available/mpm_event.load /etc/apache2/mods-available/mpm_worker.conf
/etc/apache2/mods-available/mpm_prefork.conf /etc/apache2/mods-available/mpm_worker.load
Treballar amb el mod_php
dins Apache vol dir que es crea un manipulador (handler) que és qui gestiona els fitxers amb extensió php
i els passa al motor de PHP perquè siguin interpretats.
Això implica que PHP s'executa com a mòdul dins Apache, de forma que no es criden processos externs i proporciona major agilitat i major rendiment, ja que per cada fill d'Apache es carrega en memòria una instància de PHP.
Per contra això consumeix normalment més recursos dels realment necessaris. De totes maneres podem treballar amb PHP d'una altra manera.
Inicialment, va sorgir el concepte de CGI (Common Getaway Interface), i permet interactuar Apache amb programes externs. Cada petició de PHP inicia un procés d'execució independent que es tanca quan s'acaba l'execució. Això proporciona eficiència en recursos, però perjudica el rendiment. Actualment està en desús, la implementació actual és FastCGI.
FastCGI manté la connexió oberta de forma persistent i, per tant, no es tanca un cop acaba el procés que la va obrir.
Ens ajuda a tenir diferents versions de PHP per atendre les peticions d'Apache, fet que soluciona el gran inconvenient de treballar amb mod_php
.
A més, ens proporciona un altre gran avantatge: ja no cal que PHP i Apache estiguin executant-se a la mateixa màquina, podem comunicar-nos via TCP/IP.
Arran d'aquest comportament, neix FPM (FastCGI Process Manager)
És una implementació millorada i específica del FastCGI per aconseguir un millor rendiment en entorns web.
FPM presenta grans avantatges com ara permetre múltiples versions de PHP al mateix servidor.
A més permet personalitzar molts paràmetres de configuració i executar un millor control de processos.
Per contra, la seva configuració és relativament complexa.
De cara a la programació web, el gran avantatge és la capacitat d'executar un mateix site sota dues o més versions diferents de PHP.
Permet fer un desenvolupament o adaptació (un mòdul, template, nova funcionalitat per exemple) en paral·lel sense afectar la pàgina en producció.
També es pot definir un fitxer php.ini
particular per cada site.
En el món actual, cap a la virtualització en contenidors, és extremadament útil per tal de dedicar tantes instàncies com siguin necessàries per site sense afectar a la resta.
Passa el mateix des del punt de vista de la seguretat, ja que cada execució de PHP s'executa en un entorn aïllat.
Configuració
Tant en Apache com en Nginx, cal saber quina versió de php necessitem. En Nginx, si volem instal·lar la darrera, ja podem fer-ho directament, ara bé, si volem una versió diferent de la que se'ns instal·la per defecte, cal afegir un nou repositori de cerca pel php.
sudo apt update
sudo apt-cache policy php
php:
Instal·lat: (cap)
Candidat: 2:8.1+92ubuntu1
Taula de versions:
2:8.1+92ubuntu1 500
500 http://gb.archive.ubuntu.com/ubuntu jammy/main amd64 Packages
Com podem veure, per defecte ens instal·larà la versió 8.1
Si volem instal·lar aquesta, ja podem fer-ho
sudo apt install -y php php-fpm
Possible sortida
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 |
|
COMPTE: aquesta prova està feta en un servidor amb Nginx i m'ha instal·lat l'Apache
Per desinstal·lar el servidor Apache podem executar
sudo apt remove --purge apache2 libapache2-mod-php8.1
sudo apt -y auto-remove
Si volem instal·lar una nova versió diferent de php, ho farem abans d'activar l'FPM. Per mostar-ho bé, el que farem serà instal·lar una versió anterior de php, la versió 7.4.
Comprovem la versió que ens vol instal·lar...
sudo apt-cache policy php7.4
libapache2-mod-php7.4:
Instal·lat: (cap)
Candidat: 8.1.2-1ubuntu2.18
Taula de versions:
8.1.2-1ubuntu2.18 500
500 http://gb.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages
500 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 Packages
8.1.2-1ubuntu2 500
500 http://gb.archive.ubuntu.com/ubuntu jammy/universe amd64 Packages
php7.4-fpm:
Instal·lat: (cap)
Candidat: (cap)
Taula de versions:
php7.4-common:
Instal·lat: (cap)
Candidat: (cap)
Taula de versions:
No hi ha cap altra versió de php disponible per a ser instal·lada
Abans de fer la instal·lació, cal afegir el repositori de php (Ondrej PHP
) al sistema. Ho farem de la següent forma:
En l'executar la comanda
sudo add-apt-repository ppa:ondrej/php
Premerem Control + C
, ja que ens avisa que, segons el servidor web que estiguem utilitzant, instal·lem un o un altre repositori
Avís que ens mostra sobre el servidor i el repositori
PPA publishes dbgsym, you may need to include 'main/debug' component
Repository: 'deb https://ppa.launchpadcontent.net/ondrej/php/ubuntu/ jammy main'
Description:
Co-installable PHP versions: PHP 5.6, PHP 7.x, PHP 8.x and most requested extensions are included. Only Supported Ubuntu Releases (https://wiki.ubuntu.com/Releases) are provided.
Debian oldstable and stable packages are provided as well: https://deb.sury.org/#debian-dpa
You can get more information about the packages at https://deb.sury.org
BUGS&FEATURES: This PPA now has a issue tracker:
https://deb.sury.org/#bug-reporting
CAVEATS:
1. If you are using php-gearman, you need to add ppa:ondrej/pkg-gearman
2. If you are using apache2, you are advised to add ppa:ondrej/apache2
3. If you are using nginx, you are advised to add ppa:ondrej/nginx-mainline
or ppa:ondrej/nginx
PLEASE READ: If you like my work and want to give me a little motivation, please consider donating regularly: https://donate.sury.org/
WARNING: add-apt-repository is broken with non-UTF-8 locales, see
https://github.com/oerdnj/deb.sury.org/issues/56 for workaround:
# LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php
More info: https://launchpad.net/~ondrej/+archive/ubuntu/php
Adding repository.
Press [ENTER] to continue or Ctrl-c to cancel.
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo add-apt-repository ppa:ondrej/apache2
sudo apt-get update -y
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo add-apt-repository ppa:ondrej/nginx-mainline
sudo apt-get update -y
Ara ja tenim més versions per a instal·lar: 5.6, 7.1, 7.2, 7.3 i 7.4.
isard@ubuntu:~$ sudo apt-cache policy php7.4
php7.4:
Instal·lat: (cap)
Candidat: 1:7.4.33-13+ubuntu22.04.1+deb.sury.org+1
Taula de versions:
1:7.4.33-13+ubuntu22.04.1+deb.sury.org+1 500
500 https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy/main amd64 Packages
isard@ubuntu:~$ sudo apt-cache policy php7.3
php7.3:
Instal·lat: (cap)
Candidat: 7.3.33-19+ubuntu22.04.1+deb.sury.org+1
Taula de versions:
7.3.33-19+ubuntu22.04.1+deb.sury.org+1 500
500 https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy/main amd64 Packages
isard@ubuntu:~$ sudo apt-cache policy php7.2
php7.2:
Instal·lat: (cap)
Candidat: 7.2.34-50+ubuntu22.04.1+deb.sury.org+1
Taula de versions:
7.2.34-50+ubuntu22.04.1+deb.sury.org+1 500
500 https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy/main amd64 Packages
isard@ubuntu:~$ sudo apt-cache policy php7.1
php7.1:
Instal·lat: (cap)
Candidat: 7.1.33-63+ubuntu22.04.1+deb.sury.org+1
Taula de versions:
7.1.33-63+ubuntu22.04.1+deb.sury.org+1 500
500 https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy/main amd64 Packages
isard@ubuntu:~$ sudo apt-cache policy php5.6
php5.6:
Instal·lat: (cap)
Candidat: 5.6.40-77+ubuntu22.04.1+deb.sury.org+1
Taula de versions:
5.6.40-77+ubuntu22.04.1+deb.sury.org+1 500
500 https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy/main amd64 Packages
Per tant, farem la instal·lació de la versió que vulguem. Provarem la 7.4
sudo apt install -y php7.4 php7.4-fpm libapache2-mod-php7.4 libapache2-mod-fcgid
i al final ens avisa ...
Creating config file /etc/php/7.4/fpm/php.ini with new version
NOTICE: Not enabling PHP 7.4 FPM by default.
NOTICE: To enable PHP 7.4 FPM in Apache2 do:
NOTICE: a2enmod proxy_fcgi setenvif
NOTICE: a2enconf php7.4-fpm
NOTICE: You are seeing this message because you have apache2 package installed.
Created symlink /etc/systemd/system/multi-user.target.wants/php7.4-fpm.service → /lib/systemd/system/php7.4-fpm.service.
S'està configurant php7.4 (1:7.4.33-13+ubuntu22.04.1+deb.sury.org+1)…
S'estan processant els activadors per a man-db (2.10.2-1)…
S'estan processant els activadors per a php7.4-cli (1:7.4.33-13+ubuntu22.04.1+deb.sury.org+1)…
S'estan processant els activadors per a libapache2-mod-php7.4 (1:7.4.33-13+ubuntu22.04.1+deb.sury.org+1)…
S'estan processant els activadors per a php7.4-fpm (1:7.4.33-13+ubuntu22.04.1+deb.sury.org+1)…
NOTICE: Not enabling PHP 7.4 FPM by default.
NOTICE: To enable PHP 7.4 FPM in Apache2 do:
NOTICE: a2enmod proxy_fcgi setenvif
NOTICE: a2enconf php7.4-fpm
NOTICE: You are seeing this message because you have apache2 package installed.
Scanning processes...
Scanning linux images...
Running kernel seems to be up-to-date.
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
sudo a2enmod proxy_fcgi
sudo systemctl start php7.4-fpm
sudo apt install -y php7.4 php7.4-fpm
i al final ens avisa ...
Creating config file /etc/php/7.4/fpm/php.ini with new version
Created symlink /etc/systemd/system/multi-user.target.wants/php7.4-fpm.service → /lib/systemd/system/php7.4-fpm.service.
S'està configurant php7.4 (1:7.4.33-13+ubuntu22.04.1+deb.sury.org+1)…
S'estan processant els activadors per a man-db (2.10.2-1)…
S'estan processant els activadors per a php7.4-cli (1:7.4.33-13+ubuntu22.04.1+deb.sury.org+1)…
S'estan processant els activadors per a php7.4-fpm (1:7.4.33-13+ubuntu22.04.1+deb.sury.org+1)…
Scanning processes...
Scanning linux images...
Running kernel seems to be up-to-date.
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
Reiniciem el servidor fpm
sudo systemctl start php7.4-fpm
Fixeu-vos que tenim un nou Servei anomenat php7.4-fpm
Ara ja podem crear un nou lloc virtual afegint-hi les següents línies
<FilesMatch \.php$>
# From the Apache version 2.4.10 and above, use the SetHandler to run PHP as a fastCGI process server
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
Reiniciem el servidor i provem el info.php de cada site.
Hem configurat diferents versions de php
pel lloc per defecte i pel hosting virtual.
Ara ja podem crear un nou lloc virtual, o al que tenim per defecte, afegint-hi les següents línies o descomentant les que ja incorpora el mateix fixer default
.
location ~ \.php$ {
include snippets/fastcgi-php.conf;
#
# With php-fpm (or other unix sockets):
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
# With php-cgi (or other tcp sockets):
#fastcgi_pass 127.0.0.1:9000;
}
Reiniciem el servidor i provem el info.php de cada site.
Hem configurat diferents versions de php
pel lloc per defecte i pel hosting virtual.