Nastavení serveru
Konfigurace a detailní nastavení projektu pro produkci.
Tato kapitola vás provede konfigurací projektu pomocí Dockeru. Naučíte se, jak využít Dockerfile pro nastavení produkčního prostředí, jak spouštět příkazy po startu kontejneru díky docker-entrypoint.sh, a jak upravit nastavení samotného PHP a Nginx.
Dockerfile
Dockerfile
je hlavní konfigurační soubor, ve kterém můžete specifikovat příkazy pro instalaci nejrůznějších
linuxových knihoven potřebných pro váš projekt. Docker na základě tohoto souboru nainstaluje a nastaví samotný Nginx,
PHP a knihovny jako je opcache, intl, postgres či grafickou knihovnu GD.
Ve výchozím stavu jsou některé příkazy zakomentovány - čím méně knihoven, tím lépe z hlediska performance.
Pokud vám ovšem nedostačuje výchozí SQLite databáze a chcete například postgres nebo zmíněnou GD knihovnu,
stačí tyto řádky odkomentovat a spustit příkaz docker compose up -d --build
.
FROM node:18-alpine as build-stage-node
WORKDIR /build
COPY . ./
RUN yarn cache clean --mirror
RUN yarn && yarn build
FROM php:8.3-fpm-alpine
WORKDIR /var/www/html
# Set timezone
ENV TZ="Europe/Prague"
# Nginx & PHP configs
COPY ./docker/nginx/nginx.conf /etc/nginx/nginx.conf
COPY ./docker/nginx/http.d/default.conf /etc/nginx/http.d/default.conf
COPY ./docker/php/php.ini /usr/local/etc/php/conf.d/php.ini
#COPY ./docker/php/opcache.ini /usr/local/etc/php/conf.d/opcache.ini
# Install core linux dependencies
RUN apk add openssl curl ca-certificates
RUN apk add bash nano
RUN apk add nginx
# Supported dependencies
# https://github.com/mlocati/docker-php-extension-installer#supported-php-extensions
# Install opcache
RUN docker-php-ext-install opcache
# Install intl
RUN apk add --no-cache icu-dev
RUN docker-php-ext-configure intl
RUN docker-php-ext-install intl
# Install postgres
#RUN apk add --no-cache libpq-dev
#RUN docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql
#RUN docker-php-ext-install pdo pdo_pgsql
# Intall GD
#RUN apk add --no-cache freetype libpng libjpeg-turbo freetype-dev libpng-dev libjpeg-turbo-dev
#RUN docker-php-ext-configure gd --with-freetype --with-jpeg
#RUN NPROC=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || 1)
#RUN docker-php-ext-install -j$(nproc) gd
#RUN apk del --no-cache freetype-dev libpng-dev libjpeg-turbo-dev
# Install zip
#RUN apk add zip libzip-dev #git libicu-dev curl gnupg
#RUN docker-php-ext-configure zip
#RUN docker-php-ext-install zip
# Install PCNTL
#RUN docker-php-ext-configure pcntl --enable-pcntl
#RUN docker-php-ext-install pcntl
# Install SOAP
#RUN apk add --no-cache --virtual .build-deps autoconf dpkg-dev dpkg file g++ gcc libc-dev make pkgconf re2c libxml2-dev
#RUN docker-php-ext-configure soap
#RUN docker-php-ext-install soap
# Copy source code
COPY . ./
COPY --from=build-stage-node /build/www/temp ./www/temp
#COPY --from=build-stage-node /build/temp/latte-mail ./temp/latte-mail
# Install composer & dependencies
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer install --no-cache --prefer-dist --no-scripts
# Resolve permissions
RUN chmod -R ugo+w ./temp
RUN chmod -R ugo+w ./log
RUN chmod -R ugo+r ./www/temp
RUN chown -R www-data:www-data /var/www/html
# Add entrypoint
ADD ./docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
docker-entrypoint.sh
docker-entrypoint.sh
je soubor, ve kterém můžete specifikovat příkazy, které se mají vykonat okamžitě po spuštění
containeru. Využití najdete hlavně na produkčním serveru, kde po úspěšném deploy procesu potřebujete spustit migrace,
promazat cache nebo nastavit práva souborů.
#!/bin/sh
# remove temp files
rm -rf /var/www/html/temp/*
# migrate databases
bin/console migration:migrate --no-interaction
bin/console orm:generate-proxies
bin/console app:auth:resources:update
# override permissions
chown -R www-data:www-data /var/www/html/temp
chown -R www-data:www-data /var/www/html/log
chown -R www-data:www-data /var/www/html/docker/temp
# start php-fpm and nginx
php-fpm -D && nginx -g 'daemon off;'
PHP
Základní nastavení PHP lze provádět v souboru docker/php/php.ini
. Na tomto místě můžete přenastavit stávající
direktivy jako jsou post_max_size
, upload_max_filesize
, max_file_uploads
, atp. Můžete zde přidat i
jakékoli další direktivy a po restartu containeru pomocí příkazu docker compose restart
se změny projeví.
; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; https://php.net/post-max-size
post_max_size = 128M
; Maximum allowed size for uploaded files.
; https://php.net/upload-max-filesize
upload_max_filesize = 32M
; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20
; Remove X-Powered-by Header
expose_php = off
Nginx
Do konfigurace Nginxu se nejspíše pouštět nebudete, vše potřebné je již nastaveno. Je ale dobré vědět, kam případně
sáhnout. Celé nastavení se nachází ve 2 souborech docker/nginx/nginx.conf
a docker/nginx/http.d/default.conf
.
První soubor obsahuje obecnou konfiguraci včetně sekce http
. Ve druhém souboru lze nastavit sekci server
.
...
http {
...
# Includes virtual hosts configs.
include /etc/nginx/http.d/*.conf;
...
# Request limiter https://www.nginx.com/blog/rate-limiting-nginx/
limit_req_zone $http_x_real_ip zone=primaryZone:5m rate=10r/s;
}
server {
listen 80;
...
# Project APP
location / { ... }
# Pass the PHP scripts to FastCGI server listening on socket
location ~ \.php$ { ... }
}