إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
ينطبق على: ✔️ أجهزة Linux الظاهرية
ترشدك هذه المقالة إلى كيفية نشر خادم ويب NGINX وخادم Azure MySQL المرن وPHP (مكدس LEMP) على جهاز ظاهري Ubuntu Linux في Azure. لمشاهدة خادم LEMP قيد التنفيذ، يمكنك تثبيت موقع WordPress وتكوينه اختياريا. في هذا البرنامج التعليمي، ستتعرف على كيفية القيام بما يلي:
- قم بإنشاء Ubuntu VM
- فتح المنفذين 80 و443 لحركة مرور الويب
- تثبيت وتأمين NGINX وAzure Flexible MySQL Server وPHP
- قم بالتحقق من التثبيت والتهيئة
- تثبيت WordPress هذا الإعداد مخصص للاختبارات السريعة أو إثبات المفهوم. لمزيد من التفاصيل حول مكدس LEMP، بما في ذلك التوصيات الخاصة ببيئة الإنتاج، راجع وثائق Ubuntu.
يستخدم هذا البرنامج التعليمي CLI داخل Azure Cloud Shell، الذي يتم تحديثه باستمرار إلى أحدث إصدار. لفتح Cloud Shell، حدد Try it من الجزء العلوي لكتلة التعليمة البرمجية.
إذا اخترت تثبيت CLI واستخدامه محليا، يتطلب هذا البرنامج التعليمي تشغيل الإصدار 2.0.30 من Azure CLI أو إصدار أحدث. ابحث عن الإصدار عن طريق تشغيل 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="eastus"
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 وإدارتها.
في المثال التالي سيتم إنشاء مجموعة موارد تسمى $MY_RESOURCE_GROUP_NAME في المنطقة eastus.
az group create \
--name $MY_RESOURCE_GROUP_NAME \
--location $REGION -o JSON
النتائج:
{
"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 الظاهرية
الشبكة الظاهرية هي اللبنة الأساسية للشبكات الخاصة في Azure. تتيح شبكة Azure الظاهرية لموارد Azure مثل الأجهزة الظاهرية الاتصال بأمان مع بعضها البعض والإنترنت.
استخدم az network vnet create لإنشاء شبكة ظاهرية باسم $MY_VNET_NAME مع شبكة فرعية مسماة $MY_SN_NAME $MY_RESOURCE_GROUP_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
النتائج:
{
"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": []
}
}
إنشاء عنوان IP عام ل Azure
استخدم az network public-ip create لإنشاء عنوان MY_PUBLIC_IP_NAME IPv4 عام مكرر للمنطقة باسم في $MY_RESOURCE_GROUP_NAME.
إشعار
الخيارات أدناه للمناطق هي تحديدات صالحة فقط في المناطق ذات مناطق التوفر.
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
النتائج:
{
"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
النتائج:
{
"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
إنشاء قاعدة للسماح بالاتصالات إلى الجهاز الظاهري على المنفذ 22 ل SSH والمنافذ 80 و443 ل HTTP وHTTPS. يتم إنشاء قاعدة إضافية للسماح لكافة المنافذ للاتصالات الصادرة. استخدم 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
النتائج:
{
"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
النتائج:
{
"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 ظاهري في أثناء تشغيله لأول مرة. يمكنك استخدام cloud-init لتثبيت الحزم وكتابة الملفات، أو لتكوين المستخدمين والأمان. أثناء تشغيل cloud-init أثناء عملية التمهيد الأولية، لا توجد خطوات أخرى أو عوامل مطلوبة لتطبيقها على التكوين الخاص بك.
تعمل Cloud-init أيضًا عبر التوزيعات. على سبيل المثال، لا تستخدم تثبيت apt-get أو تثبيت تثبيت yum لتثبيتحزمة. بدلًا من ذلك يمكنك تحديد قائمة الحزم لتثبيتها. يستخدم Cloud-init تلقائيًّا أداة إدارة الحزمة الأصلية للتوزيعة التي تحددها.
نحن نعمل مع شركائنا للحصول على تهيئة السحابة والعمل في الصور التي يقدمونها إلى Azure. للحصول على معلومات تفصيلية عن دعم السحابة المبدئية لكل توزيع، راجع دعم السحابة الأولية للأجهزة الافتراضية في Azure.
إنشاء ملف تهيئة cloud-init
لمشاهدة cloud-init أثناء العمل، قم بإنشاء جهاز ظاهري يقوم بتثبيت مكدس LEMP وتشغيل تطبيق Wordpress بسيط مؤمن بشهادة SSL. يقوم تكوين 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 Private DNS لخادم Azure MySQL المرن
يسمح لك تكامل Azure Private DNS Zone بحل DNS الخاص داخل 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
النتائج:
{
"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 للخادم المرن في نظام MySQL
قاعدة بيانات Azure ل 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
النتائج:
{
"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"
}
يحتوي الملقم الذي تم إنشاؤه على السمات التالية:
- تم تحديد اسم الخادم واسم المستخدم المسؤول وكلمة مرور المسؤول واسم مجموعة الموارد والموقع بالفعل في بيئة السياق المحلي ل cloud shell. يتم إنشاؤها في نفس موقع مجموعة الموارد ومكونات Azure الأخرى.
- الإعدادات الافتراضية للخدمة لتكوينات الخادم المتبقية: طبقة الحوسبة (قابلة للاندفاع)، وحجم الحساب/SKU (Standard_B2s)، وفترة الاحتفاظ بالنسخ الاحتياطي (7 أيام)، وإصدار MySQL (8.0.21)
- أسلوب الاتصال الافتراضي هو الوصول الخاص (تكامل VNet) مع شبكة ظاهرية مرتبطة وشبكة فرعية تم إنشاؤها تلقائيا.
إشعار
لا يمكن تغيير طريقة الاتصال بعد إنشاء الخادم. على سبيل المثال، إذا قمت بتحديد Private access (VNet Integration) أثناء الإنشاء، فلا يمكنك التغيير إلى Public access (allowed IP addresses) بعد الإنشاء. نوصي بشدة بإنشاء خادم مع وصول خاص للوصول بأمان إلى الخادم الخاص بك باستخدام تكامل VNet. تعرف على المزيد حول الوصول الخاص في مقالة المفاهيم.
إذا كنت ترغب في تغيير أي إعدادات افتراضية، فراجع الوثائق المرجعية ل Azure CLI للحصول على القائمة الكاملة لمعلمات CLI القابلة للتكوين.
تحقق من قاعدة بيانات Azure ل MySQL - حالة الخادم المرن
يستغرق الأمر بضع دقائق لإنشاء قاعدة بيانات Azure ل 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 ل MySQL - الخادم المرن
يمكنك إدارة Azure Database for MySQL - تكوين الخادم المرن باستخدام معلمات الخادم. يتم تكوين معلمات الخادم بالقيمة الافتراضية والمستحسنة عند إنشاء الخادم.
إظهار تفاصيل معلمة الخادم:
قم بتشغيل الأمر az mysql flexible-server parameter show لإظهار تفاصيل حول أي معلمة معينة للخادم.
تعطيل قاعدة بيانات Azure ل MySQL - معلمة اتصال SSL للخادم المرن لتكامل Wordpress
تعديل قيمة معلمة خادم:
يمكنك أيضا تعديل قيمة معلمة خادم معينة، والتي تقوم بتحديث قيمة التكوين الأساسي لمحرك خادم 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
النتائج:
{
"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 وينشئ مفاتيح SSH إذا لم تكن موجودة بالفعل في موقع مفتاح افتراضي. يعين $MY_VM_USERNAME الأمر أيضا كاسم مستخدم مسؤول.
لتحسين أمان أجهزة Linux الظاهرية في Azure، يمكنك التكامل مع مصادقة معرف Microsoft Entra. الآن يمكنك استخدام معرف Microsoft Entra كمنصة مصادقة أساسية. يمكنك أيضا SSH في Linux VM باستخدام معرف Microsoft Entra والمصادقة المستندة إلى شهادة OpenSSH. تسمح هذه الوظيفة للمؤسسات بإدارة الوصول إلى الأجهزة الظاهرية باستخدام التحكم في الوصول المستند إلى الدور في Azure ونهج الوصول المشروط.
إنشاء جهاز افتراضي من خلال أمر إنشاء "az 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
النتائج:
{
"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 Virtual Machine
يستغرق الأمر بضع دقائق لإنشاء الجهاز الظاهري ودعم الموارد. تظهر قيمة provisioningState ل Succeeded عند تثبيت الملحق بنجاح على الجهاز الظاهري. يجب أن يحتوي الجهاز الظاهري على عامل جهاز ظاهري قيد التشغيل لتثبيت الملحق.
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"
}
تمكين تسجيل الدخول إلى معرف Microsoft Entra لجهاز Linux الظاهري في Azure
يقوم التالي بتثبيت الملحق لتمكين تسجيل الدخول إلى معرف Microsoft Entra لجهاز Linux الظاهري. ملحقات الأجهزة الظاهرية عبارة عن تطبيقات صغيرة توفر تكوينًا بعد التوزيع ومهام الأتمتة على أجهزة Azure الظاهرية.
az vm extension set \
--publisher Microsoft.Azure.ActiveDirectory \
--name AADSSHLoginForLinux \
--resource-group $MY_RESOURCE_GROUP_NAME \
--vm-name $MY_VM_NAME -o JSON
النتائج:
{
"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 هو نظام إدارة محتوى مفتوح المصدر (CMS) يستخدمه أكثر من 40% من الويب لإنشاء مواقع الويب والمدونات والتطبيقات الأخرى. يمكن تشغيل WordPress على بعض خدمات Azure المختلفة: AKS والأجهزة الظاهرية وخدمة التطبيقات. للحصول على قائمة كاملة بخيارات WordPress على Azure، راجع WordPress على Azure Marketplace.
فيما يعد إعداد 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
النتائج:
<!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"