在 Apache 和 Nginx 中配置 zz_overrides.ini

在 Apache 和 Nginx 中配置 zz_overrides.ini

如果您使用 Nginx,并且想要从不会在更新中被删除或更改的外部文件覆盖您的 PHP 设置,您可以创建一个/etc/php/*/fpm/zz_overrides.ini并将您的 PHP 环境更改放在那里。

当我使用 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 本身是无效的,因为它会在每次升级时被重写)

答案1

在 Apache 中,您可以php_flag在虚拟主机配置(或.htaccess文档根目录中的文件)中使用指令。

以下示例模拟您当前的脚本,通过./conf-available/$vhost/php_overrides.conf为每个启用的虚拟主机创建一个带有 php 覆盖指令的脚本并插入(或更新)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}"

./conf-available/php_overrides.conf但是,由于看起来所有虚拟主机都使用相同的 PHP 覆盖,因此只需创建一次文件,在每个 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

相关内容