자습서: Azure Linux VM에 LEMP 스택 설치
적용 대상: ✔️ Linux VM
이 문서에서는 Azure의 Ubuntu Linux VM에 NGINX 웹 서버, Azure MySQL 유연한 서버 및 PHP(LEMP 스택)를 배포하는 방법을 안내합니다. 작동 중인 LEMP 서버를 보려면 필요에 따라 WordPress 사이트를 설치하고 구성할 수 있습니다. 이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.
- Ubuntu VM 만들기
- 웹 트래픽을 위해 80 및 443 포트를 엽니다.
- NGINX, Azure Flexible MySQL Server 및 PHP 설치 및 보안
- 설치 및 구성 확인
- WordPress 설치 이 설정은 빠른 테스트나 개념 증명을 위한 것입니다. 프로덕션 환경에 대한 권장 사항을 비롯한 LEMP 스택에 대한 자세한 내용은 Ubuntu 설명서를 참조하세요.
이 자습서에서는 지속적으로 최신 버전으로 업데이트되는 Azure Cloud Shell 내의 CLI를 사용합니다. Cloud Shell을 열려면 코드 블록 상단에서 사용해 보세요를 선택합니다.
CLI를 로컬로 설치하여 사용하도록 선택하는 경우 이 자습서에서는 Azure CLI 버전 2.0.30 이상을 실행해야 합니다. az --version
명령을 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.
변수 선언
먼저 LEMP 워크로드 구성에 도움이 되는 몇 가지 변수를 정의해야 합니다.
export NETWORK_PREFIX="$(($RANDOM % 254 + 1))"
export RANDOM_ID="$(openssl rand -hex 3)"
export MY_RESOURCE_GROUP_NAME="myLEMPResourceGroup$RANDOM_ID"
export REGION="westeurope"
export MY_VM_NAME="myVM$RANDOM_ID"
export MY_VM_USERNAME="azureadmin"
export MY_VM_SIZE='Standard_DS2_v2'
export MY_VM_IMAGE='Canonical:0001-com-ubuntu-minimal-jammy:minimal-22_04-lts-gen2:latest'
export MY_PUBLIC_IP_NAME="myPublicIP$RANDOM_ID"
export MY_DNS_LABEL="mydnslabel$RANDOM_ID"
export MY_NSG_NAME="myNSG$RANDOM_ID"
export MY_NSG_SSH_RULE="Allow-Access$RANDOM_ID"
export MY_VM_NIC_NAME="myVMNic$RANDOM_ID"
export MY_VNET_NAME="myVNet$RANDOM_ID"
export MY_VNET_PREFIX="10.$NETWORK_PREFIX.0.0/22"
export MY_SN_NAME="mySN$RANDOM_ID"
export MY_SN_PREFIX="10.$NETWORK_PREFIX.0.0/24"
export MY_MYSQL_DB_NAME="mydb$RANDOM_ID"
export MY_MYSQL_ADMIN_USERNAME="dbadmin$RANDOM_ID"
export MY_MYSQL_ADMIN_PW="$(openssl rand -base64 32)"
export MY_MYSQL_SN_NAME="myMySQLSN$RANDOM_ID"
export MY_WP_ADMIN_PW="$(openssl rand -base64 32)"
export MY_WP_ADMIN_USER="wpcliadmin"
export MY_AZURE_USER=$(az account show --query user.name --output tsv)
export FQDN="${MY_DNS_LABEL}.${REGION}.cloudapp.azure.com"
리소스 그룹 만들기
az group create 명령을 사용하여 리소스 그룹을 만듭니다. Azure 리소스 그룹은 Azure 리소스가 배포 및 관리되는 논리적 컨테이너입니다.
다음 예제에서는 eastus
위치에 $MY_RESOURCE_GROUP_NAME
이라는 리소스 그룹을 만듭니다.
az group create \
--name $MY_RESOURCE_GROUP_NAME \
--location $REGION -o JSON
Results:
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx",
"location": "eastus",
"managedBy": null,
"name": "myLEMPResourceGroupxxxxxx",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
LEMP 네트워킹 설정
Azure Virtual Network 만들기
가상 네트워크는 Azure에서 개인 네트워크의 기본 구성 요소입니다. Azure Virtual Network를 통해 VM과 같은 Azure 리소스가 상호 간 및 인터넷과 안전하게 통신할 수 있습니다.
az network vnet create를 사용하여 $MY_RESOURCE_GROUP_NAME
리소스 그룹에 $MY_SN_NAME
이라는 서브넷이 있는 $MY_VNET_NAME
이라는 가상 네트워크를 만듭니다.
az network vnet create \
--name $MY_VNET_NAME \
--resource-group $MY_RESOURCE_GROUP_NAME \
--location $REGION \
--address-prefix $MY_VNET_PREFIX \
--subnet-name $MY_SN_NAME \
--subnet-prefixes $MY_SN_PREFIX -o JSON
Results:
{
"newVNet": {
"addressSpace": {
"addressPrefixes": [
"10.19.0.0/22"
]
},
"enableDdosProtection": false,
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx/providers/Microsoft.Network/virtualNetworks/myVNetxxxxxx",
"location": "eastus",
"name": "myVNetxxxxxx",
"provisioningState": "Succeeded",
"resourceGroup": "myLEMPResourceGroupxxxxxx",
"subnets": [
{
"addressPrefix": "10.19.0.0/24",
"delegations": [],
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx/providers/Microsoft.Network/virtualNetworks/myVNetxxxxxx/subnets/mySNxxxxxx",
"name": "mySNxxxxxx",
"privateEndpointNetworkPolicies": "Disabled",
"privateLinkServiceNetworkPolicies": "Enabled",
"provisioningState": "Succeeded",
"resourceGroup": "myLEMPResourceGroupxxxxxx",
"type": "Microsoft.Network/virtualNetworks/subnets"
}
],
"type": "Microsoft.Network/virtualNetworks",
"virtualNetworkPeerings": []
}
}
Azure 공용 IP 만들기
az network public-ip create를 사용하여 $MY_RESOURCE_GROUP_NAME
에 MY_PUBLIC_IP_NAME
이라는 표준 영역 중복 공용 IPv4 주소를 만듭니다.
참고 항목
아래 영역 옵션은 가용성 영역이 있는 지역에서만 유효한 옵션입니다.
az network public-ip create \
--name $MY_PUBLIC_IP_NAME \
--location $REGION \
--resource-group $MY_RESOURCE_GROUP_NAME \
--dns-name $MY_DNS_LABEL \
--sku Standard \
--allocation-method static \
--version IPv4 \
--zone 1 2 3 -o JSON
Results:
{
"publicIp": {
"ddosSettings": {
"protectionMode": "VirtualNetworkInherited"
},
"dnsSettings": {
"domainNameLabel": "mydnslabelxxxxxx",
"fqdn": "mydnslabelxxxxxx.eastus.cloudapp.azure.com"
},
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx/providers/Microsoft.Network/publicIPAddresses/myPublicIPxxxxxx",
"idleTimeoutInMinutes": 4,
"ipTags": [],
"location": "eastus",
"name": "myPublicIPxxxxxx",
"provisioningState": "Succeeded",
"publicIPAddressVersion": "IPv4",
"publicIPAllocationMethod": "Static",
"resourceGroup": "myLEMPResourceGroupxxxxxx",
"sku": {
"name": "Standard",
"tier": "Regional"
},
"type": "Microsoft.Network/publicIPAddresses",
"zones": [
"1",
"2",
"3"
]
}
}
Azure 네트워크 보안 그룹 만들기
네트워크 보안 그룹의 보안 규칙을 사용하면 가상 네트워크 서브넷 및 네트워크 인터페이스 내외부로 이동할 수 있는 네트워크 트래픽 유형을 필터링할 수 있습니다. 네트워크 보안 그룹에 대한 자세한 내용은 네트워크 보안 그룹 개요를 참조하세요.
az network nsg create \
--name $MY_NSG_NAME \
--resource-group $MY_RESOURCE_GROUP_NAME \
--location $REGION -o JSON
Results:
{
"NewNSG": {
"defaultSecurityRules":
{
"access": "Allow",
"description": "Allow inbound traffic from all VMs in VNET",
"destinationAddressPrefix": "VirtualNetwork",
"destinationAddressPrefixes": [],
"destinationPortRange": "*",
"destinationPortRanges": [],
"direction": "Inbound",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroup104/providers/Microsoft.Network/networkSecurityGroups/protect-vms/defaultSecurityRules/AllowVnetInBound",
"name": "AllowVnetInBound",
"priority": 65000,
"protocol": "*",
"provisioningState": "Succeeded",
"resourceGroup": "myLEMPResourceGroup104",
"sourceAddressPrefix": "VirtualNetwork",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": [],
"type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
},
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroup104/providers/Microsoft.Network/networkSecurityGroups/protect-vms",
"location": "eastus",
"name": "protect-vms",
"provisioningState": "Succeeded",
"resourceGroup": "myLEMPResourceGroup104",
"securityRules": [],
"type": "Microsoft.Network/networkSecurityGroups"
}
}
Azure 네트워크 보안 그룹 규칙 만들기
SSH의 경우 포트 22, HTTP 및 HTTPS의 경우 포트 80, 443에서 가상 머신에 대한 연결을 허용하는 규칙을 만듭니다. 모든 포트에서 아웃바운드 연결을 허용하는 추가 규칙이 만들어집니다. az network nsg rule create를 사용하여 네트워크 보안 그룹 규칙을 만듭니다.
az network nsg rule create \
--resource-group $MY_RESOURCE_GROUP_NAME \
--nsg-name $MY_NSG_NAME \
--name $MY_NSG_SSH_RULE \
--access Allow \
--protocol Tcp \
--direction Inbound \
--priority 100 \
--source-address-prefix '*' \
--source-port-range '*' \
--destination-address-prefix '*' \
--destination-port-range 22 80 443 -o JSON
Results:
{
"access": "Allow",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRanges": [
"22",
"80",
"443"
],
"direction": "Inbound",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx/providers/Microsoft.Network/networkSecurityGroups/myNSGNamexxxxxx/securityRules/Allow-Accessxxxxxx",
"name": "Allow-Accessxxxxxx",
"priority": 100,
"protocol": "Tcp",
"provisioningState": "Succeeded",
"resourceGroup": "myLEMPResourceGroupxxxxxx",
"sourceAddressPrefix": "*",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": [],
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
}
Azure 네트워크 인터페이스 만들기
az network nic create를 사용하여 가상 머신에 대한 네트워크 인터페이스를 만듭니다. 이전에 만든 공용 IP 주소와 NSG는 NIC와 연결됩니다. 네트워크 인터페이스는 이전에 만든 가상 네트워크에 연결됩니다.
az network nic create \
--resource-group $MY_RESOURCE_GROUP_NAME \
--name $MY_VM_NIC_NAME \
--location $REGION \
--ip-forwarding false \
--subnet $MY_SN_NAME \
--vnet-name $MY_VNET_NAME \
--network-security-group $MY_NSG_NAME \
--public-ip-address $MY_PUBLIC_IP_NAME -o JSON
Results:
{
"NewNIC": {
"auxiliaryMode": "None",
"auxiliarySku": "None",
"disableTcpStateTracking": false,
"dnsSettings": {
"appliedDnsServers": [],
"dnsServers": []
},
"enableAcceleratedNetworking": false,
"enableIPForwarding": false,
"hostedWorkloads": [],
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx/providers/Microsoft.Network/networkInterfaces/myVMNicNamexxxxxx",
"ipConfigurations": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx/providers/Microsoft.Network/networkInterfaces/myVMNicNamexxxxxx/ipConfigurations/ipconfig1",
"name": "ipconfig1",
"primary": true,
"privateIPAddress": "10.19.0.4",
"privateIPAddressVersion": "IPv4",
"privateIPAllocationMethod": "Dynamic",
"provisioningState": "Succeeded",
"resourceGroup": "myLEMPResourceGroupxxxxxx",
"subnet": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx/providers/Microsoft.Network/virtualNetworks/myVNetxxxxxx/subnets/mySNxxxxxx",
"resourceGroup": "myLEMPResourceGroupxxxxxx"
},
"type": "Microsoft.Network/networkInterfaces/ipConfigurations"
}
],
"location": "eastus",
"name": "myVMNicNamexxxxxx",
"networkSecurityGroup": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx/providers/Microsoft.Network/networkSecurityGroups/myNSGNamexxxxxx",
"resourceGroup": "myLEMPResourceGroupxxxxxx"
},
"nicType": "Standard",
"provisioningState": "Succeeded",
"resourceGroup": "myLEMPResourceGroupxxxxxx",
"tapConfigurations": [],
"type": "Microsoft.Network/networkInterfaces",
"vnetEncryptionSupported": false
}
}
Cloud-init 개요
Cloud-init는 처음 부팅 시 Linux VM을 사용자 지정하는 데 널리 사용되는 방법입니다. Cloud-init를 사용하여 패키지를 설치하고 파일을 쓰거나, 사용자 및 보안을 구성할 수 있습니다. cloud-init은 초기 부팅 프로세스 중에 실행되므로 구성에 적용할 다른 단계나 필요한 에이전트가 없습니다.
Cloud-init는 배포에서도 작동합니다. 예를 들어, 패키지를 설치하는 데 apt-get install 또는 yum install은 사용하지 않습니다. 대신 설치할 패키지 목록을 정의할 수 있습니다. cloud-init에서 선택한 배포판의 기본 패키지 관리 도구를 자동으로 사용합니다.
당사는 파트너와 협력하여 파트너가 Azure에 제공하는 이미지에 cloud-init를 포함하고 이러한 이미지에서 cloud-init가 작동하도록 설정하고 있습니다. 각 배포의 cloud-init 지원에 대한 자세한 내용은 Azure의 VM에 대한 cloud-init 지원을 참조하세요.
cloud-init 구성 파일 만들기
cloud-init이 실제로 어떻게 작동하는지 보려면 LEMP 스택을 설치하고 SSL 인증서로 보호되는 간단한 Wordpress 앱을 실행하는 VM을 만듭니다. 다음 cloud-init 구성은 필요한 패키지를 설치하고, Wordpress 웹 사이트를 만든 다음, 웹 사이트를 초기화하고 시작합니다.
cat << EOF > cloud-init.txt
#cloud-config
# Install, update, and upgrade packages
package_upgrade: true
package_update: true
package_reboot_if_require: true
# Install packages
packages:
- vim
- certbot
- python3-certbot-nginx
- bash-completion
- nginx
- mysql-client
- php
- php-cli
- php-bcmath
- php-curl
- php-imagick
- php-intl
- php-json
- php-mbstring
- php-mysql
- php-gd
- php-xml
- php-xmlrpc
- php-zip
- php-fpm
write_files:
- owner: www-data:www-data
path: /etc/nginx/sites-available/default.conf
content: |
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
server_name $FQDN;
}
write_files:
- owner: www-data:www-data
path: /etc/nginx/sites-available/$FQDN.conf
content: |
upstream php {
server unix:/run/php/php8.1-fpm.sock;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name $FQDN;
ssl_certificate /etc/letsencrypt/live/$FQDN/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/$FQDN/privkey.pem;
root /var/www/$FQDN;
index index.php;
location / {
try_files \$uri \$uri/ /index.php?\$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_pass php;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
}
server {
listen 80;
listen [::]:80;
server_name $FQDN;
return 301 https://$FQDN\$request_uri;
}
runcmd:
- sed -i 's/;cgi.fix_pathinfo.*/cgi.fix_pathinfo = 1/' /etc/php/8.1/fpm/php.ini
- sed -i 's/^max_execution_time \= .*/max_execution_time \= 300/g' /etc/php/8.1/fpm/php.ini
- sed -i 's/^upload_max_filesize \= .*/upload_max_filesize \= 64M/g' /etc/php/8.1/fpm/php.ini
- sed -i 's/^post_max_size \= .*/post_max_size \= 64M/g' /etc/php/8.1/fpm/php.ini
- systemctl restart php8.1-fpm
- systemctl restart nginx
- certbot --nginx certonly --non-interactive --agree-tos -d $FQDN -m dummy@dummy.com --redirect
- ln -s /etc/nginx/sites-available/$FQDN.conf /etc/nginx/sites-enabled/
- rm /etc/nginx/sites-enabled/default
- systemctl restart nginx
- curl --url https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar --output /tmp/wp-cli.phar
- mv /tmp/wp-cli.phar /usr/local/bin/wp
- chmod +x /usr/local/bin/wp
- wp cli update
- mkdir -m 0755 -p /var/www/$FQDN
- chown -R azureadmin:www-data /var/www/$FQDN
- sudo -u azureadmin -i -- wp core download --path=/var/www/$FQDN
- sudo -u azureadmin -i -- wp config create --dbhost=$MY_MYSQL_DB_NAME.mysql.database.azure.com --dbname=wp001 --dbuser=$MY_MYSQL_ADMIN_USERNAME --dbpass="$MY_MYSQL_ADMIN_PW" --path=/var/www/$FQDN
- sudo -u azureadmin -i -- wp core install --url=$FQDN --title="Azure hosted blog" --admin_user=$MY_WP_ADMIN_USER --admin_password="$MY_WP_ADMIN_PW" --admin_email=$MY_AZURE_USER --path=/var/www/$FQDN
- sudo -u azureadmin -i -- wp plugin update --all --path=/var/www/$FQDN
- chmod 600 /var/www/$FQDN/wp-config.php
- mkdir -p -m 0775 /var/www/$FQDN/wp-content/uploads
- chgrp www-data /var/www/$FQDN/wp-content/uploads
EOF
Azure MySQL 유연한 서버를 위한 Azure 프라이빗 DNS 영역 만들기
Azure 프라이빗 DNS 영역 통합을 통해 프라이빗 DNS 영역이 연결된 모든 지역 내 피어링된 VNET 또는 현재 VNET 내의 프라이빗 DNS를 확인할 수 있습니다. az network private-dns zone create를 사용하여 프라이빗 DNS 영역을 만듭니다.
az network private-dns zone create \
--resource-group $MY_RESOURCE_GROUP_NAME \
--name $MY_DNS_LABEL.private.mysql.database.azure.com -o JSON
Results:
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx/providers/Microsoft.Network/privateDnsZones/mydnslabelxxxxxx.private.mysql.database.azure.com",
"location": "global",
"maxNumberOfRecordSets": 25000,
"maxNumberOfVirtualNetworkLinks": 1000,
"maxNumberOfVirtualNetworkLinksWithRegistration": 100,
"name": "mydnslabelxxxxxx.private.mysql.database.azure.com",
"numberOfRecordSets": 1,
"numberOfVirtualNetworkLinks": 0,
"numberOfVirtualNetworkLinksWithRegistration": 0,
"provisioningState": "Succeeded",
"resourceGroup": "myLEMPResourceGroupxxxxxx",
"tags": null,
"type": "Microsoft.Network/privateDnsZones"
}
Azure Database for MySQL - 유연한 서버 만들기
Azure Database for MySQL - 유연한 서버는 클라우드에서 고가용성 MySQL 서버를 실행, 관리 및 크기 조정하는 데 사용할 수 있는 관리되는 서비스입니다. az mysql flexible-server create 명령을 사용하여 유연한 서버를 만듭니다. 서버는 여러 데이터베이스를 포함할 수 있습니다. 다음 명령은 Azure CLI의 로컬 환경에 있는 서비스 기본값 및 변수 값을 사용하여 서버를 만듭니다.
az mysql flexible-server create \
--admin-password $MY_MYSQL_ADMIN_PW \
--admin-user $MY_MYSQL_ADMIN_USERNAME \
--auto-scale-iops Disabled \
--high-availability Disabled \
--iops 500 \
--location $REGION \
--name $MY_MYSQL_DB_NAME \
--database-name wp001 \
--resource-group $MY_RESOURCE_GROUP_NAME \
--sku-name Standard_B2s \
--storage-auto-grow Disabled \
--storage-size 20 \
--subnet $MY_MYSQL_SN_NAME \
--private-dns-zone $MY_DNS_LABEL.private.mysql.database.azure.com \
--tier Burstable \
--version 8.0.21 \
--vnet $MY_VNET_NAME \
--yes -o JSON
Results:
{
"databaseName": "wp001",
"host": "mydbxxxxxx.mysql.database.azure.com",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx/providers/Microsoft.DBforMySQL/flexibleServers/mydbxxxxxx",
"location": "East US",
"resourceGroup": "myLEMPResourceGroupxxxxxx",
"skuname": "Standard_B2s",
"subnetId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx/providers/Microsoft.Network/virtualNetworks/myVNetxxxxxx/subnets/myMySQLSNxxxxxx",
"username": "dbadminxxxxxx",
"version": "8.0.21"
}
생성된 서버에는 다음과 같은 특성이 있습니다.
- 서버 이름, 관리 사용자 이름, 관리 사용자 암호, 리소스 그룹 이름, 위치는 이미 클라우드 셸의 로컬 컨텍스트 환경에 지정되어 있습니다. 이러한 구성 요소는 리소스 그룹 및 기타 Azure 구성 요소와 동일한 위치에 만들어집니다.
- 나머지 서버 구성에 대한 서비스 기본값: 컴퓨팅 계층(버스트 가능), 컴퓨팅 크기/SKU(Standard_B2s), 백업 보존 기간(7일) 및 MySQL 버전(8.0.21)
- 기본 연결 방법은 연결된 가상 네트워크와 자동 생성된 서브넷을 사용하는 프라이빗 액세스(VNet 통합)입니다.
참고 항목
서버를 만든 후에는 연결 방법을 변경할 수 없습니다. 예를 들어, 만드는 동안 Private access (VNet Integration)
을 선택한 경우 만들기 후에는 Public access (allowed IP addresses)
로 변경할 수 없습니다. VNet 통합을 사용하여 서버에 안전하게 액세스하려면 프라이빗 액세스 권한이 있는 서버를 만드는 것이 좋습니다. 개념 문서에서 프라이빗 액세스에 대해 자세히 알아보세요.
기본값을 변경하려는 경우 구성 가능한 CLI 매개 변수의 전체 목록에 대한 Azure CLI 참조 설명서를 참조하세요.
Azure Database for MySQL - 유연한 서버 상태 확인
Azure Database for MySQL - 유연한 서버 및 지원 리소스를 만드는 데 몇 분 정도 걸립니다.
runtime="10 minute";
endtime=$(date -ud "$runtime" +%s);
while [[ $(date -u +%s) -le $endtime ]]; do
STATUS=$(az mysql flexible-server show -g $MY_RESOURCE_GROUP_NAME -n $MY_MYSQL_DB_NAME --query state -o tsv);
echo $STATUS;
if [ "$STATUS" == 'Ready' ]; then
break;
else
sleep 10;
fi;
done
Azure Database for MySQL - 유연한 서버에서 서버 매개 변수 구성
서버 매개 변수를 사용하여 Azure Database for MySQL - 유연한 서버 구성을 관리할 수 있습니다. 서버 매개 변수는 서버를 만들 때 기본/권장 값으로 구성됩니다.
서버 매개 변수 세부 정보 표시:
az mysql flexible-server parameters show 명령을 실행하면 서버의 특정 매개 변수에 대한 세부 정보를 볼 수 있습니다.
Azure Database for MySQL 사용 안 함 - Wordpress 통합을 위한 유연한 서버 SSL 연결 매개 변수
서버 매개 변수 값 수정
특정 서버 구성 매개 변수의 값을 수정할 수도 있습니다. 그러면 MySQL 서버 엔진의 기본 구성 값이 업데이트됩니다. 서버 매개 변수를 업데이트하려면 az mysql flexible-server parameter set 명령을 사용합니다.
az mysql flexible-server parameter set \
-g $MY_RESOURCE_GROUP_NAME \
-s $MY_MYSQL_DB_NAME \
-n require_secure_transport -v "OFF" -o JSON
Results:
{
"allowedValues": "ON,OFF",
"currentValue": "OFF",
"dataType": "Enumeration",
"defaultValue": "ON",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx/providers/Microsoft.DBforMySQL/flexibleServers/mydbxxxxxx/configurations/require_secure_transport",
"isConfigPendingRestart": "False",
"isDynamicConfig": "True",
"isReadOnly": "False",
"name": "require_secure_transport",
"resourceGroup": "myLEMPResourceGroupxxxxxx",
"source": "user-override",
"systemData": null,
"type": "Microsoft.DBforMySQL/flexibleServers/configurations",
"value": "OFF"
}
Azure Linux 가상 머신 만들기
다음 예제에서는 $MY_VM_NAME
라는 VM을 만들고 기본 키 위치에 SSH 키가 없는 경우 이 키를 만듭니다. 이 명령은 $MY_VM_USERNAME
을 관리자 사용자 이름으로 설정합니다.
Azure에서 Linux Virtual Machines의 보안을 강화하려면 Microsoft Entra ID 인증과 통합할 수 있습니다. 이제 Microsoft Entra ID를 핵심 인증 플랫폼으로 사용할 수 있습니다. Microsoft Entra ID와 OpenSSH 인증서 기반 인증을 사용하여 Linux VM에 SSH를 통해 접속할 수도 있습니다. 이 기능을 통해 조직은 Azure 역할 기반 액세스 제어 및 조건부 액세스 정책을 사용하여 VM에 대한 액세스 권한을 관리할 수 있습니다.
az vm create 명령을 사용하여 VM을 만듭니다.
az vm create \
--name $MY_VM_NAME \
--resource-group $MY_RESOURCE_GROUP_NAME \
--admin-username $MY_VM_USERNAME \
--authentication-type ssh \
--assign-identity \
--image $MY_VM_IMAGE \
--location $REGION \
--nic-delete-option Delete \
--os-disk-caching ReadOnly \
--os-disk-delete-option Delete \
--os-disk-size-gb 30 \
--size $MY_VM_SIZE \
--generate-ssh-keys \
--storage-sku Premium_LRS \
--nics $MY_VM_NIC_NAME \
--custom-data cloud-init.txt -o JSON
Results:
{
"fqdns": "mydnslabelxxxxxx.eastus.cloudapp.azure.com",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx/providers/Microsoft.Compute/virtualMachines/myVMNamexxxxxx",
"identity": {
"principalId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
"tenantId": "zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz",
"type": "SystemAssigned",
"userAssignedIdentities": null
},
"location": "eastus",
"macAddress": "60-45-BD-D8-1D-84",
"powerState": "VM running",
"privateIpAddress": "10.19.0.4",
"resourceGroup": "myLEMPResourceGroupxxxxxx",
"zones": ""
}
Azure Linux 가상 머신 상태 확인
VM과 지원 리소스를 만드는 데 몇 분이 걸립니다. 확장이 VM에 성공적으로 설치되면 provisioningState 값이 Succeeded로 표시됩니다. VM에서 확장을 설치하려면 실행 중인 VM 에이전트가 필요합니다.
runtime="5 minute";
endtime=$(date -ud "$runtime" +%s);
while [[ $(date -u +%s) -le $endtime ]]; do
STATUS=$(ssh -o StrictHostKeyChecking=no $MY_VM_USERNAME@$FQDN "cloud-init status --wait");
echo $STATUS;
if [[ "$STATUS" == *'status: done'* ]]; then
break;
else
sleep 10;
fi;
done
{
"condition": null,
"conditionVersion": null,
"createdBy": null,
"createdOn": "2023-09-04T09:29:16.895907+00:00",
"delegatedManagedIdentityResourceId": null,
"description": null,
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx/providers/Microsoft.Authorization/roleAssignments/yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
"name": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
"principalId": "zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz",
"principalType": "User",
"resourceGroup": "myLEMPResourceGroupxxxxxx",
"roleDefinitionId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/providers/Microsoft.Authorization/roleDefinitions/zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz",
"scope": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx",
"type": "Microsoft.Authorization/roleAssignments",
"updatedBy": "wwwwwwww-wwww-wwww-wwww-wwwwwwwwwwww",
"updatedOn": "2023-09-04T09:29:17.237445+00:00"
}
Azure에서 Linux 가상 머신에 대한 Microsoft Entra ID 로그인 사용
다음은 Linux VM에서 Microsoft Entra ID 로그인을 사용하도록 설정하는 확장을 설치합니다. VM 확장은 Azure 가상 머신에서 배포 후 구성 및 Automation 작업을 제공하는 작은 애플리케이션입니다.
az vm extension set \
--publisher Microsoft.Azure.ActiveDirectory \
--name AADSSHLoginForLinux \
--resource-group $MY_RESOURCE_GROUP_NAME \
--vm-name $MY_VM_NAME -o JSON
Results:
{
"autoUpgradeMinorVersion": true,
"enableAutomaticUpgrade": null,
"forceUpdateTag": null,
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myLEMPResourceGroupxxxxxx/providers/Microsoft.Compute/virtualMachines/myVMNamexxxxxx/extensions/AADSSHLoginForLinux",
"instanceView": null,
"location": "eastus",
"name": "AADSSHLoginForLinux",
"protectedSettings": null,
"protectedSettingsFromKeyVault": null,
"provisioningState": "Succeeded",
"publisher": "Microsoft.Azure.ActiveDirectory",
"resourceGroup": "myLEMPResourceGroupxxxxxx",
"settings": null,
"suppressFailures": null,
"tags": null,
"type": "Microsoft.Compute/virtualMachines/extensions",
"typeHandlerVersion": "1.0",
"typePropertiesType": "AADSSHLoginForLinux"
}
WordPress 웹 사이트 확인 및 탐색
WordPress는 웹 사이트, 블로그 및 기타 애플리케이션을 만드는 데 웹의 40% 넘게 사용하는 오픈 소스 CMS(콘텐츠 관리 시스템)입니다. WordPress는 AKS, Virtual Machines 및 App Service와 같은 몇 가지 다른 Azure 서비스에서 실행할 수 있습니다. Azure의 WordPress 옵션 전체 목록은 Azure Marketplace의 WordPress를 참조하세요.
이 WordPress 설정은 오직 개념 증명을 위한 것입니다. 권장되는 보안 설정으로 최신 WordPress를 프로덕션에 설치하려면 WordPress 설명서를 참조하세요.
애플리케이션 URL을 컬링하여 애플리케이션이 실행 중인지 유효성을 검사합니다.
runtime="5 minute";
endtime=$(date -ud "$runtime" +%s);
while [[ $(date -u +%s) -le $endtime ]]; do
if curl -I -s -f $FQDN > /dev/null ; then
curl -L -s -f $FQDN 2> /dev/null | head -n 9
break
else
sleep 10
fi;
done
Results:
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name='robots' content='max-image-preview:large' />
<title>Azure hosted blog</title>
<link rel="alternate" type="application/rss+xml" title="Azure hosted blog » Feed" href="https://mydnslabelxxxxxx.eastus.cloudapp.azure.com/?feed=rss2" />
<link rel="alternate" type="application/rss+xml" title="Azure hosted blog » Comments Feed" href="https://mydnslabelxxxxxx.eastus.cloudapp.azure.com/?feed=comments-rss2" />
echo "You can now visit your web server at https://$FQDN"