Sau đây là phần hướng dẫn về cách thiết lập và triển khai ứng dụng Django cho Amazon Web Services (AWS) trong khi vẫn bình thường.
Các công cụ / công nghệ được sử dụng:
- Python v2.7.8
- Django v1.7
- Amazon Elastic Beanstalk, EC2, S3 và RDS
- EB CLI 3.x
- PostgreSQL
Hiện đã có Python 3! Xem phiên bản cập nhật của bài viết này tại đây.
Bài viết này đã được cập nhật để đề cập đến việc triển khai với Python 3 vì AWS hiện có rất nhiều tình yêu dành cho Python 3.
Cây đậu đàn hồi so với EC2
Elastic Beanstalk là Nền tảng dưới dạng dịch vụ (PaaS) giúp đơn giản hóa việc thiết lập, triển khai và bảo trì ứng dụng của bạn trên Amazon AWS. Đó là một dịch vụ được quản lý, kết hợp máy chủ (EC2), cơ sở dữ liệu (RDS) và các tệp tĩnh của bạn (S3). Bạn có thể nhanh chóng triển khai và quản lý ứng dụng của mình, ứng dụng này sẽ tự động mở rộng quy mô khi trang web của bạn phát triển. Xem tài liệu chính thức để biết thêm thông tin.
Bắt đầu
Chúng tôi sẽ sử dụng ứng dụng “Hình ảnh trong ngày” đơn giản mà bạn có thể lấy từ kho lưu trữ này:
$ git clone https://github.com/realpython/image-of-the-day.git
$ cd image-of-the-day/
$ git checkout tags/start_here
Sau khi bạn tải xuống mã, hãy tạo virtualenv và cài đặt các yêu cầu qua pip:
$ pip install -r requirements.txt
Tiếp theo, với PostgreSQL đang chạy cục bộ, hãy thiết lập cơ sở dữ liệu mới có tên iotd
. Ngoài ra, tùy thuộc vào cấu hình Postgres địa phương của bạn, bạn có thể cần cập nhật DATABASES
cấu hình trong settings.py .
Ví dụ:tôi đã cập nhật cấu hình thành:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'iotd',
'USER': '',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '5432',
}
}
Bây giờ bạn có thể thiết lập lược đồ cơ sở dữ liệu, tạo siêu người dùng và chạy ứng dụng:
$ python manage.py migrate
$ python manage.py createsuperuser
$ python manage.py runserver
Điều hướng đến trang quản trị trong trình duyệt của bạn tại http:// localhost:8000 / admin và thêm một hình ảnh mới, hình ảnh này sau đó sẽ được hiển thị trên trang chính.
Ứng dụng không phải là quá thú vị; chúng tôi chỉ đang sử dụng nó cho mục đích demo. Tất cả những gì nó làm là cho phép bạn tải lên một hình ảnh thông qua giao diện quản trị và hiển thị hình ảnh đó toàn màn hình trên trang chính. Điều đó nói lên rằng, mặc dù đây là một ứng dụng tương đối cơ bản, nhưng nó vẫn sẽ cho phép chúng tôi khám phá một số “gotchas” tồn tại khi triển khai cho Amazon Beanstalk và RDS.
Bây giờ chúng tôi đã thiết lập và chạy trang web trên máy cục bộ của mình, hãy bắt đầu quá trình triển khai Amazon.
CLI cho AWS Elastic Beanstalk
Để làm việc với Amazon Elastic Beanstalk, chúng ta có thể sử dụng một gói có tên awsebcli. Tại thời điểm này, phiên bản mới nhất là 3.0.10 và cách được khuyến nghị để cài đặt nó là sử dụng pip:
$ pip install awsebcli
Không sử dụng brew để cài đặt gói này. Theo văn bản này, nó cài đặt v2.6.3 bị hỏng theo những cách tinh vi sẽ dẫn đến sự thất vọng nghiêm trọng.
Bây giờ hãy kiểm tra cài đặt để đảm bảo rằng nó đang hoạt động:
$ eb --version
Điều này sẽ cung cấp cho bạn số phiên bản 3.x đẹp:
EB CLI 3.0.10 (Python 2.7.8)
Để thực sự bắt đầu sử dụng Elastic Beanstalk, bạn sẽ cần có tài khoản AWS (thật bất ngờ!). Đăng ký (hoặc đăng nhập).
Định cấu hình EB - Khởi chạy ứng dụng của bạn
Với AWS Elastic Beanstalk CLI đang hoạt động, điều đầu tiên chúng tôi muốn làm là tạo một môi trường Beanstalk để lưu trữ ứng dụng. Chạy cái này từ thư mục dự án (“image-of-the-day”):
$ eb init
Điều này sẽ gợi cho bạn một số câu hỏi để giúp bạn định cấu hình môi trường của mình.
Khu vực mặc định
Việc chọn khu vực gần nhất với người dùng cuối của bạn nói chung sẽ mang lại hiệu suất tốt nhất. Hãy xem bản đồ này nếu bạn không chắc nên chọn.
Thông tin đăng nhập
Tiếp theo, sẽ yêu cầu thông tin đăng nhập AWS của bạn.
Tại đây, rất có thể bạn sẽ muốn thiết lập Người dùng IAM. Xem hướng dẫn này để biết cách thiết lập. Nếu bạn thiết lập người dùng mới, bạn sẽ cần đảm bảo người dùng có các quyền thích hợp. Cách đơn giản nhất để làm điều này là chỉ cần thêm “Quyền truy cập của quản trị viên” vào Người dùng. (Tuy nhiên, đây có lẽ không phải là lựa chọn tuyệt vời vì lý do bảo mật.) Để biết các chính sách / vai trò cụ thể mà người dùng cần để tạo / quản lý ứng dụng Elastic Beanstalk, hãy xem liên kết tại đây.
Tên ứng dụng
Điều này sẽ mặc định cho tên thư mục. Chỉ cần làm với điều đó.
Phiên bản Python
Tiếp theo, CLI sẽ tự động phát hiện rằng bạn đang sử dụng Python và chỉ cần yêu cầu xác nhận. Nói có. Sau đó, bạn cần chọn một phiên bản nền tảng. Chọn Python 2.7
.
SSH
Nói có để thiết lập SSH cho các phiên bản của bạn.
Cặp khóa RSA
Tiếp theo, bạn cần tạo cặp khóa RSA, cặp khóa này sẽ được thêm vào ~ / .ssh của bạn thư mục. Cặp khóa này cũng sẽ được tải lên khóa công khai EC2 cho khu vực bạn đã chỉ định trong bước một. Điều này sẽ cho phép bạn SSH vào phiên bản EC2 của mình ở phần sau của hướng dẫn này.
Chúng tôi đã đạt được những gì?
Một lần eb init
kết thúc, bạn sẽ thấy một thư mục ẩn mới có tên là .elasticbeanstalk trong thư mục dự án của bạn:
├── .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
Bên trong thư mục đó là một config.yml
, là một tệp cấu hình được sử dụng để xác định các thông số nhất định cho ứng dụng Beanstalk mới được đúc của bạn.
Tại thời điểm này, nếu bạn nhập eb console
nó sẽ mở trình duyệt mặc định của bạn và điều hướng đến bảng điều khiển Elastic Beanstalk. Trên trang, bạn sẽ thấy một ứng dụng (được gọi là image-of-the-day
nếu bạn đang theo dõi chính xác), nhưng không có môi trường.
Một ứng dụng đại diện cho ứng dụng mã của bạn và là những gì eb init
được tạo ra cho chúng tôi. Với Elastic Beanstalk, một ứng dụng có thể có nhiều môi trường (tức là phát triển, thử nghiệm, dàn dựng, sản xuất). Việc bạn muốn cấu hình / quản lý các môi trường này như thế nào là hoàn toàn tùy thuộc vào bạn. Đối với các ứng dụng Django đơn giản, tôi muốn có môi trường phát triển trên máy tính xách tay của mình, sau đó tạo thử nghiệm và môi trường sản xuất trên Beanstalk.
Hãy thiết lập môi trường thử nghiệm…
Định cấu hình EB - Tạo môi trường
Quay lại thiết bị đầu cuối, trong loại thư mục dự án của bạn:
$ eb create
Cũng giống như eb init
, lệnh này sẽ nhắc bạn với một loạt câu hỏi.
Tên môi trường
Bạn nên sử dụng quy ước đặt tên tương tự như những gì Amazon đề xuất - ví dụ:application_name-env_name - đặc biệt khi / nếu bạn bắt đầu lưu trữ nhiều ứng dụng với AWS. Tôi đã sử dụng - iod-test
.
Tiền tố CNAME DNS
Khi bạn triển khai một ứng dụng cho Elastic Beanstalk, bạn sẽ tự động nhận được một tên miền như xxx.elasticbeanstalk.com. DNS CNAME prefix
là những gì bạn muốn được sử dụng thay cho xxx
. Chỉ cần sử dụng mặc định.
Điều gì xảy ra bây giờ?
Tại thời điểm này eb
thực sự sẽ tạo ra môi trường của bạn cho bạn. Hãy kiên nhẫn vì điều này có thể mất một chút thời gian.
Nếu bạn gặp lỗi khi tạo môi trường, như -
aws.auth.client.error.ARCInstanceIdentityProfileNotFoundException
- kiểm tra xem bằng chứng xác thực bạn đang sử dụng có quyền thích hợp để tạo môi trường Beanstalk, như đã thảo luận trước đó trong bài đăng này hay không.
Ngay sau khi môi trường được tạo, eb
sẽ cố gắng triển khai ứng dụng của bạn, bằng cách sao chép tất cả mã trong thư mục dự án của bạn sang phiên bản EC2 mới, chạy pip install -r requirements.txt
trong quá trình này.
Bạn sẽ thấy một loạt thông tin về môi trường đang được thiết lập được hiển thị trên màn hình của bạn, cũng như thông tin về eb
đang cố gắng triển khai. Bạn cũng sẽ thấy một số lỗi. Đặc biệt, bạn sẽ thấy những dòng này được chôn ở đâu đó trong đầu ra:
ERROR: Your requirements.txt is invalid. Snapshot your logs for details.
Đừng lo lắng - Nó không thực sự không hợp lệ. Kiểm tra nhật ký để biết chi tiết:
$ eb logs
Thao tác này sẽ lấy tất cả các tệp nhật ký gần đây từ phiên bản EC2 và xuất chúng ra thiết bị đầu cuối của bạn. Đó là rất nhiều thông tin, vì vậy bạn có thể muốn chuyển hướng đầu ra đến một tệp (eb logs -z
). Xem qua nhật ký, bạn sẽ thấy một tệp nhật ký có tên là eb-activity.log :
Error: pg_config executable not found.
Vấn đề là chúng tôi đã cố cài đặt psycopy2
(các ràng buộc Postgres Python), nhưng chúng tôi cũng cần cài đặt các trình điều khiển máy khách Postgres. Vì chúng không được cài đặt theo mặc định nên trước tiên chúng ta cần cài đặt chúng. Hãy khắc phục điều đó…
Tùy chỉnh quy trình triển khai
eb
sẽ đọc .config
tùy chỉnh các tệp từ thư mục có tên “.ebextensions” ở cấp cơ sở của dự án của bạn (thư mục “image-of-the-day”). .config
này các tệp cho phép bạn cài đặt các gói, chạy các lệnh tùy ý và / hoặc đặt các biến môi trường. Các tệp trong thư mục “.ebextensions” phải tuân theo JSON
hoặc YAML
cú pháp và được thực thi theo thứ tự bảng chữ cái.
Cài đặt gói
Điều đầu tiên chúng ta cần làm là cài đặt một số gói để pip install
của chúng ta lệnh sẽ hoàn tất thành công. Để thực hiện việc này, trước tiên hãy tạo một tệp có tên là .ebextensions / 01_packages.config :
packages:
yum:
git: []
postgresql93-devel: []
Các phiên bản EC2 chạy Amazon Linux, là một phiên bản Redhat, vì vậy chúng tôi có thể sử dụng yum để cài đặt các gói mà chúng tôi cần. Hiện tại, chúng tôi chỉ cài đặt hai gói - git và ứng dụng khách Postgres.
Sau khi tạo tệp đó để triển khai lại ứng dụng, chúng ta cần làm như sau:
$ git add .ebextensions/
$ git commit -m "added eb package configuration"
Chúng tôi phải thực hiện các thay đổi vì lệnh triển khai eb deploy
hoạt động dựa trên cam kết mới nhất và do đó sẽ chỉ nhận thức được các thay đổi tệp của chúng tôi sau khi chúng tôi cam kết chúng với git. (Xin lưu ý rằng chúng tôi không phải thúc đẩy; chúng tôi đang làm việc từ bản sao địa phương của chúng tôi…)
Như bạn có thể đoán, lệnh tiếp theo là:
$ eb deploy
Bây giờ bạn sẽ chỉ thấy một lỗi:
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.
Hãy cùng tìm hiểu xem điều gì đang xảy ra…
Định cấu hình môi trường Python của chúng tôi
Các phiên bản EC2 trong Beanstalk chạy Apache và Apache sẽ tìm thấy ứng dụng Python của chúng tôi theo WSGIPATH mà chúng tôi đã đặt. Theo mặc định eb
giả sử tệp wsgi của chúng tôi được gọi là application.py . Có hai cách để sửa lỗi này-
Tùy chọn 1:Sử dụng cài đặt cấu hình theo môi trường cụ thể
$ eb config
Lệnh này sẽ mở trình chỉnh sửa mặc định của bạn, chỉnh sửa tệp cấu hình có tên là .elasticbeanstalk / iod-test.env.yml . Tệp này không thực sự tồn tại cục bộ; eb
đã kéo nó xuống khỏi máy chủ AWS và trình bày cho bạn để bạn có thể thay đổi cài đặt trong đó. Nếu bạn thực hiện bất kỳ thay đổi nào đối với tệp giả này, sau đó lưu và thoát, eb
sẽ cập nhật các cài đặt tương ứng trong môi trường Beanstalk của bạn.
Nếu bạn tìm kiếm cụm từ 'WSGI' trong tệp và bạn sẽ tìm thấy phần cấu hình giống như sau:
aws:elasticbeanstalk:container:python:
NumProcesses: '1'
NumThreads: '15'
StaticFiles: /static/=static/
WSGIPath: application.py
Cập nhật WSGIPath:
aws:elasticbeanstalk:container:python:
NumProcesses: '1'
NumThreads: '15'
StaticFiles: /static/=static/
WSGIPath: iotd/iotd/wsgi.py
Và sau đó bạn sẽ có WSGIPath được thiết lập chính xác. Nếu sau đó bạn lưu tệp và thoát, hãy eb
sẽ tự động cập nhật cấu hình môi trường:
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.
Lợi thế khi sử dụng eb config
phương pháp để thay đổi cài đặt là bạn có thể chỉ định các cài đặt khác nhau cho mỗi môi trường. Nhưng bạn cũng có thể cập nhật cài đặt bằng cùng một .config
các tệp mà chúng tôi đã sử dụng trước đây. Điều này sẽ sử dụng các cài đặt giống nhau cho từng môi trường, như .config
tệp sẽ được áp dụng khi triển khai (sau khi cài đặt từ eb config
đã được áp dụng).
Tùy chọn 2:Sử dụng cài đặt cấu hình chung
Để sử dụng .config
tùy chọn tệp, hãy tạo một tệp mới có tên là /.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/"
Điều gì đang xảy ra?
-
DJANGO_SETTINGS_MODULE: "iotd.settings"
- thêm đường dẫn đến mô-đun cài đặt. -
"PYTHONPATH": "/opt/python/current/app/iotd:$PYTHONPATH"
- cập nhậtPYTHONPATH
của chúng tôi vì vậy Python có thể tìm thấy các mô-đun trong ứng dụng của chúng tôi. (Lưu ý rằng việc sử dụng đường dẫn đầy đủ là cần thiết.) -
WSGIPath: iotd/iotd/wsgi.py
đặt Đường dẫn WSGI của chúng tôi. -
NumProcesses: 3
vàNumThreads: 20
- cập nhật số lượng quy trình và chuỗi được sử dụng để chạy ứng dụng WSGI của chúng tôi. -
"/static/": "www/static/"
đặt đường dẫn tệp tĩnh của chúng tôi.
Một lần nữa, chúng ta có thể thực hiện git commit
sau đó triển khai eb
để cập nhật các cài đặt này.
Tiếp theo, hãy thêm một cơ sở dữ liệu.
Định cấu hình cơ sở dữ liệu
Thử xem trang web đã triển khai:
$ eb open
Lệnh này sẽ hiển thị ứng dụng đã triển khai trong trình duyệt mặc định của bạn. Bạn sẽ thấy lỗi kết nối bị từ chối:
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?
Điều này là do chúng tôi chưa thiết lập cơ sở dữ liệu. Tại thời điểm này eb
sẽ thiết lập môi trường Beanstalk của bạn, nhưng nó không thiết lập RDS (tầng cơ sở dữ liệu). Chúng tôi phải thiết lập thủ công.
Thiết lập cơ sở dữ liệu
Một lần nữa, hãy sử dụng eb console
để mở trang cấu hình Beanstalk.
Từ đó, hãy làm như sau:
- Nhấp vào liên kết "Cấu hình".
- Cuộn đến cuối trang, sau đó trong phần "Cấp dữ liệu", hãy nhấp vào liên kết "tạo cơ sở dữ liệu RDS mới".
- Trên trang thiết lập RDS, hãy thay đổi “DB Engine” thành “postgres”.
- Thêm “Tên người dùng chính” và “Mật khẩu chính”.
- Lưu các thay đổi.
Beanstalk sẽ tạo RDS cho bạn. Bây giờ chúng ta cần có ứng dụng Django của mình để kết nối với RDS. Beanstalk sẽ giúp chúng tôi ở đây bằng cách tiết lộ một số biến môi trường trên các phiên bản EC2 cho chúng tôi chi tiết cách kết nối với máy chủ Postgres. Vì vậy, tất cả những gì chúng ta cần làm là cập nhật settings.py để tận dụng các biến môi trường đó. Xác nhận rằng DATABASES
tham số cấu hình phản ánh những điều sau đây trong 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',
}
}
Điều này chỉ đơn giản nói, "Sử dụng cài đặt biến môi trường nếu có, nếu không, hãy sử dụng cài đặt phát triển mặc định của chúng tôi". Đơn giản.
Xử lý di chuyển cơ sở dữ liệu
Với thiết lập cơ sở dữ liệu của chúng tôi, chúng tôi vẫn cần đảm bảo rằng quá trình di chuyển được chạy để cấu trúc bảng cơ sở dữ liệu là chính xác. Chúng tôi có thể làm điều đó bằng cách sửa đổi .ebextensions / 02_python.config và thêm các dòng sau vào đầu tệp:
container_commands:
01_migrate:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py migrate --noinput"
leader_only: true
container_commands
cho phép bạn chạy các lệnh tùy ý sau khi ứng dụng đã được triển khai trên phiên bản EC2. Vì cá thể EC2 được thiết lập bằng môi trường ảo, trước tiên chúng ta phải kích hoạt môi trường ảo đó trước khi chạy lệnh di chuyển của mình. Cũng là leader_only: true
cài đặt có nghĩa là, “Chỉ chạy lệnh này trên phiên bản đầu tiên khi triển khai cho nhiều phiên bản”.
Đừng quên rằng ứng dụng của chúng tôi sử dụng quản trị viên của Django, vì vậy chúng tôi sẽ cần một người dùng cấp cao…
Tạo người dùng quản trị
Rất tiếc, createsuperuser
không cho phép bạn chỉ định mật khẩu khi sử dụng --noinput
tùy chọn, vì vậy chúng tôi sẽ phải viết lệnh của riêng mình. May mắn thay, Django giúp tạo các lệnh tùy chỉnh rất dễ dàng.
Tạo tệp iotd / images / management / command / createu.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")
Đảm bảo bạn thêm __init__.py
thích hợp các tệp cũng như:
└─ management
├── __init__.py
└── commands
├── __init__.py
└── createsu.py
Tệp này sẽ cho phép bạn chạy python manage.py createsu
, và nó sẽ tạo một siêu người dùng mà không cần nhắc nhập mật khẩu. Vui lòng mở rộng lệnh để sử dụng các biến môi trường hoặc các phương tiện khác để cho phép bạn thay đổi mật khẩu.
Sau khi bạn đã tạo lệnh, chúng tôi chỉ có thể thêm một lệnh khác vào container_commands
của chúng tôi trong .ebextensions / 02_python.config :
02_createsu:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py createsu"
leader_only: true
Trước khi bạn kiểm tra điều này, hãy đảm bảo rằng tất cả các tệp tĩnh của chúng ta đều được đặt ở đúng vị trí…
Tệp tĩnh
Thêm một lệnh nữa trong container_commands
:
03_collectstatic:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py collectstatic --noinput"
Vì vậy, toàn bộ tệp trông giống như sau:
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/"
Bây giờ chúng tôi cần đảm bảo rằng STATIC_ROOT
được đặt chính xác trong settings.py tệp:
STATIC_ROOT = os.path.join(BASE_DIR, "..", "www", "static")
STATIC_URL = '/static/'
Đảm bảo rằng bạn cam kết www
thư mục sang git để có thể tạo dir tĩnh. Sau đó chạy eb deploy
một lần nữa, và bây giờ bạn sẽ kinh doanh:
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.
Tại thời điểm này, bạn có thể truy cập http:// your_app_url / admin, đăng nhập, thêm hình ảnh và sau đó xem hình ảnh đó được hiển thị trên trang chính của ứng dụng của bạn.
Thành công!
Sử dụng S3 để lưu trữ phương tiện
Với thiết lập này, mỗi lần chúng tôi triển khai lại, chúng tôi sẽ mất tất cả các hình ảnh đã tải lên của mình. Tại sao? Chà, khi bạn chạy eb deploy
, một phiên bản mới được tạo ra cho bạn. Đây không phải là những gì chúng tôi muốn vì sau đó chúng tôi sẽ có các mục nhập trong cơ sở dữ liệu cho các hình ảnh, nhưng không có hình ảnh liên quan. Giải pháp là lưu trữ các tệp phương tiện trong Amazon Simple Storage Service (Amazon S3) thay vì trên chính phiên bản EC2.
Bạn sẽ cần:
- Tạo một nhóm
- Lấy ARN của người dùng của bạn (Tên tài nguyên Amazon)
- Thêm quyền cho nhóm
- Định cấu hình ứng dụng Django của bạn để sử dụng S3 nhằm cung cấp các tệp tĩnh của bạn
Vì đã có nhiều bài viết hay về vấn đề này, tôi sẽ chỉ cho bạn điểm yêu thích của tôi:Sử dụng Amazon S3 để lưu trữ các tệp Django tĩnh và phương tiện
Cấu hình Apache
Vì chúng tôi đang sử dụng Apache với Beanstalk, chúng tôi có thể muốn thiết lập Apache để (trong số những thứ khác) bật tính năng nén gzip để các tệp được khách hàng tải xuống nhanh hơn. Điều đó có thể được thực hiện với container_commands
. Tạo tệp mới .ebextensions / 03_apache.config và thêm phần sau:
container_commands:
01_setup_apache:
command: "cp .ebextensions/enable_mod_deflate.conf /etc/httpd/conf.d/enable_mod_deflate.conf"
Sau đó, bạn cần tạo tệp .ebextensions/enable_mod_deflate.conf
:
# 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>
Làm điều này sẽ bật tính năng nén gzip, điều này sẽ giúp tăng kích thước tệp bạn đang tải xuống. Bạn cũng có thể sử dụng chiến lược tương tự để tự động rút gọn và kết hợp CSS / JS của mình và thực hiện bất kỳ quá trình tiền xử lý nào khác mà bạn cần thực hiện.
Khắc phục sự cố
Đừng quên eb ssh
rất hữu ích lệnh này sẽ đưa bạn vào phiên bản EC2 để bạn có thể xem xung quanh và xem điều gì đang xảy ra. Khi khắc phục sự cố, có một số thư mục bạn nên biết:
-
/opt/python
- Gốc nơi ứng dụng của bạn sẽ kết thúc. -
/opt/python/current/app
- Ứng dụng hiện tại được lưu trữ trong môi trường. -
/opt/python/on-deck/app
- Ứng dụng ban đầu được đặt trên boong và sau đó, sau khi tất cả việc triển khai hoàn tất, nó sẽ được chuyển sangcurrent
. Nếu bạn gặp lỗi trongcontainer_commands
của mình , hãy xemon-deck
chứ không phảicurrent
thư mục. -
/opt/python/current/env
- Tất cả các biến enveb
sẽ thiết lập cho bạn. Nếu bạn đang cố gắng tạo lại lỗi, trước tiên bạn có thể cần phảisource /opt/python/current/env
để mọi thứ được thiết lập như ban đầu khi triển khai eb đang chạy. -
opt/python/run/venv
- Env ảo được ứng dụng của bạn sử dụng; bạn cũng sẽ cần chạysource /opt/python/run/venv/bin/activate
nếu bạn đang cố gắng tạo lại một lỗi
Kết luận
Việc triển khai Elastic Beanstalk có thể hơi khó khăn lúc đầu, nhưng khi bạn hiểu vị trí của tất cả các bộ phận và cách mọi thứ hoạt động, thì việc này thực sự khá dễ dàng và cực kỳ linh hoạt. Nó cũng cung cấp cho bạn một môi trường sẽ tự động mở rộng quy mô khi mức sử dụng của bạn tăng lên. Hy vọng rằng bây giờ bạn đã đủ để nguy hiểm! Chúc bạn may mắn trong lần triển khai Beanstalk tiếp theo.
Chúng tôi đã bỏ lỡ bất cứ điều gì? Có bất kỳ mẹo hoặc thủ thuật nào khác không? Hãy bình luận bên dưới.