Het volgende is een soepele uitleg over het opzetten en implementeren van een Django-toepassing voor Amazon Web Services (AWS), terwijl u gezond blijft.
Gebruikte tools/technologieën:
- Python v2.7.8
- Django v1.7
- Amazon Elastic Beanstalk, EC2, S3 en RDS
- EB CLI 3.x
- PostgreSQL
Nu met Python 3! Bekijk hier de bijgewerkte versie van dit artikel.
Dit artikel is bijgewerkt om de implementatie met Python 3 te behandelen, omdat AWS nu heel veel liefde heeft voor Python 3.
Elastische bonenstaak vs EC2
Elastic Beanstalk is een Platform As A Service (PaaS) dat de installatie, implementatie en het onderhoud van uw app op Amazon AWS stroomlijnt. Het is een beheerde service, die de server (EC2), database (RDS) en uw statische bestanden (S3) koppelt. U kunt uw toepassing snel implementeren en beheren, die automatisch wordt geschaald naarmate uw site groeit. Bekijk de officiële documentatie voor meer informatie.
Aan de slag
We gebruiken een eenvoudige app "Beeld van de dag", die u uit deze repository kunt halen:
$ git clone https://github.com/realpython/image-of-the-day.git
$ cd image-of-the-day/
$ git checkout tags/start_here
Nadat je de code hebt gedownload, maak je een virtualenv en installeer je de vereisten via pip:
$ pip install -r requirements.txt
Stel vervolgens, terwijl PostgreSQL lokaal draait, een nieuwe database in met de naam iotd
. Afhankelijk van uw lokale Postgres-configuratie, moet u mogelijk ook de DATABASES
bijwerken configuratie in settings.py .
Ik heb de configuratie bijvoorbeeld bijgewerkt naar:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'iotd',
'USER': '',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '5432',
}
}
Nu kunt u het databaseschema instellen, een superuser maken en de app uitvoeren:
$ python manage.py migrate
$ python manage.py createsuperuser
$ python manage.py runserver
Navigeer naar de beheerderspagina in uw browser op http://localhost:8000/admin en voeg een nieuwe afbeelding toe, die vervolgens op de hoofdpagina wordt weergegeven.
De applicatie is niet bedoeld om erg spannend te zijn; we gebruiken het alleen voor demo-doeleinden. Het enige dat het doet, is u een afbeelding laten uploaden via de beheerdersinterface en die afbeelding op volledig scherm weergeven op de hoofdpagina. Dat gezegd hebbende, hoewel dit een relatief eenvoudige app is, kunnen we er nog steeds een aantal "problemen" mee ontdekken die bestaan bij het implementeren naar Amazon Beanstalk en RDS.
Nu we de site in gebruik hebben op onze lokale computer, laten we het Amazon-implementatieproces starten.
CLI voor AWS elastische bonenstaak
Om met een Amazon Elastic Beanstalk te werken, kunnen we een pakket gebruiken met de naam awsebcli. Op het moment van schrijven is de nieuwste versie van 3.0.10 en de aanbevolen manier om het te installeren is met pip:
$ pip install awsebcli
Gebruik brew niet om dit pakket te installeren. Op het moment van schrijven installeert het v2.6.3, die op subtiele manieren is verbroken, wat tot ernstige frustratie zal leiden.
Test nu de installatie om te controleren of deze werkt:
$ eb --version
Dit zou je een mooi 3.x versienummer moeten geven:
EB CLI 3.0.10 (Python 2.7.8)
Om Elastic Beanstalk daadwerkelijk te gaan gebruiken heb je een account bij AWS nodig (verrassing!). Meld u aan (of log in).
EB configureren – uw app initialiseren
Nu de AWS Elastic Beanstalk CLI werkt, is het eerste wat we willen doen een Beanstalk-omgeving creëren om de applicatie op te hosten. Voer dit uit vanuit de projectdirectory (“image-of-the-day”):
$ eb init
Dit zal u een aantal vragen stellen om u te helpen bij het configureren van uw omgeving.
Standaardregio
Het kiezen van de regio die het dichtst bij uw eindgebruikers ligt, levert over het algemeen de beste prestaties op. Bekijk deze kaart als je niet zeker weet welke je moet kiezen.
Inloggegevens
Vervolgens zal het om uw AWS-inloggegevens vragen.
Hier wilt u waarschijnlijk een IAM-gebruiker instellen. Zie deze handleiding voor het instellen ervan. Als u een nieuwe gebruiker instelt, moet u ervoor zorgen dat de gebruiker over de juiste machtigingen beschikt. De eenvoudigste manier om dit te doen, is door "Beheerderstoegang" toe te voegen aan de Gebruiker. (Om veiligheidsredenen is dit echter waarschijnlijk geen goede keuze.) Voor de specifieke beleidsregels/rollen die een gebruiker nodig heeft om een Elastic Beanstalk-toepassing te maken/beheren, zie de link hier.
Applicatienaam
Dit zal standaard de directorynaam zijn. Ga daar maar mee akkoord.
Python-versie
Vervolgens moet de CLI automatisch detecteren dat u Python gebruikt en gewoon om bevestiging vragen. Zeg ja. Vervolgens moet u een platformversie selecteren. Selecteer Python 2.7
.
SSH
Zeg ja tegen het instellen van SSH voor uw instanties.
RSA-sleutelpaar
Vervolgens moet u een RSA-sleutelpaar genereren, dat wordt toegevoegd aan uw ~/.ssh map. Dit sleutelpaar wordt ook geüpload naar de openbare EC2-sleutel voor de regio die u in stap één hebt opgegeven. Hierdoor kun je later in deze tutorial SSH naar je EC2-instantie sturen.
Wat hebben we bereikt?
Eenmaal eb init
klaar is, ziet u een nieuwe verborgen map met de naam .elasticbeanstalk in uw projectmap:
├── .elasticbeanstalk
│ └── config.yml
├── .gitignore
├── README.md
├── iotd
│ ├── images
│ │ ├── __init__.py
│ │ ├── admin.py
│ │ ├── migrations
│ │ │ ├── 0001_initial.py
│ │ │ └── __init__.py
│ │ ├── models.py
│ │ ├── tests.py
│ │ └── views.py
│ ├── iotd
│ │ ├── __init__.py
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ ├── manage.py
│ ├── static
│ │ ├── css
│ │ │ └── bootstrap.min.css
│ │ └── js
│ │ ├── bootstrap.min.js
│ │ └── jquery-1.11.0.min.js
│ └── templates
│ ├── base.html
│ └── images
│ └── home.html
├── requirements.txt
└── www
└── media
└── sitelogo.png
In die map bevindt zich een config.yml
bestand, dat een configuratiebestand is dat wordt gebruikt om bepaalde parameters voor uw nieuw aangemaakte Beanstalk-toepassing te definiëren.
Als u nu eb console
. typt het opent uw standaardbrowser en navigeert naar de Elastic Beanstalk-console. Op de pagina zou je één applicatie moeten zien (genaamd image-of-the-day
als je precies volgt), maar geen omgevingen.
Een toepassing vertegenwoordigt uw codetoepassing en is wat eb init
. is voor ons gemaakt. Met Elastic Beanstalk kan een applicatie meerdere omgevingen hebben (d.w.z. ontwikkeling, testen, staging, productie). Het is geheel aan jou hoe je deze omgevingen wilt configureren/beheren. Voor simpele Django applicaties heb ik graag de ontwikkelomgeving op mijn laptop, om vervolgens een test- en een productieomgeving op Beanstalk te maken.
Laten we een testomgeving opzetten...
EB configureren – Creëer een omgeving
Terugkomend op de terminal, typ in uw projectdirectory:
$ eb create
Net als eb init
, zal deze opdracht u een reeks vragen stellen.
Omgevingsnaam
U moet een soortgelijke naamgevingsconventie gebruiken als wat Amazon suggereert - bijvoorbeeld applicatienaam-env_naam - vooral wanneer/als u meerdere applicaties gaat hosten met AWS. Ik gebruikte - iod-test
.
DNS CNAME-voorvoegsel
Wanneer u een app implementeert voor Elastic Beanstalk, krijgt u automatisch een domeinnaam zoals xxx.elasticbeanstalk.com. DNS CNAME prefix
is wat u wilt gebruiken in plaats van xxx
. Ga gewoon met de standaard.
Wat gebeurt er nu?
Op dit punt eb
zal daadwerkelijk uw omgeving voor u creëren. Wees geduldig, want dit kan even duren.
Als u een foutmelding krijgt bij het maken van de omgeving, zoals -
aws.auth.client.error.ARCInstanceIdentityProfileNotFoundException
- controleer of de inloggegevens die u gebruikt de juiste machtigingen hebben om de Beanstalk-omgeving te maken, zoals eerder in dit bericht is besproken.
Onmiddellijk nadat de omgeving is gemaakt, eb
zal proberen uw toepassing te implementeren door alle code in uw projectdirectory te kopiëren naar de nieuwe EC2-instantie, met pip install -r requirements.txt
in het proces.
U zou een heleboel informatie over de omgeving die wordt ingesteld op uw scherm moeten zien, evenals informatie over eb
proberen in te zetten. U zult ook enkele fouten zien. In het bijzonder zou je deze regels ergens in de uitvoer moeten zien begraven:
ERROR: Your requirements.txt is invalid. Snapshot your logs for details.
Maak je geen zorgen - het is niet echt ongeldig. Controleer de logboeken voor details:
$ eb logs
Hiermee worden alle recente logbestanden van de EC2-instantie opgehaald en naar uw terminal uitgevoerd. Het is veel informatie, dus misschien wilt u de uitvoer omleiden naar een bestand (eb logs -z
). Als u door de logs kijkt, ziet u één logbestand met de naam eb-activity.log :
Error: pg_config executable not found.
Het probleem is dat we hebben geprobeerd psycopy2
. te installeren (de Postgres Python-bindingen), maar we moeten ook de Postgres-clientstuurprogramma's installeren. Omdat ze niet standaard zijn geïnstalleerd, moeten we ze eerst installeren. Laten we dat oplossen...
Het implementatieproces aanpassen
eb
leest aangepaste .config
bestanden uit een map genaamd ".ebextensions" op het hoofdniveau van uw project ("image-of-the-day" directory). Deze .config
Met bestanden kunt u pakketten installeren, willekeurige opdrachten uitvoeren en/of omgevingsvariabelen instellen. Bestanden in de map ".ebextensions" moeten voldoen aan JSON
of YAML
syntaxis en worden in alfabetische volgorde uitgevoerd.
Pakketten installeren
Het eerste wat we moeten doen is enkele pakketten installeren zodat onze pip install
opdracht wordt succesvol voltooid. Laten we hiervoor eerst een bestand maken met de naam .ebextensions/01_packages.config :
packages:
yum:
git: []
postgresql93-devel: []
EC2-instanties draaien Amazon Linux, wat een Redhat-smaak is, dus we kunnen yum gebruiken om de pakketten te installeren die we nodig hebben. Voor nu gaan we gewoon twee pakketten installeren - git en de Postgres-client.
Nadat we dat bestand hebben gemaakt om de toepassing opnieuw te implementeren, moeten we het volgende doen:
$ git add .ebextensions/
$ git commit -m "added eb package configuration"
We moeten de wijzigingen vastleggen omdat het deployment-commando eb deploy
werkt met de laatste commit, en zal dus alleen op de hoogte zijn van onze bestandswijzigingen nadat we ze hebben vastgelegd in git. (Houd er echter rekening mee dat we niet hoeven te pushen; we werken vanuit onze lokale kopie...)
Zoals je waarschijnlijk al geraden had, is het volgende commando:
$ eb deploy
U zou nu slechts één fout moeten zien:
INFO: Environment update is starting.
INFO: Deploying new version to instance(s).
ERROR: Your WSGIPath refers to a file that does not exist.
INFO: New application version was deployed to running EC2 instances.
INFO: Environment update completed successfully.
Laten we eens kijken wat er aan de hand is...
Onze Python-omgeving configureren
EC2-instanties in Beanstalk voeren Apache uit en Apache zal onze Python-app vinden volgens de WSGIPATH die we hebben ingesteld. Standaard eb
gaat ervan uit dat ons wsgi-bestand application.py . heet . Er zijn twee manieren om dit te corrigeren-
Optie 1:omgevingsspecifieke configuratie-instellingen gebruiken
$ eb config
Deze opdracht opent uw standaardeditor en bewerkt een configuratiebestand met de naam .elasticbeanstalk/iod-test.env.yml . Dit bestand bestaat niet echt lokaal; eb
haalde het van de AWS-servers en presenteerde het aan u zodat u de instellingen erin kunt wijzigen. Als u wijzigingen aanbrengt in dit pseudo-bestand en vervolgens opslaat en afsluit, eb
zal de overeenkomstige instellingen in uw Beanstalk-omgeving bijwerken.
Als u zoekt naar de termen 'WSGI' in het bestand, zou u een configuratiegedeelte moeten vinden dat er als volgt uitziet:
aws:elasticbeanstalk:container:python:
NumProcesses: '1'
NumThreads: '15'
StaticFiles: /static/=static/
WSGIPath: application.py
Werk de WSGIPath bij:
aws:elasticbeanstalk:container:python:
NumProcesses: '1'
NumThreads: '15'
StaticFiles: /static/=static/
WSGIPath: iotd/iotd/wsgi.py
En dan heb je je WSGIPath correct ingesteld. Als u het bestand vervolgens opslaat en afsluit, eb
zal de omgevingsconfiguratie automatisch bijwerken:
Printing Status:
INFO: Environment update is starting.
INFO: Updating environment iod-test's configuration settings.
INFO: Successfully deployed new configuration to environment.
INFO: Environment update completed successfully.
Het voordeel van het gebruik van de eb config
methode om instellingen te wijzigen is dat je per omgeving verschillende instellingen kunt opgeven. Maar u kunt ook instellingen bijwerken met dezelfde .config
bestanden die we eerder gebruikten. Dit gebruikt dezelfde instellingen voor elke omgeving, als de .config
bestanden worden toegepast bij implementatie (na de instellingen van eb config
zijn toegepast).
Optie 2:Algemene configuratie-instellingen gebruiken
Om de .config
te gebruiken bestandsoptie, laten we een nieuw bestand maken met de naam /.ebextensions/02_python.config :
option_settings:
"aws:elasticbeanstalk:application:environment":
DJANGO_SETTINGS_MODULE: "iotd.settings"
"PYTHONPATH": "/opt/python/current/app/iotd:$PYTHONPATH"
"aws:elasticbeanstalk:container:python":
WSGIPath: iotd/iotd/wsgi.py
NumProcesses: 3
NumThreads: 20
"aws:elasticbeanstalk:container:python:staticfiles":
"/static/": "www/static/"
Wat gebeurt er?
DJANGO_SETTINGS_MODULE: "iotd.settings"
- voegt het pad toe aan de instellingenmodule."PYTHONPATH": "/opt/python/current/app/iotd:$PYTHONPATH"
- werkt onzePYTHONPATH
bij zodat Python de modules in onze applicatie kan vinden. (Merk op dat het gebruik van het volledige pad noodzakelijk is.)WSGIPath: iotd/iotd/wsgi.py
bepaalt ons WSGI-pad.NumProcesses: 3
enNumThreads: 20
- werkt het aantal processen en threads bij dat wordt gebruikt om onze WSGI-toepassing uit te voeren."/static/": "www/static/"
stelt ons pad voor statische bestanden in.
Nogmaals, we kunnen een git commit
. doen dan een eb deploy
om deze instellingen bij te werken.
Laten we vervolgens een database toevoegen.
Een database configureren
Probeer de geïmplementeerde website te bekijken:
$ eb open
Met deze opdracht wordt de geïmplementeerde toepassing in uw standaardbrowser weergegeven. U zou de foutmelding verbinding geweigerd moeten zien:
OperationalError at /
could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
Dit komt omdat we nog geen database hebben opgezet. Op dit punt eb
zal uw Beanstalk-omgeving opzetten, maar het stelt geen RDS (de databaselaag) in. Dat moeten we handmatig instellen.
Database instellen
Gebruik opnieuw eb console
om de Beanstalk-configuratiepagina te openen.
Doe vanaf daar het volgende:
- Klik op de link 'Configuratie'.
- Scroll helemaal naar de onderkant van de pagina en klik vervolgens onder het gedeelte 'Gegevenslaag' op de link 'maak een nieuwe RDS-database'.
- Verander op de RDS-configuratiepagina de "DB Engine" in "postgres".
- Voeg een “Hoofdgebruikersnaam” en “Hoofdwachtwoord” toe.
- Sla de wijzigingen op.
Beanstalk maakt de RDS voor je aan. Nu moeten we onze Django-app krijgen om verbinding te maken met de RDS. Beanstalk zal ons hierbij helpen door een aantal omgevingsvariabelen op de EC2-instanties voor ons bloot te leggen die beschrijven hoe we verbinding kunnen maken met de Postgres-server. We hoeven dus alleen onze settings.py . bij te werken bestand om te profiteren van die omgevingsvariabelen. Bevestig dat de DATABASES
configuratieparameter geeft het volgende weer in settings.py :
if 'RDS_DB_NAME' in os.environ:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ['RDS_DB_NAME'],
'USER': os.environ['RDS_USERNAME'],
'PASSWORD': os.environ['RDS_PASSWORD'],
'HOST': os.environ['RDS_HOSTNAME'],
'PORT': os.environ['RDS_PORT'],
}
}
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'iotd',
'USER': 'iotd',
'PASSWORD': 'iotd',
'HOST': 'localhost',
'PORT': '5432',
}
}
Dit zegt eenvoudigweg:"Gebruik de instellingen van de omgevingsvariabele, indien aanwezig, gebruik anders onze standaard ontwikkelingsinstellingen". Eenvoudig.
Databasemigraties afhandelen
Met onze databaseconfiguratie moeten we er nog steeds voor zorgen dat migraties worden uitgevoerd, zodat de databasetabelstructuur correct is. We kunnen dat doen door .ebextensions/02_python.config . aan te passen en de volgende regels bovenaan het bestand toe te voegen:
container_commands:
01_migrate:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py migrate --noinput"
leader_only: true
container_commands
kunt u willekeurige opdrachten uitvoeren nadat de toepassing is geïmplementeerd op de EC2-instantie. Omdat de EC2-instantie is ingesteld met behulp van een virtuele omgeving, moeten we eerst die virtuele omgeving activeren voordat we onze migratieopdracht uitvoeren. Ook de leader_only: true
instelling betekent:"Voer deze opdracht alleen uit op de eerste instantie bij implementatie op meerdere instanties".
Vergeet niet dat onze applicatie gebruik maakt van Django's admin, dus we hebben een superuser nodig...
Maak de beheerdergebruiker
Helaas createsuperuser
staat u niet toe om een wachtwoord op te geven bij gebruik van de --noinput
optie, dus we zullen onze eigen opdracht moeten schrijven. Gelukkig maakt Django het heel gemakkelijk om aangepaste commando's te maken.
Maak het bestand iotd/images/management/commands/createsu.py :
from django.core.management.base import BaseCommand
from django.contrib.auth.models import User
class Command(BaseCommand):
def handle(self, *args, **options):
if not User.objects.filter(username="admin").exists():
User.objects.create_superuser("admin", "[email protected]", "admin")
Zorg ervoor dat u de juiste __init__.py
. toevoegt ook bestanden:
└─ management
├── __init__.py
└── commands
├── __init__.py
└── createsu.py
Met dit bestand kun je python manage.py createsu
. uitvoeren , en het zal een superuser maken zonder om een wachtwoord te vragen. Voel je vrij om de opdracht uit te breiden om omgevingsvariabelen of een ander middel te gebruiken waarmee je het wachtwoord kunt wijzigen.
Zodra je de opdracht hebt gemaakt, kunnen we gewoon een andere opdracht toevoegen aan onze container_commands
sectie in .ebextensions/02_python.config :
02_createsu:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py createsu"
leader_only: true
Voordat u dit uitprobeert, moeten we ervoor zorgen dat onze statische bestanden allemaal op de juiste plaats staan...
Statische bestanden
Voeg nog een commando toe onder container_commands
:
03_collectstatic:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py collectstatic --noinput"
Het hele bestand ziet er dus als volgt uit:
container_commands:
01_migrate:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py migrate --noinput"
leader_only: true
02_createsu:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py createsu"
leader_only: true
03_collectstatic:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py collectstatic --noinput"
option_settings:
"aws:elasticbeanstalk:application:environment":
DJANGO_SETTINGS_MODULE: "iotd.settings"
"PYTHONPATH": "/opt/python/current/app/iotd:$PYTHONPATH"
"ALLOWED_HOSTS": ".elasticbeanstalk.com"
"aws:elasticbeanstalk:container:python":
WSGIPath: iotd/iotd/wsgi.py
NumProcesses: 3
NumThreads: 20
"aws:elasticbeanstalk:container:python:staticfiles":
"/static/": "www/static/"
We moeten er nu voor zorgen dat de STATIC_ROOT
is correct ingesteld in settings.py bestand:
STATIC_ROOT = os.path.join(BASE_DIR, "..", "www", "static")
STATIC_URL = '/static/'
Zorg ervoor dat u de www
. commit directory naar git zodat de statische dir kan worden gemaakt. Voer vervolgens eb deploy
uit nogmaals, en u zou nu zaken moeten doen:
INFO: Environment update is starting.
INFO: Deploying new version to instance(s).
INFO: New application version was deployed to running EC2 instances.
INFO: Environment update completed successfully.
Op dit punt zou u naar http://your_app_url/admin moeten kunnen gaan, inloggen, een afbeelding toevoegen en die afbeelding vervolgens op de hoofdpagina van uw toepassing zien verschijnen.
Succes!
S3 gebruiken voor mediaopslag
Met deze opstelling zullen we elke keer dat we opnieuw implementeren, al onze geüploade afbeeldingen verliezen. Waarom? Welnu, wanneer u eb deploy
. uitvoert , wordt er een nieuw exemplaar voor je gemaakt. Dit is niet wat we willen, omdat we dan gegevens in de database voor de afbeeldingen hebben, maar geen bijbehorende afbeeldingen. De oplossing is om de mediabestanden op te slaan in Amazon Simple Storage Service (Amazon S3) in plaats van op de EC2-instantie zelf.
U moet:
- Maak een bucket
- Pak de ARN van uw gebruiker (Amazon Resource Name)
- Buckemachtigingen toevoegen
- Configureer je Django-app om S3 te gebruiken om je statische bestanden te serveren
Aangezien hier al goede berichten over zijn, wijs ik je gewoon op mijn favoriet:Amazon S3 gebruiken om je Django-statische en mediabestanden op te slaan
Apache-configuratie
Aangezien we Apache gebruiken met Beanstalk, willen we Apache waarschijnlijk zo instellen dat het (onder andere) gzip-compressie mogelijk maakt, zodat bestanden sneller door de clients worden gedownload. Dat kan met container_commands
. Maak een nieuw bestand .ebextensions/03_apache.config en voeg het volgende toe:
container_commands:
01_setup_apache:
command: "cp .ebextensions/enable_mod_deflate.conf /etc/httpd/conf.d/enable_mod_deflate.conf"
Vervolgens moet u het bestand .ebextensions/enable_mod_deflate.conf
maken :
# mod_deflate configuration
<IfModule mod_deflate.c>
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xml+rss
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
# Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9
# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
<IfModule mod_headers.c>
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</IfModule>
</IfModule>
Als u dit doet, wordt gzip-compressie ingeschakeld, wat zou moeten helpen bij de grootte van de bestanden die u downloadt. U kunt dezelfde strategie ook gebruiken om uw CSS/JS automatisch te verkleinen en te combineren en andere voorbewerkingen uit te voeren die u moet doen.
Problemen oplossen
Vergeet de zeer behulpzame eb ssh
. niet commando, waarmee je naar de EC2-instantie gaat, zodat je rond kunt snuffelen en kunt zien wat er aan de hand is. Bij het oplossen van problemen zijn er een paar mappen waar u op moet letten:
/opt/python
- Root van waar je applicatie zal eindigen./opt/python/current/app
- De huidige applicatie die in de omgeving wordt gehost./opt/python/on-deck/app
- De app wordt in eerste instantie op het dek geplaatst en vervolgens, nadat de implementatie is voltooid, wordt deze verplaatst naarcurrent
. Als u fouten krijgt in uwcontainer_commands
, bekijk deon-deck
map en niet decurrent
map./opt/python/current/env
- Alle env-variabelen dieeb
voor u zal opzetten. Als u een fout probeert te reproduceren, moet u mogelijk eerstsource /opt/python/current/env
om dingen in te stellen zoals ze zouden zijn wanneer eb deploy actief is.opt/python/run/venv
- De virtuele omgeving die door uw toepassing wordt gebruikt; je moet ooksource /opt/python/run/venv/bin/activate
uitvoeren als u een fout probeert te reproduceren
Conclusie
Implementeren op Elastic Beanstalk kan in het begin een beetje ontmoedigend zijn, maar als je eenmaal begrijpt waar alle onderdelen zijn en hoe de dingen werken, is het eigenlijk vrij eenvoudig en extreem flexibel. Het geeft u ook een omgeving die automatisch wordt geschaald naarmate uw gebruik groeit. Hopelijk heb je nu genoeg om gevaarlijk te zijn! Veel succes bij uw volgende Beanstalk-implementatie.
Hebben we iets gemist? Heb je nog andere tips of trucs? Reageer hieronder.