Thứ ba, 05/03/2019 | 00:00 GMT+7

Cách thiết lập ứng dụng Django có thể mở rộng với database và không gian được quản lý DigitalOcean

Django là một khung công tác web mạnh mẽ có thể giúp bạn khởi động ứng dụng Python hoặc trang web của bạn một cách nhanh chóng. Nó bao gồm một số tính năng tiện lợi như trình ánh xạ quan hệ đối tượng , API Python và giao diện quản trị có thể tùy chỉnh cho ứng dụng của bạn. Nó cũng bao gồm một khuôn khổ bộ nhớ đệm và khuyến khích thiết kế ứng dụng sạch sẽ thông qua Hệ thống điều phối URLMẫu của nó .

Ngoài ra, Django bao gồm một web server tối thiểu để thử nghiệm và phát triển local , nhưng nó phải được ghép nối với cơ sở hạ tầng phục vụ mạnh mẽ hơn cho các trường hợp sử dụng production . Django thường được triển khai với web server Nginx để xử lý các yêu cầu file tĩnh và chuyển hướng HTTPS, và server Gunicorn WSGI để cung cấp ứng dụng.

Trong hướng dẫn này, ta sẽ tăng cường cài đặt này bằng cách giảm tải các file tĩnh như bảng định kiểu Javascript và CSS xuống DigitalOcean Spaces và tùy chọn phân phối chúng bằng C ontent D elivery N etwork hoặc CDN, lưu trữ các file này gần user cuối hơn để giảm thời gian truyền . Ta cũng sẽ sử dụng cơ sở dữ liệu DigitalOcean Managed PostgreSQL làm repodata của bạn để đơn giản hóa lớp dữ liệu và tránh phải cấu hình thủ công database PostgreSQL có thể mở rộng.

Yêu cầu

Trước khi bắt đầu với hướng dẫn này, bạn nên chuẩn bị sẵn những thứ sau:

Bước 1 - Cài đặt Gói từ Kho lưu trữ Ubuntu

Để bắt đầu, ta sẽ download và cài đặt tất cả các mục ta cần từ repository Ubuntu. Ta sẽ sử dụng pip quản lý gói Python để cài đặt các thành phần bổ sung sau một chút.

Trước tiên, ta cần cập nhật index gói apt local , sau đó download và cài đặt các gói.

Trong hướng dẫn này, ta sẽ sử dụng Django với Python 3 . Để cài đặt các thư viện cần thiết, hãy đăng nhập vào server của bạn và nhập:

  • sudo apt update
  • sudo apt install python3-pip python3-dev libpq-dev curl postgresql-client

Điều này sẽ cài đặt pip , các file phát triển Python cần thiết để xây dựng Gunicorn, các file tiêu đề libpq cần thiết để xây dựng bộ điều hợp Pyscopg PostgreSQL Python và ứng dụng dòng lệnh PostgreSQL.

Nhấn Y rồi nhấn ENTER khi được yêu cầu bắt đầu download và cài đặt các gói.

Tiếp theo, ta sẽ cấu hình database để hoạt động với ứng dụng Django của ta .

Bước 2 - Tạo database và user PostgreSQL

Bây giờ ta sẽ tạo một database và user database cho ứng dụng Django của ta .

Để bắt đầu, lấy Tham số kết nối cho cụm của bạn bằng cách chuyển đến Database từ Control panel cloud và nhấp vào database của bạn. Bạn sẽ thấy hộp Chi tiết kết nối chứa một số tham số cho cụm của bạn. Ghi lại những điều này.

Quay lại dòng lệnh, đăng nhập vào cụm của bạn bằng các thông tin đăng nhập này và ứng dụng client psql PostgreSQL mà ta vừa cài đặt:

  • psql -U username -h host -p port -d database -set=sslmode=require

Khi được yêu cầu , hãy nhập password được hiển thị cùng với tên user Postgres và nhấn ENTER .

Bạn sẽ nhận được một dấu nhắc PostgreSQL mà từ đó bạn có thể quản lý database .

Đầu tiên, hãy tạo một database cho dự án của bạn được gọi là polls :

  • CREATE DATABASE polls;

Lưu ý: Mọi câu lệnh Postgres phải kết thúc bằng dấu chấm phẩy, vì vậy hãy đảm bảo lệnh của bạn kết thúc bằng dấu chấm phẩy nếu bạn đang gặp sự cố.

Bây giờ ta có thể chuyển sang database polls :

  • \c polls;

Tiếp theo, tạo một user database cho dự án. Đảm bảo chọn một password an toàn:

  • CREATE USER myprojectuser WITH PASSWORD 'password';

Bây giờ ta sẽ sửa đổi một vài thông số kết nối cho user mà ta vừa tạo. Điều này sẽ tăng tốc hoạt động database để các giá trị chính xác không phải được truy vấn và đặt mỗi khi kết nối được cài đặt .

Ta đang đặt mã hóa mặc định thành UTF-8 , mà Django mong đợi. Ta cũng đang đặt schemas cách ly giao dịch mặc định thành “đọc được commit ”, ngăn chặn việc đọc từ các giao dịch không được commit . Cuối cùng, ta đang đặt múi giờ. Theo mặc định, các dự án Django của ta sẽ được đặt để sử dụng UTC . Đây là tất cả các khuyến nghị từ chính dự án Django .

Nhập các lệnh sau tại dấu nhắc PostgreSQL:

  • ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
  • ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
  • ALTER ROLE myprojectuser SET timezone TO 'UTC';

Bây giờ ta có thể cấp cho user mới quyền truy cập để quản lý database mới của ta :

  • GRANT ALL PRIVILEGES ON DATABASE polls TO myprojectuser;

Khi bạn hoàn tất, hãy thoát khỏi dấu nhắc PostgreSQL bằng lệnh :

  • \q

Ứng dụng Django của bạn hiện đã sẵn sàng để kết nối và quản lý database này.

Trong bước tiếp theo, ta sẽ cài đặt virtualenv và tạo môi trường ảo Python cho dự án Django của ta .

Bước 3 - Tạo môi trường ảo Python cho dự án của bạn

Bây giờ ta đã cài đặt database của bạn để hoạt động với ứng dụng của bạn , ta sẽ tạo một môi trường ảo Python sẽ cô lập các phụ thuộc của dự án này khỏi cài đặt Python global của hệ thống.

Để làm điều này, trước tiên ta cần truy cập vào lệnh virtualenv . Ta có thể cài đặt cái này bằng pip .

Nâng cấp pip và cài đặt gói bằng lệnh :

  • sudo -H pip3 install --upgrade pip
  • sudo -H pip3 install virtualenv

Với virtualenv được cài đặt, ta có thể tạo một folder để lưu trữ các môi trường ảo Python của bạn và tạo một folder để sử dụng với ứng dụng polls Django.

Tạo một folder có tên là envs và chuyển vào đó:

  • mkdir envs
  • cd envs

Trong folder này, hãy tạo một môi trường ảo Python được gọi là polls bằng lệnh :

  • virtualenv polls

Thao tác này sẽ tạo một folder được gọi là polls bên trong folder envs . Bên trong, nó sẽ cài đặt version local của Python và version local của pip . Ta có thể sử dụng điều này để cài đặt và cấu hình một môi trường Python riêng biệt cho dự án của bạn .

Trước khi cài đặt các yêu cầu Python của dự án, ta cần kích hoạt môi trường ảo. Bạn có thể thực hiện bằng cách gõ:

  • source polls/bin/activate

Dấu nhắc của bạn sẽ thay đổi để cho biết rằng bạn hiện đang hoạt động trong môi trường ảo Python. Nó trông giống như sau : (polls) user @ host :~/ envs $ .

Với môi trường ảo của bạn đang hoạt động, hãy cài đặt Django, Gunicorn và bộ điều hợp psycopg2 PostgreSQL với version local của pip :

Lưu ý: Khi môi trường ảo được kích hoạt (khi dấu nhắc của bạn có (polls) trước nó), hãy sử dụng pip thay vì pip3 , ngay cả khi bạn đang sử dụng Python 3. Bản sao của công cụ trong môi trường ảo luôn được đặt tên là pip , dù Python là gì version .

  • pip install django gunicorn psycopg2-binary

Đến đây bạn sẽ có tất cả phần mềm cần thiết để chạy ứng dụng polls Django. Trong bước tiếp theo, ta sẽ tạo một dự án Django và cài đặt ứng dụng này.

Bước 4 - Tạo ứng dụng Polls Django

Bây giờ ta có thể cài đặt ứng dụng mẫu của ta . Trong hướng dẫn này, ta sẽ sử dụng ứng dụng demo Polls từ tài liệu Django . Nó bao gồm một trang web công cộng cho phép user xem các cuộc thăm dò và bỏ phiếu trong đó, và một console quản trị cho phép administrator sửa đổi, tạo và xóa các cuộc thăm dò.

Trong hướng dẫn này, ta sẽ bỏ qua các bước hướng dẫn và chỉ cần sao chép ứng dụng cuối cùng từ kho cuộc thăm dò django của Cộng đồng DigitalOcean.

Nếu bạn muốn hoàn thành các bước theo cách thủ công, hãy tạo một folder có tên là django-polls trong folder chính của bạn và chuyển vào đó:

  • cd
  • mkdir django-polls
  • cd django-polls

Từ đó, bạn có thể làm theo hướng dẫn Viết ứng dụng Django đầu tiên của bạn từ tài liệu Django chính thức. Khi bạn hoàn tất, chuyển sang Bước 5 .

Nếu bạn chỉ muốn sao chép ứng dụng đã hoàn thành, hãy chuyển đến folder chính của bạn và sử dụng git để sao chép kho django-polls :

  • cd
  • git clone https://github.com/do-community/django-polls.git

cd vào đó và liệt kê nội dung folder :

  • cd django-polls
  • ls

Bạn sẽ thấy các đối tượng sau:

Output
LICENSE README.md manage.py mysite polls templates

manage.py là tiện ích dòng lệnh chính được sử dụng để thao tác ứng dụng. polls chứa mã ứng dụng pollsmysite chứa mã và cài đặt phạm vi dự án. templates chứa các file mẫu tùy chỉnh cho giao diện quản trị. Để tìm hiểu thêm về cấu trúc dự án và file , hãy tham khảo Tạo dự án từ tài liệu chính thức của Django.

Trước khi chạy ứng dụng, ta cần điều chỉnh cài đặt mặc định của nó và kết nối nó với database của ta .

Bước 5 - Điều chỉnh cài đặt ứng dụng

Trong bước này, ta sẽ sửa đổi cấu hình mặc định của dự án Django để tăng cường bảo mật, kết nối Django với database của ta và thu thập các file tĩnh vào một folder local .

Bắt đầu bằng cách mở file cài đặt trong editor của bạn:

  • nano ~/django-polls/mysite/settings.py

Bắt đầu bằng cách định vị chỉ thị ALLOWED_HOSTS . Điều này xác định danh sách các địa chỉ hoặc domain mà bạn muốn sử dụng để kết nối với version Django. Một yêu cầu đến có tiêu đề Server lưu trữ không có trong danh sách này sẽ tạo ra một ngoại lệ. Django yêu cầu bạn cài đặt điều này để ngăn chặn một lớp lỗ hổng bảo mật nhất định .

Trong dấu ngoặc vuông, liệt kê các địa chỉ IP hoặc domain được liên kết với server Django của bạn. Mỗi mục nên được liệt kê trong phần trích dẫn với các mục được phân tách bằng dấu phẩy. Danh sách của bạn cũng sẽ bao gồm localhost , vì bạn sẽ kết nối proxy thông qua version Nginx local . Nếu bạn muốn bao gồm các yêu cầu cho toàn bộ domain và bất kỳ domain phụ nào, hãy thêm một khoảng thời gian vào đầu mục nhập.

Trong đoạn mã bên dưới, có một vài ví dụ được comment minh họa những mục này trông như thế nào:

~ / django-polls / mysite / settings.py
. . .  # The simplest case: just add the domain name(s) and IP addresses of your Django server # ALLOWED_HOSTS = [ 'example.com', '203.0.113.5'] # To respond to 'example.com' and any subdomains, start the domain with a dot # ALLOWED_HOSTS = ['.example.com', '203.0.113.5'] ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . ., 'localhost']  . . .  

Tiếp theo, tìm phần của file cấu hình quyền truy cập database . Nó sẽ bắt đầu với DATABASES . Cấu hình trong file dành cho database SQLite. Ta đã tạo database PostgreSQL cho dự án của bạn , vì vậy ta cần điều chỉnh các cài đặt này.

Ta sẽ yêu cầu Django sử dụng bộ điều hợp database psycopg2 mà ta đã cài đặt bằng pip , thay vì công cụ SQLite mặc định. Ta cũng sẽ sử dụng lại các Tham số kết nối được tham chiếu trong Bước 2 . Bạn luôn có thể tìm thấy thông tin này từ phần Dịch vụdatabase của Control panel cloud DigitalOcean.

Cập nhật file với cài đặt database của bạn: tên database ( polls ), tên user database , password của user database , host database và port . Đảm bảo thay thế các giá trị dành riêng cho database bằng thông tin của bạn :

~ / django-polls / mysite / settings.py
. . .  DATABASES = {     'default': {         'ENGINE': 'django.db.backends.postgresql_psycopg2',         'NAME': 'polls',         'USER': 'myprojectuser',         'PASSWORD': 'password',         'HOST': 'managed_db_host',         'PORT': 'managed_db_port',     } }  . . . 

Tiếp theo, di chuyển xuống cuối file và thêm cài đặt cho biết vị trí các file tĩnh sẽ được đặt. Điều này là cần thiết để Nginx có thể xử lý các yêu cầu cho các mục này. Dòng sau yêu cầu Django đặt chúng vào một folder được gọi là static trong folder dự án cơ sở:

~ / django-polls / mysite / settings.py
. . .  STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static/') 

Lưu file khi bạn hoàn tất.

Đến đây, bạn đã cấu hình cài đặt database , bảo mật và file tĩnh của dự án Django. Nếu bạn đã làm theo hướng dẫn polls ngay từ đầu và không sao chép repo GitHub, bạn có thể chuyển sang Bước 6 . Nếu bạn sao chép repo GitHub, vẫn còn một bước bổ sung.

Tệp cài đặt Django chứa biến SECRET_KEY được sử dụng để tạo hàm băm cho các đối tượng Django khác nhau. Điều quan trọng là nó phải được đặt thành một giá trị duy nhất, không thể đoán trước. Biến SECRET_KEY đã được xóa khỏi repository GitHub, vì vậy ta sẽ tạo một biến mới bằng cách sử dụng một hàm được tích hợp sẵn trong gói django Python có tên get_random_secret_key() . Từ dòng lệnh, hãy mở trình thông dịch Python:

  • python

Bạn sẽ thấy kết quả và dấu nhắc sau:

Output
Python 3.6.7 (default, Oct 22 2018, 11:32:17) [GCC 8.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>>

Nhập hàm get_random_secret_key từ gói Django, sau đó gọi hàm:

  • from django.core.management.utils import get_random_secret_key
  • get_random_secret_key()

Sao chép khóa kết quả vào clipboard của bạn.

Thoát trình thông dịch Python bằng cách nhấn CTRL+D

Tiếp theo, mở lại file cài đặt trong editor của bạn:

nano ~/django-polls/mysite/settings.py 

Tìm biến SECRET_KEY và paste vào khóa bạn vừa tạo:

~ / django-polls / mysite / settings.py
. . .  # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'your_secret_key_here'  . . . 

Lưu và đóng file .

Bây giờ ta sẽ kiểm tra local ứng dụng bằng server phát triển Django đảm bảo rằng mọi thứ đã được cấu hình chính xác.

Bước 6 - Kiểm tra ứng dụng

Trước khi chạy server phát triển Django, ta cần sử dụng trình manage.py để tạo schemas database và thu thập các file tĩnh vào folder STATIC_ROOT .

Điều hướng vào folder cơ sở của dự án và tạo schemas database ban đầu trong database PostgreSQL của ta bằng cách sử dụng lệnh makemigrationsmigrate :

  • cd django-polls
  • ./manage.py makemigrations
  • ./manage.py migrate

makemigrations sẽ tạo di chuyển hoặc thay đổi schemas database , dựa trên những thay đổi được thực hiện đối với mô hình Django. migrate sẽ áp dụng các di chuyển này vào schemas database . Để tìm hiểu thêm về việc di chuyển trong Django, hãy tham khảo Migrations từ tài liệu Django chính thức.

Tạo admin-user cho dự án bằng lệnh :

  • ./manage.py createsuperuser

Bạn sẽ phải chọn tên user , cung cấp địa chỉ email, chọn và xác nhận password .

Ta có thể thu thập tất cả nội dung tĩnh vào vị trí folder mà ta đã cấu hình bằng lệnh :

  • ./manage.py collectstatic

Các file tĩnh sau đó sẽ được đặt trong một folder được gọi là static trong folder dự án của bạn.

Nếu bạn đã làm theo hướng dẫn cài đặt server ban đầu, bạn phải có firewall UFW bảo vệ server của bạn . Để kiểm tra server phát triển, ta sẽ phải cho phép truy cập vào cổng mà ta sẽ sử dụng.

Tạo một ngoại lệ cho cổng 8000 bằng lệnh :

  • sudo ufw allow 8000

Kiểm tra ứng dụng bằng Server phát triển Django

Cuối cùng, bạn có thể kiểm tra dự án của bạn bằng cách khởi động server phát triển Django bằng lệnh này:

  • ./manage.py runserver 0.0.0.0:8000

Trong trình duyệt web , hãy truy cập domain hoặc địa chỉ IP của server , sau đó là :8000 và đường dẫn polls :

  • http://server_domain_or_IP:8000/polls

Bạn sẽ thấy giao diện ứng dụng Polls:

Giao diện ứng dụng thăm dò ý kiến

Để kiểm tra giao diện quản trị, hãy truy cập domain hoặc địa chỉ IP của server của bạn, theo sau là :8000 và đường dẫn của giao diện quản trị:

  • http://server_domain_or_IP:8000/admin

Bạn sẽ thấy cửa sổ xác thực quản trị ứng dụng Polls:

Trang xác thực  administrator  thăm dò ý kiến

Nhập tên user và password quản trị mà bạn đã tạo bằng lệnh createsuperuser .

Sau khi xác thực, bạn có thể truy cập vào giao diện quản trị của ứng dụng Polls:

Giao diện chính của  administrator  thăm dò

Khi bạn khám phá xong, nhấn CTRL-C trong cửa sổ terminal để tắt server phát triển.

Kiểm tra ứng dụng bằng Gunicorn

Điều cuối cùng ta muốn làm trước khi tải các file tĩnh là kiểm tra Gunicorn đảm bảo rằng nó có thể phục vụ ứng dụng. Ta có thể làm điều này bằng lệnh folder dự án của bạn và sử dụng gunicorn để tải module WSGI của dự án:

  • gunicorn --bind 0.0.0.0:8000 mysite.wsgi

Thao tác này sẽ khởi động Gunicorn trên cùng giao diện mà server phát triển Django đang chạy. Bạn có thể quay lại và kiểm tra lại ứng dụng.

Lưu ý: Giao diện quản trị sẽ không có bất kỳ kiểu nào được áp dụng vì Gunicorn không biết cách tìm nội dung CSS tĩnh chịu trách nhiệm cho việc này.

Ta đã chuyển cho Gunicorn một module bằng cách chỉ định đường dẫn folder tương đối đến file wsgi.py của Django, điểm vào ứng dụng của ta ,. Tệp này định nghĩa một chức năng được gọi là application , chức năng này giao tiếp với ứng dụng. Để tìm hiểu thêm về đặc điểm kỹ thuật WSGI, hãy nhấp vào đây .

Khi bạn kiểm tra xong, nhấn CTRL-C trong cửa sổ dòng lệnh để dừng Gunicorn.

Bây giờ ta sẽ giảm tải các file tĩnh của ứng dụng xuống DigitalOcean Spaces.

Bước 7 - Tải các file tĩnh lên DigitalOcean

Đến đây, Gunicorn có thể phục vụ ứng dụng Django của ta chứ không phải các file tĩnh của nó. Thông thường, ta sẽ cấu hình Nginx để phân phát các file này, nhưng trong hướng dẫn này, ta sẽ tải chúng xuống DigitalOcean Spaces bằng cách sử dụng plugin django-storages . Điều này cho phép bạn dễ dàng mở rộng Django bằng cách tập trung nội dung tĩnh của nó và giải phóng tài nguyên server . Ngoài ra, bạn có thể phân phối nội dung tĩnh này bằng CDN DigitalOcean Spaces.

Để có hướng dẫn đầy đủ về cách tải các file tĩnh Django sang Lưu trữ đối tượng, hãy tham khảoCách cài đặt Lưu trữ đối tượng với Django .

Cài đặt và cấu hình django-storages

Ta sẽ bắt đầu bằng cách cài đặt gói Python django-storages . Gói django-storages cung cấp cho Django phần backend lưu trữ S3Boto3Storage sử dụng thư viện boto3 để tải file lên bất kỳ dịch vụ lưu trữ đối tượng nào tương thích với S3.

Để bắt đầu, hãy cài đặt các gói django-storagesboto3 Python bằng cách sử dụng pip :

  • pip install django-storages boto3

Tiếp theo, mở lại file cài đặt Django của ứng dụng:

  • nano ~/django-polls/mysite/settings.py

Điều hướng xuống phần INSTALLED_APPS của file và thêm các storages vào danh sách các ứng dụng đã cài đặt:

~ / django-polls / mysite / settings.py
. . .  INSTALLED_APPS = [     . . .     'django.contrib.staticfiles',     'storages', ]  . . . 

Cuộn thêm file xuống STATIC_URL mà ta đã sửa đổi trước đó. Bây giờ ta sẽ overrides các giá trị này và thêm các tham số backend S3Boto3Storage mới. Xóa mã bạn đã nhập trước đó và thêm các khối sau, bao gồm thông tin truy cập và vị trí cho Không gian của bạn. Hãy nhớ thay thế các giá trị được đánh dấu ở đây bằng thông tin của bạn ::

~ / django-polls / mysite / settings.py
. . .  # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.1/howto/static-files/  AWS_ACCESS_KEY_ID = 'your_spaces_access_key' AWS_SECRET_ACCESS_KEY = 'your_spaces_secret_key'  AWS_STORAGE_BUCKET_NAME = 'your_space_name' AWS_S3_ENDPOINT_URL = 'spaces_endpoint_URL' AWS_S3_OBJECT_PARAMETERS = {     'CacheControl': 'max-age=86400', } AWS_LOCATION = 'static' AWS_DEFAULT_ACL = 'public-read'  STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'  STATIC_URL = '{}/{}/'.format(AWS_S3_ENDPOINT_URL, AWS_LOCATION) STATIC_ROOT = 'static/' 

Ta xác định các mục cấu hình sau:

  • AWS_ACCESS_KEY_ID : ID Khóa truy cập cho Không gian mà bạn đã tạo trong yêu cầu của hướng dẫn. Nếu bạn chưa tạo một bộ Khóa truy cập, hãy tham khảo Chia sẻ quyền truy cập vào không gian bằng Khóa truy cập .
  • AWS_SECRET_ACCESS_KEY : Khóa bí mật cho DigitalOcean .
  • AWS_STORAGE_BUCKET_NAME : Tên DigitalOcean của bạn.
  • AWS_S3_ENDPOINT_URL : URL điểm cuối được sử dụng để truy cập dịch vụ lưu trữ đối tượng. Đối với DigitalOcean, đây sẽ là một cái gì đó giống như https://nyc3.digitaloceanspaces.com tùy thuộc vào khu vực Không gian.
  • AWS_S3_OBJECT_PARAMETERS Đặt tiêu đề kiểm soát cache trên các file tĩnh.
  • AWS_LOCATION : Xác định một folder trong group lưu trữ đối tượng, nơi tất cả các file tĩnh sẽ được đặt.
  • AWS_DEFAULT_ACL : Xác định danh sách kiểm soát truy cập (ACL) cho các file tĩnh. Đặt nó ở public-read đảm bảo user cuối có thể truy cập các file .
  • STATICFILES_STORAGE : Đặt phần backend lưu trữ mà Django sẽ sử dụng để giảm tải các file tĩnh. Phần backend này sẽ hoạt động với bất kỳ phần backend nào tương thích với S3, bao gồm cả DigitalOcean Spaces.
  • STATIC_URL : Chỉ định URL cơ sở mà Django nên sử dụng khi tạo URL cho các file tĩnh. Ở đây, ta kết hợp URL điểm cuối và folder con file tĩnh để tạo URL cơ sở cho file tĩnh.
  • STATIC_ROOT : Chỉ định nơi thu thập các file tĩnh local trước khi sao chép chúng vào bộ nhớ đối tượng.

Lưu file khi bạn chỉnh sửa xong.

Từ bây giờ, khi bạn chạy collectstatic , Django sẽ tải các file tĩnh của ứng dụng của bạn lên Không gian. Khi bạn khởi động Django, nó sẽ bắt đầu phân phát các nội dung tĩnh như CSS và Javascript từ Không gian này.

Trong phần tiếp theo, ta sẽ bật CDN cho Không gian này và tùy chọn cấu hình domain phụ tùy chỉnh cho CDN của Không gian. Điều này sẽ tăng tốc độ phân phối các file tĩnh của dự án Django của bạn bằng cách lưu chúng vào bộ nhớ đệm trên một mạng server biên được phân phối theo địa lý. Để tìm hiểu thêm về CDN, hãy tham khảo Sử dụng CDN để tăng tốc độ phân phối nội dung tĩnh . Nếu bạn không muốn bật CDN Spaces, hãy chuyển sang phần Định cấu hình tiêu đề CORS .

Bật CDN (Tùy chọn)

Để kích hoạt phân phối file tĩnh qua CDN DigitalOcean Spaces, hãy bắt đầu bằng cách bật CDN cho DigitalOcean Space của bạn. Để tìm hiểu cách thực hiện việc này, hãy tham khảo Cách bật CDN Spaces từ tài liệu sản phẩm DigitalOcean.

Nếu bạn muốn sử dụng miền tùy chỉnh với Spaces CDN, hãy tạo bản ghi CNAME domain phụ và certificate SSL thích hợp theo Cách tùy chỉnh Điểm cuối CDN của Spaces với domain phụ .

Bạn rất nên sử dụng domain tùy chỉnh với Spaces CDN. Điều này sẽ cải thiện đáng kể Tối ưu hóa Công cụ Tìm kiếm (SEO) cho trang web bằng cách giữ cho các URL nội dung giảm tải của bạn tương tự như các URL của trang web Django của bạn. Để sử dụng domain tùy chỉnh với Spaces CDN, bạn cần đảm bảo trước tiên bạn thêm domain vào account DigitalOcean của bạn . Để tìm hiểu cách thực hiện việc này, hãy tham khảo Cách thêm domain .

Sau khi bạn đã bật CDN cho Không gian của bạn và tùy chọn tạo domain phụ tùy chỉnh cho nó, hãy chuyển đến Không gian của bạn bằng Control panel cloud . Bạn sẽ thấy một liên kết Điểm cuối mới dưới tên Không gian của bạn :

Danh sách các điểm cuối không gian

Các điểm cuối này phải chứa tên Space của bạn.Nếu bạn đã tạo một domain phụ tùy chỉnh cho Spaces CDN, danh sách này sẽ chứa một điểm cuối bổ sung được gọi là Subdomain .

Điểm cuối Edge định tuyến các yêu cầu cho các đối tượng Spaces thông qua CDN, phục vụ chúng từ bộ nhớ đệm cạnh càng nhiều càng tốt. Lưu ý điểm cuối Edge này, vì ta sẽ sử dụng nó để cấu hình plugin django-storages . Nếu bạn đã tạo domain phụ cho Spaces CDN, thì điểm cuối Tên domain phụ là alias cho điểm cuối Edge này.

Tiếp theo, chỉnh sửa lại file cài đặt Django của ứng dụng của bạn:

  • nano ~/django-polls/mysite/settings.py

Điều hướng xuống phần Tệp tĩnh mà ta đã sửa đổi gần đây. Thêm thông số AWS_S3_CUSTOM_DOMAIN để cấu hình điểm cuối CDN của plugin django-storages và cập nhật thông số STATIC_URL để sử dụng điểm cuối CDN mới này:

~ / django-polls / mysite / settings.py
. . .  # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.1/howto/static-files/  # Moving static assets to DigitalOcean Spaces as per: # /cach-thiet-lap-luu-tru-doi-tuong-voi-django.2249.anews AWS_ACCESS_KEY_ID = 'your_spaces_access_key' AWS_SECRET_ACCESS_KEY = 'your_spaces_secret_key'  AWS_STORAGE_BUCKET_NAME = 'your_space_name' AWS_S3_ENDPOINT_URL = 'spaces_endpoint_URL' AWS_S3_CUSTOM_DOMAIN = 'spaces_edge_endpoint_URL' AWS_S3_OBJECT_PARAMETERS = {     'CacheControl': 'max-age=86400', } AWS_LOCATION = 'static' AWS_DEFAULT_ACL = 'public-read'  STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'  STATIC_URL = '{}/{}/'.format(AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION) STATIC_ROOT = 'static/' 

Tại đây, hãy thay thế khoảng spaces_edge_endpoint_URL bằng điểm cuối Edge mà bạn vừa ghi chú xuống, cắt bớt tiền tố https:// . Ví dụ: nếu URL điểm cuối Edge là https:// example.sfo2 .cdn.digitaloceanspaces.com , AWS_S3_CUSTOM_DOMAIN phải được đặt thành example.sfo2 .cdn.digitaloceanspaces.com .

Nếu bạn đã tạo một domain phụ tùy chỉnh, hãy thay thế spaces_edge_endpoint_URL bằng điểm cuối của domain phụ tùy chỉnh, cắt bớt tiền tố https:// . Ví dụ, nếu URL endpoint subdomain là https:// assets .example.com , AWS_S3_CUSTOM_DOMAIN nên được đặt thành assets .example.com .

Khi bạn hoàn tất, hãy lưu file .

Khi bạn khởi động Django, bây giờ nó sẽ phân phát nội dung tĩnh bằng CDN cho DigitalOcean của bạn.

Trước khi ta kiểm tra đảm bảo rằng tất cả điều này đều hoạt động chính xác, ta cần cấu hình tiêu đề Chia sẻ tài nguyên chéo (CORS) cho các file Spaces của ta hoặc quyền truy cập vào một số nội dung tĩnh nhất định có thể bị trình duyệt web từ chối. Nếu bạn đang sử dụng domain phụ tùy chỉnh với Spaces CDN cho cùng một domain mà Django sử dụng, bạn có thể chuyển sang phần Kiểm tra Phân phối Tệp Tĩnh của Spaces .

Cấu hình tiêu đề CORS

Các tiêu đề CORS cho trình duyệt web biết rằng một ứng dụng chạy tại một domain có thể truy cập các tập lệnh hoặc tài nguyên ở domain khác. Trong trường hợp này, ta cần cho phép chia sẻ tài nguyên nguồn root chéo cho domain của server Django của ta để các yêu cầu về file tĩnh trong Space không bị trình duyệt web từ chối.

Lưu ý: Bước này chỉ cần thiết nếu bạn không sử dụng domain phụ tùy chỉnh với Spaces CDN.

Để bắt đầu, hãy chuyển đến trang Cài đặt trong Không gian của bạn bằng Control panel cloud :

Ảnh chụp màn hình   b Cài đặt

Trong phần Cấu hình CORS , nhấp vào Thêm .

CORS cài đặt nâng cao

Tại đây, trong Nguồn root , hãy nhập nguồn root ký tự đại diện, *

Cảnh báo: Khi bạn triển khai ứng dụng của bạn vào version production , hãy đảm bảo thay đổi giá trị này thành domain root chính xác của bạn (bao gồm cả giao thức http:// hoặc https:// ). Để điều này làm nguồn root ký tự đại diện là không an toàn và ta thực hiện việc này ở đây chỉ cho mục đích thử nghiệm vì việc đặt nguồn root thành http://example.com:8000 (sử dụng cổng không chuẩn) hiện không được hỗ trợ.

Trong Phương thức được phép , hãy chọn NHẬN .

Bấm vào Thêm tiêu đề và trong hộp văn bản xuất hiện, nhập Access-Control-Allow-Origin .

Đặt Access Control Max Age thành 600 để tiêu đề ta vừa tạo hết hạn sau mỗi 10 phút.

Bấm Lưu Tùy chọn .

Từ bây giờ, các đối tượng trong Không gian của bạn sẽ chứa các tiêu đề phản hồi Access-Control-Allow-Origin thích hợp, cho phép các trình duyệt web an toàn hiện đại tìm nạp các file này trên các domain .

Kiểm tra phân phối file tĩnh trong Spaces

Bây giờ ta sẽ kiểm tra xem Django có đang phân phát chính xác các file tĩnh từ DigitalOcean của ta hay không.

Điều hướng đến folder ứng dụng Django của bạn:

  • cd ~/django-polls

Từ đây, hãy chạy collectstatic để thu thập và tải các file tĩnh lên DigitalOcean của bạn:

  • python manage.py collectstatic

Bạn sẽ thấy kết quả sau:

Output
You have requested to collect static files at the destination location as specified in your settings. This will overwrite existing files! Are you sure you want to do this? Type 'yes' to continue, or 'no' to cancel:

Nhập yes và nhấn ENTER để xác nhận.

Sau đó, bạn sẽ thấy kết quả như sau

Output
121 static files copied.

Điều này xác nhận Django đã tải thành công các file tĩnh của ứng dụng polls lên Không gian của bạn. Bạn có thể chuyển đến Không gian của bạn bằng Control panel cloud và kiểm tra các file trong folder static .

Tiếp theo, ta sẽ xác minh Django đang viết lại các URL thích hợp.

Khởi động server Gunicorn:

  • gunicorn --bind 0.0.0.0:8000 mysite.wsgi

Trong trình duyệt web , hãy truy cập vào domain hoặc địa chỉ IP của server , theo sau là :8000/admin :

http://server_domain_or_IP:8000/admin 

, bạn sẽ thấy cửa sổ xác thực quản trị ứng dụng Polls, lần này với kiểu chính xác.

Bây giờ, hãy sử dụng các công cụ dành cho nhà phát triển của trình duyệt để kiểm tra nội dung trang và tiết lộ vị trí lưu trữ file nguồn.

Để thực hiện việc này bằng Google Chrome, hãy nhấp chuột phải vào trang và chọn Kiểm tra .

Bạn sẽ thấy cửa sổ sau:

Cửa sổ công cụ dành cho nhà phát triển của Chrome

Từ đây, nhấp vào Nguồn trên thanh công cụ. Trong danh sách các file nguồn ở ngăn bên trái, bạn sẽ thấy /admin/login trong domain của server Django và static/admin dưới điểm cuối CDN của Space của bạn. Trong static/admin , bạn sẽ thấy cả folder cssfonts .

Điều này xác nhận các bảng định kiểu và phông chữ CSS đang được phân phối chính xác từ CDN của Space của bạn.

Khi bạn kiểm tra xong, nhấn CTRL-C trong cửa sổ dòng lệnh để dừng Gunicorn.

Bạn có thể vô hiệu hóa môi trường ảo Python đang hoạt động của bạn bằng lệnh deactivate :

  • deactivate

Dấu nhắc của bạn sẽ trở lại bình thường.

Đến đây, bạn đã download thành công các file tĩnh từ server Django của bạn và đang phân phát chúng từ bộ nhớ đối tượng. Bây giờ ta có thể chuyển sang cấu hình Gunicorn để khởi động tự động như một dịch vụ hệ thống.

Bước 8 - Tạo socket systemd và file dịch vụ cho Gunicorn

Trong Bước 6, ta đã kiểm tra rằng Gunicorn có thể tương tác với ứng dụng Django của ta , nhưng ta nên triển khai một cách khởi động và dừng server ứng dụng mạnh mẽ hơn. Để thực hiện điều này, ta sẽ tạo dịch vụ systemd và các file socket.

Ổ cắm Gunicorn sẽ được tạo khi khởi động và sẽ lắng nghe các kết nối. Khi kết nối xảy ra, systemd sẽ tự động bắt đầu quy trình Gunicorn để xử lý kết nối.

Bắt đầu bằng cách tạo và mở file socket systemd cho Gunicorn với các quyền sudo :

  • sudo nano /etc/systemd/system/gunicorn.socket

Bên trong, ta sẽ tạo một phần [Unit] để mô tả socket , một phần [Socket] để xác định vị trí socket và một phần [Install] đảm bảo socket được tạo vào đúng thời điểm. Thêm mã sau vào file :

/etc/systemd/system/gunicorn.socket
[Unit] Description=gunicorn socket  [Socket] ListenStream=/run/gunicorn.sock  [Install] WantedBy=sockets.target 

Lưu file khi bạn hoàn tất.

Tiếp theo, tạo và mở file dịch vụ systemd cho Gunicorn với các quyền sudo trong editor của bạn. Tên file dịch vụ phải trùng với tên file socket ngoại trừ phần mở rộng:

  • sudo nano /etc/systemd/system/gunicorn.service

Bắt đầu với phần [Unit] , phần này chỉ định metadata và phần phụ thuộc. Ta sẽ đặt mô tả về dịch vụ của bạn ở đây và yêu cầu hệ thống init chỉ bắt đầu điều này sau khi đã đạt được mục tiêu mạng. Bởi vì dịch vụ của ta dựa vào socket từ file socket, ta cần bao gồm chỉ thị Requires để chỉ ra mối quan hệ đó:

/etc/systemd/system/gunicorn.service
[Unit] Description=gunicorn daemon Requires=gunicorn.socket After=network.target 

Tiếp theo, ta sẽ mở phần [Service] . Ta sẽ chỉ định user và group mà ta muốn xử lý để chạy. Ta sẽ cấp cho account regular user quyền sở hữu quy trình vì nó sở hữu tất cả các file có liên quan. Ta sẽ cấp quyền sở hữu group cho www-data group để Nginx có thể giao tiếp dễ dàng với Gunicorn.

Sau đó, ta sẽ vạch ra folder làm việc và chỉ định lệnh sử dụng để bắt đầu dịch vụ. Trong trường hợp này, ta sẽ phải chỉ định đường dẫn đầy đủ đến file thực thi Gunicorn, được cài đặt trong môi trường ảo của ta . Ta sẽ liên kết quy trình với socket Unix mà ta đã tạo trong folder /run để quy trình có thể giao tiếp với Nginx. Ta ghi lại tất cả dữ liệu vào kết quả chuẩn để quá trình journald có thể thu thập log Gunicorn. Ta cũng có thể chỉ định bất kỳ chỉnh sửa Gunicorn tùy chọn nào tại đây, chẳng hạn như số lượng quy trình của worker. Ở đây, ta chạy Gunicorn với 3 quy trình công nhân.

Thêm phần Dịch vụ sau vào file . Đảm bảo thay thế tên user được liệt kê ở đây bằng tên user của bạn :

/etc/systemd/system/gunicorn.service
[Unit] Description=gunicorn daemon Requires=gunicorn.socket After=network.target  [Service] User=sammy Group=www-data WorkingDirectory=/home/sammy/django-polls ExecStart=/home/sammy/envs/polls/bin/gunicorn \           --access-logfile - \           --workers 3 \           --bind unix:/run/gunicorn.sock \           mysite.wsgi:application 

Cuối cùng, ta sẽ thêm phần [Install] . Điều này sẽ cho systemd biết những gì để liên kết dịch vụ này nếu ta cho phép nó khởi động khi server khởi động . Ta muốn dịch vụ này bắt đầu khi hệ thống nhiều regular user được cài đặt và chạy:

/etc/systemd/system/gunicorn.service
[Unit] Description=gunicorn daemon Requires=gunicorn.socket After=network.target  [Service] User=sammy Group=www-data WorkingDirectory=/home/sammy/django-polls ExecStart=/home/sammy/envs/polls/bin/gunicorn \           --access-logfile - \           --workers 3 \           --bind unix:/run/gunicorn.sock \           mysite.wsgi:application  [Install] WantedBy=multi-user.target 

Như vậy, file dịch vụ systemd của ta đã hoàn tất. Lưu và đóng nó ngay bây giờ.

Bây giờ ta có thể khởi động và kích hoạt socket Gunicorn. Thao tác này sẽ tạo file socket tại /run/gunicorn.sock ngay bây giờ và khi khởi động. Khi kết nối được thực hiện với socket đó, systemd sẽ tự động khởi động gunicorn.service để xử lý nó:

  • sudo systemctl start gunicorn.socket
  • sudo systemctl enable gunicorn.socket

Ta có thể xác nhận thao tác đã thành công bằng cách kiểm tra file socket.

Kiểm tra file socket Gunicorn

Kiểm tra trạng thái của quá trình để tìm hiểu xem nó có bắt đầu thành công hay không:

  • sudo systemctl status gunicorn.socket

Bạn sẽ thấy kết quả sau:

Output
Failed to dump process list, ignoring: No such file or directory ● gunicorn.socket - gunicorn socket Loaded: loaded (/etc/systemd/system/gunicorn.socket; enabled; vendor preset: enabled) Active: active (running) since Tue 2019-03-05 19:19:16 UTC; 1h 22min ago Listen: /run/gunicorn.sock (Stream) CGroup: /system.slice/gunicorn.socket Mar 05 19:19:16 django systemd[1]: Listening on gunicorn socket.

Tiếp theo, kiểm tra sự tồn tại của file gunicorn.sock trong folder /run :

  • file /run/gunicorn.sock
Output
/run/gunicorn.sock: socket

Nếu lệnh systemctl status cho biết đã xảy ra lỗi hoặc nếu bạn không tìm thấy file gunicorn.sock trong folder , thì đó là dấu hiệu cho thấy socket Gunicorn không được tạo đúng cách. Kiểm tra log của socket Gunicorn bằng lệnh :

  • sudo journalctl -u gunicorn.socket

Hãy xem lại file /etc/systemd/system/gunicorn.socket của bạn để khắc phục mọi sự cố trước khi tiếp tục.

Kiểm tra kích hoạt socket

Hiện tại, nếu bạn chỉ khởi động đơn vị gunicorn.socket , thì gunicorn.service sẽ không hoạt động, vì socket chưa nhận được bất kỳ kết nối nào. Bạn có thể kiểm tra bằng lệnh :

  • sudo systemctl status gunicorn
Output
● gunicorn.service - gunicorn daemon Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled) Active: inactive (dead)

Để kiểm tra cơ chế kích hoạt socket , ta có thể gửi kết nối đến socket thông qua curl bằng lệnh :

  • curl --unix-socket /run/gunicorn.sock localhost

Bạn sẽ thấy kết quả HTML từ ứng dụng của bạn trong terminal . Điều này cho thấy rằng Gunicorn đã bắt đầu và có thể phục vụ ứng dụng Django của bạn. Bạn có thể xác minh dịch vụ Gunicorn đang chạy bằng lệnh :

  • sudo systemctl status gunicorn
Output
● gunicorn.service - gunicorn daemon Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled) Active: active (running) since Tue 2019-03-05 20:43:56 UTC; 1s ago Main PID: 19074 (gunicorn) Tasks: 4 (limit: 4915) CGroup: /system.slice/gunicorn.service ├─19074 /home/sammy/envs/polls/bin/python3 /home/sammy/envs/polls/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock mysite.wsgi:application ├─19098 /home/sammy/envs/polls/bin/python3 /home/sammy/envs/polls/bin/gunicorn . . . Mar 05 20:43:56 django systemd[1]: Started gunicorn daemon. Mar 05 20:43:56 django gunicorn[19074]: [2019-03-05 20:43:56 +0000] [19074] [INFO] Starting gunicorn 19.9.0 . . . Mar 05 20:44:15 django gunicorn[19074]: - - [05/Mar/2019:20:44:15 +0000] "GET / HTTP/1.1" 301 0 "-" "curl/7.58.0"

Nếu kết quả từ curl hoặc kết quả của systemctl status cho biết sự cố đã xảy ra, hãy kiểm tra log để biết thêm chi tiết:

  • sudo journalctl -u gunicorn

Bạn cũng có thể kiểm tra file /etc/systemd/system/gunicorn.service của bạn để tìm các sự cố. Nếu bạn áp dụng các thay đổi đối với file này, hãy nhớ reload daemon để đọc lại định nghĩa dịch vụ và khởi động lại quy trình Gunicorn:

  • sudo systemctl daemon-reload
  • sudo systemctl restart gunicorn

Đảm bảo rằng bạn khắc phục sự cố trước khi tiếp tục cấu hình server Nginx.

Bước 8 - Cấu hình Nginx HTTPS và Gunicorn Proxy Passing

Như vậy, Gunicorn đã được cài đặt theo cách mạnh mẽ hơn, ta cần cấu hình Nginx để mã hóa các kết nối và chuyển lưu lượng truy cập vào quy trình Gunicorn.

Nếu bạn đã tuân theo các yêu cầu và cài đặt Nginx với Let's Encrypt, bạn sẽ có sẵn một file khối server tương ứng với domain của bạn trong folder sites-available của Nginx. Nếu không, hãy làm theo Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 18.04 và quay lại bước này.

Trước khi ta chỉnh sửa file khối server example.com này, trước tiên ta sẽ xóa file khối server default được triển khai theo mặc định sau khi cài đặt Nginx:

  • sudo rm /etc/nginx/sites-enabled/default

Bây giờ ta sẽ sửa đổi file khối server example.com để chuyển lưu lượng truy cập đến Gunicorn thay vì trang index.html mặc định được cấu hình trong bước yêu cầu .

Mở file khối server tương ứng với domain của bạn trong editor :

  • sudo nano /etc/nginx/sites-available/example.com

Bạn sẽ thấy thông tin như sau:

/etc/nginx/sites-available/example.com
server {          root /var/www/example.com/html;         index index.html index.htm index.nginx-debian.html;          server_name example.com www.example.com;          location / {                 try_files $uri $uri/ =404;         }      listen [::]:443 ssl ipv6only=on; # managed by Certbot     listen 443 ssl; # managed by Certbot     ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot     ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot     include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot     ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot  }  server {     if ($host = example.com) {         return 301 https://$host$request_uri;     } # managed by Certbot           listen 80;         listen [::]:80;          server_name example.com www.example.com;     return 404; # managed by Certbot   } 

Đây là sự kết hợp của file khối server mặc định được tạo trong Cách cài đặt Nginx trên Ubuntu 18.04 cũng như các phần bổ sung được Let's Encrypt tự động thêm vào. Ta sẽ xóa nội dung của file này và viết một cấu hình mới chuyển hướng truy cập HTTP đến HTTPS và chuyển tiếp các yêu cầu đến socket Gunicorn mà ta đã tạo ở bước trước.

Nếu muốn, bạn có thể backup file này bằng cp . Thoát editor của bạn và tạo một bản backup có tên example.com.old :

  • sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/example.com.old

Bây giờ, mở lại file và xóa nội dung của nó. Ta sẽ xây dựng đoạn cấu hình mới theo từng khối.

Bắt đầu bằng cách paste vào khối sau, khối này sẽ chuyển hướng các yêu cầu HTTP ở cổng 80 sang HTTPS:

/etc/nginx/sites-available/example.com
server {     listen 80 default_server;     listen [::]:80 default_server;     server_name _;     return 301 https://example.com$request_uri; } 

Ở đây ta lắng nghe các yêu cầu HTTP IPv4 và IPv6 trên cổng 80 và gửi tiêu đề phản hồi 301 để chuyển hướng yêu cầu đến cổng HTTPS 443 bằng domain example.com . Điều này cũng sẽ chuyển hướng các yêu cầu HTTP trực tiếp đến địa chỉ IP của server .

Sau khối này, hãy thêm khối mã cấu hình sau để xử lý các yêu cầu HTTPS cho domain example.com :

/etc/nginx/sites-available/example.com
. . .  server {     listen [::]:443 ssl ipv6only=on;     listen 443 ssl;     server_name example.com www.example.com;      # Let's Encrypt parameters     ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;     ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;     include /etc/letsencrypt/options-ssl-nginx.conf;     ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;      location = /favicon.ico { access_log off; log_not_found off; }      location / {         proxy_pass         http://unix:/run/gunicorn.sock;         proxy_redirect     off;          proxy_set_header   Host              $http_host;         proxy_set_header   X-Real-IP         $remote_addr;         proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;         proxy_set_header   X-Forwarded-Proto https;     } } 

Ở đây, trước tiên ta lắng nghe trên cổng 443 để biết các yêu cầu truy cập example.comwww. example.com domain www. example.com .

Tiếp theo, ta cung cấp cấu hình Let's Encrypt tương tự có trong file khối server mặc định, chỉ định vị trí của certificate SSL và private key , cũng như một số thông số bảo mật bổ sung.

Dòng location = /favicon.ico hướng dẫn Nginx bỏ qua mọi vấn đề khi tìm biểu tượng yêu thích.

Vị location = / cuối cùng location = / block hướng dẫn Nginx xử lý các yêu cầu tới socket Gunicorn được cấu hình ở Bước 8 . Ngoài ra, nó thêm các tiêu đề để thông báo cho server Django ngược dòng rằng một yêu cầu đã được chuyển tiếp và cung cấp cho nó các thuộc tính yêu cầu khác nhau.

Sau khi bạn đã paste vào hai đoạn cấu hình đó, file cuối cùng sẽ trông giống như sau:

/etc/nginx/sites-available/example.com
server {     listen 80 default_server;     listen [::]:80 default_server;     server_name _;     return 301 https://example.com$request_uri; } server {         listen [::]:443 ssl ipv6only=on;         listen 443 ssl;         server_name example.com www.example.com;          # Let's Encrypt parameters         ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;         ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;         include /etc/letsencrypt/options-ssl-nginx.conf;         ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;          location = /favicon.ico { access_log off; log_not_found off; }          location / {           proxy_pass         http://unix:/run/gunicorn.sock;           proxy_redirect     off;            proxy_set_header   Host              $http_host;           proxy_set_header   X-Real-IP         $remote_addr;           proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;           proxy_set_header   X-Forwarded-Proto https;         } } 

Lưu file khi bạn hoàn tất.

Kiểm tra cấu hình Nginx của bạn để tìm lỗi cú pháp bằng lệnh :

  • sudo nginx -t

Nếu cấu hình của bạn không có lỗi, hãy khởi động lại Nginx bằng lệnh :

  • sudo systemctl restart nginx

Đến đây bạn có thể truy cập domain hoặc địa chỉ IP của server để xem ứng dụng của bạn . Trình duyệt của bạn phải sử dụng kết nối HTTPS an toàn để kết nối với phần backend Django.

Để bảo mật hoàn toàn dự án Django của ta , ta cần thêm một vài tham số bảo mật vào file settings.py của nó. Mở lại file này trong editor :

  • nano ~/django-polls/mysite/settings.py

Cuộn xuống cuối file và thêm các thông số sau:

~ / django-polls / mysite / settings.py
. . .  SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True SECURE_SSL_REDIRECT = True 

Các cài đặt này cho Django biết rằng bạn đã bật HTTPS trên server của bạn và hướng dẫn nó sử dụng cookie "an toàn". Để tìm hiểu thêm về các cài đặt này, hãy tham khảo phần SSL / HTTPS của Bảo mật trong Django .

Khi bạn hoàn tất, hãy lưu file .

Cuối cùng, khởi động lại Gunicorn:

  • sudo systemctl restart gunicorn

Đến đây, bạn đã cấu hình Nginx để chuyển hướng các yêu cầu HTTP và chuyển các yêu cầu này cho Gunicorn. HTTPS bây giờ sẽ được bật đầy đủ cho dự án và ứng dụng Django của bạn. Nếu bạn đang gặp lỗi, cuộc thảo luận về cách khắc phục sự cố Nginx và Gunicorn này có thể hữu ích.

Cảnh báo: Nếu bạn không cấu hình domain phụ tùy chỉnh cho CDN Spaces, như đã nêu trong Định cấu hình tiêu đề CORS , hãy đảm bảo thay đổi Nguồn root từ domain ký tự đại diện * domain của bạn ( https://example.com trong hướng dẫn này) trước khi thực hiện user cuối có thể truy cập ứng dụng của bạn.

Kết luận

Trong hướng dẫn này, bạn cài đặt và cấu hình ứng dụng Django có thể mở rộng chạy trên server Ubuntu 18.04. Cài đặt này có thể được sao chép trên nhiều server để tạo ra một kiến trúc có tính khả dụng cao. Hơn nữa, ứng dụng này và cấu hình của nó có thể được chứa bằng Docker hoặc thời gian chạy containers khác để dễ dàng triển khai và mở rộng. Những containers này sau đó có thể được triển khai thành một cụm containers như Kubernetes . Trong loạt bài Hướng dẫn sắp tới, ta sẽ khám phá cách chứa và hiện đại hóa ứng dụng polls Django này để nó có thể chạy trong một cụm Kubernetes.

Ngoài các file tĩnh, bạn cũng có thể cần tải các file Django Media của bạn vào bộ nhớ đối tượng. Để tìm hiểu cách thực hiện việc này, hãy tham khảo Sử dụng Amazon S3 để Lưu trữ các file Phương tiện và Tĩnh trên Trang web Django của bạn . Bạn cũng có thể cân nhắc việc nén các file tĩnh để tối ưu hóa hơn nữa việc phân phối chúng đến user cuối. Để làm điều này, bạn có thể sử dụng plugin Django như máy nén Django .


Tags:

Các tin trước