자습서: Azure에서 PHP 및 MySQL 앱 빌드Tutorial: Build a PHP and MySQL app in Azure

참고

이 문서에서는 Windows의 App Service에 앱을 배포합니다.This article deploys an app to App Service on Windows. _Linux_의 App Service에 배포하려면, Linux의 Azure App Service에서 PHP와 MySQL 앱 빌드를 참조하세요.To deploy to App Service on Linux, see Build a PHP and MySQL app in Azure App Service on Linux.

Azure App Service는 확장성 높은 자체 패치 웹 호스팅 서비스를 제공합니다.Azure App Service provides a highly scalable, self-patching web hosting service. 이 자습서에서는 Azure에서 PHP 앱을 만들고 MySQL 데이터베이스에 연결하는 방법을 보여줍니다.This tutorial shows how to create a PHP app in Azure and connect it to a MySQL database. 완료되면 Laravel 앱이 Azure App Service에서 실행됩니다.When you're finished, you'll have a Laravel app running on Azure App Service.

Azure App Service에서 실행 중인 PHP 앱

이 자습서에서는 다음 작업 방법을 알아봅니다.In this tutorial, you learn how to:

  • Azure에서 MySQL 데이터베이스 만들기Create a MySQL database in Azure
  • MySQL에 PHP 앱 연결Connect a PHP app to MySQL
  • Azure에 앱 배포Deploy the app to Azure
  • 데이터 모델 업데이트 및 앱 다시 배포Update the data model and redeploy the app
  • Azure에서 진단 로그 스트림Stream diagnostic logs from Azure
  • Azure Portal에서 앱 관리Manage the app in the Azure portal

Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.If you don't have an Azure subscription, create a free account before you begin.

필수 구성 요소Prerequisites

이 자습서를 완료하려면 다음이 필요합니다.To complete this tutorial:

로컬 MySQL 준비Prepare local MySQL

이 단계에서는 이 자습서에서 사용할 데이터베이스를 로컬 MySQL 서버에 만듭니다.In this step, you create a database in your local MySQL server for your use in this tutorial.

로컬 MySQL 서버에 연결Connect to local MySQL server

터미널 창에서 로컬 MySQL 서버에 연결합니다.In a terminal window, connect to your local MySQL server. 이 터미널 창을 사용하여 이 자습서의 모든 명령을 실행할 수 있습니다.You can use this terminal window to run all the commands in this tutorial.

mysql -u root -p

암호를 묻는 메시지가 표시되면 root 계정에 대한 암호를 입력합니다.If you're prompted for a password, enter the password for the root account. 루트 계정 암호가 기억나지 않는 경우 MySQL: 루트 암호를 재설정하는 방법을 참조하세요.If you don't remember your root account password, see MySQL: How to Reset the Root Password.

명령이 성공적으로 실행되면 MySQL 서버가 실행되고 있습니다.If your command runs successfully, then your MySQL server is running. 그렇지 않은 경우 MySQL 설치 후 단계에 따라 로컬 MySQL 서버가 시작되었는지 확인합니다.If not, make sure that your local MySQL server is started by following the MySQL post-installation steps.

로컬에서 데이터베이스 만들기Create a database locally

mysql 프롬프트에서 데이터베이스를 만듭니다.At the mysql prompt, create a database.

CREATE DATABASE sampledb;

quit을 입력하여 서버 연결을 종료합니다.Exit your server connection by typing quit.

quit

로컬에서 PHP 앱 만들기Create a PHP app locally

이 단계에서는 Laravel 샘플 애플리케이션 가져오고, 해당 데이터베이스를 구성한 후 로컬로 실행합니다.In this step, you get a Laravel sample application, configure its database connection, and run it locally.

샘플 복제Clone the sample

터미널 창에서 cd를 사용하여 작업 디렉터리로 이동합니다.In the terminal window, cd to a working directory.

다음 명령을 실행하여 샘플 리포지토리를 복제합니다.Run the following command to clone the sample repository.

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

cd를 사용하여 복제된 디렉터리로 이동합니다.cd to your cloned directory. 필요한 패키지를 설치합니다.Install the required packages.

cd laravel-tasks
composer install

MySQL 연결 구성Configure MySQL connection

리포지토리 루트에서 .env라는 텍스트 파일을 만듭니다.In the repository root, create a text file named .env. 다음 변수를 .env 파일에 복사합니다.Copy the following variables into the .env file. <root_password> 자리 표시자를 MySQL 루트 사용자의 암호로 바꿉니다.Replace the <root_password> placeholder with the MySQL root user's password.

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 환경 구성(영문)을 참조하세요.For information on how Laravel uses the .env file, see Laravel Environment Configuration.

로컬에서 샘플 실행Run the sample locally

Laravel 데이터베이스 마이그레이션(영문)을 실행하여 애플리케이션에 필요한 테이블을 만듭니다.Run Laravel database migrations to create the tables the application needs. 마이그레이션에서 만들어진 테이블을 보려면 Git 리포지토리의 database/migrations 디렉터리를 살펴봅니다.To see which tables are created in the migrations, look in the database/migrations directory in the Git repository.

php artisan migrate

새 Laravel 애플리케이션 키를 생성합니다.Generate a new Laravel application key.

php artisan key:generate

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

php artisan serve

브라우저에서 http://localhost:8000 으로 이동합니다.Navigate to http://localhost:8000 in a browser. 해당 페이지에서 몇 가지 작업을 추가합니다.Add a few tasks in the page.

PHP가 MySQL 연결에 성공

PHP 서버를 중지하려면 터미널에서 Ctrl + C를 입력합니다.To stop the PHP server, type Ctrl + C in the terminal.

Azure Cloud Shell 사용Use Azure Cloud Shell

Azure는 브라우저를 통해 사용할 수 있는 대화형 셸 환경인 Azure Cloud Shell을 호스트합니다.Azure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. Cloud Shell에서 Bash 또는 PowerShell을 사용하여 Azure 서비스 작업을 수행할 수 있습니다.You can use either Bash or PowerShell with Cloud Shell to work with Azure services. 로컬 환경에 아무 것도 설치할 필요 없이 Azure Cloud Shell의 미리 설치된 명령을 사용하여 이 문서의 코드를 실행할 수 있습니다.You can use the Cloud Shell preinstalled commands to run the code in this article without having to install anything on your local environment.

Azure Cloud Shell을 시작하려면 다음을 수행합니다.To start Azure Cloud Shell:

옵션Option 예제/링크Example/Link
코드 블록의 오른쪽 위 모서리에서 사용을 선택합니다.Select Try It in the upper-right corner of a code block. 사용해보기를 선택하면 코드가 Cloud Shell에 자동으로 복사되지 않습니다.Selecting Try It doesn't automatically copy the code to Cloud Shell. Azure Cloud Shell에 대한 사용 예제
https://shell.azure.com으로 이동하거나 Cloud Shell 시작 버튼을 선택하여 브라우저에서 Cloud Shell을 엽니다.Go to https://shell.azure.com, or select the Launch Cloud Shell button to open Cloud Shell in your browser. 새 창에서 Cloud Shell 시작Launch Cloud Shell in a new window
Azure Portal의 오른쪽 위에 있는 메뉴 모음에서 Cloud Shell 단추를 선택합니다.Select the Cloud Shell button on the menu bar at the upper right in the Azure portal. Azure Portal의 Cloud Shell 단추

이 문서의 코드를 Azure Cloud Shell에서 실행하려면 다음을 수행합니다.To run the code in this article in Azure Cloud Shell:

  1. Cloud Shell을 시작합니다.Start Cloud Shell.

  2. 코드 블록의 복사 단추를 선택하여 코드를 복사합니다.Select the Copy button on a code block to copy the code.

  3. Windows 및 Linux에서 Ctrl+Shift+V를 선택하거나 macOS에서 Cmd+Shift+V를 선택하여 코드를 Cloud Shell 세션에 붙여넣습니다.Paste the code into the Cloud Shell session by selecting Ctrl+Shift+V on Windows and Linux or by selecting Cmd+Shift+V on macOS.

  4. Enter를 선택하여 코드를 실행합니다.Select Enter to run the code.

Azure에서 MySQL 만들기Create MySQL in Azure

이 단계에서는 Azure Database for MySQL에서 MySQL 데이터베이스를 만듭니다.In this step, you create a MySQL database in Azure Database for MySQL. 나중에 이 데이터베이스에 연결할 PHP 애플리케이션을 구성합니다.Later, you configure the PHP application to connect to this database.

리소스 그룹 만들기Create a resource group

리소스 그룹은 웹앱, 데이터베이스, 스토리지 계정과 같은 Azure 리소스가 배포되고 관리되는 논리적 컨테이너입니다.A resource group is a logical container into which Azure resources like web apps, databases, and storage accounts are deployed and managed. 예를 들어 나중에 간단한 단계 하나만으로 전체 리소스 그룹을 삭제하도록 선택할 수 있습니다.For example, you can choose to delete the entire resource group in one simple step later.

Cloud Shell에서 az group create 명령을 사용하여 리소스 그룹을 만듭니다.In the Cloud Shell, create a resource group with the az group create command. 다음 예제에서는 서유럽 위치에 myResourceGroup이라는 리소스 그룹을 만듭니다.The following example creates a resource group named myResourceGroup in the West Europe location. 체험 계층에서 App Service에 지원되는 모든 위치를 확인하려면 az appservice list-locations --sku FREE 명령을 실행합니다.To see all supported locations for App Service in Free tier, run the az appservice list-locations --sku FREE command.

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

일반적으로 사용자와 가까운 지역에서 리소스 그룹 및 리소스를 만듭니다.You generally create your resource group and the resources in a region near you.

명령이 완료되면 JSON 출력이 리소스 그룹 속성을 보여줍니다.When the command finishes, a JSON output shows you the resource group properties.

MySQL 서버 만들기Create a MySQL server

Cloud Shell에서 az mysql server create 명령을 사용하여 Azure Database for MySQL에 서버를 만듭니다.In the Cloud Shell, create a server in Azure Database for MySQL with the az mysql server create command.

다음 명령에서 <mysql_server_name> 자리 표시자의 고유한 서버 이름, <admin_user> 의 사용자 이름 및 <admin_password> 사용자 자리 표시자의 암호를 바꿉니다.In the following command, substitute a unique server name for the <mysql_server_name> placeholder, a user name for the <admin_user>, and a password for the <admin_password> placeholder. 서버 이름은 MySQL 엔드포인트(https://<mysql_server_name>.mysql.database.azure.com)의 일부로 사용되므로 이름은 Azure의 모든 서버에서 고유해야 합니다.The server name is used as part of your MySQL endpoint (https://<mysql_server_name>.mysql.database.azure.com), so the name needs to be unique across all servers in Azure.

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

참고

이 자습서에서 고려하는 자격 증명에는 여러 가지가 있으므로, 혼동을 피하기 위해 --admin-user--admin-password는 dummy 값으로 설정됩니다.Since there are several credentials to think about in this tutorial, to avoid confusion, --admin-user and --admin-password are set to dummy values. 프로덕션 환경에서 Azure의 MySQL 서버에 사용할 좋은 사용자 이름 및 암호를 선택하는 경우 보안 모범 사례를 따릅니다.In a production environment, follow security best practices when choosing a good username and password for your MySQL server in Azure.

MySQL 서버를 만들면 Azure CLI는 다음 예제와 비슷한 정보를 표시합니다.When the MySQL server is created, the Azure CLI shows information similar to the following example:

{
  "location": "westeurope",
  "name": "<mysql_server_name>",
  "resourceGroup": "myResourceGroup",
  "sku": {
    "additionalProperties": {},
    "capacity": 1,
    "family": "Gen5",
    "name": "B_Gen5_1",
    "size": null,
    "tier": "GeneralPurpose"
  },
  "sslEnforcement": "Enabled",
  ...    +  
  -  < Output has been truncated for readability >
}

서버 방화벽 구성Configure server firewall

Cloud Shell에서 az mysql server firewall-rule create 명령을 사용하여 클라이언트 연결을 허용하도록 MySQL 서버에 대한 방화벽 규칙을 만듭니다.In the Cloud Shell, create a firewall rule for your MySQL server to allow client connections by using the az mysql server firewall-rule create command. 시작 IP 및 끝 IP가 0.0.0.0으로 설정되면 방화벽이 다른 Azure 리소스에 대해서만 열립니다.When both starting IP and end IP are set to 0.0.0.0, the firewall is only opened for other Azure resources.

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 주소만 사용으로 방화벽 규칙을 훨씬 더 엄격하게 제한할 수 있습니다.You can be even more restrictive in your firewall rule by using only the outbound IP addresses your app uses.

Cloud Shell에서 <your_ip_address>로컬 IPv4 IP 주소로 바꾸어 로컬 컴퓨터에서 액세스할 수 있도록 명령을 다시 실행합니다.In the Cloud Shell, run the command again to allow access from your local computer by replacing <your_ip_address> with your local IPv4 IP address.

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 서버에 연결Connect to production MySQL server locally

로컬 터미널 창에서 Azure의 MySQL 서버에 연결합니다.In the local terminal window, connect to the MySQL server in Azure. <mysql_server_name> 에 대해 이전에 지정한 값을 사용합니다.Use the value you specified previously for <mysql_server_name>. 암호를 묻는 메시지가 표시되면 Azure에서 데이터베이스를 만들 때 지정한 암호를 사용합니다.When prompted for a password, use the password you specified when you created the database in Azure.

mysql -u <admin_user>@<mysql_server_name> -h <mysql_server_name>.mysql.database.azure.com -P 3306 -p<PASSWORD> --ssl-mode=REQUIRED --ssl-ca=<PATH_TO_PEM>

프로덕션 데이터베이스 만들기Create a production database

mysql 프롬프트에서 데이터베이스를 만듭니다.At the mysql prompt, create a database.

CREATE DATABASE sampledb;

사용 권한이 있는 사용자 만들기Create a user with permissions

phpappuser 라는 데이터베이스 사용자를 만들고 sampledb 데이터베이스의 모든 권한을 부여합니다.Create a database user called phpappuser and give it all privileges in the sampledb database. 다시, 자습서의 편의를 위해 MySQLAzure2017 을 암호로 사합니다.Again, for simplicity of the tutorial, use MySQLAzure2017 as the password.

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

quit를 입력하여 서버 연결을 종료합니다.Exit the server connection by typing quit.

quit

Azure MySQL에 앱 연결Connect app to Azure MySQL

이 단계에서는 Azure Database for MySQL에서 만든 MySQL 데이터베이스에 PHP 애플리케이션을 연결합니다.In this step, you connect the PHP application to the MySQL database you created in Azure Database for MySQL.

데이터베이스 연결 구성Configure the database connection

리포지토리 루트에서 .env.production 파일을 만들고 다음 변수를 복사합니다.In the repository root, create an .env.production file and copy the following variables into it. DB_HOSTDB_USERNAME 모두에서 자리 표시자 <mysql_server_name> 을 바꿉니다.Replace the placeholder <mysql_server_name> in both DB_HOST and DB_USERNAME.

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

변경 내용을 저장합니다.Save the changes.

MySQL 연결 정보를 보호하기 위해 이 파일은 이미 Git 리포지토리에서 제외됩니다(리포지토리 루트의 .gitignore 참조).To secure your MySQL connection information, this file is already excluded from the Git repository (See .gitignore in the repository root). 나중에 Azure Database for MySQL에서 데이터베이스에 연결하도록 App Service에서 환경 변수를 구성하는 방법에 대해 알아봅니다.Later, you learn how to configure environment variables in App Service to connect to your database in Azure Database for MySQL. 환경 변수를 사용하면 App Service에서 .env 파일이 필요하지 않습니다.With environment variables, you don't need the .env file in App Service.

TLS/SSL 인증서 구성Configure TLS/SSL certificate

기본적으로 MySQL용 Azure 데이터베이스에는 클라이언트로부터의 TLS 연결이 적용됩니다.By default, Azure Database for MySQL enforces TLS connections from clients. Azure의 MySQL 데이터베이스에 연결하려면 Azure Database for MySQL에서 제공하는 .pem 인증서를 사용해야 합니다.To connect to your MySQL database in Azure, you must use the .pem certificate supplied by Azure Database for MySQL.

다음 코드와 같이 _config/database.php_를 열고 sslmodeoptions 매개 변수를 connections.mysql에 추가합니다.Open config/database.php and add the sslmode and options parameters to connections.mysql, as shown in the following code.

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

이 자습서에서는 편의를 위해 리포지토리에 BaltimoreCyberTrustRoot.crt.pem 인증서가 제공됩니다.The certificate BaltimoreCyberTrustRoot.crt.pem is provided in the repository for convenience in this tutorial.

로컬에서 애플리케이션 테스트Test the application locally

.env.production_을 환경 파일로 사용해서 Laravel 데이터베이스 마이그레이션을 실행하고 Azure Database for MySQL에서 MySQL 데이터베이스에 테이블을 만듭니다.Run Laravel database migrations with .env.production as the environment file to create the tables in your MySQL database in Azure Database for MySQL. .env.production_에는 Azure의 MySQL 데이터베이스에 대한 연결 정보가 있습니다.Remember that .env.production has the connection information to your MySQL database in Azure.

php artisan migrate --env=production --force

.env.production_에는 아직 유효한 애플리케이션 키가 없습니다..env.production_ doesn't have a valid application key yet. 터미널에서 새 키를 생성합니다.Generate a new one for it in the terminal.

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

_.env.production_을 환경 파일로 사용해서 샘플 애플리케이션을 실행합니다.Run the sample application with .env.production as the environment file.

php artisan serve --env=production

http://localhost:8000로 이동합니다.Navigate to http://localhost:8000. 오류 없이 페이지가 로드되면 PHP 애플리케이션이 Azure의 MySQL 데이터베이스에 연결됩니다.If the page loads without errors, the PHP application is connecting to the MySQL database in Azure.

해당 페이지에서 몇 가지 작업을 추가합니다.Add a few tasks in the page.

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

PHP를 중지하려면 터미널에서 Ctrl + C를 입력합니다.To stop PHP, type Ctrl + C in the terminal.

변경 내용을 커밋합니다Commit your changes

다음 Git 명령을 실행하여 변경 내용을 커밋합니다.Run the following Git commands to commit your changes:

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

앱을 배포할 준비가 되었습니다.Your app is ready to be deployed.

Deploy to AzureDeploy to Azure

이 단계에서는 MySQL에 연결된 PHP 애플리케이션을 Azure App Service에 배포합니다.In this step, you deploy the MySQL-connected PHP application to Azure App Service.

배포 사용자 구성Configure a deployment user

FTP 및 로컬 Git는 배포 사용자를 통해 Azure 웹앱에 배포할 수 있습니다.FTP and local Git can deploy to an Azure web app by using a deployment user. 일단 배포 사용자를 구성하면 모든 Azure 배포에 사용할 수 있습니다.Once you configure your deployment user, you can use it for all your Azure deployments. 계정 수준 배포 사용자 이름 및 암호는 Azure 구독 자격 증명과 다릅니다.Your account-level deployment username and password are different from your Azure subscription credentials.

배포 사용자를 구성하려면 Azure Cloud Shell에서 az webapp deployment user set 명령을 실행합니다.To configure the deployment user, run the az webapp deployment user set command in Azure Cloud Shell. <username> 및 <password>를 배포 사용자 이름 및 암호로 바꿉니다.Replace <username> and <password> with a deployment user username and password.

  • 사용자 이름은 Azure 내에서 고유해야 하고, 로컬 Git 푸시의경우 ' @' 기호를 포함하면 안 됩니다.The username must be unique within Azure, and for local Git pushes, must not contain the ‘@’ symbol.
  • 암호는 글자, 숫자, 기호의 세 가지 요소 중 두 가지를 사용하고 8자 이상이어야 합니다.The password must be at least eight characters long, with two of the following three elements: letters, numbers, and symbols.
az webapp deployment user set --user-name <username> --password <password>

JSON 출력에는 암호가 null로 나옵니다.The JSON output shows the password as null. 'Conflict'. Details: 409 오류가 발생하면 사용자 이름을 변경합니다.If you get a 'Conflict'. Details: 409 error, change the username. 'Bad Request'. Details: 400 오류가 발생하면 더 강력한 암호를 사용합니다.If you get a 'Bad Request'. Details: 400 error, use a stronger password.

웹앱을 배포할 때 사용할 수 있도록 사용자 이름 및 암호를 기록해 둡니다.Record your username and password to use to deploy your web apps.

App Service 플랜 만들기Create an App Service plan

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

다음 예에서는 체험 가격 책정 계층에서 myAppServicePlan이라는 App Service 계획을 만듭니다.The following example creates an App Service plan named myAppServicePlan in the Free pricing tier:

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

App Service 계획을 만든 경우 Azure CLI는 다음 예제와 비슷한 정보를 표시합니다.When the App Service plan has been created, the Azure CLI shows information similar to the following example:

{ 
  "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
} 

웹앱 만들기Create a web app

myAppServicePlan App Service 계획에서 웹앱을 만듭니다.Create a web app in the myAppServicePlan App Service plan.

Cloud Shell에서 az webapp create 명령을 사용할 수 있습니다.In the Cloud Shell, you can use the az webapp create command. 다음 예에서 <app-name>을 전역적으로 고유한 앱 이름으로 바꿉니다(유효한 문자는 a-z, 0-9-).In the following example, replace <app-name> with a globally unique app name (valid characters are a-z, 0-9, and -). 런타임은 PHP|7.3으로 설정됩니다.The runtime is set to PHP|7.3. 지원되는 모든 런타임을 보려면 az webapp list-runtimes --linux를 실행합니다.To see all supported runtimes, run az webapp list-runtimes --linux.

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

웹앱이 만들어지면 Azure CLI에서 다음 예제와 비슷한 출력을 표시합니다.When the web app has been created, the Azure CLI shows output similar to the following example:

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 배포를 활성화하여 새 빈 웹앱을 만들었습니다.You’ve created an empty new web app, with git deployment enabled.

참고

Git 원격의 URL은 https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git 형식으로 deploymentLocalGitUrl 속성에 표시됩니다.The URL of the Git remote is shown in the deploymentLocalGitUrl property, with the format https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git. 나중에 필요하므로 이 URL을 저장합니다.Save this URL as you need it later.

데이터베이스 설정 구성Configure database settings

앞서 설명한 것처럼 App Service에서 환경 변수를 사용하여 Azure MySQL 데이터베이스에 연결할 수 있습니다.As pointed out previously, you can connect to your Azure MySQL database using environment variables in App Service.

Cloud Shell에서 az webapp config appsettings set 명령을 사용하여 환경 변수를 _앱 설정_으로 설정합니다.In the Cloud Shell, you set environment variables as app settings by using the az webapp config appsettings set command.

다음 명령에서는 DB_HOST, DB_DATABASE, DB_USERNAMEDB_PASSWORD 앱 설정을 구성합니다.The following command configures the app settings DB_HOST, DB_DATABASE, DB_USERNAME, and DB_PASSWORD. <appname><mysql_server_name> 자리 표시자를 바꿉니다.Replace the placeholders <appname> and <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 메서드를 사용하여 설정에 액세스할 수 있습니다.You can use the PHP getenv method to access the settings. Laravel 코드에서는 getenv PHP에 대해 env() 래퍼를 사용합니다.the Laravel code uses an env wrapper over the PHP getenv. 예를 들어 _config/database.php_의 MySQL 구성은 다음 코드와 같습니다.For example, the MySQL configuration in config/database.php looks like the following code:

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

Laravel 환경 변수 구성Configure Laravel environment variables

Laravel에는 App Service의 애플리케이션 키가 필요합니다.Laravel needs an application key in App Service. 앱 설정을 사용하여 키를 구성할 수 있습니다.You can configure it with app settings.

로컬 터미널 창에서 php artisan을 사용하여 _.env_로 저장하지 않으면서 새 애플리케이션 키를 생성합니다.In the local terminal window, use php artisan to generate a new application key without saving it to .env.

php artisan key:generate --show

Cloud Shell에서 az webapp config appsettings set 명령을 사용하여 App Service 앱에서 애플리케이션 키를 설정합니다.In the Cloud Shell, set the application key in the App Service app by using the az webapp config appsettings set command. 자리 표시자 <appname><outputofphpartisankey:generate> 를 바꿉니다.Replace the placeholders <appname> and <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에 지시합니다.APP_DEBUG="true" tells Laravel to return debugging information when the deployed app encounters errors. 프로덕션 애플리케이션을 실행할 때 더 안전한 false로 설정합니다.When running a production application, set it to false, which is more secure.

가상 애플리케이션 경로 설정Set the virtual application path

앱에 대한 가상 애플리케이션 경로를 설정합니다.Set the virtual application path for the app. Laravel 애플리케이션 수명 주기가 애플리케이션의 루트 디렉터리 대신 public 디렉터리에서 시작되므로 이 단계가 필요합니다.This step is required because the Laravel application lifecycle begins in the public directory instead of the application's root directory. 해당 수명 주기가 루트 디렉터리에서 시작하는 다른 PHP 프레임워크는 가상 애플리케이션 경로를 수동으로 구성하지 않아도 작동될 수 있습니다.Other PHP frameworks whose lifecycle start in the root directory can work without manual configuration of the virtual application path.

Cloud Shell에서 az resource update 명령을 사용하여 가상 애플리케이션 경로를 설정합니다.In the Cloud Shell, set the virtual application path by using the az resource update command. <appname> 자리 표시자를 바꿉니다.Replace the <appname> placeholder.

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)를 가리킵니다.By default, Azure App Service points the root virtual application path (/) to the root directory of the deployed application files (sites\wwwroot).

Git에서 Azure에 푸시Push to Azure from Git

로컬 터미널 창으로 돌아와서 로컬 Git 리포지토리에 Azure 원격을 추가합니다.Back in the local terminal window, add an Azure remote to your local Git repository. <deploymentLocalGitUrl-from-create-step>웹앱 만들기에 저장된 Git 원격의 URL로 바꿉니다.Replace <deploymentLocalGitUrl-from-create-step> with the URL of the Git remote that you saved from Create a web app.

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

다음 명령을 사용하여 Azure 원격에 푸시하여 앱을 배포합니다.Push to the Azure remote to deploy your app with the following command. Git Credential Manager에서 자격 증명을 묻는 메시지가 표시되면 Azure Portal에 로그인하는 데 사용하는 자격 증명이 아니라 배포 사용자 구성에서 만든 자격 증명을 입력해야 합니다.When Git Credential Manager prompts you for credentials, make sure you enter the credentials you created in Configure a deployment user, not the credentials you use to sign in to the Azure portal.

git push azure master

이 명령을 실행하는 데 몇 분 정도 걸릴 수 있습니다.This command may take a few minutes to run. 실행 시 다음 예와 유사한 정보를 출력합니다.While running, it displays information similar to the following example:

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 'master'.
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 패키지가 설치되는 것을 알 수 있습니다.You may notice that the deployment process installs Composer packages at the end. App Service는 기본 배포 중에 이러한 자동화를 실행하지 않으므로 이 샘플 리포지토리는 사용 설정에 사용되는 추가 파일 3개가 루트 디렉터리에 들어 있습니다.App Service does not run these automations during default deployment, so this sample repository has three additional files in its root directory to enable it:

  • .deployment - 이 파일은 App Service에서 bash deploy.sh를 사용자 지정 배포 스크립트로 실행하게 만듭니다..deployment - This file tells App Service to run bash deploy.sh as the custom deployment script.
  • deploy.sh - 사용자 지정 배포 스크립트입니다.deploy.sh - The custom deployment script. 파일을 검토하는 경우 npm install 다음에 php composer.phar install이 실행되는 것을 볼 수 있습니다.If you review the file, you will see that it runs php composer.phar install after npm install.
  • composer.phar - Composer 패키지 관리자입니다.composer.phar - The Composer package manager.

이 방식으로 App Service에 대한 Git 기반 배포에 어떤 단계든 추가할 수 있습니다.You can use this approach to add any step to your Git-based deployment to App Service. 자세한 내용은 사용자 지정 배포 스크립트를 참조하세요.For more information, see Custom Deployment Script.

Azure 앱 찾아보기Browse to the Azure app

http://<app_name>.azurewebsites.net으로 이동한 후 목록에 몇 가지 작업을 추가합니다.Browse to http://<app_name>.azurewebsites.net and add a few tasks to the list.

Azure App Service에서 실행 중인 PHP 앱

축하합니다! Azure App Service에서 데이터 기반 PHP 앱을 실행하고 있습니다.Congratulations, you're running a data-driven PHP app in Azure App Service.

로컬에서 모델 업데이트 및 다시 배포Update model locally and redeploy

이 단계에서는 task 데이터 모델과 웹앱을 간단히 변경한 다음 업데이트를 Azure에 게시합니다.In this step, you make a simple change to the task data model and the webapp, and then publish the update to Azure.

작업 시나리오의 경우 작업을 완료한 것으로 표시할 수 있도록 애플리케이션을 수정합니다.For the tasks scenario, you modify the application so that you can mark a task as complete.

열 추가Add a column

로컬 터미널 창에서 Git 리포지토리의 루트로 이동합니다.In the local terminal window, navigate to the root of the Git repository.

tasks 테이블에 대한 새 데이터베이스 마이그레이션을 생성합니다.Generate a new database migration for the tasks table:

php artisan make:migration add_complete_column --table=tasks

이 명령은 생성되는 마이그레이션 파일의 이름을 표시합니다.This command shows you the name of the migration file that's generated. _database/migrations_에서 이 파일을 찾아서 엽니다.Find this file in database/migrations and open it.

up 메서드를 다음 코드로 바꿉니다.Replace the up method with the following code:

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

앞의 코드는 complete라는 tasks 테이블에 부울 열을 추가합니다.The preceding code adds a boolean column in the tasks table called complete.

down 메서드를 롤백 작업에 대한 다음 코드로 바꿉니다.Replace the down method with the following code for the rollback action:

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

로컬 터미널 창에서 Laravel 데이터베이스 마이그레이션을 실행하여 로컬 데이터베이스를 변경합니다.In the local terminal window, run Laravel database migrations to make the change in the local database.

php artisan migrate

Laravel 명명 규칙에 따라 Task(app/Task.php 참조) 모델은 기본적으로 tasks 테이블에 매핑됩니다.Based on the Laravel naming convention, the model Task (see app/Task.php) maps to the tasks table by default.

애플리케이션 논리 업데이트Update application logic

routes/web.php 파일을 엽니다.Open the routes/web.php file. 애플리케이션에서 해당 경로 및 비즈니스 논리를 여기에 정의합니다.The application defines its routes and business logic here.

파일의 끝에 다음 코드를 포함하는 경로를 추가합니다.At the end of the file, add a route with the following code:

/**
 * 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 값을 설정/해제하여 데이터 모델을 간단히 업데이트합니다.The preceding code makes a simple update to the data model by toggling the value of complete.

보기 업데이트Update the view

resources/views/tasks.blade.php 파일을 엽니다.Open the resources/views/tasks.blade.php file. <tr> 여는 태그를 찾아 다음으로 바꿉니다.Search for the <tr> opening tag and replace it with:

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

앞의 코드는 작업이 완료되었는지 여부에 따라 행 색을 변경합니다.The preceding code changes the row color depending on whether the task is complete.

다음 줄에는 다음 코드가 있습니다.In the next line, you have the following code:

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

전체 줄을 다음 코드로 바꿉니다.Replace the entire line with the following code:

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

앞의 코드는 이전에 정의한 경로를 참조하는 제출 단추를 추가합니다.The preceding code adds the submit button that references the route that you defined earlier.

로컬에서 변경 내용 테스트Test the changes locally

로컬 터미널 창에서 Git 리포지토리의 루트 디렉터리에서 개발 서버를 실행합니다.In the local terminal window, run the development server from the root directory of the Git repository.

php artisan serve

작업 상태 변경을 확인하려면 http://localhost:8000으로 이동하고 확인란을 선택합니다.To see the task status change, navigate to http://localhost:8000 and select the checkbox.

작업에 확인란이 추가됨

PHP를 중지하려면 터미널에서 Ctrl + C를 입력합니다.To stop PHP, type Ctrl + C in the terminal.

변경 내용을 Azure에 게시Publish changes to Azure

로컬 터미널 창에서 프로덕션 연결 문자열로 Laravel 데이터베이스 마이그레이션을 실행하여 Azure 데이터베이스를 변경합니다.In the local terminal window, run Laravel database migrations with the production connection string to make the change in the Azure database.

php artisan migrate --env=production --force

Git에서 모든 변경 내용을 커밋한 다음 Azure에 코드 변경 내용을 푸시합니다.Commit all the changes in Git, and then push the code changes to Azure.

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

git push가 완료되면 Azure 앱으로 이동하여 새 기능을 테스트합니다.Once the git push is complete, navigate to the Azure app and test the new functionality.

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

모든 작업을 추가했으면 데이터베이스에서 유지됩니다.If you added any tasks, they are retained in the database. 데이터 스키마를 업데이트하는 경우 기존 데이터는 그대로 유지됩니다.Updates to the data schema leave existing data intact.

진단 로그 스트림Stream diagnostic logs

PHP 애플리케이션이 Azure App Service에서 실행되는 동안 콘솔 로그를 터미널에 파이프할 수 있습니다.While the PHP application runs in Azure App Service, you can get the console logs piped to your terminal. 이 방법으로 애플리케이션 오류를 디버깅하는 데 도움이 되는 진단 메시지를 동일하게 받을 수 있습니다.That way, you can get the same diagnostic messages to help you debug application errors.

로그 스트리밍을 시작하려면 Cloud Shell에서 az webapp log tail 명령을 사용합니다.To start log streaming, use the az webapp log tail command in the Cloud Shell.

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

로그 스트리밍이 시작되면 브라우저에서 Azure 앱을 새로 고쳐 일부 웹 트래픽을 가져옵니다.Once log streaming has started, refresh the Azure app in the browser to get some web traffic. 이제 터미널에 파이프된 콘솔 로그가 표시될 수 있습니다.You can now see console logs piped to the terminal. 콘솔 로그가 즉시 표시되지 않으면 30초 후에 다시 확인합니다.If you don't see console logs immediately, check again in 30 seconds.

언제든지 로그 스트리밍을 중지하려면 Ctrl+C를 입력합니다.To stop log streaming at anytime, type Ctrl+C.

PHP 애플리케이션은 표준 error_log()를 사용하여 콘솔에 출력할 수 있습니다.A PHP application can use the standard error_log() to output to the console. 샘플 애플리케이션은 _app/Http/routes.php_에서 이 접근 방식을 사용합니다.The sample application uses this approach in app/Http/routes.php.

웹 프레임워크로서 Laravel은 Monolog 로깅 공급자로 사용합니다.As a web framework, Laravel uses Monolog as the logging provider. Monolog가 메시지를 콘솔로 출력하게 하는 방법은 PHP: monolog를 사용하여 콘솔에 기록하는 방법(php://out)을 참조하세요.To see how to get Monolog to output messages to the console, see PHP: How to use monolog to log to console (php://out).

Azure 앱 관리Manage the Azure app

만든 앱을 관리하려면 Azure Portal로 이동합니다.Go to the Azure portal to manage the app you created.

왼쪽 메뉴에서 App Services를 클릭한 다음, Azure 앱의 이름을 클릭합니다.From the left menu, click App Services, and then click the name of your Azure app.

Azure 앱에 대한 포털 탐색

앱의 [개요] 페이지가 표시됩니다.You see your app's Overview page. 여기서 중지, 시작, 다시 시작, 찾아보기 및 삭제와 같은 기본 관리 작업을 수행할 수 있습니다.Here, you can perform basic management tasks like stop, start, restart, browse, and delete.

왼쪽 메뉴에서 앱을 구성하기 위한 페이지를 제공합니다.The left menu provides pages for configuring your app.

Azure Portal의 App Service 페이지

리소스 정리Clean up resources

이전 단계에서 Azure 리소스를 리소스 그룹에 만들었습니다.In the preceding steps, you created Azure resources in a resource group. 나중에 이러한 리소스가 필요하지 않을 것 같으면 Cloud Shell에서 다음 명령을 실행하여 리소스 그룹을 삭제합니다.If you don't expect to need these resources in the future, delete the resource group by running the following command in the Cloud Shell:

az group delete --name myResourceGroup

이 명령을 실행하는 데 1분 정도 걸릴 수 있습니다.This command may take a minute to run.

다음 단계Next steps

이 자습서에서는 다음 작업 방법을 알아보았습니다.In this tutorial, you learned how to:

  • Azure에서 MySQL 데이터베이스 만들기Create a MySQL database in Azure
  • MySQL에 PHP 앱 연결Connect a PHP app to MySQL
  • Azure에 앱 배포Deploy the app to Azure
  • 데이터 모델 업데이트 및 앱 다시 배포Update the data model and redeploy the app
  • Azure에서 진단 로그 스트림Stream diagnostic logs from Azure
  • Azure Portal에서 앱 관리Manage the app in the Azure portal

사용자 지정 DNS 이름을 앱에 매핑하는 방법에 대해 알아보려면 다음 자습서로 이동합니다.Advance to the next tutorial to learn how to map a custom DNS name to the app.

추가 리소스:More resources: