web-dev-qa-db-fra.com

Configuration de zz_overrides.ini dans Apache ou dans Nginx

Si vous travaillez avec Nginx et que vous souhaitez remplacer vos paramètres PHP à partir d'un fichier externe qui ne sera ni supprimé ni modifié dans les mises à jour, vous pouvez créer un /etc/php/*/fpm/zz_overrides.ini et placer votre PHP env change ici.

Lorsque j'ai travaillé avec Nginx, j'ai configuré zz_overrides.ini dans mon environnement en exécutant ce script:

#!/bin/bash

for dir in /etc/php/*/fpm/; do
    cat <<-"EOF" > "$dir"/zz_overrides.ini
        [PHP]
        post_max_size = 2000M
        upload_max_filesize = 2000M
        max_execution_time = 3000
    EOF
done

ln -s /etc/php/*/fpm/zz_overrides.ini /etc/php/*/fpm/conf.d/20-zz-overrides.ini
# Enable the above php.ini extension via a symlink in conf.d;

Maintenant, je suis retourné travailler avec Apache (dans lequel je n'ai jamais fait cette tâche et je pense que cela devrait être très différent là-bas en raison du manque d'utilisation de php-fpm, bien entendu).

Comment dois-je faire de même en écrasant dans Apache?

Nouveaux arrivants: notez que changer PHP.ini n'est pas efficace car il sera réécrit à chaque mise à jour).

3
JohnDoea

Dans Apache, vous pouvez utiliser les directives php_flag dans une configuration virtualhost (ou un fichier .htaccess dans le répertoire racine du document).

L'exemple suivant reproduit votre script actuel en créant un ./conf-available/$vhost/php_overrides.conf avec des directives de substitution php par virtualhost activé et insère (ou met à jour) une directive Include pointant sur ce fichier (les chemins sont de style Debian, s'adaptent à vos besoins). ):

Apache_confdir="${Apache_confdir:-/etc/Apache2}"
Apache_confavailable="${Apache_confdir}/conf-available"
overrides_name="php_overrides.conf"
overrides=(
"post_max_size = 2000M"
"upload_max_filesize 2000M"
"max_execution_time 3000"
)
# name of the directive under which the new Include directive will be placed
parentdirective_name="DocumentRoot"
parentdirective_re="^([[:space:]]*)(${parentdirective_name}[[:space:]]+.*)$"

oldpwd="$(pwd)"
cd ${Apache_confdir}/sites-enabled
for vhostconf in *.conf; do

   # construct and create/overwrite the per vhost php_overrides.conf file
   vhost_realpath="$(readlink -m "${vhostconf}")"
   vhost_realname="${vhost_realpath##*/}"
   vhost_name="${vhost_realname%*.conf}"
   vhost_confdir="${Apache_confavailable}/${vhost_name}"
   [[ ! -d "${vhost_confdir}" ]] && mkdir -p "${vhost_confdir}"

   vhost_overrides="${vhost_confdir}/${overrides_name}"
   printf "php_flag %s\n" "${overrides[@]}" > ${vhost_overrides}

   # construct and insert/update the Include directive
   printf -v includedirective "Include %s" "${vhost_overrides}"
   include_re="^([[:space:]]+Include[[:space:]]+${vhost_overrides})$"
   if grep -qE "${include_re}" "${vhostconf}"; then
       sed -i "s#${include_re}#    ${includedirective}#g" "${vhost_realpath}"
   else
       declare -a directives=()
       while IFS='' read line; do
           directives+=("${line}")
           if [[ "${line}" =~ ${parentdirective_re} ]]; then
               directives+=("${BASH_REMATCH[1]}${includedirective}")
           fi
       done<"${vhost_realpath}"
       printf "%s\n" "${directives[@]}" > "${vhost_realpath}"
   fi
done
cd "${oldpwd}"

Cependant, comme il semble que tous vos hôtes virtuels utilisent les mêmes PHP substitutions, il serait plus simple de créer un fichier ./conf-available/php_overrides.conf une fois, d'inclure la ligne suivante dans chaque configuration vhost, puis de créer ou supprime les liens symboliques dans ./conf-enabled pour contrôler s’il sera utilisé:

# inside /etc/Apache2/sites-available/vhost1
Include /etc/Apache2/conf-enabled/vhost1/*.conf

Donc pour l'utiliser:

cd /etc/Apache2/conf-enabled
mkdir vhost1
cd vhost1
ln -s /etc/Apache2/conf-available/php_overrides.conf

Pour arrêter de l'utiliser:

rm /etc/Apache2/conf-enabled/vhost1/php_overrides.conf
1
Ronald