[Rocky9] codeignitor4+ nginx+ php8.1-fpm + docker compose

URL Link //n.sfs.tw/16020

2022-12-22 14:09:14 By 張○○

 

這次的目標是重新改寫以前 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

FROM php:8.1-fpm
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非關鍵設定)

  php:
    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

server {
    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 方式安裝

上面可以在 /home下面產生一個ci4目錄

或採用tarball來裝,可參考官網說明[2],下載頁面 https://github.com/CodeIgniter4/framework/releases/tag/v4.2.11 (未來版本會變動)

設定完成後啟動 docker container

 

5. 修改ci4設定檔

可參考[3a][3b]說明,以下為我實際設定方法。

在安裝完的ci4目錄下,會產生以下檔案:

app/  <== 以前的 application目錄,所有程式相關設定檔放此
├── 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 $baseURL = 'http://ci4.example.com/';
    public $defaultLocale = 'zh-TW';
    public $supportedLocales = ['zh-TW'];
    public $appTimezone = 'Asia/Taipei';

3. 啟動自動目錄

app/Config/Routes.php

$routes->setAutoRoute(true);

 

測試你的頁面

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/