Статьи

Развертывание WordPress Azure Web App с альтернативной базой данных MySQL

Недавно мне был задан интересный вопрос о веб-приложениях Azure, WordPress и MySQL. Хотя это и не обязательно «сложный» вопрос, ответ был не так легко доступен, как я ожидал. Я думал, что поделюсь своим опытом здесь в надежде помочь другим.

Вопрос

Как развернуть сайт WordPress с помощью веб-приложений Azure , использующих экземпляр базы данных MySQL, который не доступен в базе данных ClearDB, доступной в подписке Azure?

Фон

Обычно при создании сайта WordPress с помощью веб-приложений Azure вам предоставляется возможность выбрать существующую базу данных ClearDB MySQL или создать новую. Но что, если вы не хотите использовать существующий экземпляр или создавать новый? Что если вы хотите использовать экземпляр базы данных MySQL, развернутый на виртуальной машине Azure, или у вас есть база данных ClearDB MySQL, которая не отображается на портале Azure (например, одно из предложений ClearDB Basic )?

Create_WordPress_ClearDB_Normal

Ответы)

Как и большинство вопросов, связанных с технологиями (или жизни в целом), есть несколько способов решить эту проблему. Есть «легкий» путь, а затем есть более мощный, но немного более сложный, некоторые будут утверждать «правильный» путь.

Легкий путь

Самый простой подход — создать сайт WordPress с помощью Azure Web Apps и выбрать либо существующую базу данных ClearDB, либо создать новую базу данных ClearDB. После развертывания сайта WordPress вы можете изменить строку подключения к базе данных в файле wp-config.php, указав нужную базу данных (например, экземпляр ClearDB Basic или экземпляр MySQL на виртуальной машине Azure).

  1. Пусть сайт WordPress будет развернут, но не завершайте установку. Другими словами, после развертывания сайта переход по URL-адресу сайта должен привести к стандартной установке WordPress по умолчанию.
  2. Откройте консоль Kudu, перейдя по адресу http: // your-site-name . СКМ .azurewebsites.net . Если вы уже вошли на портал Azure, вы должны пройти без каких-либо проблем аутентификации В противном случае вам будет предложено ввести учетные данные для аутентификации.
  3. Перейдите к консоли отладки (через меню вверху). Перейдите в каталог \ site \ wwroot \.
  4. Отредактируйте файл wp-config.php , щелкнув значок карандаша слева от имени файла. Это переключится в режим редактирования для файла. Не нажимайте на значок удаления … это было бы плохо.
  5. В файле wp-config.php измените значения DB_NAME, DB_USER, DB_PASSWORD и DB_HOST на значения для требуемой базы данных. Сохраните файл.
  6. Теперь перезагрузите ваш сайт — http: // your-site-name .azurewebsites.net . Это должно загрузить страницу установки WordPress по умолчанию, предлагающую завершить установку WordPress.
  7. Завершите установку. Для завершения установки WordPress следует использовать параметр базы данных, настроенный в файле wp-config.php .
  8. Если для начала вы создали бесплатную базу данных ClearDB, не стесняйтесь удалять эту базу данных ClearDB.

Альтернатива

И теперь начинается настоящее веселье! В этом альтернативном подходе шаблон Azure Resource Manager (ARM) можно использовать для создания сайта WordPress в веб-приложениях Azure и подключения базы данных по вашему выбору. Чтобы это произошло, вам понадобится шаблон ARM и база данных MySQL по вашему выбору.

Чтобы получить шаблон ARM, моей первой мыслью было, что я могу загрузить шаблон, который использует портал Azure, и просто изменить сведения о подключении к базе данных, чтобы они соответствовали моим требованиям. Неправильно! Шаблоны, которые я пробовал, оказались немного сложнее, чем я хотел. Тем не менее, они обеспечили хорошее начало и помогли мне понять, что мне нужно было сделать.

Если вам интересно, вы можете получить шаблоны, вызвав скрипт PowerShell ниже.

# Retrieve all available items
$allGalleryItems = Invoke-WebRequest -Uri "https://gallery.azure.com/Microsoft.Gallery/GalleryItems?api-version=2015-04-01&includePreview=true" | ConvertFrom-Json

# Get all items published by WordPress
$allGalleryItems | Where-Object { $_.PublisherDisplayName -eq "WordPress" }
$allGalleryItems | Where-Object { $_.Identity -eq "WordPress.WordPress.1.0.0" }

# Save default template for all items under directory "C:\Templates"
$allGalleryItems | Foreach-Object {
$path = Join-Path -Path "C:\templates" -ChildPath $_.Identity
New-Item -type Directory -Path $path -Force

$.Artifacts | Where-Object { $.type -eq "template" } | ForEach-Object {
$templatePath = Join-Path -Path $path -ChildPath ( $_.Name + ".json" )

(Invoke-WebRequest -Uri $_.Uri).Content | Out-File -FilePath $templatePath
}
}

(оригинальный образец PowerShell с https://github.com/Azure/azure-powershell/issues/1064 )

Используя шаблон ARM, полученный из образца галереи, как вдохновение, я создал новый шаблон ARM. Вы можете получить полный образец моего репозитория GitHub по адресу https://github.com/mcollier/AzureWebApp-WordPress-AlternativeDatabase .

"resources": [
{
"apiVersion": "2014-06-01",
"name": "[parameters('hostingPlanName')]",
"type": "Microsoft.Web/serverfarms",
"location": "[resourceGroup().location]",
"tags": {
"displayName": "HostingPlan"
},
"properties": {
"name": "[parameters('hostingPlanName')]",
"sku": "[parameters('sku')]",
"workerSize": "[parameters('workerSize')]",
"numberOfWorkers": 1
}
},
{
"apiVersion": "2014-06-01",
"name": "[variables('webSiteName')]",
"type": "Microsoft.Web/sites",
"location": "[resourceGroup().location]",
"tags": {
"[concat('hidden-related:', resourceGroup().id, '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]": "Resource",
"displayName": "Website"
},
"dependsOn": [
"[concat('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]"
],
"properties": {
"name": "[variables('webSiteName')]",
"serverFarm": "[parameters('hostingPlanName')]"
},
"resources": [
{
"apiVersion": "2014-11-01",
"name": "connectionstrings",
"type": "config",
"dependsOn": [
"[concat('Microsoft.Web/sites/', variables('webSiteName'))]"
],
"properties": {
"defaultConnection": {
"value": "[variables('dbConnectionString')]",
"type": 0
}
}
},
{
"apiVersion": "2014-06-01",
"name": "web",
"type": "config",
"dependsOn": [
"[concat('Microsoft.Web/sites/', variables('webSiteName'))]"
],
"properties": {
"phpVersion": "5.6"
}
},
{
"name": "MSDeploy",
"type": "extensions",
"location": "[resourceGroup().location]",
"apiVersion": "2014-06-01",
"dependsOn": [
"[concat('Microsoft.Web/sites/', variables('webSiteName'))]",
"[concat('Microsoft.Web/Sites/', variables('webSiteName'), '/config/web')]"
],
"tags": {
"displayName": "WordPressDeploy"
},
"properties": {
"packageUri": "https://auxmktplceprod.blob.core.windows.net/packages/wordpress-4.3.1-IIS.zip",
"dbType": "MySQL",
"connectionString": "[variables('dbConnectionString')]",
"setParameters": {
"AppPath": "[variables('webSiteName')]",
"DbServer": "[parameters('databaseServerName')]",
"DbName": "[parameters('databaseName')]",
"DbUsername": "[parameters('databaseUsername')]",
"DbPassword": "[parameters('databasePassword')]",
"DbAdminUsername": "[parameters('databaseUsername')]",
"DbAdminPassword": "[parameters('databasePassword')]"
}
}
}
]
}

The most relevant section is the MSDeploy resource extension (around line 60). It is this extension that deploys WordPress and gets the default database connection string set up. You provide the database server name, database name, database username, and database password as input parameters to the ARM template. The ARM template will use those parameters to construct a database connection string in the proper format (set in a variable in the template).

Once the template is created, it can be deployed with a few lines of PowerShell:

#Login-AzureRmAccount

#NOTE - Ensure the correct Azure subscription is current before continuing. View all via Get-AzureRmSubscription -All
#Select-AzureRmSubscription -SubscriptionId "[your-id-goes-here]" -TenantId "[your-azure-ad-tenant-id-goes-here]"

$ResourceGroupName = "dg-wordpress-001"
$ResourceGroupLocation = "East US"
$TemplateFile = "azuredeploy.json"
$TemplateParametersFile = "azuredeploy.parameters.json"

Test-AzureRmResourceGroupDeployment -ResourceGroupName $ResourceGroupName `
-TemplateFile $TemplateFile `
-TemplateParameterFile $TemplateParametersFile `
-Verbose

# Create or update the resource group using the specified template file and template parameters file
New-AzureRmResourceGroup -Name $ResourceGroupName -Location $ResourceGroupLocation -Verbose -Force -ErrorAction Stop

New-AzureRmResourceGroupDeployment -Name ((Get-ChildItem $TemplateFile).BaseName + '-' + ((Get-Date).ToUniversalTime()).ToString('MMdd-HHmm')) `
-ResourceGroupName $ResourceGroupName `
-TemplateFile $TemplateFile `
-TemplateParameterFile $TemplateParametersFile `
-Force -Verbose

The reason I like this approach is that it is very clear what is being deployed. I can customize the template however I like, adding or removing additional resources as needed. Plus, I don’t have to go through that “create a database just to delete it” dance.

For instance, I can envision a version of this ARM template that may optionally set up a MySQL database on an Azure VM. Oh! Look here, https://azure.microsoft.com/en-us/documentation/templates/wordpress-mysql-replication/. Someone already pretty much did that! That template could be modified to have some options to allow for the creation of a database in a few different configurations. Thanks for saving me some work. Naturally, I found this after I went through all the work above. Go figure!