PHP 애플리케이션을 배포하는 방법은 무엇인가요?

Back4app PHP 커버

이 글에서는 월드와이드웹을 구동하는 가장 인기 있는 스크립팅 언어 중 하나인 PHP에 대해 설명합니다. 이 언어의 장점과 단점, 배포 옵션에 대해 알아보겠습니다.

이 글이 끝나면 간단한 PHP 애플리케이션을 부트스트랩하고, 도커화하여 Back4app 컨테이너에 배포할 수 있습니다.

PHP 개요

PHP(“PHP: HyperText Processor”의 줄임말)는 널리 사용되는 무료 범용 스크립팅 언어입니다. 1993년 Rasmus Lerdorf에 의해 만들어져 1995년에 출시되었습니다.

PHP는 처음에 웹 개발을 위해 설계되었지만 지금은 서버 측 스크립팅, 명령줄 스크립팅, 데스크톱 애플리케이션 작성에도 사용됩니다.

PHP의 가장 큰 장점은 HTML에 직접 임베드할 수 있다는 점입니다. C나 Perl에서처럼 HTML을 출력하기 위해 긴 명령을 사용할 필요가 없습니다. 다음은 간단한 예시입니다:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>My first PHP website</title>
    </head>
    <body>
        <?php
            $cool_scripting_language = "PHP";
            echo "$cool_scripting_language is a cool scripting language!";
        ?>
    </body>
</html>

사용자가 이 사이트를 요청하면 PHP가 실행되고 처리된 HTML 출력만 반환됩니다. 이 경우 “PHP는 멋진 스크립팅 언어입니다!”라는 메시지가 표시됩니다. PHP는 JavaScript처럼 브라우저에서 실행되는 것이 아니라 서버 측에서 실행됩니다.

PHP가 완전한 객체 지향 언어인지는 논란의 여지가 있습니다. 하지만 네임스페이스, 클래스, 객체와 같은 표준 객체 지향 기능을 지원하긴 합니다.

이 글을 쓰는 시점에서 가장 안정적인 최신 PHP 버전은 8.2이지만, 많은 PHP 애플리케이션이 이전 릴리스를 사용하고 있습니다.

일부 개발자는 PHP가 죽어가고 있다고 주장하지만 이는 사실이 아닙니다. W3Techs의 조사에 따르면 현재 서버 측 프로그래밍 언어로 알려진 모든 웹사이트의 77.4%가 PHP를 사용하고 있습니다.

스크립팅 언어는 Facebook, Wikipedia, Mailchimp, 다양한 CMS 소프트웨어와 같이 트래픽이 많은 웹사이트에서도 사용되며, 과거에는 YouTube에서도 사용되었습니다.

PHP의 이점

좋은 성능

PHP는 ASP.NET, JSP, Python과 같은 다른 서버 측 스크립팅 언어보다 성능이 뛰어납니다. 일부 벤치마크에서는 PHP가 Python보다 최대 3배 더 빠른 것으로 나타났습니다.

PHP는 HTML 페이지 생성, 양식 제출 처리, 데이터베이스와의 상호 작용 등 웹 관련 작업을 처리하는 데 가장 적합합니다.

오히려 무거운 계산 작업이나 복잡한 알고리즘에는 PHP보다 최적의 선택지가 더 많습니다.

크로스 플랫폼

PHP는 플랫폼에 구애받지 않습니다. 윈도우, 리눅스, 유닉스, 맥 등 다양한 플랫폼에서 실행됩니다. 또한 Apache HTTP, Caddy, Nginx, LiteSpeed 등 거의 모든 인기 웹 서버와 호환됩니다.

인기 있는 스크립팅 언어인 이 언어를 데스크톱 애플리케이션 개발에도 사용할 수 있는 것은 Czarek Tomczak의 phpdesktop 덕분입니다. 이 라이브러리는 Electron PHP용으로 만든 것이라고 생각하면 됩니다. Phpdesktop 애플리케이션은 윈도우와 리눅스에서는 실행할 수 있지만 맥 OS X에서는 (아직) 실행할 수 없습니다.

데이터베이스 지원

스크립팅 언어는 SQL 및 NoSQL 데이터베이스를 포함한 다양한 데이터베이스를 지원합니다. PHP와 함께 가장 많이 사용되는 데이터베이스는 MySQL(LAMP 스택)이지만, PostgreSQL이나 다른 유형의 데이터베이스를 사용하는 데 아무런 제한이 없습니다.

공식 웹사이트에서 모든 PHP 추상화 계층과 공급업체별 데이터베이스 확장 기능을 확인할 수 있습니다.

활기찬 생태계

PHP는 활발한 생태계 덕분에 인기가 높습니다. 많은 멋진 PHP 프레임워크는 개발 프로세스의 속도를 크게 높이고 코드베이스를 간소화하며 보다 깔끔하고 표준화된 코드를 작성하도록 안내합니다.

이 글을 쓰는 시점에 가장 인기 있는 PHP 프레임워크는 다음과 같습니다:

더 멋진 프레임워크와 리소스를 보려면 GitHub에서 awesome-php를 확인하세요.

WordPress, Joomla, Drupal, Magento 등 PHP를 사용하는 CMS도 많이 있습니다.

쉬운 학습

PHP는 간단한 구문을 가진 초보자 친화적인 언어입니다. 월드와이드웹(WWW), HTML, CSS, JavaScript의 기본에 익숙하다면 비교적 쉽게 배울 수 있습니다. 많은 개발자가 PHP를 작성할 수 있지만, 깔끔한 코드 규칙을 따르는 유지 관리 가능한 PHP를 작성할 수 있는 개발자는 소수에 불과합니다.

PHP의 한계

제한된 디버깅 도구

PHP는 다른 인기 프로그래밍 언어에 비해 오류 처리에 취약하고 디버깅 도구가 부족합니다. 프로젝트에 고급 디버깅이 필요한 경우 Xdebug, Krumo 또는 Kint와 같은 타사 소프트웨어를 사용해야 할 가능성이 높습니다.

PhpStormVisual Studio와 같은 일부 인기 있는 IDE에는 PHP 디버깅 도구가 내장되어 있습니다.

느슨하게 입력

위에서 언급했듯이 PHP는 프로그래밍 언어가 아닌 스크립팅 언어입니다. 스크립팅 언어의 가장 일반적인 특징 중 하나는 느슨하게 입력된다는 것입니다.

즉, 변수 유형을 사용하기 전에 명시적으로 선언할 필요가 없습니다. 또한 런타임 중에 언제든지 변경할 수 있습니다.

그 결과 PHP 애플리케이션은 오류가 발생하기 쉽고 디버깅하기 어렵습니다.

보안 결함

수년 동안 PHP 애플리케이션은 다양한 해커 공격의 표적이 되어 왔습니다. 이는 주로 PHP의 오픈 소스 특성과 신규 개발자의 진입 비용이 낮기 때문입니다.

가장 잘 알려진 PHP 취약점으로는 SQL 인젝션, 크로스 사이트 스크립팅(XSS), 크로스 사이트 요청 위조(CSRF), 원격 코드 실행(RCE) 등이 있습니다.

이러한 취약점은 안전한 코딩 관행을 준수함으로써 예방할 수 있다는 점을 기억하세요. 항상 입력을 살균하고 사용자가 제공한 입력은 절대 실행하지 마세요.

바닐라 PHP가 오래되었습니다.

바닐라 PHP(라이브러리나 프레임워크가 없는 PHP를 의미)는 최신 애플리케이션을 구축하기에는 상당히 구식일 수 있습니다. 안전한 앱을 빠르게 구축하려면 프레임워크를 활용해야 합니다.

PHP 배포 옵션

PHP 앱은 다양한 플랫폼에 배포할 수 있습니다. PHP 애플리케이션 배포를 위한 가장 일반적인 클라우드 모델은 다음과 같습니다:

  1. 서비스형 인프라(IaaS),
  2. 서비스형 플랫폼(PaaS),
  3. 서비스형 컨테이너(CaaS).

PHP 애플리케이션 배포에 가장 적합한 클라우드 모델은 존재하지 않습니다. 궁극적으로 선택은 프로젝트 요구 사항, 예산, 원하는 추상화 수준에 따라 달라집니다.

일반적으로 개발자 팀은 관리가 쉽고 IaaS보다 훨씬 비싸지 않기 때문에 PaaS 또는 CaaS를 선택합니다. 최고의 PHP 호스팅 공급업체를 살펴보겠습니다.

Back4app Containers

Back4app Containers Back4app 우수한 서비스형 컨테이너(CaaS) 제품입니다. 이 플랫폼을 통해 개발자는 도커화된 애플리케이션을 빌드, 확장 및 신속하게 배포할 수 있습니다.

Back4app 컨테이너에 애플리케이션을 배포하는 것은 GitHub 저장소를 가져오고 버튼을 클릭하는 것만큼이나 간단합니다. 이 플랫폼은 뛰어난 지속적 통합 및 배포 시스템을 갖추고 있으며, 다운타임 없는 배포, 실시간 배포 추적 등을 지원합니다!

Back4app 컨테이너의 또 다른 장점은 소규모 애플리케이션 호스팅에 적합한 무료 티어를 제공한다는 점입니다. 앱이 확장되면 간단하고 예측 가능한 요금제에 따라 프리미엄 티어로 업그레이드할 수 있습니다.

Google Cloud Run

Google Cloud Run은 컨테이너화된 앱을 배포하고 확장하기 위한 완전 자동화된 서비스형 컨테이너(CaaS) 플랫폼입니다. 2019년에 공개되었으며 이후 많은 인기를 얻고 있습니다.

특히 다른 GCP 제품에 익숙하다면 Cloud Run을 비교적 쉽게 사용할 수 있습니다. Cloud Run의 장점으로는 무료 SSL 인증서, 다른 GCP 솔루션과의 우수한 통합, 제로 스케일링 등이 있습니다.

이 글을 쓰는 시점에 Google은 신규 사용자에게 300달러의 무료 크레딧을 제공합니다.

Heroku

Heroku는 선구적인 서비스형 플랫폼(PaaS) 솔루션 중 하나입니다. 2007년에 설립되어 현재까지도 높은 인기를 누리고 있습니다.

PHP, Java, Node.js, Go, Scala, Python 등 다양한 프로그래밍 언어에 대한 광범위한 지원을 제공합니다. 이 플랫폼은 매끄럽고 사용자 친화적인 UI를 갖추고 있으며 확장성이 뛰어나고 다양한 애드온을 제공합니다.

Heroku는 무료 요금제와 무료 PostgreSQL 및 Redis 인스턴스를 제공했지만 사기 및 봇과 관련된 우려로 인해 2022년에 이를 취소하기로 결정했습니다. 그럼에도 불구하고 Heroku는 여전히 앱 배포를 위한 훌륭한 플랫폼입니다.

AWS Elastic Beanstalk

AWS Elastic Beanstalk (EB)는 훌륭한 서비스형 플랫폼(PaaS) 솔루션입니다. 2011년에 구축된 성숙하고 충분한 테스트를 거친 플랫폼입니다. EB는 기본적으로 Go, Java, Node.js, PHP, Python, Ruby를 지원하며 도커화된 애플리케이션을 배포할 수 있습니다.

Elastic Beanstalk의 가장 큰 장점은 AWS S3, AWS RDS, AWS CloudFront 등과 같은 다른 AWS 솔루션과 결합할 수 있다는 점입니다. AWS는 신규 고객에게 무료 티어를 제공합니다.

PHP 배포 프로세스

이 섹션에서는 간단한 Laravel 웹 앱을 부트스트랩하고 Back4app 컨테이너에 배포하는 방법을 살펴보겠습니다.

전제 조건

  • PHP에 대한 기본적인 이해.
  • Docker 및 컨테이너화 기술에 대한 기본적인 이해.
  • Composer와 로컬 머신에 설치된 Node.jsDocker를 함께 사용하세요.

컨테이너화 기술에 익숙하지 않다면 컨테이너란 무엇인가요?

Laravel이란 무엇인가요?

라라벨 로고

Laravel은 표현력이 풍부하고 우아한 구문을 사용하여 앱을 빠르게 구축할 수 있는 훌륭한 PHP 프레임워크입니다. 결과적으로 깔끔하고 간결한 코드가 완성됩니다.

이 프레임워크는 모델-뷰-컨트롤러(MVC) 아키텍처 패턴을 기반으로 합니다. 무엇보다도 Laravel은 완전히 무료이며 오픈 소스입니다.

2011년에 처음 출시되었으며 현재 가장 인기 있는 PHP 프레임워크 중 하나입니다. 유연성이 뛰어나 모든 유형의 웹 애플리케이션을 구축하는 데 사용할 수 있습니다.

Laravel의 장점

  • 성능과 유연성.
  • 데이터베이스 작업을 간소화합니다( Eloquent ORM을 통해).
  • 기본 제공 인증 및 권한 부여.
  • 통합 보안 조치(CSRF, XSS).

일부 Laravel 대안으로는 Symfony, CodeIgniter, CakePHP, Laminas Project가 있습니다.

앱 만들기

다음 단계를 수행하려면 Composer가 설치되어 있어야 합니다. 아직 설치되어 있지 않은 경우 공식 웹사이트에서 다운로드하세요.

먼저 Composer 명령줄 인터페이스를 통해 새 Laravel 프로젝트를 생성합니다:

$ composer create-project laravel/laravel sample-app

샘플 앱을 사용자 지정 이름으로 자유롭게 대체할 수 있습니다.

이 명령은 새 Laravel 프로젝트와 기본 디렉토리 구조를 생성합니다. 또한 컴포저 설치를 통해 모든 종속성을 설치합니다. 이 명령은 최대 3분 정도 소요됩니다.

완료되면 다음과 같은 디렉토리 구조를 확인할 수 있습니다:

sample-app/
├── app/                   contains the core code of your application
│   ├── Console
│   ├── Exceptions
│   ├── Http
│   ├── Models
│   └── Providers
├── bootstrap              is used to bootstrap the framework
├── config                 contains all your configuration files
├── database               contains database factories, migrations, seeders
├── public                 contains your index.php and static assets (JS, images, CSS)
├── resources              contains all your views and templates (along with raw assets)
├── routes                 is used to define all your application endpoints
├── storage                contains logs and other auto-generated stuff
├── tests                  can be utilized for automatic testing
└── vendor                 contains your Composer dependencies

다음으로 다음 명령을 통해 개발 서버를 실행합니다:

$ php artisan serve

INFO  Server running on [http://127.0.0.1:8000].
Press Ctrl+C to stop the server.

마지막으로 즐겨찾는 웹 브라우저를 열고 http://localhost:8000/ 으로 이동합니다. 기본 Laravel 색인 페이지가 표시될 것입니다.

라라벨 색인 페이지

앱 수정

이 섹션에서는 새 API 엔드포인트를 등록하여 앱을 약간 수정해 보겠습니다.

이전 섹션에서 언급했듯이 모든 경로는 경로 폴더에 정의되어 있습니다. 경로 폴더에는 다음 파일이 포함되어 있습니다:

routes/
├── api
├── channels
├── console
└── web

디렉토리는 최종 사용자 경로를 정의하고, API 경로를 위한 api, 콘솔 명령을 정의하는 콘솔, 마지막으로 이벤트 브로드캐스팅 채널을 위한 채널을 정의합니다.

Laravel 5.3 이전에는 app/Http/routes.php에 라우팅 파일이 하나만 있었습니다.

routes/api.php로 이동하여 다음과 같이 새 API 엔드포인트를 등록합니다:

<?php

// routes/api.php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

// new endpoint
Route::get('/', function () {
    return response()->json([
        'detail' => 'Back4app Containers rocks!',
    ]);
});

좋아요, 끝났습니다.

개발 서버를 다시 시작하고(아직 실행 중이 아닌 경우) http://localhost:8000/ 으로 이동합니다. 여전히 기본 Laravel 페이지를 볼 수 있어야 하지만 /api/로 이동하면 다음과 같은 메시지가 표시됩니다:

{
    "detail": "Back4app Containers rocks!"
}

도커라이즈 앱

이 섹션에서는 도커파일을 사용하여 Laravel 앱을 도커화하겠습니다.

도커파일

Docker파일은 도커 엔진이 도커 이미지를 빌드하고 실행하기 위해 수행해야 하는 모든 명령어가 포함된 일반 텍스트 파일입니다. 명령어는 일반적으로 모두 대문자로 작성되며 사용자 지정 인수가 뒤따릅니다. 예시:

INSTRUCTION arg1 arg2 ... argn

계속해서 프로젝트 루트에 다음 내용으로 Docker파일을 생성합니다:

FROM php:8.1-apache

# Set the working directory
WORKDIR /var/www/html

# Install the necessary libraries
RUN apt-get update && apt-get install -y \
    libonig-dev \
    libzip-dev

# Install PHP extensions
RUN docker-php-ext-install \
    mbstring \
    zip

# Copy over the Laravel project
COPY . .

# Install Composer along with the dependencies
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
RUN composer install

# Change ownership of our applications
RUN chown -R www-data:www-data /var/www/html

# Copy over the .env file and generate the app key
COPY .env .env
RUN php artisan key:generate

# Expose port 80
EXPOSE 80

# Adjusting Apache configurations
RUN a2enmod rewrite
COPY apache/apache-config.conf /etc/apache2/sites-available/000-default.conf

도커파일은 php:8.1-apache를 기본 이미지로 사용하고, 필요한 OS 종속성을 설치하며, 프로젝트를 통해 복사합니다. 그런 다음 Composer를 통해 PHP 종속성을 설치하고, Laravel 키를 생성하고, 포트 80을 노출하고, 마지막으로 Apache 구성을 통해 복사합니다.

도커파일에 대해 자세히 알아보려면 도커파일 참조를 확인하세요.

.dockerignore

.dockerignore 파일을 사용하여 이미지 크기를 줄일 수 있습니다. 이 파일은 .gitignore 파일과 유사하게 작동합니다. 이 파일을 사용하면 이미지에 포함하지 않으려는 특정 파일과 디렉터리를 생략할 수 있습니다.

프로젝트 루트에 다음 내용으로 .dockerignore 파일을 만듭니다:

/.phpunit.cache
/node_modules
/public/build
/public/hot
/public/storage
/storage/*.key
/vendor
.phpunit.result.cache
auth.json
npm-debug.log
yarn-error.log
/.fleet
/.idea
/.vscode

필요에 따라 .dockerignore 파일을 자유롭게 수정하세요.

빌드, 실행 및 테스트

이미지를 빌드하기 전에 Docker가 설치되어 있는지 확인하세요:

$ docker --version

Docker version 20.10.22, build 3a2c30b

이미지를 만들 수 있는지 확인했으면 이미지를 만들 수 있습니다:

$ docker build -t laravel-sample:1.0 .

명령 런다운:

  1. 도커 빌드를 사용하여 이미지를 빌드합니다.
  2. -t laravel-sample:1.0은 이미지에 태그를 지정합니다(이미지 이름은 일반적으로 이름:버전 구조를 가집니다).
  3. 빌드 컨텍스트를 지정합니다. 이 경우 프로젝트 루트입니다.

그런 다음 새로 만든 이미지를 사용하여 컨테이너를 스핀업합니다:

$ docker run -p 80:80 --name laravel-sample-container -d laravel-sample:1.0

명령 런다운:

  1. 도커 실행은 컨테이너를 스핀업하는 데 사용됩니다.
  2. -p 80:80은 호스트의 포트 80을 컨테이너의 80에 바인딩합니다.
  3. 이름 laravel-sample-container는 컨테이너 이름을 지정합니다.
  4. -d는 분리 모드, 즉 터미널을 차지하지 않고 이미지를 실행합니다.
  5. laravel-sample:1.0은 Docker 엔진에 어떤 이미지를 사용해야 하는지 알려줍니다.

이제 실행 중인 컨테이너를 확인하면 laravel-sample-container가 표시될 것입니다:

$ docker ps

CONTAINER  IMAGE               COMMAND          CREATED  PORTS              
b0bfbd     laravel-sample:1.0  "docker-php..."  2s ago   0.0.0.0:80->80/tcp  laravel

마지막으로 자주 사용하는 웹 브라우저에서 http://localhost/ 을 방문하여 앱을 볼 수 있는지 확인하세요.

GitHub로 푸시

Back4app 컨테이너에 앱을 배포하려면 먼저 소스 코드를 GitHub에 업로드해야 합니다. Back4app 컨테이너는 코드를 특정 브랜치에 커밋하면 자동으로 배포하는 CI/CD 시스템을 사용합니다.

다음 단계를 수행하려면 GitHub 계정 (및 Git 설치)이 있어야 합니다.

https://github.com 로 이동하여 새 리포지토리를 생성합니다:

GitHub 리포지토리 만들기

그런 다음 적절한 이름을 선택하고 다른 모든 항목은 기본값으로 둡니다. 그런 다음 ‘리포지토리 만들기’ 버튼을 클릭하여 리포지토리를 만듭니다:

GitHub 리포지토리 만들기 대화 상자

리포지토리가 생성되면 원격 URL을 가져옵니다:

GitHub 원격 URL

이제 로컬 프로젝트로 돌아가서 명령줄을 엽니다. 코드를 GitHub에 푸시하려면 먼저 다음을 통해 로컬 Git 리포지토리를 초기화해야 합니다:

$ git init

그런 다음 모든 파일을 VCS하고 새 커밋을 만듭니다:

$ git add .
$ git commit -m "init"

마지막으로 리모컨에 코드를 푸시합니다:

$ git push origin master

이제 끝났습니다! GitHub 리포지토리 페이지를 새로 고치면 모든 파일이 원격 Git 리포지토리로 성공적으로 푸시된 것을 볼 수 있습니다.

앱 배포

Back4app 컨테이너에 앱을 배포하려면 먼저 로그인 (또는 아직 계정이 없는 경우 가입 )해야 합니다. 로그인하면 앱 대시보드 페이지로 리디렉션됩니다.

그런 다음 ‘새 앱 만들기’ 버튼을 사용하여 앱 만들기 프로세스를 시작합니다:

Back4app 앱 만들기

컨테이너화된 앱을 배포하는 것이므로 “서비스형 컨테이너”를 선택합니다:

Back4app 앱 유형 만들기

그런 다음 GitHub를 Back4app 계정에 연결하고 이전 단계에서 만든 리포지토리를 가져옵니다.

Back4app 컨테이너 가져오기 리포지토리

앱에 사용자 지정 이름을 지정하고 다른 모든 항목은 기본값으로 둡니다.

앱을 만들려면 “앱 만들기”를 클릭합니다. 클릭하면 Back4app이 GitHub에서 소스 코드를 자동으로 가져와서 도커 이미지 빌드 프로세스를 시작합니다. 몇 분 후 앱 상태가 “준비됨”으로 변경됩니다.

그런 다음 왼쪽에 있는 링크를 사용하여 브라우저에서 페이지를 엽니다.

Back4app 컨테이너의 성공적인 배포

그거예요!

결론

결론적으로 PHP의 장점, 단점 및 배포 옵션에 대해 배웠습니다. 이제 Laravel 애플리케이션을 부트스트랩하고 Back4app에 배포하는 방법을 알게 되었습니다.

이 튜토리얼에서 살펴본 주제는 Laravel 프레임워크의 표면적인 부분만 다루었습니다. Laravel 문서를 확인하면 언제든지 더 자세히 알아볼 수 있습니다.

소스 코드는 back4app-containers-php GitHub 리포지토리에서 확인할 수 있습니다.

향후 단계

자주 묻는 질문

PHP란 무엇인가요?

PHP는 인기 있는 무료 범용 스크립팅 언어입니다. 웹을 위해 설계되었지만 서버 측 스크립팅, 명령줄 명령 및 데스크탑 응용 프로그램에도 사용할 수 있습니다. 현재 PHP는 웹의 약 80%를 지원하며 Facebook, Wikipedia, Slack 등과 같은 고트래픽 사이트에서 사용됩니다.

PHP의 장점은 무엇인가요?

– 좋은 성능
– 크로스 플랫폼
– 데이터베이스 지원
– 활발한 생태계
– 배우기 쉬움

PHP의 단점은 무엇인가요?

– 제한된 디버깅 도구
– 느슨한 형식
– 보안 결함
– 기본 PHP는 구식

PHP 애플리케이션을 어떻게 배포하나요?

1. PHP 애플리케이션을 작성하세요.
2. 애플리케이션을 Docker화하고 로컬에서 테스트하세요.
3. 소스 코드를 GitHub에 푸시하세요.
4. Back4app Containers 계정을 생성하세요.
5. GitHub 리포지토리를 가져오고 배포를 클릭하세요!


Leave a reply

Your email address will not be published.