這次的目標是重新改寫以前 Codeignitor3 的程式,變成 Codeignitor4。
同時把服務裝在docker,裡面放入 nginx 和 php8.1-fpm的 docker container。
所以這次的變動很大,1首先是將以前我常用的 apache + php7架構換成 nginx + php8.1-fpm,2其次把服務放到 docker+ docker compose ;最後就是把所有的程式改成 codeigniter4架構(後面簡直為ci4),弄了好久。
let's do it.
系統
# cat /etc/redhat-release
Rocky Linux release 9.0 (Blue Onyx)
已安裝 docker ,docker compose
# docker version
Client: Docker Engine - Community
Version: 20.10.21
Server: Docker Engine - Community
Engine:
Version: 20.10.21
# docker compose version
Docker Compose version v2.12.2
1. 重編 php8.1-fpm,加入 mysqli + intl 套件[1]
Dockfile
MAINTAINER n.sfs.tw
RUN apt-get -y update && \
docker-php-ext-install intl && \
rm -rf /etc/localtime && \
ln -s /usr/share/zoneinfo/Asia/Taipei /etc/localtime && \
docker-php-ext-install mysqli
建立
# docker build -t php:8.1-fpm-mysqli . --no-cache
2. Docker compose
這次最相關的是 php 和 nginx 兩個服務的設定,其餘的服務(如mysql, mongo, memcache非關鍵設定)
image: php:8.1-fpm-mysqli
container_name: php
restart: always
ports:
- 9000
volumes:
- /home/ci4/:/var/www/html/ci4:rw
- ./conf/php.ini:/usr/local/etc/php/php.ini:ro
- ./conf/www.conf:/usr/local/etc/php-fpm.d/www.conf:ro
- ./conf/php-fpm.conf:/usr/local/etc/php-fpm.conf:ro
- /etc/localtime:/etc/localtime:rw
nginx:
image: nginx:latest
container_name: nginx
ports:
- "80:80"
- "443:443"
volumes:
- /home/ci4/:/var/www/html/ci4:rw
- ./conf/conf.d:/etc/nginx/conf.d/:ro
- ./conf/nginx.conf:/etc/nginx/nginx.conf:ro
- /etc/localtime:/etc/localtime:ro
restart: always
這次設定的家目錄指定到外面的 /home/ci4 ,原理把兩個服務的目錄指到同一個地方,交由nginx 來分派,如果是.php的檔案再丟給php服務處理。
其餘的 volumes 設定只是服務的設定檔,建置時只能把container裡的檔案複製到外面系統中,沒別的辦法。
3. nginx 服務設定
因為nginx有設定 conf.d的目錄(上面2項中粉紅色的設定),其中加一個 virtual.conf,網站的設定如下:
vi conf/conf.d/virtual.conf
listen 80;
listen [::]:80;
server_name ci4.example.com;
root /var/www/html/ci4/public;
index index.php index.html;
charset UTF-8;
error_page 404 /index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
黃色的部分是針對 ci4的設定,其餘部分是nginx的設定。
4. 安裝 Codeignitor4
可以使用git或是tarball 方式安裝
# git clone https://github.com/codeigniter4/CodeIgniter4.git ci4
上面可以在 /home下面產生一個ci4目錄
或採用tarball來裝,可參考官網說明[2],下載頁面 https://github.com/CodeIgniter4/framework/releases/tag/v4.2.11 (未來版本會變動)
設定完成後啟動 docker container
5. 修改ci4設定檔
可參考[3a][3b]說明,以下為我實際設定方法。
在安裝完的ci4目錄下,會產生以下檔案:
├── Common.php
├── Config <==設定放此
├── Controllers
├── Database
├── Filters
├── Helpers
├── index.html
├── Language
├── Libraries
├── Models
├── ThirdParty
└── Views
composer.json <==給composer使用的
env <==臨時設置的話,可以把env改成.env
LICENSE
phpunit.xml.dist
preload.php
public/ <== 網頁檔放這裡、例如圖片,css,js...
README.md
spark <== ci4提供的測試程式
system/
tests
writable/ <== cache、上傳檔放這裡
1. 修改writeable目錄
chmod 777 -R writable
2. 修改預設參數
app/Config/App.php
public $defaultLocale = 'zh-TW';
public $supportedLocales = ['zh-TW'];
public $appTimezone = 'Asia/Taipei';
3. 啟動自動目錄
app/Config/Routes.php
測試你的頁面
http://ci4.example.com/
參考資料
[1] https://stackoverflow.com/questions/48674297/php-intl-extension-in-docker-container
[2] https://codeigniter.tw/user_guide/installation/installing_manual.html
[3a] https://gratch.tw/codeigniter-4/
[3b] https://gratch.tw/codeigniter-4-creat/