DockerでPHP8.0・LiteSpeedの開発環境を作る

PHP
スポンサーリンク

経緯

現在のところ OpenLiteSpeed WordPress Docker Container(公式イメージ) は PHP8.0 に対応していないようですので、ubuntu 公式イメージ をベースに最低限の PHP8.0・LiteSpeed 開発環境を作成しました。

開発環境

  • macOS Big Sur 11.1
  • Docker version 20.10.0
  • docker-compose version 1.27.4

構成

.
├── .env
├── docker-compose.yml
├── Dockerfile
├── config
│   ├── httpd_config.conf
│   └── vhconf.conf
└── www
    └── html

ファイル

.env

LSPHP_VERSION=lsphp80

今回は lsphp のみ記載しています。
必要に応じて、DB設定などを記載してください。

docker-compoes.yml

version: '3.8'

services:
  php8-litespeed:
    container_name: php8-litespeed
    build:
      context: .
      args:
        - LSPHP_VERSION=${LSPHP_VERSION}
    ports:
      - "7080:7080"
      - "8088:8088"
    volumes:
      - ./www:/var/www
      - ./config/httpd_config.conf:/usr/local/lsws/conf/httpd_config.conf
      - ./config/vhconf.conf:/usr/local/lsws/conf/vhosts/www/vhconf.conf

最低限の記述です。

Dockerfile

FROM ubuntu:20.04

ARG LSPHP_VERSION

SHELL ["/bin/bash", "-o", "pipefail", "-c"]

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

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", "cp -r /usr/local/lsws/Example/html /var/www/; /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 LTS イメージをベースにして、リポジトリのアップデート・ LiteSpeed のインストール・ Composer のインストールを行っています。

ドキュメントルートを馴染みのある /var/www/html にして、 php コマンドも使えるように変更しています。

デフォルトの virtualhost である Example から www にファイルをコピーしていますが、しなくても構いません。

config/http_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
}

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 {
  internal                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
  ls_enabled              1
}

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

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
}

デフォルトの設定から、 virtualhost に www を追加しています。

config/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.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 0
  logLevel 0
}

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
}

デフォルトです。必要に応じて変更してください。

コンテナ立ち上げ

$ docker-compose up -d

動作確認

php8-litespeed コンテナ内

$ docker exec -it php8-litespeed bash

PHP のバージョン

# php -v
PHP 8.0.0 (cli) (built: Nov 27 2020 04:00:09) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.0, Copyright (c), by Zend Technologies

Composer

# composer -v
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.0.8 2020-12-03 17:20:38

PHP8.0.0・Composer の確認ができました。

Web画面表示

http://localhost:8088/

LiteSpeed Welcome Page

http://localhost:8088/phpinfo.php

Laravel インストール

# composer create-project laravel/laravel --prefer-dist laravel
Creating a "laravel/laravel" project at "./laravel"
Installing laravel/laravel (v8.5.8)
  - Downloading laravel/laravel (v8.5.8)
  - Installing laravel/laravel (v8.5.8): Extracting archive
Created project in /var/www/html/laravel
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies
Lock file operations: 105 installs, 0 updates, 0 removals

〜 略 〜

Package manifest generated successfully.
73 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan key:generate --ansi
Application key set successfully.

CakePHP インストール

# composer self-update && composer create-project --prefer-dist cakephp/app:4.* cakephp
You are already using composer version 2.0.8 (stable channel).
Creating a "cakephp/app:4.*" project at "./cakephp"
Installing cakephp/app (4.2.1)
  - Downloading cakephp/app (4.2.1)
  - Installing cakephp/app (4.2.1): Extracting archive
Created project in /var/www/html/cakephp
Loading composer repositories with package information
Updating dependencies
Lock file operations: 91 installs, 0 updates, 0 removals

〜 略 〜

まとめ

以上で、Apache に近いディレクトリ構成で操作できる、最低限の開発環境ができました。

試しに ComposerLaravelCakePHP をインストールしてみました。実際に動作するようにするにはもう少し設定が必要ですが、Composer でインストールできるところまでは確認できました。

LiteSpeed は WordPress で利用することが多いと思いますので、次回は WordPress と MySQL を扱えるようにする開発環境を作ろうと思います。

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

コメント

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