DockerでWordPress・PHP8.0・LiteSpeed環境を作る

PHP
スポンサーリンク

前回はDockerでPHP8.0・LiteSpeed環境を作ったので、今回はWordpressをインストールできる環境を作りたいと思います。

開発環境は前回同様です。

ディレクトリ構成

.
├── .env
├── docker-compose.yml
├── mysql8
│   ├── data
│   └── Dockerfile
├── php8_litespeed
│   └── litespeed
│       ├── conf
│       │   ├── httpd_config.conf
│       │   └── vhconf.conf
│       └── Dockerfile
└── www
    └── html

LiteSpeed の config ファイルは Dockerfile で Copy、PHPの ini は sed で書き換えるので、以上のような構成になっています。

html ディレクトリに WordPress をインストールする想定です。

ファイル

.env

LSPHP_VERSION=lsphp80
PHP_VERSION=8.0

MYSQL_ROOT_PASSWORD=P@ssw0rd
MYSQL_USER=user
MYSQL_PASSWORD=P@ssw0rd

LitteSpeed・PHP のバージョンと MySQL のユーザーとパスワードです。

docker-compose.yml

version: '3.8'

services:
  php8-litespeed:
    container_name: php8-litespeed
    build:
      context: ./php8_litespeed
      args:
        - LSPHP_VERSION=${LSPHP_VERSION}
        - PHP_VERSION=${PHP_VERSION}
    ports:
      - "7080:7080"
      - "8088:8088"
    volumes:
      - ./www:/var/www
    depends_on:
      - "mysql8"

  mysql8:
    container_name: mysql8
    build:
      context: ./mysql8
    command:
      --default-authentication-plugin=mysql_native_password
    ports:
      - "13306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      TZ: "Asia/Tokyo"

volumes:
  mysql_data:

MySQL 用の Volume を作っています。

Dockerfile(php8-litespeed)

FROM ubuntu:20.04

ARG LSPHP_VERSION
ARG PHP_VERSION

RUN apt-get update && apt-get install -y --no-install-recommends \
    tzdata \
    curl \
    ca-certificates \
    wget \
    && wget -O - http://rpms.litespeedtech.com/debian/enable_lst_debian_repo.sh | bash

ENV TZ Asia/Tokyo

RUN apt-get update && apt-get install -y --no-install-recommends \
    vim \
    git \
    zip \
    unzip \
    openlitespeed \
    ${LSPHP_VERSION} \
    ${LSPHP_VERSION}-common \
    ${LSPHP_VERSION}-mysql \
    ${LSPHP_VERSION}-curl \
    ${LSPHP_VERSION}-intl \
    && rm -rf /var/lib/apt/lists/*

EXPOSE 7080 8088

COPY ./litespeed/conf/httpd_config.conf /usr/local/lsws/conf/httpd_config.conf
COPY ./litespeed/conf/vhconf.conf /usr/local/lsws/conf/vhosts/www/vhconf.conf

RUN sed -i -r 's/upload_max_filesize = [0-9]+M/upload_max_filesize = 50M/g' /usr/local/lsws/${LSPHP_VERSION}/etc/php/${PHP_VERSION}/litespeed/php.ini
RUN sed -i -r 's/post_max_size = [0-9]+M/post_max_size = 50M/g' /usr/local/lsws/${LSPHP_VERSION}/etc/php/${PHP_VERSION}/litespeed/php.ini

ENV PATH $PATH:/usr/local/lsws/lsphp80/bin/

RUN wget https://getcomposer.org/installer -O composer-installer.php \
    && php composer-installer.php --filename=composer --install-dir=/usr/local/bin \
    && rm -f composer-installer.php

CMD ["sh", "-c", "/usr/local/lsws/bin/lswsctrl start; tail -F /usr/local/lsws/logs/error.log /usr/local/lsws/logs/access.log"]

WORKDIR /var/www/html

Ubuntu 20.04 をベースに LiteSpeed をインストールしています。

LiteSpeed のconfigファイルは Copy 、PHP の inised コマンドで書き換えています。

Dockerfile(mysql8)

FROM mysql:8.0

RUN apt-get update && apt-get install -y \
    locales \
    && rm -rf /var/lib/apt/lists/* \
    && echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen \
    && locale-gen ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8

RUN { \
    echo '[mysqld]'; \
    echo 'character-set-server=utf8mb4'; \
    echo 'collation-server=utf8mb4_bin'; \
    echo '[client]'; \
    echo 'default-character-set=utf8mb4'; \
} > /etc/mysql/conf.d/charset.cnf

文字コードの設定だけです。

httpd_config.conf

#
# PLAIN TEXT CONFIGURATION FILE
#
#It not set, will use host name as serverName
serverName                
user                      nobody
group                     nogroup
priority                  0
inMemBufSize              60M
swappingDir               /tmp/lshttpd/swap
autoFix503                1
gracefulRestartTimeout    300
mime                      conf/mime.properties
showVersionNumber         0
adminEmails               root@localhost

errorlog logs/error.log {
  logLevel                DEBUG
  debugLevel              0
  rollingSize             10M
  enableStderrLog         1
}

accesslog logs/access.log {
  rollingSize             10M
  keepDays                30
  compressArchive         0
}
indexFiles                index.html, index.php

expires  {
  enableExpires           1
  expiresByType           image/*=A604800,text/css=A604800,application/x-javascript=A604800,application/javascript=A604800,font/*=A604800,application/x-font-ttf=A604800
}

autoLoadHtaccess          1

tuning  {
  maxConnections          10000
  maxSSLConnections       10000
  connTimeout             300
  maxKeepAliveReq         10000
  keepAliveTimeout        5
  sndBufSize              0
  rcvBufSize              0
  maxReqURLLen            32768
  maxReqHeaderSize        65536
  maxReqBodySize          2047M
  maxDynRespHeaderSize    32768
  maxDynRespSize          2047M
  maxCachedFileSize       4096
  totalInMemCacheSize     20M
  maxMMapFileSize         256K
  totalMMapCacheSize      40M
  useSendfile             1
  fileETag                28
  enableGzipCompress      1
  compressibleTypes       default
  enableDynGzipCompress   1
  gzipCompressLevel       6
  gzipAutoUpdateStatic    1
  gzipStaticCompressLevel 6
  brStaticCompressLevel   6
  gzipMaxFileSize         10M
  gzipMinFileSize         300

  quicEnable              1
  quicShmDir              /dev/shm
}

fileAccessControl  {
  followSymbolLink        1
  checkSymbolLink         0
  requiredPermissionMask  000
  restrictedPermissionMask 000
}

perClientConnLimit  {
  staticReqPerSec         0
  dynReqPerSec            0
  outBandwidth            0
  inBandwidth             0
  softLimit               10000
  hardLimit               10000
  gracePeriod             15
  banPeriod               300
}

CGIRLimit  {
  maxCGIInstances         20
  minUID                  11
  minGID                  10
  priority                0
  CPUSoftLimit            10
  CPUHardLimit            50
  memSoftLimit            1460M
  memHardLimit            1470M
  procSoftLimit           400
  procHardLimit           450
}

accessDenyDir  {
  dir                     /
  dir                     /etc/*
  dir                     /dev/*
  dir                     conf/*
  dir                     admin/conf/*
}

accessControl  {
  allow                   ALL
}

extprocessor lsphp {
  type                    lsapi
  address                 uds://tmp/lshttpd/lsphp.sock
  maxConns                10
  env                     PHP_LSAPI_CHILDREN=10
  env                     LSAPI_AVOID_FORK=200M
  initTimeout             60
  retryTimeout            0
  persistConn             1
  respBuffer              0
  autoStart               1
  path                    lsphp80/bin/lsphp
  backlog                 100
  instances               1
  priority                0
  memSoftLimit            2047M
  memHardLimit            2047M
  procSoftLimit           1400
  procHardLimit           1500
}

scripthandler  {
  add                     lsapi:lsphp php
}

railsDefaults  {
  maxConns                1
  env                     LSAPI_MAX_IDLE=60
  initTimeout             60
  retryTimeout            0
  pcKeepAliveTimeout      60
  respBuffer              0
  backlog                 50
  runOnStartUp            3
  extMaxIdleTime          300
  priority                3
  memSoftLimit            2047M
  memHardLimit            2047M
  procSoftLimit           500
  procHardLimit           600
}

wsgiDefaults  {
  maxConns                5
  env                     LSAPI_MAX_IDLE=60
  initTimeout             60
  retryTimeout            0
  pcKeepAliveTimeout      60
  respBuffer              0
  backlog                 50
  runOnStartUp            3
  extMaxIdleTime          300
  priority                3
  memSoftLimit            2047M
  memHardLimit            2047M
  procSoftLimit           500
  procHardLimit           600
}

nodeDefaults  {
  maxConns                5
  env                     LSAPI_MAX_IDLE=60
  initTimeout             60
  retryTimeout            0
  pcKeepAliveTimeout      60
  respBuffer              0
  backlog                 50
  runOnStartUp            3
  extMaxIdleTime          300
  priority                3
  memSoftLimit            2047M
  memHardLimit            2047M
  procSoftLimit           500
  procHardLimit           600
}

module cache {
  ls_enabled              1

  checkPrivateCache       1
  checkPublicCache        1
  maxCacheObjSize         10000000
  maxStaleAge             200
  qsCache                 1
  reqCookieCache          1
  respCookieCache         1
  ignoreReqCacheCtrl      1
  ignoreRespCacheCtrl     0

  enableCache             0
  expireInSeconds         3600
  enablePrivateCache      0
  privateExpireInSeconds  3600

}

virtualhost www {
  vhRoot                  /var/www
  configFile              conf/vhosts/www/vhconf.conf
  allowSymbolLink         1
  enableScript            1
  restrained              1
  setUIDMode              0
}

listener Default {
  address                 *:8088
  secure                  0
  map                     www *
}

vhTemplate centralConfigLog {
  templateFile            conf/templates/ccl.conf
  listeners               Default
}

vhTemplate EasyRailsWithSuEXEC {
  templateFile            conf/templates/rails.conf
  listeners               Default
}

バーチャルホストに www を指定しています。

vhconf.conf

docRoot $VH_ROOT/html/
enableGzip 1


context / {
  allowBrowse 1
  location $DOC_ROOT/
  rewrite  {
    RewriteFile .htaccess
  }
}

context /docs/{
  allowBrowse 1
  location $SERVER_ROOT/docs/
}

context /protected/{
  required user test
  authName Protected
  allowBrowse 1
  location protected/
  realm SampleProtectedArea

  accessControl {
    deny
    allow *
  }
}

context /blocked/{
  allowBrowse 0
}

context /cgi-bin/{
  allowBrowse 1
  location $VH_ROOT/cgi-bin/
  type cgi
}

expires {
  enableExpires 1
}

index {
  autoIndexURI /_autoindex/default.php
  indexFiles index.php index.html
  autoIndex 0
  useServer 0
}

errorPage 404{
  url /error404.html
}

errorlog $VH_ROOT/logs/error.log{
  logLevel DEBUG
  rollingSize 10M
  useServer 1
}

accessLog $VH_ROOT/logs/access.log{
  compressArchive 0
  logReferer 1
  keepDays 30
  rollingSize 10M
  logUserAgent 1
  useServer 0
}

awstats {
  updateInterval 86400
  workingDir $VH_ROOT/awstats
  updateOffset 0
  siteDomain localhost
  siteAliases 127.0.0.1 localhost
  updateMode 0
  awstatsURI /awstats/
}

rewrite  {
  enable 1
  autoLoadHtaccess 1
  logLevel 0
  RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
  RewriteBase /
  RewriteRule ^index\.php$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.php [L]
}

hotlinkCtrl {
  suffixes gif,  jpeg,  jpg
  allowedHosts
  allowDirectAccess 1
  enableHotlinkCtrl 0
  onlySelf 1
}

accessControl {
  deny
  allow *
}

realm SampleProtectedArea {
  userDB {
    cacheTimeout 60
    maxCacheSize 200
    location conf/vhosts/$VH_NAME/htpasswd
  }

  groupDB {
    cacheTimeout 60
    maxCacheSize 200
    location conf/vhosts/$VH_NAME/htgroup
  }
}

general {
  enableContextAC 0
}

mod_rewrite 効かせるため httpd_config.conf とこのファイルに設定しますが、 RewriteRulerewrite に記載します。

WordPress インストール

ホスト

$ docker exec -it php8-litespeed bash

php8-litespeed コンテナ内

/var/www/html# wget -O - https://ja.wordpress.org/latest-ja.tar.gz | tar zxf -

--2021-01-31 00:14:30--  https://ja.wordpress.org/latest-ja.tar.gz
Resolving ja.wordpress.org (ja.wordpress.org)... 198.143.164.252
Connecting to ja.wordpress.org (ja.wordpress.org)|198.143.164.252|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 16121648 (15M) [application/octet-stream]
Saving to: 'STDOUT'

-                                 100%[===========================================================>]  15.37M   903KB/s    in 26s     

2021-01-31 00:14:56 (608 KB/s) - written to stdout [16121648/16121648]

/var/www/html# cp wordpress/index.php ./

/var/www/html# chown -R nobody:nogroup /var/www/html

/var/www/html# vi index.php

index.php

<?php
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */

/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define( 'WP_USE_THEMES', true );

/** Loads the WordPress Environment and Template */
require __DIR__ . '/wordpress/wp-blog-header.php';

/wordpress を追加する。

DB 作成

ホスト

mysql8 コンテナ内に入ります。

$ docker exec -it mysql8 bash

mysql8 コンテナ内

# mysql -h localhost -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.22 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database wordpress;
Query OK, 1 row affected (0.01 sec)

wordpress という名前の DB を作成しました。

WordPress 設定

http://localhost:8088/wordpress/

データベースのホスト名には mysql8 (MySQL8.0のコンテナ名)を入れます。

管理画面が表示できました。

ドメイン直下 http://localhost:8088/ に表示させたい場合は以下の設定を行います。

サイトアドレス(URL)の項目から /wordpress を削除し http:localhost:8088 にします。

http://localhost:8088/

表示できました。

まとめ

以上の設定で通常通り WordPress を利用することができます。

LiteSpeed の場合、Rewrite の設定方法など少し特殊なところもあります。

コンテナ内で /usr/local/lsws/admin/misc/admpass.sh から管理者パスワードを設定し、http:localhost:7080 にアクセスして LiteSpeed の管理画面で設定を行うこともできますが、この設定はコンテナを再度ビルドすると消えてしまうので、Configファイルを編集して設定を変更するほうが望ましいです。

スポンサーリンク
PHPWEBWordpress
スポンサーリンク
hayoをフォローする
暇なのでいろいろと…

コメント

タイトルとURLをコピーしました