배포

최적화

CodeIgniter 애플리케이션을 운영 환경에 배포하기 전에 애플리케이션을 더 효율적으로 실행하기 위해 할 수 있는 몇 가지 작업이 있습니다.

이 섹션에서는 CodeIgniter가 제공하는 최적화 기능에 대해 설명합니다.

spark optimize

Added in version 4.5.0.

spark optimize 명령은 다음과 같은 최적화를 수행합니다:

경고

워커 모드에서 앱을 실행할 때는 spark optimize를 사용하지 마세요.

Composer 최적화

개발 패키지 제거

배포할 때 다음 명령을 실행하는 것을 잊지 마세요:

composer install --no-dev

위의 명령은 운영 환경에서 필요하지 않은 개발 전용 Composer 패키지를 제거합니다. 이를 통해 vendor 폴더 크기를 크게 줄일 수 있습니다.

검색할 패키지 지정

Composer 패키지 자동 검색(Auto-Discovery)이 활성화된 경우, 필요할 때 모든 Composer 패키지가 스캔됩니다. 하지만 CodeIgniter 패키지가 아닌 패키지를 스캔할 필요가 없으므로, 스캔할 패키지를 지정하면 불필요한 스캔을 방지할 수 있습니다.

Composer 패키지 지정를 참조하세요.

Config 캐싱

중요

한 번 캐시되면 설정 파일이나 .env가 변경되더라도 캐시가 삭제될 때까지 설정 값은 변경되지 않습니다.

Config 객체를 캐싱하면 성능이 향상될 수 있습니다. 단, Config 값을 변경할 때는 캐시를 수동으로 삭제해야 합니다.

Config Caching을 참조하세요.

FileLocator 캐싱

FileLocator가 찾은 파일 경로를 캐싱하면 성능이 향상될 수 있습니다. 단, 파일 경로를 추가/삭제/변경할 때는 캐시를 수동으로 삭제해야 합니다.

FileLocator 캐싱을 참조하세요.

PHP 프리로딩

PHP 프리로딩을 사용하면 서버 시작 시 함수와 클래스 같은 필수 파일을 메모리에 로드하도록 지시할 수 있습니다. 이를 통해 이러한 요소들이 모든 요청에 대해 즉시 사용 가능해지고, 일반적인 로딩 과정을 건너뛰어 애플리케이션 성능을 향상시킵니다. 다만 메모리 사용량이 증가하며, 변경 사항을 적용하려면 PHP 엔진을 재시작해야 합니다.

참고

프리로딩을 사용하려면 프리로드 스크립트를 제공합니다.

요구 사항

프리로딩을 사용하려면 전용 PHP 핸들러가 하나 필요합니다. 일반적으로 웹 서버는 하나의 PHP 핸들러를 사용하도록 구성되므로 하나의 앱에는 전용 웹 서버가 필요합니다. 하나의 웹 서버에서 여러 앱에 프리로딩을 사용하려면 각 가상 호스트가 하나의 PHP 핸들러(예: 여러 PHP-FPM)를 사용하도록 서버를 구성하세요. 프리로딩은 opcache.preload에 지정된 파일을 읽어 관련 정의를 메모리에 유지합니다.

참고

하나의 CodeIgniter4 코어로 여러 앱을 처리하려면 하나의 CodeIgniter 설치로 여러 애플리케이션 실행을 참조하세요.

설정

PHP에서 INI 설정을 분리한 경우 php.ini 또는 xx-opcache.ini를 열고 opcache.preload=/path/to/preload.phpopcache.preload_user=myuser를 설정하는 것을 권장합니다.

참고

myuser는 웹 서버에서 실행 중인 사용자입니다. 분리된 INI 설정의 위치를 찾으려면 php --ini를 실행하거나 phpinfo() 파일을 열어 Additional .ini files parsed를 검색하세요.

appstarter 설치를 사용하고 있는지 확인하세요. 수동 설치를 사용하는 경우 include 경로의 디렉터리를 변경해야 합니다.

<?php

// ...

class preload
{
    /**
     * @var array Paths to preload.
     */
    private array $paths = [
        [
            'include' => __DIR__ . '/system', // <== change this line to where CI is installed
            // ...
        ],
    ];

    // ...
}

// ...

공유 호스팅 서비스에 배포

중요

index.php는 더 이상 프로젝트 루트에 없습니다! 보안 강화와 컴포넌트 분리를 위해 public 폴더 안으로 이동되었습니다.

이는 웹 서버가 프로젝트 루트가 아닌 프로젝트의 public 폴더를 “가리키도록” 설정해야 함을 의미합니다.

문서 루트 지정

가장 좋은 방법은 서버 설정에서 문서 루트를 public 폴더로 설정하는 것입니다:

└── example.com/ (project folder)
    └── public/  (document root)

호스팅 서비스 제공업체에 문서 루트를 변경할 수 있는지 확인하세요. 아쉽게도 문서 루트를 변경할 수 없는 경우 다음 방법으로 진행하세요.

두 디렉터리 사용

두 번째 방법은 두 개의 디렉터리를 사용하고 경로를 조정하는 것입니다. 하나는 애플리케이션용이고 다른 하나는 기본 문서 루트용입니다.

public 폴더의 내용을 public_html(기본 문서 루트)에 업로드하고 나머지 파일은 애플리케이션 디렉터리에 업로드하세요:

├── example.com/ (for the application)
       ├── app/
       ├── vendor/ (or system/)
       └── writable/
└── public_html/ (the default document root)
        ├── .htaccess
        ├── favicon.ico
        ├── index.php
        └── robots.txt

자세한 내용은 공유 호스팅(cPanel)에 CodeIgniter 4 설치를 참조하세요.

.htaccess 추가

마지막 방법은 프로젝트 루트에 .htaccess를 추가하는 것입니다.

프로젝트 폴더를 문서 루트에 두는 것은 권장되지 않습니다. 하지만 다른 선택지가 없다면 이 방법을 사용할 수 있습니다.

public_html이 문서 루트인 상황에서 프로젝트 폴더를 다음과 같이 배치하고 .htaccess 파일을 생성하세요:

└── public_html/     (the default document root)
    └── example.com/ (project folder)
        ├── .htaccess
        └── public/

그리고 .htaccess를 다음과 같이 편집하세요:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

<FilesMatch "^\.">
    Require all denied
    Satisfy All
</FilesMatch>

그리고 public/.htaccess의 리다이렉트 설정을 제거하세요:

--- a/public/.htaccess
+++ b/public/.htaccess
@@ -16,16 +16,6 @@ Options -Indexes
    # http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase
    # RewriteBase /

-   # Redirect Trailing Slashes...
-   RewriteCond %{REQUEST_FILENAME} !-d
-   RewriteCond %{REQUEST_URI} (.+)/$
-   RewriteRule ^ %1 [L,R=301]
-
-   # Rewrite "www.example.com -> example.com"
-   RewriteCond %{HTTPS} !=on
-   RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
-   RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
-
    # Checks to see if the user is attempting to access a valid file,
    # such as an image or css document, if this isn't true it sends the
    # request to the front controller, index.php