J'ai essayé de déployer une application Django en utilisant PostgreSQL sur l'App Service de Microsoft Azure, mais j'ai eu beaucoup de problèmes, je vais donc l'écrire.
J'ai découvert grâce à divers essais et erreurs avec le document.
Il est naturel que l'OS soit Windows parce que c'est Microsoft, mais il est facile d'oublier le fait que Linux est une personne qui a grandi dans le monde du bon sens.
Quand j'ai cherché la page sur Python dans le menu, j'ai trouvé les quatre suivantes.
Je pense qu'il est préférable d'essayer d'abord 1, puis de voir 4. 2 est un tutoriel, mais soyez prudent car il s'agit d'une utilisation particulière du déploiement avec une image Docker sur la version préliminaire de Linux. Vous n'avez pas besoin de regarder 3 si vous n'utilisez pas Visual Studio.
** Créer une application Web Python sur Azure **
--Procédures de déploiement d'une application simple à l'aide de Flask.
** [Création d'applications Docker Python et PostgreSQL sur Azure](https://docs.microsoft.com/en-us/azure/app-service-web/app-service-web-tutorial-docker-python-postgresql -app) **
** [Django et MySQL sur Azure avec Python Tools 2.2 pour Visual Studio](https://docs.microsoft.com/en-us/azure/app-service-web/web-sites-python-ptvs- django-mysql) **
** Configuration de Python avec les applications Web Azure App Service **
J'ai pu déployer avec la procédure suivante avec les informations du document officiel + α.
Je crée généralement une application Django. Les paramètres suivants sont requis lors du déploiement.
settings.py
DEBUG = False
ALLOW_HOST = ['*']
STATIC_ROOT = 'static'
Création d'applications Docker Python et PostgreSQL sur Azure, Créez une base de données PostgreSQL dans Azure en vous référant à «Création d'une base de données PostgreSQL opérationnelle».
AZ_GROUP="<resource_group>"
AZ_LOCATION="japanwest"
AZ_PG="<postgresql_name>"
AZ_PG_USER="<admin_username>"
AZ_PG_PASS="<admin_password>"
az postgres server create -g $AZ_GROUP -n $AZ_PG -l $AZ_LOCATION -u $AZ_PG_USER -p $AZ_PG_PASS
az postgres server firewall-rule create -g $AZ_GROUP --server-name $AZ_PG --start-ip-address=0.0.0.0 --end-ip-address=255.255.255.255 --name AllowAllIPs
Créez une base de données et un utilisateur.
$ psql -h ${AZ_PG}.postgres.database.azure.com -U ${AZ_PG_USER}@${AZ_PG} postgres
python
CREATE DATABASE <database_name>;
CREATE USER <user> WITH PASSWORD '<password>';
GRANT ALL PRIVILEGES ON DATABASE <database_name> TO <user>;
Reportez-vous à Créer une application Web Python dans Azure et suivez les étapes ci-dessous. Exécutez la commande.
AZ_GROUP="<resource_group>"
AZ_LOCATION="japanwest"
AZ_APPSERVICE_PLAN="<plan_name>"
AZ_APPSERVICE_PLAN_TYPE="Free"
AZ_APP_NAME="<app_name>"
az group create -n $AZ_GROUP -l $AZ_LOCATION
az appservice plan create -n $AZ_APPSERVICE_PLAN -g $AZ_GROUP --sku $AZ_APPSERVICE_PLAN_TYPE
az webapp create -n $AZ_APP_NAME -g $AZ_GROUP --plan $AZ_APPSERVICE_PLAN --deployment-local-git
Upgrading Python on Azure App Service – Python Engineering at Microsoft
Sélectionnez le service d'application que vous avez créé à partir de l'écran du portail Azure> Sélectionnez les extensions> Sélectionnez la version Python que vous souhaitez installer et installez-la.
Créez le fichier suivant.
requirements.txt
Django
psycopg2
.deployment
[config]
command = deploy.cmd
deploy.cmd
copie celui par défaut et modifie le chemin de python.exe et pip selon la version.
deploy.cmd
@if "%SCM_TRACE_LEVEL%" NEQ "4" @echo off
:: ----------------------
:: KUDU Deployment Script
:: Version: 1.0.15
:: ----------------------
SET PYTHON_HOME=D:\home\python361x86
SET PYTHON=%PYTHON_HOME%\python.exe
SET PIP=%PYTHON% -m pip
:: Prerequisites
:: -------------
:: Verify node.js installed
where node 2>nul >nul
IF %ERRORLEVEL% NEQ 0 (
echo Missing node.js executable, please install node.js, if already installed make sure it can be reached from current environment.
goto error
)
:: Setup
:: -----
setlocal enabledelayedexpansion
SET ARTIFACTS=%~dp0%..\artifacts
IF NOT DEFINED DEPLOYMENT_SOURCE (
SET DEPLOYMENT_SOURCE=%~dp0%.
)
IF NOT DEFINED DEPLOYMENT_TARGET (
SET DEPLOYMENT_TARGET=%ARTIFACTS%\wwwroot
)
IF NOT DEFINED NEXT_MANIFEST_PATH (
SET NEXT_MANIFEST_PATH=%ARTIFACTS%\manifest
IF NOT DEFINED PREVIOUS_MANIFEST_PATH (
SET PREVIOUS_MANIFEST_PATH=%ARTIFACTS%\manifest
)
)
IF NOT DEFINED KUDU_SYNC_CMD (
:: Install kudu sync
echo Installing Kudu Sync
call npm install kudusync -g --silent
IF !ERRORLEVEL! NEQ 0 goto error
:: Locally just running "kuduSync" would also work
SET KUDU_SYNC_CMD=%appdata%\npm\kuduSync.cmd
)
goto Deployment
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Deployment
:: ----------
:Deployment
echo Handling python deployment.
:: 1. KuduSync
IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" (
call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_SOURCE%" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd"
IF !ERRORLEVEL! NEQ 0 goto error
)
IF NOT EXIST "%DEPLOYMENT_TARGET%\requirements.txt" goto postPython
pushd "%DEPLOYMENT_TARGET%"
:: 4. Install packages
echo Pip install requirements.
%PIP% install -r requirements.txt
IF !ERRORLEVEL! NEQ 0 goto error
REM Add additional package installation here
REM -- Example --
REM env\scripts\easy_install pytz
REM IF !ERRORLEVEL! NEQ 0 goto error
:: 5. Copy web.config
IF EXIST "%DEPLOYMENT_SOURCE%\web.%PYTHON_VER%.config" (
echo Overwriting web.config with web.%PYTHON_VER%.config
copy /y "%DEPLOYMENT_SOURCE%\web.%PYTHON_VER%.config" "%DEPLOYMENT_TARGET%\web.config"
)
:: 6. Django collectstatic
IF EXIST "%DEPLOYMENT_TARGET%\manage.py" (
echo Collecting Django static files. You can skip Django specific steps with a .skipDjango file.
IF NOT EXIST "%DEPLOYMENT_TARGET%\static" (
MKDIR "%DEPLOYMENT_TARGET%\static"
)
%PYTHON% manage.py collectstatic --noinput --clear
)
popd
:postPython
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
goto end
:: Execute command routine that will echo out when error
:ExecuteCmd
setlocal
set _CMD_=%*
call %_CMD_%
if "%ERRORLEVEL%" NEQ "0" echo Failed exitCode=%ERRORLEVEL%, command=%_CMD_%
exit /b %ERRORLEVEL%
:error
endlocal
echo An error has occurred during web site deployment.
call :exitSetErrorLevel
call :exitFromFunction 2>nul
:exitSetErrorLevel
exit /b 1
:exitFromFunction
()
:end
endlocal
echo Finished successfully.
web.config
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="PYTHONPATH" value="D:\home\site\wwwroot" />
<add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()" />
<add key="WSGI_LOG" value="D:\home\LogFiles\wfastcgi.log" />
<add key="DJANGO_SETTINGS_MODULE" value="project.settings" />
</appSettings>
<system.webServer>
<handlers>
<remove name="Python27_via_FastCGI" />
<remove name="Python34_via_FastCGI" />
<add name="Python FastCGI"
path="handler.fcgi"
verb="*"
modules="FastCgiModule"
scriptProcessor="D:\home\python361x86\python.exe|D:\home\python361x86\wfastcgi.py"
resourceType="Unspecified"
requireAccess="Script" />
</handlers>
<rewrite>
<rules>
<rule name="Static Files" stopProcessing="true">
<conditions>
<add input="true" pattern="false" />
</conditions>
</rule>
<rule name="Configure Python" stopProcessing="true">
<match url="(.*)" ignoreCase="false" />
<conditions>
<add input="{REQUEST_URI}" pattern="^/static/.*" ignoreCase="true" negate="true" />
</conditions>
<action type="Rewrite" url="handler.fcgi/{R:1}" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Veuillez changer la partie de DJANGO_SETTINGS_MODULE
selon le projet Django.
AZ_USER="<user>"
AZ_PASS="<password>"
az webapp deployment user set --user-name $AZ_USER --password $AZ_PASS
git remote add azure <git_url>
git push azure master
L'URL git sera affichée lorsque vous "une webapp create". Vous pouvez également consulter la présentation d'App Service sur le portail.
ブラウザで<app_name>.azurewebsites.net/admin
にアクセスしてadminのログイン画面が表示されれば完了です。
Il a été assez influencé par la structure de la documentation officielle. J'étais confus parce que la partie du tutoriel expliquait d'une manière complètement différente. .. ..
Recommended Posts