web-dev-qa-db-ja.com

ApacheとNginxでzz_overrides.iniを構成する

Nginxを使用していて、更新時に削除または変更されない外部ファイルのPHP設定をオーバーライドする場合は、/etc/php/*/fpm/zz_overrides.iniを作成してPHP envはそこで変更します。

Nginxで作業したとき、次のスクリプトを実行して、環境でzz_overrides.iniを構成しました。

#!/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;

さて、私はApacheでの作業に戻りました(そのタスクを実行したことはありません。当然、php-fpmの使用率が低いため、そこではまったく異なるはずです)。

Apacheで同様のオーバーライドを行うにはどうすればよいですか?

初心者:PHP.ini自体の変更は、アップグレードのたびに書き換えられるため、効果的ではないことに注意してください)

3
JohnDoea

Apacheでは、仮想ホスト構成内でphp_flagディレクティブ(またはドキュメントルートディレクトリ内で.htaccessファイル)を使用できます。

次の例は、有効な仮想ホストごとにphpオーバーライドディレクティブを使用して./conf-available/$vhost/php_overrides.confを作成し、そのファイルを指すIncludeディレクティブを挿入して、現在のスクリプトを模倣します(パスはDebianスタイルで、ニーズに合わせて調整します) ):

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}"

ただし、すべての仮想ホストが同じPHPオーバーライドを使用しているように見えるため、ファイル./conf-available/php_overrides.confを一度作成し、各vhost構成に次の行を含めてから、作成または./conf-enabledのシンボリックリンクを削除して、使用するかどうかを制御します。

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

それを使用するには:

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

使用を停止するには:

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