자습서: Azure App Service에서 PHP 및 MySQL 앱 빌드

Azure App Service는 Windows 운영 체제를 사용하여 확장성이 뛰어난 자체 패치 웹 호스팅 서비스를 제공합니다. 이 자습서에서는 Azure에서 PHP 앱을 만들고 MySQL 데이터베이스에 연결하는 방법을 보여줍니다. 완료되면 Laravel 앱이 Windows의 Azure App Service에서 실행됩니다.

Azure App Service는 Linux 운영 체제를 사용하여 확장성이 뛰어난 자체 패치 웹 호스팅 서비스를 제공합니다. 이 자습서에서는 Azure에서 PHP 앱을 만들고 MySQL 데이터베이스에 연결하는 방법을 보여줍니다. 완료되면 Laravel 앱이 Linux의 Azure App Service에서 실행됩니다.

작업 목록이라는 제목의 PHP 앱 예제 스크린샷.

이 자습서에서는 다음 작업 방법을 알아봅니다.

  • Azure에서 MySQL 데이터베이스 만들기
  • MySQL에 PHP 앱 연결
  • Azure에 앱 배포
  • 데이터 모델 업데이트 및 앱 다시 배포
  • Azure에서 진단 로그 스트림
  • Azure Portal에서 앱 관리

Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

사전 요구 사항

이 자습서를 완료하려면 다음이 필요합니다.

  • Azure Cloud Shell에서 Bash 환경을 사용합니다.

    새 창에서 Cloud Shell 시작

  • 원하는 경우 Azure CLI를 설치하여 CLI 참조 명령을 실행합니다.

    • 로컬 설치를 사용하는 경우 az login 명령을 사용하여 Azure CLI에 로그인합니다. 인증 프로세스를 완료하려면 터미널에 표시되는 단계를 수행합니다. 추가 로그인 옵션은 Azure CLI를 사용하여 로그인을 참조하세요.

    • 메시지가 표시되면 처음 사용할 때 Azure CLI 확장을 설치합니다. 확장에 대한 자세한 내용은 Azure CLI에서 확장 사용을 참조하세요.

    • az version을 실행하여 설치된 버전과 종속 라이브러리를 찾습니다. 최신 버전으로 업그레이드하려면 az upgrade를 실행합니다.

로컬 MySQL 준비

이 단계에서는 이 자습서에서 사용할 데이터베이스를 로컬 MySQL 서버에 만듭니다.

로컬 MySQL 서버에 연결

터미널 창에서 로컬 MySQL 서버에 연결합니다. 이 터미널 창을 사용하여 이 자습서의 모든 명령을 실행할 수 있습니다.

mysql -u root -p

암호를 묻는 메시지가 표시되면 root 계정에 대한 암호를 입력합니다. 루트 계정 암호가 기억나지 않는 경우 MySQL: 루트 암호를 재설정하는 방법을 참조하세요.

명령이 성공적으로 실행되면 MySQL 서버가 실행되고 있습니다. 그렇지 않은 경우 MySQL 설치 후 단계에 따라 로컬 MySQL 서버가 시작되었는지 확인합니다.

로컬에서 데이터베이스 만들기

mysql 프롬프트에서 데이터베이스를 만듭니다.

CREATE DATABASE sampledb;

quit을 입력하여 서버 연결을 종료합니다.

quit

로컬에서 PHP 앱 만들기

이 단계에서는 Laravel 샘플 애플리케이션 가져오고, 해당 데이터베이스를 구성한 후 로컬로 실행합니다.

샘플 복제

터미널 창에서 cd를 사용하여 작업 디렉터리로 이동합니다.

다음 명령을 실행하여 샘플 리포지토리를 복제합니다.

git clone https://github.com/Azure-Samples/laravel-tasks

cd를 사용하여 복제된 디렉터리로 이동합니다. 필요한 패키지를 설치합니다.

cd laravel-tasks
composer install

MySQL 연결 구성

리포지토리 루트에서 .env 라는 파일을 만듭니다. 다음 변수를 .env 파일에 복사합니다. <root_password> 자리 표시자를 MySQL 루트 사용자의 암호로 바꿉니다.

APP_ENV=local
APP_DEBUG=true
APP_KEY=

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=sampledb
DB_USERNAME=root
DB_PASSWORD=<root_password>

Laravel에서 .env 파일을 사용하는 방법에 대한 자세한 내용은 Laravel 환경 구성(영문)을 참조하세요.

로컬에서 샘플 실행

Laravel 데이터베이스 마이그레이션(영문)을 실행하여 애플리케이션에 필요한 테이블을 만듭니다. 마이그레이션에서 만들어진 테이블을 보려면 Git 리포지토리의 database/migrations 디렉터리를 살펴봅니다.

php artisan migrate

새 Laravel 애플리케이션 키를 생성합니다.

php artisan key:generate

애플리케이션을 실행합니다.

php artisan serve

브라우저에서 http://localhost:8000 으로 이동합니다. 해당 페이지에서 몇 가지 작업을 추가합니다.

PHP가 MySQL 연결에 성공

PHP를 중지하려면 터미널에서 Ctrl + C를 입력합니다.

Azure에서 MySQL 만들기

이 단계에서는 Azure Database for MySQL에서 MySQL 데이터베이스를 만듭니다. 나중에 이 데이터베이스에 연결할 PHP 애플리케이션을 구성합니다.

리소스 그룹 만들기

리소스 그룹은 웹앱, 데이터베이스, 스토리지 계정과 같은 Azure 리소스가 배포되고 관리되는 논리적 컨테이너입니다. 예를 들어 나중에 간단한 단계 하나만으로 전체 리소스 그룹을 삭제하도록 선택할 수 있습니다.

Cloud Shell에서 az group create 명령을 사용하여 리소스 그룹을 만듭니다. 다음 예제에서는 서유럽 위치에 myResourceGroup 이라는 리소스 그룹을 만듭니다. 체험 계층에서 App Service에 지원되는 모든 위치를 확인하려면 az appservice list-locations --sku FREE 명령을 실행합니다.

az group create --name myResourceGroup --location "West Europe"

일반적으로 사용자와 가까운 지역에서 리소스 그룹 및 리소스를 만듭니다.

명령이 완료되면 JSON 출력이 리소스 그룹 속성을 보여줍니다.

MySQL 서버 만들기

Cloud Shell에서 az mysql server create 명령을 사용하여 Azure Database for MySQL에 서버를 만듭니다.

다음 명령에서 <mysql-server-name> 자리 표시자의 고유한 서버 이름, <admin-user> 의 사용자 이름 및 <admin-password> 사용자 자리 표시자의 암호를 바꿉니다. 서버 이름은 MySQL 엔드포인트(https://<mysql-server-name>.mysql.database.azure.com)의 일부로 사용되므로 이름은 Azure의 모든 서버에서 고유해야 합니다. MySQL DB SKU 선택에 대한 자세한 내용은 MySQL 서버용 Azure Database 만들기를 참조하세요.

az mysql server create --resource-group myResourceGroup --name <mysql-server-name> --location "West Europe" --admin-user <admin-user> --admin-password <admin-password> --sku-name B_Gen5_1

MySQL 서버를 만들면 Azure CLI는 다음 예제와 비슷한 정보를 표시합니다.

{
  "administratorLogin": "<admin-user>",
  "administratorLoginPassword": null,
  "fullyQualifiedDomainName": "<mysql-server-name>.mysql.database.azure.com",
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.DBforMySQL/servers/<mysql-server-name>",
  "location": "westeurope",
  "name": "<mysql-server-name>",
  "resourceGroup": "myResourceGroup",
  ...
  -  < Output has been truncated for readability >
}

서버 방화벽 구성

Cloud Shell에서 az mysql server firewall-rule create 명령을 사용하여 클라이언트 연결을 허용하도록 MySQL 서버에 대한 방화벽 규칙을 만듭니다. 시작 IP 및 끝 IP가 0.0.0.0으로 설정되면 방화벽이 다른 Azure 리소스에 대해서만 열립니다.

az mysql server firewall-rule create --name allAzureIPs --server <mysql-server-name> --resource-group myResourceGroup --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0

앱이 사용하는 아웃바운드 IP 주소만 사용으로 방화벽 규칙을 훨씬 더 엄격하게 제한할 수 있습니다.

Cloud Shell에서 <your-ip-address>로컬 IPv4 IP 주소로 바꾸어 로컬 컴퓨터에서 액세스할 수 있도록 명령을 다시 실행합니다.

az mysql server firewall-rule create --name AllowLocalClient --server <mysql-server-name> --resource-group myResourceGroup --start-ip-address=<your-ip-address> --end-ip-address=<your-ip-address>

로컬에서 프로덕션 MySQL 서버에 연결

로컬 터미널 창에서 Azure의 MySQL 서버에 연결합니다. <admin-user><mysql-server-name> 에 대해 이전에 지정한 값을 사용합니다. 암호를 묻는 메시지가 표시되면 Azure에서 데이터베이스를 만들 때 지정한 암호를 사용합니다.

mysql -u <admin-user>@<mysql-server-name> -h <mysql-server-name>.mysql.database.azure.com -P 3306 -p

프로덕션 데이터베이스 만들기

mysql 프롬프트에서 데이터베이스를 만듭니다.

CREATE DATABASE sampledb;

사용 권한이 있는 사용자 만들기

phpappuser 라는 데이터베이스 사용자를 만들고 sampledb 데이터베이스의 모든 권한을 부여합니다. 자습서의 편의를 위해 MySQLAzure2017 을 암호로 사용합니다.

CREATE USER 'phpappuser' IDENTIFIED BY 'MySQLAzure2017'; 
GRANT ALL PRIVILEGES ON sampledb.* TO 'phpappuser';

quit를 입력하여 서버 연결을 종료합니다.

quit

Azure MySQL에 앱 연결

이 단계에서는 Azure Database for MySQL에서 만든 MySQL 데이터베이스에 PHP 애플리케이션을 연결합니다.

데이터베이스 연결 구성

리포지토리 루트에서 .env.production 파일을 만들고 다음 변수를 복사합니다. DB_HOSTDB_USERNAME 모두에서 자리 표시자 _<mysql-server-name>_을 바꿉니다.

APP_ENV=production
APP_DEBUG=true
APP_KEY=

DB_CONNECTION=mysql
DB_HOST=<mysql-server-name>.mysql.database.azure.com
DB_DATABASE=sampledb
DB_USERNAME=phpappuser@<mysql-server-name>
DB_PASSWORD=MySQLAzure2017
MYSQL_SSL=true

변경 내용을 저장합니다.

MySQL 연결 정보를 보호하기 위해 이 파일은 이미 Git 리포지토리에서 제외됩니다(리포지토리 루트의 .gitignore 참조). 나중에 Azure Database for MySQL에서 데이터베이스에 연결하도록 App Service에서 환경 변수를 구성하는 방법에 대해 알아봅니다. 환경 변수를 사용하면 App Service에서 .env 파일이 필요하지 않습니다.

TLS/SSL 인증서 구성

기본적으로 MySQL용 Azure 데이터베이스에는 클라이언트로부터의 TLS 연결이 적용됩니다. Azure의 MySQL 데이터베이스에 연결하려면 Azure Database for MySQL에서 제공하는 .pem 인증서를 사용해야 합니다.

다음 코드와 같이 config/database.php 를 열고 sslmodeoptions 매개 변수를 connections.mysql에 추가합니다.

'mysql' => [
    ...
    'sslmode' => env('DB_SSLMODE', 'prefer'),
    'options' => (env('MYSQL_SSL')) ? [
        PDO::MYSQL_ATTR_SSL_KEY    => '/ssl/BaltimoreCyberTrustRoot.crt.pem', 
    ] : []
],
'mysql' => [
    ...
    'sslmode' => env('DB_SSLMODE', 'prefer'),
    'options' => (env('MYSQL_SSL') && extension_loaded('pdo_mysql')) ? [
        PDO::MYSQL_ATTR_SSL_KEY    => '/ssl/BaltimoreCyberTrustRoot.crt.pem',
    ] : []
],

이 자습서에서는 편의를 위해 리포지토리에 BaltimoreCyberTrustRoot.crt.pem 인증서가 제공됩니다.

로컬에서 애플리케이션 테스트

.env.production 을 환경 파일로 사용해서 Laravel 데이터베이스 마이그레이션을 실행하고 Azure Database for MySQL에서 MySQL 데이터베이스에 테이블을 만듭니다. .env.production 에는 Azure의 MySQL 데이터베이스에 대한 연결 정보가 있습니다.

php artisan migrate --env=production --force

.env.production 에는 아직 유효한 애플리케이션 키가 없습니다. 터미널에서 새 키를 생성합니다.

php artisan key:generate --env=production --force

.env.production 을 환경 파일로 사용해서 샘플 애플리케이션을 실행합니다.

php artisan serve --env=production

http://localhost:8000로 이동합니다. 오류 없이 페이지가 로드되면 PHP 애플리케이션이 Azure의 MySQL 데이터베이스에 연결됩니다.

해당 페이지에서 몇 가지 작업을 추가합니다.

PHP가 Azure Database for MySQL에 성공적으로 연결됨

PHP를 중지하려면 터미널에서 Ctrl + C를 입력합니다.

변경 내용을 커밋합니다

다음 Git 명령을 실행하여 변경 내용을 커밋합니다.

git add .
git commit -m "database.php updates"

앱을 배포할 준비가 되었습니다.

Deploy to Azure

이 단계에서는 MySQL에 연결된 PHP 애플리케이션을 Azure App Service에 배포합니다.

배포 사용자 구성

FTP 및 로컬 Git는 배포 사용자 를 통해 Azure 웹앱에 배포할 수 있습니다. 일단 배포 사용자를 구성하면 모든 Azure 배포에 사용할 수 있습니다. 계정 수준 배포 사용자 이름 및 암호는 Azure 구독 자격 증명과 다릅니다.

배포 사용자를 구성하려면 Azure Cloud Shell에서 az webapp deployment user set 명령을 실행합니다. <username> 및 <password>를 배포 사용자 이름 및 암호로 바꿉니다.

  • 사용자 이름은 Azure 내에서 고유해야 하고, 로컬 Git 푸시의경우 ‘@’ 기호를 포함하면 안 됩니다.
  • 암호는 글자, 숫자, 기호의 세 가지 요소 중 두 가지를 사용하고 8자 이상이어야 합니다.
az webapp deployment user set --user-name <username> --password <password>

JSON 출력에는 암호가 null로 나옵니다. 'Conflict'. Details: 409 오류가 발생하면 사용자 이름을 변경합니다. 'Bad Request'. Details: 400 오류가 발생하면 더 강력한 암호를 사용합니다.

웹앱을 배포할 때 사용할 수 있도록 사용자 이름 및 암호를 기록해 둡니다.

App Service 플랜 만들기

Cloud Shell에서 az appservice plan create 명령을 사용하여 App Service 계획을 만듭니다.

다음 예에서는 체험 가격 책정 계층에서 myAppServicePlan이라는 App Service 계획을 만듭니다.

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE

App Service 계획을 만든 경우 Azure CLI는 다음 예제와 비슷한 정보를 표시합니다.

{ 
  "adminSiteName": null,
  "appServicePlanName": "myAppServicePlan",
  "geoRegion": "West Europe",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "app",
  "location": "West Europe",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

Cloud Shell에서 az appservice plan create 명령을 사용하여 App Service 계획을 만듭니다.

다음 예에서는 체험 가격 책정 계층에서 myAppServicePlan이라는 App Service 계획을 만듭니다.

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE

App Service 계획을 만든 경우 Azure CLI는 다음 예제와 비슷한 정보를 표시합니다.

{ 
  "adminSiteName": null,
  "appServicePlanName": "myAppServicePlan",
  "geoRegion": "West Europe",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "app",
  "location": "West Europe",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

웹앱 만들기

myAppServicePlan App Service 계획에서 웹앱을 만듭니다.

Cloud Shell에서 az webapp create 명령을 사용할 수 있습니다. 다음 예에서 <app-name>을 전역적으로 고유한 앱 이름으로 바꿉니다(유효한 문자는 a-z, 0-9-). 런타임은 PHP|7.2으로 설정됩니다. 지원되는 모든 런타임을 보려면 az webapp list-runtimes --linux를 실행합니다.

# Bash
az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.2" --deployment-local-git
# PowerShell
az --% webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.2" --deployment-local-git

웹앱이 만들어지면 Azure CLI에서 다음 예제와 비슷한 출력을 표시합니다.

Local git is configured with url of 'https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<app-name>.azurewebsites.net",
  "deploymentLocalGitUrl": "https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

git 배포를 활성화하여 새 빈 웹앱을 만들었습니다.

참고

Git 원격의 URL은 https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git 형식으로 deploymentLocalGitUrl 속성에 표시됩니다. 나중에 필요하므로 이 URL을 저장합니다.

myAppServicePlan App Service 계획에서 웹앱을 만듭니다.

Cloud Shell에서 az webapp create 명령을 사용할 수 있습니다. 다음 예에서 <app-name>을 전역적으로 고유한 앱 이름으로 바꿉니다(유효한 문자는 a-z, 0-9-). 런타임은 PHP|7.2으로 설정됩니다. 지원되는 모든 런타임을 보려면 az webapp list-runtimes --linux를 실행합니다.

# Bash
az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.2" --deployment-local-git
# PowerShell
az --% webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.2" --deployment-local-git

웹앱이 만들어지면 Azure CLI에서 다음 예제와 비슷한 출력을 표시합니다.

Local git is configured with url of 'https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<app-name>.azurewebsites.net",
  "deploymentLocalGitUrl": "https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

git 배포를 활성화하여 새 빈 웹앱을 만들었습니다.

참고

Git 원격의 URL은 https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git 형식으로 deploymentLocalGitUrl 속성에 표시됩니다. 나중에 필요하므로 이 URL을 저장합니다.

데이터베이스 설정 구성

App Service에서 az webapp config appsettings set 명령을 사용하여 환경 변수를 앱 설정 으로 설정합니다.

다음 명령에서는 DB_HOST, DB_DATABASE, DB_USERNAMEDB_PASSWORD 앱 설정을 구성합니다. <app-name><mysql-server-name> 자리 표시자를 바꿉니다.

az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DB_HOST="<mysql-server-name>.mysql.database.azure.com" DB_DATABASE="sampledb" DB_USERNAME="phpappuser@<mysql-server-name>" DB_PASSWORD="MySQLAzure2017" MYSQL_SSL="true"

PHP getenv 메서드를 사용하여 설정에 액세스할 수 있습니다. Laravel 코드에서는 getenv PHP에 대해 env() 래퍼를 사용합니다. 예를 들어 config/database.php 의 MySQL 구성은 다음 코드와 같습니다.

'mysql' => [
    'driver'    => 'mysql',
    'host'      => env('DB_HOST', 'localhost'),
    'database'  => env('DB_DATABASE', 'forge'),
    'username'  => env('DB_USERNAME', 'forge'),
    'password'  => env('DB_PASSWORD', ''),
    ...
],

Laravel 환경 변수 구성

Laravel에는 App Service의 애플리케이션 키가 필요합니다. 앱 설정을 사용하여 키를 구성할 수 있습니다.

로컬 터미널 창에서 php artisan을 사용하여 .env 로 저장하지 않으면서 새 애플리케이션 키를 생성합니다.

php artisan key:generate --show

Cloud Shell에서 az webapp config appsettings set 명령을 사용하여 App Service 앱에서 애플리케이션 키를 설정합니다. 자리 표시자 <app-name><outputofphpartisankey:generate> 를 바꿉니다.

az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings APP_KEY="<output_of_php_artisan_key:generate>" APP_DEBUG="true"

APP_DEBUG="true"는 배포된 앱에서 오류가 발생하면 디버깅 정보를 반환하도록 Laravel에 지시합니다. 프로덕션 애플리케이션을 실행할 때 더 안전한 false로 설정합니다.

가상 애플리케이션 경로 설정

앱에 대한 가상 애플리케이션 경로를 설정합니다. Laravel 애플리케이션 수명 주기가 애플리케이션의 루트 디렉터리 대신 public 디렉터리에서 시작되므로 이 단계가 필요합니다. 해당 수명 주기가 루트 디렉터리에서 시작하는 다른 PHP 프레임워크는 가상 애플리케이션 경로를 수동으로 구성하지 않아도 작동될 수 있습니다.

Cloud Shell에서 az resource update 명령을 사용하여 가상 애플리케이션 경로를 설정합니다. <app-name> 자리 표시자를 바꿉니다.

az resource update --name web --resource-group myResourceGroup --namespace Microsoft.Web --resource-type config --parent sites/<app_name> --set properties.virtualApplications[0].physicalPath="site\wwwroot\public" --api-version 2015-06-01

기본적으로 Azure App Service에서는 루트 가상 애플리케이션 경로( / )가 배포된 애플리케이션 파일의 루트 디렉터리(sites\wwwroot)를 가리킵니다.

Laravel 애플리케이션 수명 주기는 애플리케이션의 루트 디렉터리 대신 public 디렉터리에서 시작됩니다. App Service용 기본 PHP Docker 이미지는 Apache를 사용하며 Laravel에 맞게 DocumentRoot를 사용자 지정하는 것을 허용하지 않습니다. 하지만 .htaccess를 사용하여 루트 디렉터리 대신 /public 을 가리키도록 모든 요청을 다시 쓸 수 있습니다. 리포지토리 루트에는 이 목적을 위해 .htaccess가 이미 추가되었습니다. 이를 통해 Laravel 애플리케이션을 배포할 수 있습니다.

자세한 내용은 사이트 루트 변경을 참조하세요.

Git에서 Azure에 푸시

로컬 터미널 창으로 돌아와서 로컬 Git 리포지토리에 Azure 원격을 추가합니다. <deploymentLocalGitUrl-from-create-step>웹앱 만들기에 저장된 Git 원격의 URL로 바꿉니다.

git remote add azure <deploymentLocalGitUrl-from-create-step>

다음 명령을 사용하여 Azure 원격에 푸시하여 앱을 배포합니다. Git Credential Manager에서 자격 증명을 묻는 메시지가 표시되면 Azure Portal에 로그인하는 데 사용하는 자격 증명이 아니라 배포 사용자 구성 에서 만든 자격 증명을 입력해야 합니다.

git push azure master

이 명령을 실행하는 데 몇 분 정도 걸릴 수 있습니다. 실행 시 다음 예와 유사한 정보를 출력합니다.

Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 291 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Updating branch 'main'.
remote: Updating submodules.
remote: Preparing deployment for commit id 'a5e076db9c'.
remote: Running custom deployment command...
remote: Running deployment command...
...
< Output has been truncated for readability >

참고

배포 프로세스를 진행하면 마지막에 Composer 패키지가 설치되는 것을 알 수 있습니다. App Service는 기본 배포 중에 이러한 자동화를 실행하지 않으므로 이 샘플 리포지토리는 사용 설정에 사용되는 추가 파일 3개가 루트 디렉터리에 들어 있습니다.

  • .deployment - 이 파일은 App Service에서 bash deploy.sh를 사용자 지정 배포 스크립트로 실행하게 만듭니다.
  • deploy.sh - 사용자 지정 배포 스크립트입니다. 파일을 검토하는 경우 npm install 다음에 php composer.phar install이 실행되는 것을 볼 수 있습니다.
  • composer.phar - Composer 패키지 관리자입니다.

이 방식으로 App Service에 대한 Git 기반 배포에 어떤 단계든 추가할 수 있습니다. 자세한 내용은 사용자 지정 배포 스크립트를 참조하세요.

로컬 터미널 창으로 돌아와서 로컬 Git 리포지토리에 Azure 원격을 추가합니다. <deploymentLocalGitUrl-from-create-step>웹앱 만들기에 저장된 Git 원격의 URL로 바꿉니다.

git remote add azure <deploymentLocalGitUrl-from-create-step>

다음 명령을 사용하여 Azure 원격에 푸시하여 앱을 배포합니다. Git Credential Manager에서 자격 증명을 묻는 메시지가 표시되면 Azure Portal에 로그인하는 데 사용하는 자격 증명이 아니라 배포 사용자 구성 에서 만든 자격 증명을 입력해야 합니다.

git push azure master

이 명령을 실행하는 데 몇 분 정도 걸릴 수 있습니다. 실행 시 다음 예와 유사한 정보를 출력합니다.

Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 291 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Updating branch 'main'.
remote: Updating submodules.
remote: Preparing deployment for commit id 'a5e076db9c'.
remote: Running custom deployment command...
remote: Running deployment command...
...
< Output has been truncated for readability >

Azure 앱 찾아보기

http://<app-name>.azurewebsites.net으로 이동한 후 목록에 몇 가지 작업을 추가합니다.

새로 추가된 작업을 보여주는 작업 목록이라는 제목의 Azure 앱 예제 스크린샷.

축하합니다! Azure App Service에서 데이터 기반 PHP 앱을 실행하고 있습니다.

로컬에서 모델 업데이트 및 다시 배포

이 단계에서는 task 데이터 모델과 웹앱을 간단히 변경한 다음 업데이트를 Azure에 게시합니다.

작업 시나리오의 경우 작업을 완료한 것으로 표시할 수 있도록 애플리케이션을 수정합니다.

열 추가

로컬 터미널 창에서 Git 리포지토리의 루트로 이동합니다.

tasks 테이블에 대한 새 데이터베이스 마이그레이션을 생성합니다.

php artisan make:migration add_complete_column --table=tasks

이 명령은 생성되는 마이그레이션 파일의 이름을 표시합니다. database/migrations 에서 이 파일을 찾아서 엽니다.

up 메서드를 다음 코드로 바꿉니다.

public function up()
{
    Schema::table('tasks', function (Blueprint $table) {
        $table->boolean('complete')->default(False);
    });
}

앞의 코드는 complete라는 tasks 테이블에 부울 열을 추가합니다.

down 메서드를 롤백 작업에 대한 다음 코드로 바꿉니다.

public function down()
{
    Schema::table('tasks', function (Blueprint $table) {
        $table->dropColumn('complete');
    });
}

로컬 터미널 창에서 Laravel 데이터베이스 마이그레이션을 실행하여 로컬 데이터베이스를 변경합니다.

php artisan migrate

Laravel 명명 규칙에 따라 Task(app/Task.php 참조) 모델은 기본적으로 tasks 테이블에 매핑됩니다.

애플리케이션 논리 업데이트

routes/web.php 파일을 엽니다. 애플리케이션에서 해당 경로 및 비즈니스 논리를 여기에 정의합니다.

파일의 끝에 다음 코드를 포함하는 경로를 추가합니다.

/**
 * Toggle Task completeness
 */
Route::post('/task/{id}', function ($id) {
    error_log('INFO: post /task/'.$id);
    $task = Task::findOrFail($id);

    $task->complete = !$task->complete;
    $task->save();

    return redirect('/');
});

앞의 코드는 complete 값을 설정/해제하여 데이터 모델을 간단히 업데이트합니다.

보기 업데이트

resources/views/tasks.blade.php 파일을 엽니다. <tr> 여는 태그를 찾아 다음으로 바꿉니다.

<tr class="{{ $task->complete ? 'success' : 'active' }}" >

앞의 코드는 작업이 완료되었는지 여부에 따라 행 색을 변경합니다.

다음 줄에는 다음 코드가 있습니다.

<td class="table-text"><div>{{ $task->name }}</div></td>

전체 줄을 다음 코드로 바꿉니다.

<td>
    <form action="{{ url('task/'.$task->id) }}" method="POST">
        {{ csrf_field() }}

        <button type="submit" class="btn btn-xs">
            <i class="fa {{$task->complete ? 'fa-check-square-o' : 'fa-square-o'}}"></i>
        </button>
        {{ $task->name }}
    </form>
</td>

앞의 코드는 이전에 정의한 경로를 참조하는 제출 단추를 추가합니다.

로컬에서 변경 내용 테스트

로컬 터미널 창에서 Git 리포지토리의 루트 디렉터리에서 개발 서버를 실행합니다.

php artisan serve

작업 상태 변경을 확인하려면 http://localhost:8000으로 이동하고 확인란을 선택합니다.

작업에 확인란이 추가됨

PHP를 중지하려면 터미널에서 Ctrl + C를 입력합니다.

변경 내용을 Azure에 게시

로컬 터미널 창에서 프로덕션 연결 문자열로 Laravel 데이터베이스 마이그레이션을 실행하여 Azure 데이터베이스를 변경합니다.

php artisan migrate --env=production --force

Git에서 모든 변경 내용을 커밋한 다음 Azure에 코드 변경 내용을 푸시합니다.

git add .
git commit -m "added complete checkbox"
git push azure main

git push가 완료되면 Azure 앱으로 이동하여 새 기능을 테스트합니다.

Azure에 게시된 모델 및 데이터베이스 변경 내용

모든 작업을 추가했으면 데이터베이스에서 유지됩니다. 데이터 스키마를 업데이트하는 경우 기존 데이터는 그대로 유지됩니다.

진단 로그 스트림

PHP 애플리케이션이 Azure App Service에서 실행되는 동안 콘솔 로그를 터미널에 파이프할 수 있습니다. 이 방법으로 애플리케이션 오류를 디버깅하는 데 도움이 되는 진단 메시지를 동일하게 받을 수 있습니다.

로그 스트리밍을 시작하려면 Cloud Shell에서 az webapp log tail 명령을 사용합니다.

az webapp log tail --name <app_name> --resource-group myResourceGroup

로그 스트리밍이 시작되면 브라우저에서 Azure 앱을 새로 고쳐 일부 웹 트래픽을 가져옵니다. 이제 터미널에 파이프된 콘솔 로그가 표시될 수 있습니다. 콘솔 로그가 즉시 표시되지 않으면 30초 후에 다시 확인합니다.

언제든지 로그 스트리밍을 중지하려면 Ctrl+C를 입력합니다.

App Service의 애플리케이션 코드 내부에서 생성된 콘솔 로그에 액세스하려면 Cloud Shell에서 다음 명령을 실행하여 진단 로깅을 켭니다.

az webapp log config --resource-group <resource-group-name> --name <app-name> --application-logging true --level Verbose

--level에 대한 가능한 값은 Error, Warning, InfoVerbose입니다. 각 후속 수준에는 이전 수준이 포함됩니다. 예를 들어 Error에는 오류 메시지만 포함하고 Verbose에는 모든 메시지를 포함합니다.

진단 로깅이 설정되면 다음 명령을 실행하여 로그 스트림을 확인합니다.

az webapp log tail --resource-group <resource-group-name> --name <app-name>

콘솔 로그가 즉시 표시되지 않으면 30초 후에 다시 확인합니다.

참고

https://<app-name>.scm.azurewebsites.net/api/logs/docker의 브라우저에서 로그 파일을 검사할 수도 있습니다.

언제든지 로그 스트리밍을 중지하려면 Ctrl+C를 입력합니다.

PHP 애플리케이션은 표준 error_log()를 사용하여 콘솔에 출력할 수 있습니다. 샘플 애플리케이션은 app/Http/routes.php 에서 이 접근 방식을 사용합니다.

웹 프레임워크로서 Laravel은 Monolog 로깅 공급자로 사용합니다. Monolog가 메시지를 콘솔로 출력하게 하는 방법은 PHP: monolog를 사용하여 콘솔에 기록하는 방법(php://out)을 참조하세요.

Azure 앱 관리

만든 앱을 관리하려면 Azure Portal로 이동합니다.

왼쪽 메뉴에서 App Services 를 클릭한 다음, Azure 앱의 이름을 클릭합니다.

Azure 앱에 대한 포털 탐색

앱의 [개요] 페이지가 표시됩니다. 여기서 중지, 시작, 다시 시작, 찾아보기 및 삭제와 같은 기본 관리 작업을 수행할 수 있습니다.

왼쪽 메뉴에서 앱을 구성하기 위한 페이지를 제공합니다.

Azure Portal의 App Service 페이지

리소스 정리

이전 단계에서 Azure 리소스를 리소스 그룹에 만들었습니다. 나중에 이러한 리소스가 필요하지 않을 것 같으면 Cloud Shell에서 다음 명령을 실행하여 리소스 그룹을 삭제합니다.

az group delete --name myResourceGroup

이 명령을 실행하는 데 1분 정도 걸릴 수 있습니다.

다음 단계

이 자습서에서는 다음 작업 방법을 알아보았습니다.

  • Azure에서 MySQL 데이터베이스 만들기
  • MySQL에 PHP 앱 연결
  • Azure에 앱 배포
  • 데이터 모델 업데이트 및 앱 다시 배포
  • Azure에서 진단 로그 스트림
  • Azure Portal에서 앱 관리

사용자 지정 DNS 이름을 앱에 매핑하는 방법에 대해 알아보려면 다음 자습서로 이동합니다.

또는 다른 리소스를 확인합니다.