Сегодня заказчик поставил вопрос – а можно ли сделать сайт на Wordpress «нормально», без постоянной свистопляски с версиями PHP и прочего. Потому как не все хостеры предоставляют VPS на свежих версиях системы, а ручное обновление PHP часто приводит к проблемам.
Можно, конечно, только придется пойти другим путем, с использованием Docker, который все свое носит с собой. И не важно какие там версии в репозиториях.
В качестве веб-сервера вместо привычного NGINX мы давно выбираем Caddy, за более простую и прозрачную работу с шифрованием, которая снимает с администратора эту головную боль.
Ну и раз мы решили все делать по-современному, то почему бы сразу не добавить объектный кеш на Redis?
В итоге получился такой файл
docker-compose.yml:services:
db:
image: mariadb:10.11
container_name: wp_db
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- db_data:/var/lib/mysql
redis:
image: redis:alpine
container_name: wp_redis
restart: always
command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru
wordpress:
image: wordpress:fpm
container_name: wp_app
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: ${MYSQL_USER}
WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
WORDPRESS_CONFIG_EXTRA: |
define('WP_REDIS_HOST', 'redis');
volumes:
- wp_data:/var/www/html
- ./php.ini:/usr/local/etc/php/conf.d/php.ini
depends_on:
- db
- redis
caddy:
image: caddy:latest
container_name: wp_caddy
restart: always
ports:
- "80:80/tcp"
- "443:443/tcp"
- "443:443/udp"
environment:
MY_DOMAIN: ${MY_DOMAIN}
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- wp_data:/var/www/html
- caddy_data:/data
- caddy_config:/config
depends_on:
- wordpress
volumes:
db_data:
wp_data:
caddy_data:
caddy_config:
Там же создаем файл с переменными окружения
.env:MYSQL_ROOT_PASSWORD=your_secure_root_password
MYSQL_DATABASE=wordpress
MYSQL_USER=wp_user
MYSQL_PASSWORD=wp_password
MY_DOMAIN=example.com
Файл конфигурации веб-сервера
Caddyfile, если для тестирования нужен самоподписанный сертификат, то раскомментируйте опцию tls internal:{$MY_DOMAIN} {
#tls internal
root * /var/www/html
php_fastcgi wordpress:9000
file_server
# Сжатие
encode zstd gzip
# Кэширование статики (картинки, шрифты, стили, скрипты)
@static {
file
path *.ico *.css *.js *.gif *.jpg *.jpeg *.png *.svg *.woff *.woff2 *.webp
}
header @static Cache-Control "public, max-age=31536000, must-revalidate"
header {
X-Frame-Options "SAMEORIGIN"
X-Content-Type-Options "nosniff"
Referrer-Policy "strict-origin-when-cross-origin"
}
}И файл кастомных параметров PHP-FPM
php.ini, в котором мы переопределили лимиты загрузки файлов и лимит памяти.upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
Запускаем все это командой:
docker compose up -d
Ждем пока все соберется и поднимется, потом переходим по доменному имени и выполняем стандартную установку Wordpress, чтобы заработал объектный кеш – установите плагин
Redis Object Cache и активируйте его. На этом все, мы получили быстрый и современный Wordpress, который будет всегда использовать последние версии PHP рекомендуемые разработчиками вне зависимости от вашей хостовой системы.



