現在のところ 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/
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
に近いディレクトリ構成で操作できる、最低限の開発環境ができました。
試しに Composer
で Laravel
と CakePHP
をインストールしてみました。実際に動作するようにするにはもう少し設定が必要ですが、Composer
でインストールできるところまでは確認できました。
LiteSpeed は WordPress で利用することが多いと思いますので、次回は WordPress と MySQL を扱えるようにする開発環境を作ろうと思います。
コメント