Webserver Docker alapokon -1.rész (Apache)

A bejegyzés egy több részből álló konfiguráció első eleme. Most docker technológiával fogunk beüzemelni egy Apache webservert, mindezt alpine linux alapokon.

Előkészületek

Adjuk hozzá a docker repo-t a csomaglistánkhoz:

sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

Majd telepítsük fel a docker aktuális stabil verzióját:

sudo apt update
sudo apt install docker-ce docker-compose

Webserver Konfiguráció

A tervem az, hogy olyan alpine linux alapon működő image-t készítsek, mely egyedileg konfigurálható. Virtual hostokat nem tartalmaz. Az webes tartalmak kiszolgálása az alábbiak szerint fog működni:

  • 1. A beérkező kéréseket a gazdagép Apache webservere fogadja, majd a domain névnek megfelelően átproxy-a a kérést az illetékes – konténerben futó – webserver felé
  • 2. A konténerben futó Apache, ha php kóddal találkozik, átküldi a szintén konténerben futó php motornak.
  • 3. A php motor feldolgozást követően visszaküldni a választ a konténer apache rendszernek, majd az továbbitja a fő kiszolgáló felé. A PHP motor kapcsolatban áll egy rendis szerverrel, illetve egy mariadb adatbázis kezelővel

Első lépésben hozzuk létre a munkakönyvtárunkat és lépjünk bele:

mkdir -p ~/apache && cd ~/apache

Ahhoz, hogy az image-ből készült konténerben lévő apache-t az indításkor megfelelően tudjuk konfigurálni szükségünk van egy script-re, mely induláskor lefut és elvégzi a beállításokat. Nyissuk meg az állományt:

nano apachestart.sh

Ennek tartalma a következő:

#!/bin/sh

: "${SERVERNAME:?SERVERNAME needs to be set}"
: "${SERVERADMIN:?SERVERADMIN needs to be set}"
: "${HTTPPORT:?HTTPPORT needs to be set}"
: "${DOCROOT:?DOCROOT needs to be set}"

if [ ! -d $DOCROOT ]; then
echo "The DOCROOT=$DOCROOT doesn't exists!"
exit 1
fi

mkdir -p /run/apache2

cat <<EOF >/etc/apache2/conf.d/01main.conf
Listen $HTTPPORT
ServerAdmin $SERVERADMIN
ServerName $SERVERNAME:$HTTPPORT
DocumentRoot "$DOCROOT"
<Directory "$DOCROOT">
Options Indexes FollowSymlinks
AllowOverride All
Require all granted
</Directory>
EOF

if [ x$FCGI != "x" ]; then
cat <<EOF> /etc/apache2/conf.d/fcgi.conf
LoadModule proxy_module /usr/lib/apache2/mod_proxy.so
LoadModule proxy_fcgi_module /usr/lib/apache2/mod_proxy_fcgi.so
<IfModule mod_proxy_fcgi.c>
ProxyPassMatch "^/(.*\\.php(/.*)?)$" "fcgi://$FCGI$DOCROOT/\$1"
DirectoryIndex /index.php index.php
</IfModule>
EOF
fi
exec /usr/sbin/httpd -DFOREGROUND

A konténert öt környezeti változóval tudjuk indítani, ezek sorrendben a következőek:

  • SERVERNAME: weboldal domain neve
  • SERVERADMIN: A weboldal üzemeltetőjének email címe
  • DOCROOT: A weboldal adatainak elérési útja
  • HTTPPORT: A port, melyen a konténerben futó apache figyel
  • FCGI: :

A script úgy lett megírva, hogy amennyiben az FCGI környezeti változó nem kerül megadásra, az erre vonatkozó beállítások nem futnak le.

Dockerfile

Készítsük el a dockerfile-t az alábbi tartalommal:

FROM alpine
MAINTAINER Albert Ványi <albert@vanyi.eu>

RUN apk update && apk add apache2 apache2-utils apache2-proxy \
&& rm -f /etc/apache2/conf.d/info.conf \
&& rm -r /etc/apache2/conf.d/userdir.conf \
&& rm -r /etc/apache2/conf.d/proxy.conf


COPY apache/ /etc/apache2/
COPY apachestart.sh /usr/local/bin/

WORKDIR /var/www
CMD ["/usr/local/bin/apachestart.sh"]

Az apache2-proxy telepítése automatikusan létrehozza a proxy.conf állományt. Erre nincs szükségünk, ezért eltávolítjuk. Ha az FCGI környezeti változó értéket kap, legeneráljuk a megfelelő tartalommal az állományt, de alap esetben erre nincs szükség telepítés után.

Konfigurálás

Amint látható az apache könyvtárat fogjuk becsatolni az konténer /etc/apache2 könyvtárába. Ebben lesznek az egyedi konfigurációink. Először hozzuk létre a könyvtár szerkezetet:

mkdir -p apache/conf.d && cd apache

Készítsük el a httpd.conf állományt:

nano httpd.conf
IncludeOptional /etc/apache2/conf.d/*.conf

Az utasításból látszik, hogy minden konfigurációt a conf.d könyvtárba helyezünk el. Most lépjünk a conf.d könyvtárba és készítsük el ezeket is:

cd conf.d && nano 00modules.conf
# Example:
# LoadModule foo_module /usr/lib/apache2/mod_foo.so
#
LoadModule authn_file_module /usr/lib/apache2/mod_authn_file.so
#LoadModule authn_dbm_module /usr/lib/apache2/mod_authn_dbm.so
#LoadModule authn_anon_module /usr/lib/apache2/mod_authn_anon.so
#LoadModule authn_dbd_module /usr/lib/apache2/mod_authn_dbd.so
#LoadModule authn_socache_module /usr/lib/apache2/mod_authn_socache.so
LoadModule authn_core_module /usr/lib/apache2/mod_authn_core.so
LoadModule authz_host_module /usr/lib/apache2/mod_authz_host.so
LoadModule authz_groupfile_module /usr/lib/apache2/mod_authz_groupfile.so
LoadModule authz_user_module /usr/lib/apache2/mod_authz_user.so
#LoadModule authz_dbm_module /usr/lib/apache2/mod_authz_dbm.so
#LoadModule authz_owner_module /usr/lib/apache2/mod_authz_owner.so
#LoadModule authz_dbd_module /usr/lib/apache2/mod_authz_dbd.so
LoadModule authz_core_module /usr/lib/apache2/mod_authz_core.so
LoadModule access_compat_module /usr/lib/apache2/mod_access_compat.so
LoadModule auth_basic_module /usr/lib/apache2/mod_auth_basic.so
#LoadModule auth_form_module /usr/lib/apache2/mod_auth_form.so
#LoadModule auth_digest_module /usr/lib/apache2/mod_auth_digest.so
#LoadModule allowmethods_module /usr/lib/apache2/mod_allowmethods.so
#LoadModule file_cache_module /usr/lib/apache2/mod_file_cache.so
#LoadModule cache_module /usr/lib/apache2/mod_cache.so
#LoadModule cache_disk_module /usr/lib/apache2/mod_cache_disk.so
#LoadModule cache_socache_module /usr/lib/apache2/mod_cache_socache.so
#LoadModule socache_shmcb_module /usr/lib/apache2/mod_socache_shmcb.so
#LoadModule socache_dbm_module /usr/lib/apache2/mod_socache_dbm.so
#LoadModule socache_memcache_module /usr/lib/apache2/mod_socache_memcache.so
#LoadModule socache_redis_module /usr/lib/apache2/mod_socache_redis.so
#LoadModule watchdog_module /usr/lib/apache2/mod_watchdog.so
#LoadModule macro_module /usr/lib/apache2/mod_macro.so
#LoadModule dbd_module /usr/lib/apache2/mod_dbd.so
#LoadModule dumpio_module /usr/lib/apache2/mod_dumpio.so
#LoadModule echo_module /usr/lib/apache2/mod_echo.so
#LoadModule buffer_module /usr/lib/apache2/mod_buffer.so
#LoadModule data_module /usr/lib/apache2/mod_data.so
LoadModule ratelimit_module /usr/lib/apache2/mod_ratelimit.so
LoadModule reqtimeout_module /usr/lib/apache2/mod_reqtimeout.so
#LoadModule ext_filter_module /usr/lib/apache2/mod_ext_filter.so
#LoadModule request_module /usr/lib/apache2/mod_request.so
#LoadModule include_module /usr/lib/apache2/mod_include.so
LoadModule filter_module /usr/lib/apache2/mod_filter.so
#LoadModule reflector_module /usr/lib/apache2/mod_reflector.so
#LoadModule substitute_module /usr/lib/apache2/mod_substitute.so
#LoadModule sed_module /usr/lib/apache2/mod_sed.so
#LoadModule charset_lite_module /usr/lib/apache2/mod_charset_lite.so
#LoadModule deflate_module /usr/lib/apache2/mod_deflate.so
LoadModule mime_module /usr/lib/apache2/mod_mime.so
LoadModule log_config_module /usr/lib/apache2/mod_log_config.so
#LoadModule log_debug_module /usr/lib/apache2/mod_log_debug.so
#LoadModule log_forensic_module /usr/lib/apache2/mod_log_forensic.so
LoadModule logio_module /usr/lib/apache2/mod_logio.so
LoadModule env_module /usr/lib/apache2/mod_env.so
#LoadModule mime_magic_module /usr/lib/apache2/mod_mime_magic.so
#LoadModule expires_module /usr/lib/apache2/mod_expires.so
LoadModule headers_module /usr/lib/apache2/mod_headers.so
#LoadModule usertrack_module /usr/lib/apache2/mod_usertrack.so
#LoadModule unique_id_module /usr/lib/apache2/mod_unique_id.so
LoadModule setenvif_module /usr/lib/apache2/mod_setenvif.so
LoadModule version_module /usr/lib/apache2/mod_version.so
#LoadModule remoteip_module /usr/lib/apache2/mod_remoteip.so
#LoadModule session_module /usr/lib/apache2/mod_session.so
#LoadModule session_cookie_module /usr/lib/apache2/mod_session_cookie.so
#LoadModule session_crypto_module /usr/lib/apache2/mod_session_crypto.so
#LoadModule session_dbd_module /usr/lib/apache2/mod_session_dbd.so
#LoadModule slotmem_shm_module /usr/lib/apache2/mod_slotmem_shm.so
#LoadModule slotmem_plain_module /usr/lib/apache2/mod_slotmem_plain.so
#LoadModule dialup_module /usr/lib/apache2/mod_dialup.so
#LoadModule http2_module /usr/lib/apache2/mod_http2.so
LoadModule unixd_module /usr/lib/apache2/mod_unixd.so
#LoadModule heartbeat_module /usr/lib/apache2/mod_heartbeat.so
#LoadModule heartmonitor_module /usr/lib/apache2/mod_heartmonitor.so
#LoadModule status_module /usr/lib/apache2/mod_status.so
#LoadModule autoindex_module /usr/lib/apache2/mod_autoindex.so
#LoadModule asis_module /usr/lib/apache2/mod_asis.so
#LoadModule info_module /usr/lib/apache2/mod_info.so
#LoadModule suexec_module /usr/lib/apache2/mod_suexec.so
<IfModule !mpm_prefork_module>
        #LoadModule cgid_module /usr/lib/apache2/mod_cgid.so
</IfModule>
<IfModule mpm_prefork_module>
        #LoadModule cgi_module /usr/lib/apache2/mod_cgi.so
</IfModule>
#LoadModule vhost_alias_module /usr/lib/apache2/mod_vhost_alias.so
#LoadModule negotiation_module /usr/lib/apache2/mod_negotiation.so
LoadModule dir_module /usr/lib/apache2/mod_dir.so
#LoadModule actions_module /usr/lib/apache2/mod_actions.so
#LoadModule speling_module /usr/lib/apache2/mod_speling.so
#LoadModule userdir_module /usr/lib/apache2/mod_userdir.so
LoadModule alias_module /usr/lib/apache2/mod_alias.so
LoadModule rewrite_module /usr/lib/apache2/mod_rewrite.so
LoadModule negotiation_module /usr/lib/apache2/mod_negotiation.so
nano default.conf
<IfModule unixd_module>
User apache
Group apache

</IfModule>
ServerTokens Prod
ServerRoot /var/www
ServerSignature Off
<Directory />
AllowOverride none
Require all denied
</Directory>
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
<Files ".ht*">
Require all denied
</Files>

ErrorLog /dev/stderr
LogLevel warn

<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common

<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
CustomLog /dev/stderr combinedio
</IfModule>
<IfModule !logio_module>
CustomLog /dev/stderr combined
</IfModule>
</IfModule>
<IfModule mime_module>
TypesConfig /etc/apache2/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
</IfModule>
<IfModule mime_magic_module>
MIMEMagicFile /etc/apache2/magic
</IfModule>

#EnableMMAP off
#EnableSendfile on
Timeout 60
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
UseCanonicalName Off
AccessFileName .htaccess
HostnameLookups Off
<IfModule reqtimeout_module>
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
</IfModule>
nano mpm.conf
LoadModule mpm_event_module /usr/lib/apache2/mod_mpm_event.so
#LoadModule mpm_prefork_module /usr/lib/apache2/mod_mpm_prefork.so
#LoadModule mpm_worker_module /usr/lib/apache2/mod_mpm_worker.so

<IfModule mpm_event_module>
    StartServers             3
    MinSpareThreads          5
    MaxSpareThreads          45
    ThreadsPerChild          15
    MaxRequestWorkers        25
    MaxConnectionsPerChild   0
</IfModule>

<IfModule !mpm_netware_module>
    MaxMemFree            512
</IfModule>

Tesztelés

Hozzuk létre az image-nket és készítsünk- és futtassunk egy konténert:

cd ~apache && \
docker build -t slapic/apache . && \
docker run -it --rm -p 80:80 -e SERVERNAME=test.example.com -e SERVERADMIN=user@example.com -e HTTPPORT=80 -e DOCROOT=/var/www/localhost/htdocs --tmpfs /run:rw,noexec,nosuid,size=65536k slapic/apache

Konklúzió

Előkészítettük a webservert a működésre, a következő bejegyzésben elkészítjük a php-fpm-t biztosító image-t.