Gestion du multi-instances
Créer le dossier dédié à l’instance
Créez un dossier dédié à l’instance dans l’arborescence du serveur, par exemple /var/www/app/instancename
, puis créez les fichiers nécessaires pour assurer la séparation des instances :
# Dossier contenant le code de l'application
APP=/var/www/app
# Dossier comprenant les paramètres spécifiques de l'instance
FOLDER="/var/www/instances/instancename"
mkdir -P $FOLDER
chmod g+r $FOLDER
cd $FOLDER
mkdir temp
# Nouvelles cles cryptographiques
openssl genpkey -algorithm rsa -out id_app -pkeyopt rsa_keygen_bits:2048
openssl rsa -in id_app -pubout -out id_app.pub
# Recopie du fichier de parametrage
cp $APP/env .env
# Mise à niveau des droits
chmod -R g+r .
chmod g+w temp
chown www-data id_app
le dossier temp est le dossier dans lequel l’application va générer tous les fichiers avant leur envoi au navigateur. Pour éviter les risques de collision entre deux instances, il est vivement recommandé que chacune dispose de son propre espace.
Mettre à niveau du site virtuel Apache
Rajoutez, dans la description du site virtuel (fichier moninstance.conf
, dans /etc/apache2/sites-available
) :
<VirtualHost *:443>
(...) /var/www/app
DocumentRoot envPath /var/www/instances/instancename
setenv (...)
Modifier les paramètres
Éditez le fichier /var/www/instances/instancename/.env
:
app.baseURL = 'https://myinstance.mysociety.com'
BASE_DIR = "/var/www/instances/instancename"
app.privateKey = ${BASE_DIR}/id_app
app.pubKey = ${BASE_DIR}/id_app.pub
app.APP_temp = ${BASE_DIR}/temp
database.default.hostname = localhost
database.default.database = dbname_instance
database.default.username = login_instance
database.default.password = password_instance
Vérifiez également le mode d’identification par défaut, et adaptez-le le cas échéant.
Adapter les scripts lancés en ligne de commande
Si vous utilisez des scripts qui sont exécutés en ligne de commande, par exemple programmés à horaires réguliers (crontab), vous devrez modifier le script de lancement :
#!/bin/bash
export envPath=/var/www/instances/instancename
cd $envPath/public
php index.php monscript
où monscript correspond à la route à appeler.
La variable envPath
est disponible dans $_SERVER
.
Technique : modifications apportées au code pour gérer le multi-instances
La fin du fichier index.php est modifié ainsi :
//exit(CodeIgniter\Boot::bootWeb($paths));
require FCPATH. '../vendor/equinton/ppci/src/BootApp.php';
exit (CodeIgniter\BootApp::bootweb($paths));
Et la classe BootApp
contient ce code :
<?php
namespace CodeIgniter;
use CodeIgniter\Boot;
use Config\Paths;
use CodeIgniter\Config\DotEnv;
class BootApp extends Boot {
protected static function loadDotEnv(Paths $paths): void
{require_once $paths->systemDirectory . '/Config/DotEnv.php';
if (is_file($file = $_SERVER["envPath"] . DIRECTORY_SEPARATOR . ".env") && is_readable($file)) {
new DotEnv($_SERVER["envPath"],".env"))->load();
(else {
} new DotEnv($paths->appDirectory . '/../'))->load();
(
}
} }
Attention : l’utilisation d’un fichier .env placé ailleurs qu’à la racine de l’application empêche le fonctionnement des outils de débogage de CodeIgniter (mode développement).