dimti
2 years ago
10 changed files with 705 additions and 2 deletions
-
4anygroup.yml
-
4requirements.yml
-
32roles/nginx/tasks/files/20-envsubst-on-templates.sh
-
188roles/nginx/tasks/files/30-tune-worker-processes.sh
-
30roles/nginx/tasks/main.yml
-
69roles/php/files/docker-php-ext-configure
-
121roles/php/files/docker-php-ext-enable
-
143roles/php/files/docker-php-ext-install
-
34roles/php/files/docker-php-source
-
82roles/php/tasks/main.yml
@ -1,8 +1,8 @@ |
|||||
--- |
--- |
||||
- hosts: debian10 |
- hosts: debian10 |
||||
roles: |
roles: |
||||
- common |
|
||||
- anyrole |
|
||||
|
- nginx |
||||
|
- php |
||||
|
|
||||
# Associate further roles to servers in specific group in this file... |
# Associate further roles to servers in specific group in this file... |
||||
|
|
||||
|
@ -0,0 +1,4 @@ |
|||||
|
--- |
||||
|
collections: |
||||
|
- name: nginxinc.nginx_core |
||||
|
version: 0.8.0 |
@ -0,0 +1,32 @@ |
|||||
|
#!/bin/sh |
||||
|
|
||||
|
set -e |
||||
|
|
||||
|
ME=$(basename $0) |
||||
|
|
||||
|
auto_envsubst() { |
||||
|
local template_dir="${NGINX_ENVSUBST_TEMPLATE_DIR:-/etc/nginx/templates}" |
||||
|
local suffix="${NGINX_ENVSUBST_TEMPLATE_SUFFIX:-.template}" |
||||
|
local output_dir="${NGINX_ENVSUBST_OUTPUT_DIR:-/etc/nginx/conf.d}" |
||||
|
|
||||
|
local template defined_envs relative_path output_path subdir |
||||
|
defined_envs=$(printf '${%s} ' $(env | cut -d= -f1)) |
||||
|
[ -d "$template_dir" ] || return 0 |
||||
|
if [ ! -w "$output_dir" ]; then |
||||
|
echo >&3 "$ME: ERROR: $template_dir exists, but $output_dir is not writable" |
||||
|
return 0 |
||||
|
fi |
||||
|
find "$template_dir" -follow -type f -name "*$suffix" -print | while read -r template; do |
||||
|
relative_path="${template#$template_dir/}" |
||||
|
output_path="$output_dir/${relative_path%$suffix}" |
||||
|
subdir=$(dirname "$relative_path") |
||||
|
# create a subdirectory where the template file exists |
||||
|
mkdir -p "$output_dir/$subdir" |
||||
|
echo >&3 "$ME: Running envsubst on $template to $output_path" |
||||
|
envsubst "$defined_envs" < "$template" > "$output_path" |
||||
|
done |
||||
|
} |
||||
|
|
||||
|
auto_envsubst |
||||
|
|
||||
|
exit 0 |
@ -0,0 +1,188 @@ |
|||||
|
#!/bin/sh |
||||
|
# vim:sw=2:ts=2:sts=2:et |
||||
|
|
||||
|
set -eu |
||||
|
|
||||
|
LC_ALL=C |
||||
|
ME=$( basename "$0" ) |
||||
|
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin |
||||
|
|
||||
|
[ "${NGINX_ENTRYPOINT_WORKER_PROCESSES_AUTOTUNE:-}" ] || exit 0 |
||||
|
|
||||
|
touch /etc/nginx/nginx.conf 2>/dev/null || { echo >&2 "$ME: error: can not modify /etc/nginx/nginx.conf (read-only file system?)"; exit 0; } |
||||
|
|
||||
|
ceildiv() { |
||||
|
num=$1 |
||||
|
div=$2 |
||||
|
echo $(( (num + div - 1) / div )) |
||||
|
} |
||||
|
|
||||
|
get_cpuset() { |
||||
|
cpusetroot=$1 |
||||
|
cpusetfile=$2 |
||||
|
ncpu=0 |
||||
|
[ -f "$cpusetroot/$cpusetfile" ] || return 1 |
||||
|
for token in $( tr ',' ' ' < "$cpusetroot/$cpusetfile" ); do |
||||
|
case "$token" in |
||||
|
*-*) |
||||
|
count=$( seq $(echo "$token" | tr '-' ' ') | wc -l ) |
||||
|
ncpu=$(( ncpu+count )) |
||||
|
;; |
||||
|
*) |
||||
|
ncpu=$(( ncpu+1 )) |
||||
|
;; |
||||
|
esac |
||||
|
done |
||||
|
echo "$ncpu" |
||||
|
} |
||||
|
|
||||
|
get_quota() { |
||||
|
cpuroot=$1 |
||||
|
ncpu=0 |
||||
|
[ -f "$cpuroot/cpu.cfs_quota_us" ] || return 1 |
||||
|
[ -f "$cpuroot/cpu.cfs_period_us" ] || return 1 |
||||
|
cfs_quota=$( cat "$cpuroot/cpu.cfs_quota_us" ) |
||||
|
cfs_period=$( cat "$cpuroot/cpu.cfs_period_us" ) |
||||
|
[ "$cfs_quota" = "-1" ] && return 1 |
||||
|
[ "$cfs_period" = "0" ] && return 1 |
||||
|
ncpu=$( ceildiv "$cfs_quota" "$cfs_period" ) |
||||
|
[ "$ncpu" -gt 0 ] || return 1 |
||||
|
echo "$ncpu" |
||||
|
} |
||||
|
|
||||
|
get_quota_v2() { |
||||
|
cpuroot=$1 |
||||
|
ncpu=0 |
||||
|
[ -f "$cpuroot/cpu.max" ] || return 1 |
||||
|
cfs_quota=$( cut -d' ' -f 1 < "$cpuroot/cpu.max" ) |
||||
|
cfs_period=$( cut -d' ' -f 2 < "$cpuroot/cpu.max" ) |
||||
|
[ "$cfs_quota" = "max" ] && return 1 |
||||
|
[ "$cfs_period" = "0" ] && return 1 |
||||
|
ncpu=$( ceildiv "$cfs_quota" "$cfs_period" ) |
||||
|
[ "$ncpu" -gt 0 ] || return 1 |
||||
|
echo "$ncpu" |
||||
|
} |
||||
|
|
||||
|
get_cgroup_v1_path() { |
||||
|
needle=$1 |
||||
|
found= |
||||
|
foundroot= |
||||
|
mountpoint= |
||||
|
|
||||
|
[ -r "/proc/self/mountinfo" ] || return 1 |
||||
|
[ -r "/proc/self/cgroup" ] || return 1 |
||||
|
|
||||
|
while IFS= read -r line; do |
||||
|
case "$needle" in |
||||
|
"cpuset") |
||||
|
case "$line" in |
||||
|
*cpuset*) |
||||
|
found=$( echo "$line" | cut -d ' ' -f 4,5 ) |
||||
|
break |
||||
|
;; |
||||
|
esac |
||||
|
;; |
||||
|
"cpu") |
||||
|
case "$line" in |
||||
|
*cpuset*) |
||||
|
;; |
||||
|
*cpu,cpuacct*|*cpuacct,cpu|*cpuacct*|*cpu*) |
||||
|
found=$( echo "$line" | cut -d ' ' -f 4,5 ) |
||||
|
break |
||||
|
;; |
||||
|
esac |
||||
|
esac |
||||
|
done << __EOF__ |
||||
|
$( grep -F -- '- cgroup ' /proc/self/mountinfo ) |
||||
|
__EOF__ |
||||
|
|
||||
|
while IFS= read -r line; do |
||||
|
controller=$( echo "$line" | cut -d: -f 2 ) |
||||
|
case "$needle" in |
||||
|
"cpuset") |
||||
|
case "$controller" in |
||||
|
cpuset) |
||||
|
mountpoint=$( echo "$line" | cut -d: -f 3 ) |
||||
|
break |
||||
|
;; |
||||
|
esac |
||||
|
;; |
||||
|
"cpu") |
||||
|
case "$controller" in |
||||
|
cpu,cpuacct|cpuacct,cpu|cpuacct|cpu) |
||||
|
mountpoint=$( echo "$line" | cut -d: -f 3 ) |
||||
|
break |
||||
|
;; |
||||
|
esac |
||||
|
;; |
||||
|
esac |
||||
|
done << __EOF__ |
||||
|
$( grep -F -- 'cpu' /proc/self/cgroup ) |
||||
|
__EOF__ |
||||
|
|
||||
|
case "${found%% *}" in |
||||
|
"/") |
||||
|
foundroot="${found##* }$mountpoint" |
||||
|
;; |
||||
|
"$mountpoint") |
||||
|
foundroot="${found##* }" |
||||
|
;; |
||||
|
esac |
||||
|
echo "$foundroot" |
||||
|
} |
||||
|
|
||||
|
get_cgroup_v2_path() { |
||||
|
found= |
||||
|
foundroot= |
||||
|
mountpoint= |
||||
|
|
||||
|
[ -r "/proc/self/mountinfo" ] || return 1 |
||||
|
[ -r "/proc/self/cgroup" ] || return 1 |
||||
|
|
||||
|
while IFS= read -r line; do |
||||
|
found=$( echo "$line" | cut -d ' ' -f 4,5 ) |
||||
|
done << __EOF__ |
||||
|
$( grep -F -- '- cgroup2 ' /proc/self/mountinfo ) |
||||
|
__EOF__ |
||||
|
|
||||
|
while IFS= read -r line; do |
||||
|
mountpoint=$( echo "$line" | cut -d: -f 3 ) |
||||
|
done << __EOF__ |
||||
|
$( grep -F -- '0::' /proc/self/cgroup ) |
||||
|
__EOF__ |
||||
|
|
||||
|
case "${found%% *}" in |
||||
|
"") |
||||
|
return 1 |
||||
|
;; |
||||
|
"/") |
||||
|
foundroot="${found##* }$mountpoint" |
||||
|
;; |
||||
|
"$mountpoint") |
||||
|
foundroot="${found##* }" |
||||
|
;; |
||||
|
esac |
||||
|
echo "$foundroot" |
||||
|
} |
||||
|
|
||||
|
ncpu_online=$( getconf _NPROCESSORS_ONLN ) |
||||
|
ncpu_cpuset= |
||||
|
ncpu_quota= |
||||
|
ncpu_cpuset_v2= |
||||
|
ncpu_quota_v2= |
||||
|
|
||||
|
cpuset=$( get_cgroup_v1_path "cpuset" ) && ncpu_cpuset=$( get_cpuset "$cpuset" "cpuset.effective_cpus" ) || ncpu_cpuset=$ncpu_online |
||||
|
cpu=$( get_cgroup_v1_path "cpu" ) && ncpu_quota=$( get_quota "$cpu" ) || ncpu_quota=$ncpu_online |
||||
|
cgroup_v2=$( get_cgroup_v2_path ) && ncpu_cpuset_v2=$( get_cpuset "$cgroup_v2" "cpuset.cpus.effective" ) || ncpu_cpuset_v2=$ncpu_online |
||||
|
cgroup_v2=$( get_cgroup_v2_path ) && ncpu_quota_v2=$( get_quota_v2 "$cgroup_v2" ) || ncpu_quota_v2=$ncpu_online |
||||
|
|
||||
|
ncpu=$( printf "%s\n%s\n%s\n%s\n%s\n" \ |
||||
|
"$ncpu_online" \ |
||||
|
"$ncpu_cpuset" \ |
||||
|
"$ncpu_quota" \ |
||||
|
"$ncpu_cpuset_v2" \ |
||||
|
"$ncpu_quota_v2" \ |
||||
|
| sort -n \ |
||||
|
| head -n 1 ) |
||||
|
|
||||
|
sed -i.bak -r 's/^(worker_processes)(.*)$/# Commented out by '"$ME"' on '"$(date)"'\n#\1\2\n\1 '"$ncpu"';/' /etc/nginx/nginx.conf |
@ -0,0 +1,30 @@ |
|||||
|
--- |
||||
|
- name: Set ENV vars |
||||
|
lineinfile: |
||||
|
dest: ~/.bashrc |
||||
|
line: "{{item}}" |
||||
|
loop: |
||||
|
- 'export NGINX_VERSION="1.21.3"' |
||||
|
- 'export NJS_VERSION="0.6.2"' |
||||
|
- 'export PKG_RELEASE="1~buster"' |
||||
|
|
||||
|
- name: Install gnupg |
||||
|
shell: apt-get update && apt-get install --no-install-recommends --no-install-suggests -y gnupg1 gnupg2 gnupg ca-certificates |
||||
|
|
||||
|
- name: Install nginx |
||||
|
environment: |
||||
|
NGINX_GPGKEY: 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 |
||||
|
shell: >- |
||||
|
set -x && addgroup --system --gid 101 nginx && adduser --system --disabled-login --ingroup nginx --no-create-home --home /nonexistent --gecos "nginx user" --shell /bin/false --uid 101 nginx && found=''; for server in ha.pool.sks-keyservers.net hkp://keyserver.ubuntu.com:80 hkp://p80.pool.sks-keyservers.net:80 pgp.mit.edu ; do echo "Fetching GPG key $NGINX_GPGKEY from $server"; apt-key adv --keyserver "$server" --keyserver-options timeout=10 --recv-keys "$NGINX_GPGKEY" && found=yes && break; done; test -z "$found" && echo >&2 "error: failed to fetch GPG key $NGINX_GPGKEY" && exit 1; apt-get remove --purge --auto-remove -y gnupg1 && rm -rf /var/lib/apt/lists/* && dpkgArch="$(dpkg --print-architecture)" && nginxPackages=" nginx=${NGINX_VERSION}-${PKG_RELEASE} nginx-module-xslt=${NGINX_VERSION}-${PKG_RELEASE} nginx-module-geoip=${NGINX_VERSION}-${PKG_RELEASE} nginx-module-image-filter=${NGINX_VERSION}-${PKG_RELEASE} nginx-module-njs=${NGINX_VERSION}+${NJS_VERSION}-${PKG_RELEASE} " && case "$dpkgArch" in amd64|i386|arm64) echo "deb https://nginx.org/packages/mainline/debian/ buster nginx" >> /etc/apt/sources.list.d/nginx.list && apt-get update ;; *) echo "deb-src https://nginx.org/packages/mainline/debian/ buster nginx" >> /etc/apt/sources.list.d/nginx.list && tempDir="$(mktemp -d)" && chmod 777 "$tempDir" && savedAptMark="$(apt-mark showmanual)" && apt-get update && apt-get build-dep -y $nginxPackages && ( cd "$tempDir" && DEB_BUILD_OPTIONS="nocheck parallel=$(nproc)" apt-get source --compile $nginxPackages ) && apt-mark showmanual | xargs apt-mark auto > /dev/null && { [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; } && ls -lAFh "$tempDir" && ( cd "$tempDir" && dpkg-scanpackages . > Packages ) && grep '^Package: ' "$tempDir/Packages" && echo "deb [ trusted=yes ] file://$tempDir ./" > /etc/apt/sources.list.d/temp.list && apt-get -o Acquire::GzipIndexes=false update ;; esac && apt-get install --no-install-recommends --no-install-suggests -y $nginxPackages gettext-base curl && apt-get remove --purge --auto-remove -y && rm -rf /var/lib/apt/lists/* /etc/apt/sources.list.d/nginx.list && if [ -n "$tempDir" ]; then apt-get purge -y --auto-remove && rm -rf "$tempDir" /etc/apt/sources.list.d/temp.list; fi && ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log |
||||
|
|
||||
|
- name: Create dir for additional helper scripts /docker-entrypoint.d |
||||
|
shell: mkdir -p /docker-entrypoint.d |
||||
|
|
||||
|
- name: Copy envsubst and tune worker to /docker-entrypoint.d |
||||
|
copy: |
||||
|
src: "{{item}}" |
||||
|
dest: /docker-entrypoint.d |
||||
|
mode: 0744 |
||||
|
loop: |
||||
|
- 20-envsubst-on-templates.sh |
||||
|
- 30-tune-worker-processes.sh |
@ -0,0 +1,69 @@ |
|||||
|
#!/bin/sh |
||||
|
set -e |
||||
|
|
||||
|
# prefer user supplied CFLAGS, but default to our PHP_CFLAGS |
||||
|
: ${CFLAGS:=$PHP_CFLAGS} |
||||
|
: ${CPPFLAGS:=$PHP_CPPFLAGS} |
||||
|
: ${LDFLAGS:=$PHP_LDFLAGS} |
||||
|
export CFLAGS CPPFLAGS LDFLAGS |
||||
|
|
||||
|
srcExists= |
||||
|
if [ -d /usr/src/php ]; then |
||||
|
srcExists=1 |
||||
|
fi |
||||
|
docker-php-source extract |
||||
|
if [ -z "$srcExists" ]; then |
||||
|
touch /usr/src/php/.docker-delete-me |
||||
|
fi |
||||
|
|
||||
|
cd /usr/src/php/ext |
||||
|
|
||||
|
usage() { |
||||
|
echo "usage: $0 ext-name [configure flags]" |
||||
|
echo " ie: $0 gd --with-jpeg-dir=/usr/local/something" |
||||
|
echo |
||||
|
echo 'Possible values for ext-name:' |
||||
|
find . \ |
||||
|
-mindepth 2 \ |
||||
|
-maxdepth 2 \ |
||||
|
-type f \ |
||||
|
-name 'config.m4' \ |
||||
|
| xargs -n1 dirname \ |
||||
|
| xargs -n1 basename \ |
||||
|
| sort \ |
||||
|
| xargs |
||||
|
echo |
||||
|
echo 'Some of the above modules are already compiled into PHP; please check' |
||||
|
echo 'the output of "php -i" to see which modules are already loaded.' |
||||
|
} |
||||
|
|
||||
|
ext="$1" |
||||
|
if [ -z "$ext" ] || [ ! -d "$ext" ]; then |
||||
|
usage >&2 |
||||
|
exit 1 |
||||
|
fi |
||||
|
shift |
||||
|
|
||||
|
pm='unknown' |
||||
|
if [ -e /lib/apk/db/installed ]; then |
||||
|
pm='apk' |
||||
|
fi |
||||
|
|
||||
|
if [ "$pm" = 'apk' ]; then |
||||
|
if \ |
||||
|
[ -n "$PHPIZE_DEPS" ] \ |
||||
|
&& ! apk info --installed .phpize-deps > /dev/null \ |
||||
|
&& ! apk info --installed .phpize-deps-configure > /dev/null \ |
||||
|
; then |
||||
|
apk add --no-cache --virtual .phpize-deps-configure $PHPIZE_DEPS |
||||
|
fi |
||||
|
fi |
||||
|
|
||||
|
if command -v dpkg-architecture > /dev/null; then |
||||
|
gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)" |
||||
|
set -- --build="$gnuArch" "$@" |
||||
|
fi |
||||
|
|
||||
|
cd "$ext" |
||||
|
phpize |
||||
|
./configure --enable-option-checking=fatal "$@" |
@ -0,0 +1,121 @@ |
|||||
|
#!/bin/sh |
||||
|
set -e |
||||
|
|
||||
|
extDir="$(php -d 'display_errors=stderr' -r 'echo ini_get("extension_dir");')" |
||||
|
cd "$extDir" |
||||
|
|
||||
|
usage() { |
||||
|
echo "usage: $0 [options] module-name [module-name ...]" |
||||
|
echo " ie: $0 gd mysqli" |
||||
|
echo " $0 pdo pdo_mysql" |
||||
|
echo " $0 --ini-name 0-apc.ini apcu apc" |
||||
|
echo |
||||
|
echo 'Possible values for module-name:' |
||||
|
find -maxdepth 1 \ |
||||
|
-type f \ |
||||
|
-name '*.so' \ |
||||
|
-exec basename '{}' ';' \ |
||||
|
| sort \ |
||||
|
| xargs |
||||
|
echo |
||||
|
echo 'Some of the above modules are already compiled into PHP; please check' |
||||
|
echo 'the output of "php -i" to see which modules are already loaded.' |
||||
|
} |
||||
|
|
||||
|
opts="$(getopt -o 'h?' --long 'help,ini-name:' -- "$@" || { usage >&2 && false; })" |
||||
|
eval set -- "$opts" |
||||
|
|
||||
|
iniName= |
||||
|
while true; do |
||||
|
flag="$1" |
||||
|
shift |
||||
|
case "$flag" in |
||||
|
--help|-h|'-?') usage && exit 0 ;; |
||||
|
--ini-name) iniName="$1" && shift ;; |
||||
|
--) break ;; |
||||
|
*) |
||||
|
{ |
||||
|
echo "error: unknown flag: $flag" |
||||
|
usage |
||||
|
} >&2 |
||||
|
exit 1 |
||||
|
;; |
||||
|
esac |
||||
|
done |
||||
|
|
||||
|
modules= |
||||
|
for module; do |
||||
|
if [ -z "$module" ]; then |
||||
|
continue |
||||
|
fi |
||||
|
if ! [ -f "$module" ] && ! [ -f "$module.so" ]; then |
||||
|
echo >&2 "error: '$module' does not exist" |
||||
|
echo >&2 |
||||
|
usage >&2 |
||||
|
exit 1 |
||||
|
fi |
||||
|
modules="$modules $module" |
||||
|
done |
||||
|
|
||||
|
if [ -z "$modules" ]; then |
||||
|
usage >&2 |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
pm='unknown' |
||||
|
if [ -e /lib/apk/db/installed ]; then |
||||
|
pm='apk' |
||||
|
fi |
||||
|
|
||||
|
apkDel= |
||||
|
if [ "$pm" = 'apk' ]; then |
||||
|
if \ |
||||
|
[ -n "$PHPIZE_DEPS" ] \ |
||||
|
&& ! apk info --installed .phpize-deps > /dev/null \ |
||||
|
&& ! apk info --installed .phpize-deps-configure > /dev/null \ |
||||
|
; then |
||||
|
apk add --no-cache --virtual '.docker-php-ext-enable-deps' binutils |
||||
|
apkDel='.docker-php-ext-enable-deps' |
||||
|
fi |
||||
|
fi |
||||
|
|
||||
|
for module in $modules; do |
||||
|
moduleFile="$module" |
||||
|
if [ -f "$module.so" ] && ! [ -f "$module" ]; then |
||||
|
moduleFile="$module.so" |
||||
|
fi |
||||
|
if readelf --wide --syms "$moduleFile" | grep -q ' zend_extension_entry$'; then |
||||
|
# https://wiki.php.net/internals/extensions#loading_zend_extensions |
||||
|
line="zend_extension=$module" |
||||
|
else |
||||
|
line="extension=$module" |
||||
|
fi |
||||
|
|
||||
|
ext="$(basename "$module")" |
||||
|
ext="${ext%.*}" |
||||
|
if php -d 'display_errors=stderr' -r 'exit(extension_loaded("'"$ext"'") ? 0 : 1);'; then |
||||
|
# this isn't perfect, but it's better than nothing |
||||
|
# (for example, 'opcache.so' presents inside PHP as 'Zend OPcache', not 'opcache') |
||||
|
echo >&2 |
||||
|
echo >&2 "warning: $ext ($module) is already loaded!" |
||||
|
echo >&2 |
||||
|
continue |
||||
|
fi |
||||
|
|
||||
|
case "$iniName" in |
||||
|
/*) |
||||
|
# allow an absolute path |
||||
|
ini="$iniName" |
||||
|
;; |
||||
|
*) |
||||
|
ini="$PHP_INI_DIR/conf.d/${iniName:-"docker-php-ext-$ext.ini"}" |
||||
|
;; |
||||
|
esac |
||||
|
if ! grep -qFx -e "$line" -e "$line.so" "$ini" 2>/dev/null; then |
||||
|
echo "$line" >> "$ini" |
||||
|
fi |
||||
|
done |
||||
|
|
||||
|
if [ "$pm" = 'apk' ] && [ -n "$apkDel" ]; then |
||||
|
apk del --no-network $apkDel |
||||
|
fi |
@ -0,0 +1,143 @@ |
|||||
|
#!/bin/sh |
||||
|
set -e |
||||
|
|
||||
|
# prefer user supplied CFLAGS, but default to our PHP_CFLAGS |
||||
|
: ${CFLAGS:=$PHP_CFLAGS} |
||||
|
: ${CPPFLAGS:=$PHP_CPPFLAGS} |
||||
|
: ${LDFLAGS:=$PHP_LDFLAGS} |
||||
|
export CFLAGS CPPFLAGS LDFLAGS |
||||
|
|
||||
|
srcExists= |
||||
|
if [ -d /usr/src/php ]; then |
||||
|
srcExists=1 |
||||
|
fi |
||||
|
docker-php-source extract |
||||
|
if [ -z "$srcExists" ]; then |
||||
|
touch /usr/src/php/.docker-delete-me |
||||
|
fi |
||||
|
|
||||
|
cd /usr/src/php/ext |
||||
|
|
||||
|
usage() { |
||||
|
echo "usage: $0 [-jN] [--ini-name file.ini] ext-name [ext-name ...]" |
||||
|
echo " ie: $0 gd mysqli" |
||||
|
echo " $0 pdo pdo_mysql" |
||||
|
echo " $0 -j5 gd mbstring mysqli pdo pdo_mysql shmop" |
||||
|
echo |
||||
|
echo 'if custom ./configure arguments are necessary, see docker-php-ext-configure' |
||||
|
echo |
||||
|
echo 'Possible values for ext-name:' |
||||
|
find . \ |
||||
|
-mindepth 2 \ |
||||
|
-maxdepth 2 \ |
||||
|
-type f \ |
||||
|
-name 'config.m4' \ |
||||
|
| xargs -n1 dirname \ |
||||
|
| xargs -n1 basename \ |
||||
|
| sort \ |
||||
|
| xargs |
||||
|
echo |
||||
|
echo 'Some of the above modules are already compiled into PHP; please check' |
||||
|
echo 'the output of "php -i" to see which modules are already loaded.' |
||||
|
} |
||||
|
|
||||
|
opts="$(getopt -o 'h?j:' --long 'help,ini-name:,jobs:' -- "$@" || { usage >&2 && false; })" |
||||
|
eval set -- "$opts" |
||||
|
|
||||
|
j=1 |
||||
|
iniName= |
||||
|
while true; do |
||||
|
flag="$1" |
||||
|
shift |
||||
|
case "$flag" in |
||||
|
--help|-h|'-?') usage && exit 0 ;; |
||||
|
--ini-name) iniName="$1" && shift ;; |
||||
|
--jobs|-j) j="$1" && shift ;; |
||||
|
--) break ;; |
||||
|
*) |
||||
|
{ |
||||
|
echo "error: unknown flag: $flag" |
||||
|
usage |
||||
|
} >&2 |
||||
|
exit 1 |
||||
|
;; |
||||
|
esac |
||||
|
done |
||||
|
|
||||
|
exts= |
||||
|
for ext; do |
||||
|
if [ -z "$ext" ]; then |
||||
|
continue |
||||
|
fi |
||||
|
if [ ! -d "$ext" ]; then |
||||
|
echo >&2 "error: $PWD/$ext does not exist" |
||||
|
echo >&2 |
||||
|
usage >&2 |
||||
|
exit 1 |
||||
|
fi |
||||
|
exts="$exts $ext" |
||||
|
done |
||||
|
|
||||
|
if [ -z "$exts" ]; then |
||||
|
usage >&2 |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
pm='unknown' |
||||
|
if [ -e /lib/apk/db/installed ]; then |
||||
|
pm='apk' |
||||
|
fi |
||||
|
|
||||
|
apkDel= |
||||
|
if [ "$pm" = 'apk' ]; then |
||||
|
if [ -n "$PHPIZE_DEPS" ]; then |
||||
|
if apk info --installed .phpize-deps-configure > /dev/null; then |
||||
|
apkDel='.phpize-deps-configure' |
||||
|
elif ! apk info --installed .phpize-deps > /dev/null; then |
||||
|
apk add --no-cache --virtual .phpize-deps $PHPIZE_DEPS |
||||
|
apkDel='.phpize-deps' |
||||
|
fi |
||||
|
fi |
||||
|
fi |
||||
|
|
||||
|
popDir="$PWD" |
||||
|
for ext in $exts; do |
||||
|
cd "$ext" |
||||
|
|
||||
|
[ -e Makefile ] || docker-php-ext-configure "$ext" |
||||
|
|
||||
|
make -j"$j" |
||||
|
|
||||
|
if ! php -n -d 'display_errors=stderr' -r 'exit(ZEND_DEBUG_BUILD ? 0 : 1);' > /dev/null; then |
||||
|
# only "strip" modules if we aren't using a debug build of PHP |
||||
|
# (none of our builds are debug builds, but PHP might be recompiled with "--enable-debug" configure option) |
||||
|
# https://github.com/docker-library/php/issues/1268 |
||||
|
|
||||
|
find modules \ |
||||
|
-maxdepth 1 \ |
||||
|
-name '*.so' \ |
||||
|
-exec sh -euxc ' \ |
||||
|
strip --strip-all "$@" || : |
||||
|
' -- '{}' + |
||||
|
fi |
||||
|
|
||||
|
make -j"$j" install |
||||
|
|
||||
|
find modules \ |
||||
|
-maxdepth 1 \ |
||||
|
-name '*.so' \ |
||||
|
-exec basename '{}' ';' \ |
||||
|
| xargs -r docker-php-ext-enable ${iniName:+--ini-name "$iniName"} |
||||
|
|
||||
|
make -j"$j" clean |
||||
|
|
||||
|
cd "$popDir" |
||||
|
done |
||||
|
|
||||
|
if [ "$pm" = 'apk' ] && [ -n "$apkDel" ]; then |
||||
|
apk del --no-network $apkDel |
||||
|
fi |
||||
|
|
||||
|
if [ -e /usr/src/php/.docker-delete-me ]; then |
||||
|
docker-php-source delete |
||||
|
fi |
@ -0,0 +1,34 @@ |
|||||
|
#!/bin/sh |
||||
|
set -e |
||||
|
|
||||
|
dir=/usr/src/php |
||||
|
|
||||
|
usage() { |
||||
|
echo "usage: $0 COMMAND" |
||||
|
echo |
||||
|
echo "Manage php source tarball lifecycle." |
||||
|
echo |
||||
|
echo "Commands:" |
||||
|
echo " extract extract php source tarball into directory $dir if not already done." |
||||
|
echo " delete delete extracted php source located into $dir if not already done." |
||||
|
echo |
||||
|
} |
||||
|
|
||||
|
case "$1" in |
||||
|
extract) |
||||
|
mkdir -p "$dir" |
||||
|
if [ ! -f "$dir/.docker-extracted" ]; then |
||||
|
tar -Jxf /usr/src/php.tar.xz -C "$dir" --strip-components=1 |
||||
|
touch "$dir/.docker-extracted" |
||||
|
fi |
||||
|
;; |
||||
|
|
||||
|
delete) |
||||
|
rm -rf "$dir" |
||||
|
;; |
||||
|
|
||||
|
*) |
||||
|
usage |
||||
|
exit 1 |
||||
|
;; |
||||
|
esac |
@ -0,0 +1,82 @@ |
|||||
|
--- |
||||
|
- name: Copy docker-php-* helpers to /usr/local/bin/ |
||||
|
copy: |
||||
|
src: "{{item}}" |
||||
|
dest: /usr/local/bin/ |
||||
|
mode: 0744 |
||||
|
loop: |
||||
|
- docker-php-ext-configure |
||||
|
- docker-php-ext-enable |
||||
|
- docker-php-ext-install |
||||
|
- docker-php-source |
||||
|
|
||||
|
# prevent Debian's PHP packages from being installed |
||||
|
# https://github.com/docker-library/php/pull/542 |
||||
|
- name: Disable php for apt |
||||
|
shell: "set -eux; { echo 'Package: php*'; echo 'Pin: release *'; echo 'Pin-Priority: -1'; } > /etc/apt/preferences.d/no-debian-php" |
||||
|
|
||||
|
# dependencies required for running "phpize" |
||||
|
# (see persistent deps below) |
||||
|
- name: Set ENV var PHPIZE_DEPS |
||||
|
lineinfile: |
||||
|
dest: ~/.bashrc |
||||
|
line: 'export PHPIZE_DEPS="autoconf dpkg-dev file g++ gcc libc-dev make pkg-config re2c"' |
||||
|
|
||||
|
# persistent / runtime deps |
||||
|
- name: Install dev dependencies for compile |
||||
|
shell: set -eux; apt-get update; apt-get install -y --no-install-recommends $PHPIZE_DEPS ca-certificates curl xz-utils ; rm -rf /var/lib/apt/lists/* |
||||
|
environment: |
||||
|
PHPIZE_DEPS: autoconf dpkg-dev file g++ gcc libc-dev make pkg-config re2c |
||||
|
|
||||
|
- name: Set ENV var PHP_INI_DIR |
||||
|
lineinfile: |
||||
|
dest: ~/.bashrc |
||||
|
line: 'export PHP_INI_DIR="/usr/local/etc/php"' |
||||
|
|
||||
|
- name: Create /var/www/html dir |
||||
|
shell: set -eux; mkdir -p "$PHP_INI_DIR/conf.d"; [ ! -d /var/www/html ]; mkdir -p /var/www/html; chown www-data:www-data /var/www/html; chmod 777 /var/www/html |
||||
|
environment: |
||||
|
PHP_INI_DIR: /usr/local/etc/php |
||||
|
|
||||
|
# Apply stack smash protection to functions using local buffers and alloca() |
||||
|
# Make PHP's main executable position-independent (improves ASLR security mechanism, and has no performance impact on x86_64) |
||||
|
# Enable optimization (-O2) |
||||
|
# Enable linker optimization (this sorts the hash buckets to improve cache locality, and is non-default) |
||||
|
# https://github.com/docker-library/php/issues/272 |
||||
|
# -D_LARGEFILE_SOURCE and -D_FILE_OFFSET_BITS=64 (https://www.php.net/manual/en/intro.filesystem.php) |
||||
|
- name: Set ENV vars for php installation |
||||
|
lineinfile: |
||||
|
dest: ~/.bashrc |
||||
|
line: "{{item}}" |
||||
|
loop: |
||||
|
- 'export PHP_CFLAGS="-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"' |
||||
|
- 'export PHP_CPPFLAGS="$PHP_CFLAGS"' |
||||
|
- 'export PHP_LDFLAGS="-Wl,-O1 -pie"' |
||||
|
- 'export GPG_KEYS="42670A7FE4D0441C8E4632349E4FDC074A4EF02D 5A52880781F755608BF815FC910DEB46F53EA312"' |
||||
|
- 'export PHP_VERSION="7.4.33"' |
||||
|
- 'export PHP_URL="https://www.php.net/distributions/php-7.4.33.tar.xz" PHP_ASC_URL="https://www.php.net/distributions/php-7.4.33.tar.xz.asc"' |
||||
|
- 'export PHP_SHA256="924846abf93bc613815c55dd3f5809377813ac62a9ec4eb3778675b82a27b927"' |
||||
|
|
||||
|
- name: Download php sources |
||||
|
shell: set -eux; savedAptMark="$(apt-mark showmanual)"; apt-get update; apt-get install -y --no-install-recommends gnupg dirmngr; rm -rf /var/lib/apt/lists/*; mkdir -p /usr/src; cd /usr/src; curl -fsSL -o php.tar.xz "$PHP_URL"; if [ -n "$PHP_SHA256" ]; then echo "$PHP_SHA256 *php.tar.xz" | sha256sum -c -; fi; if [ -n "$PHP_ASC_URL" ]; then curl -fsSL -o php.tar.xz.asc "$PHP_ASC_URL"; export GNUPGHOME="$(mktemp -d)"; for key in $GPG_KEYS; do gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; done; gpg --batch --verify php.tar.xz.asc php.tar.xz; gpgconf --kill all; rm -rf "$GNUPGHOME"; fi; apt-mark auto '.*' > /dev/null; apt-mark manual $savedAptMark > /dev/null; apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false |
||||
|
environment: |
||||
|
PHP_URL: https://www.php.net/distributions/php-7.4.33.tar.xz |
||||
|
PHP_SHA256: 924846abf93bc613815c55dd3f5809377813ac62a9ec4eb3778675b82a27b927 |
||||
|
PHP_ASC_URL: https://www.php.net/distributions/php-7.4.33.tar.xz.asc |
||||
|
GPG_KEYS: 42670A7FE4D0441C8E4632349E4FDC074A4EF02D 5A52880781F755608BF815FC910DEB46F53EA312 |
||||
|
|
||||
|
- name: Install php |
||||
|
environment: |
||||
|
PHP_CFLAGS: -fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 |
||||
|
PHP_CPPFLAGS: -fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 |
||||
|
PHP_LDFLAGS: -Wl,-O1 -pie |
||||
|
PHP_INI_DIR: /usr/local/etc/php |
||||
|
shell: >- |
||||
|
set -eux; savedAptMark="$(apt-mark showmanual)"; apt-get update; apt-get install -y --no-install-recommends libargon2-dev libcurl4-openssl-dev libonig-dev libreadline-dev libsodium-dev libsqlite3-dev libssl-dev libxml2-dev zlib1g-dev ; export CFLAGS="$PHP_CFLAGS" CPPFLAGS="$PHP_CPPFLAGS" LDFLAGS="$PHP_LDFLAGS" ; docker-php-source extract; cd /usr/src/php; gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; if [ ! -d /usr/include/curl ]; then ln -sT "/usr/include/$debMultiarch/curl" /usr/local/include/curl; fi; ./configure --build="$gnuArch" --with-config-file-path="$PHP_INI_DIR" --with-config-file-scan-dir="$PHP_INI_DIR/conf.d" --enable-option-checking=fatal --with-mhash --with-pic --enable-ftp --enable-mbstring --enable-mysqlnd --with-password-argon2 --with-sodium=shared --with-pdo-sqlite=/usr --with-sqlite3=/usr --with-curl --with-iconv --with-openssl --with-readline --with-zlib --disable-phpdbg --with-pear $(test "$gnuArch" = 's390x-linux-gnu' && echo '--without-pcre-jit') --with-libdir="lib/$debMultiarch" --disable-cgi --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data ; make -j "$(nproc)"; find -type f -name '*.a' -delete; make install; find /usr/local -type f -perm '/0111' -exec sh -euxc ' strip --strip-all "$@" || : ' -- '{}' + ; make clean; cp -v php.ini-* "$PHP_INI_DIR/"; cd /; docker-php-source delete; apt-mark auto '.*' > /dev/null; [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; find /usr/local -type f -executable -exec ldd '{}' ';' | awk '/=>/ { print $(NF-1) }' | sort -u | xargs -r dpkg-query --search | cut -d: -f1 | sort -u | xargs -r apt-mark manual ; apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; rm -rf /var/lib/apt/lists/*; pecl update-channels; rm -rf /tmp/pear ~/.pearrc; php --version |
||||
|
|
||||
|
# sodium was built as a shared module (so that it can be replaced later if so desired), so let's enable it too (https://github.com/docker-library/php/issues/598) |
||||
|
- name: Shell Command (docker-php-ext-enable sodium) |
||||
|
shell: docker-php-ext-enable sodium |
||||
|
|
||||
|
- name: Nerest php-fpm pool config |
||||
|
shell: set -eux; cd /usr/local/etc; if [ -d php-fpm.d ]; then sed 's!=NONE/!=!g' php-fpm.conf.default | tee php-fpm.conf > /dev/null; cp php-fpm.d/www.conf.default php-fpm.d/www.conf; else mkdir php-fpm.d; cp php-fpm.conf.default php-fpm.d/www.conf; { echo '[global]'; echo 'include=etc/php-fpm.d/*.conf'; } | tee php-fpm.conf; fi; { echo '[global]'; echo 'error_log = /proc/self/fd/2'; echo; echo '; https://github.com/docker-library/php/pull/725#issuecomment-443540114'; echo 'log_limit = 8192'; echo; echo '[www]'; echo '; if we send this to /proc/self/fd/1, it never appears'; echo 'access.log = /proc/self/fd/2'; echo; echo 'clear_env = no'; echo; echo '; Ensure worker stdout and stderr are sent to the main error log.'; echo 'catch_workers_output = yes'; echo 'decorate_workers_output = no'; } | tee php-fpm.d/docker.conf; { echo '[global]'; echo 'daemonize = no'; echo; echo '[www]'; echo 'listen = 9000'; } | tee php-fpm.d/zz-docker.conf |
Write
Preview
Loading…
Cancel
Save
Reference in new issue