Giới thiệu

Django là một khung công tác web mạnh mẽ có thể giúp bạn lấy ứng dụng hoặc trang web Python của bạn khỏi mặt đất. Django bao gồm một máy chủ phát triển đơn giản để thử nghiệm mã của bạn cục bộ, nhưng đối với bất cứ điều gì thậm chí hơi liên quan đến sản xuất, một máy chủ web an toàn hơn và mạnh mẽ là bắt buộc.

Trong hướng dẫn này, chúng tôi sẽ trình bày cách cài đặt và cấu hình một số thành phần trên Debian 8 để hỗ trợ và phục vụ các ứng dụng Django. Chúng tôi sẽ thiết lập một cơ sở dữ liệu PostgreSQL thay vì sử dụng cơ sở dữ liệu SQLite mặc định. Chúng tôi sẽ cấu hình máy chủ ứng dụng Gunicorn để giao tiếp với các ứng dụng của chúng tôi. Sau đó, chúng tôi sẽ thiết lập Nginx để đảo ngược proxy cho Gunicorn, cho phép chúng tôi truy cập các tính năng bảo mật và hiệu suất để phục vụ các ứng dụng của chúng tôi.

Điều kiện tiên quyết và Mục tiêu

Để hoàn tất hướng dẫn này, bạn nên có một cá thể máy chủ Debian 8 mới với một người dùng không phải root với sudo đặc quyền được định cấu hình. Bạn có thể tìm hiểu cách thiết lập điều này bằng cách chạy qua hướng dẫn thiết lập máy chủ ban đầu.

Chúng tôi sẽ cài đặt Django trong một môi trường ảo. Cài đặt Django vào một môi trường cụ thể cho dự án của bạn sẽ cho phép các dự án của bạn và yêu cầu của họ được xử lý riêng biệt.

Khi chúng ta có cơ sở dữ liệu và ứng dụng của chúng ta đang chạy và chạy, chúng ta sẽ cài đặt và cấu hình máy chủ ứng dụng Gunicorn. Điều này sẽ phục vụ như một giao diện cho ứng dụng của chúng tôi, dịch các yêu cầu của máy khách trong các cuộc gọi HTTP sang Python mà ứng dụng của chúng ta có thể xử lý. Sau đó chúng tôi sẽ thiết lập Nginx trước Gunicorn để tận dụng lợi thế của các cơ chế xử lý kết nối hiệu năng cao và các tính năng bảo mật dễ thực hiện của nó.

Băt đâu nao.

Cài đặt các gói từ kho Debian

Để bắt đầu quá trình, chúng tôi sẽ tải xuống và cài đặt tất cả các mục chúng tôi cần từ kho lưu trữ Debian. Chúng tôi sẽ sử dụng trình quản lý gói Python pip để cài đặt các thành phần bổ sung sau này một chút.

Chúng tôi cần cập nhật địa phương apt chỉ mục gói và sau đó tải xuống và cài đặt các gói. Các gói chúng tôi cài đặt phụ thuộc vào phiên bản Python mà dự án của bạn sẽ sử dụng.

Nếu bạn đang sử dụng Python 2, kiểu:

sudo apt-get update

sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx

Nếu bạn đang sử dụng Python 3, kiểu:

sudo apt-get update

sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx

Điều này sẽ cài đặt pip, các tệp phát triển Python cần thiết để xây dựng Gunicorn sau đó, hệ thống cơ sở dữ liệu Postgres và các thư viện cần thiết để tương tác với nó và máy chủ web Nginx.

Tạo cơ sở dữ liệu và người dùng PostgreSQL

Chúng ta sẽ nhảy ngay vào và tạo một cơ sở dữ liệu và người dùng cơ sở dữ liệu cho ứng dụng Django của chúng ta.

Theo mặc định, Postgres sử dụng lược đồ xác thực được gọi là "xác thực ngang hàng" cho các kết nối cục bộ. Về cơ bản, điều này có nghĩa là nếu tên người dùng hệ điều hành của người dùng khớp với tên người dùng Postgres hợp lệ, người dùng đó có thể đăng nhập mà không cần xác thực thêm.

Trong quá trình cài đặt Postgres, một người dùng hệ điều hành có tên postgres đã được tạo để tương ứng với postgres Người dùng quản trị PostgreSQL. Chúng tôi cần sử dụng người dùng này để thực hiện các tác vụ quản trị. Chúng tôi có thể sử dụng sudo và vượt qua trong tên người dùng với -u Tùy chọn.

Đăng nhập vào một phiên Postgres tương tác bằng cách gõ:

sudo -u postgres psql

Bạn sẽ nhận được một nhắc nhở PostgreSQL, nơi chúng tôi có thể thiết lập các yêu cầu của chúng tôi.

Đầu tiên, tạo một cơ sở dữ liệu cho dự án của bạn:

Note

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 chắc chắn rằng lệnh của bạn kết thúc bằng một lệnh để tránh các vấn đề.

CREATE DATABASE myproject;

OutputCREATE DATABASE

Tiếp theo, tạo một người dùng cơ sở dữ liệu cho dự án của chúng tôi. Đảm bảo chọn mật khẩu an toàn:

CREATE USER myprojectuser WITH PASSWORD 'password';

OutputCREATE ROLE

Tiếp theo, chúng tôi sẽ sửa đổi một vài tham số kết nối cho người dùng mà chúng tôi vừa tạo. Điều này sẽ tăng tốc độ hoạt động của cơ sở dữ liệu sao cho các giá trị chính xác không phải được truy vấn và thiết lập mỗi khi kết nối được thiết lập.

Chúng tôi đang thiết lập mã hóa mặc định thành UTF-8, mà Django mong đợi. Chúng tôi cũng đang thiết lập sơ đồ cách ly giao dịch mặc định thành "read cam kết", chặn các lần đọc từ các giao dịch không được cam kết. Cuối cùng, chúng tôi đang thiết lập múi giờ. Theo mặc định, các dự án Django của chúng tôi sẽ được đặt để sử dụng UTC. Đây là tất cả các đề xuất từ bản thân dự án Django:

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';

OutputALTER ROLE
ALTER ROLE
ALTER ROLE

Bây giờ, chúng tôi có thể cấp quyền truy cập cho người dùng mới để quản trị cơ sở dữ liệu mới của mình:

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

OutputGRANT

Khi bạn hoàn thành, thoát ra khỏi dấu nhắc PostgreSQL bằng cách gõ:

\q

Bạn sẽ được trả về phiên trình bao của bạn.

Tạo một môi trường ảo Python cho dự án của bạn

Bây giờ chúng tôi có cơ sở dữ liệu của chúng tôi, chúng tôi có thể bắt đầu nhận được các yêu cầu dự án còn lại của chúng tôi. Chúng tôi sẽ cài đặt các yêu cầu Python của chúng tôi trong một môi trường ảo để quản lý dễ dàng hơn.

Để làm điều này, trước tiên chúng tôi cần quyền truy cập vào virtualenv chỉ huy. Chúng ta có thể cài đặt nó với pip.

Nếu bạn đang sử dụng Python 2, kiểu:

sudo pip install virtualenv

Nếu bạn đang sử dụng Python 3, kiểu:

sudo pip3 install virtualenv

Với virtualenv cài đặt, chúng tôi có thể bắt đầu hình thành dự án của chúng tôi. Tạo và di chuyển vào một thư mục nơi chúng tôi có thể giữ các tệp dự án của mình:

mkdir ~/myproject

cd ~/myproject

Trong thư mục dự án, tạo một môi trường ảo Python bằng cách gõ:

virtualenv venv

Thao tác này sẽ tạo một thư mục có tên venv bên trong của bạn myproject danh mục. Bên trong, nó sẽ cài đặt phiên bản Python cục bộ và phiên bản cục bộ của pip. Chúng ta có thể sử dụng nó để cài đặt và cấu hình một môi trường Python riêng biệt cho dự án của chúng ta.

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

source venv/bin/activate

Lời 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ó sẽ giống như thế này: (venv)user@host:~/myproject$.

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

Note

Bất kể bạn đang sử dụng phiên bản Python nào, khi môi trường ảo được kích hoạt, bạn nên sử dụng pip lệnh (không pip3).

pip install django gunicorn psycopg2

Các thành phần này sẽ được cài đặt trong môi trường ảo của chúng tôi, được phân lập từ các gói toàn cầu của chúng tôi.

Tạo và cấu hình dự án Django mới

Với các thành phần Python được cài đặt của chúng tôi, chúng tôi có thể tạo các tệp dự án Django thực tế.

Tạo Dự án Django

Kể từ khi chúng tôi đã có một thư mục dự án, chúng tôi sẽ nói với Django để cài đặt các tập tin ở đây. Bây giờ chúng ta có thể bắt đầu một dự án Django trong myproject danh mục. Điều này sẽ tạo một thư mục con có cùng tên để giữ chính mã đó và sẽ tạo một kịch bản quản lý trong thư mục hiện tại:

Chú thích: Đảm bảo thêm dấu chấm ở cuối lệnh để thiết lập này được thiết lập chính xác. Vì chúng ta đã tạo một thư mục dự án cha mẹ để giữ thư mục môi trường ảo của chúng ta, chúng ta không muốn mức thư mục phụ sẽ được tạo ra nếu chúng ta rời khỏi dấu chấm.

django-admin.py startproject myproject .

Cấu trúc thư mục hiện tại của bạn sẽ trông giống như sau:

.
└── ./myproject/
    ├── manage.py
    ├── myproject/
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── venv/
        └── . . .

Như bạn có thể thấy, chúng ta có một thư mục dự án cha mẹ chứa một manage.py tập lệnh, thư mục dự án bên trong và venv thư mục môi trường ảo mà chúng tôi đã tạo trước đó.

Điều chỉnh cài đặt dự án

Điều đầu tiên chúng ta nên làm với các tập tin dự án mới được tạo của chúng tôi là điều chỉnh các thiết lập. Mở tệp cài đặt trong trình chỉnh sửa văn bản của bạn:

nano ~/myproject/myproject/settings.py

Bắt đầu bằng cách định vị ALLOWED_HOSTS chỉ thị. Điều này định nghĩa một danh sách trắng các địa chỉ hoặc tên miền có thể được sử dụng để kết nối với cá thể Django. Mọi yêu cầu đến với Máy chủ lưu trữ tiêu đề không có trong danh sách này sẽ làm tăng ngoại lệ. Django yêu cầu bạn thiết lập để ngăn chặn một lớp bảo mật nào đó.

Trong dấu ngoặc vuông, liệt kê các địa chỉ IP hoặc tên miền được liên kết với máy chủ Django của bạn. Mỗi mục phải được liệt kê trong danh ngôn với mục được phân tách bằng dấu phẩy. Nếu bạn muốn trả lời các yêu cầu cho miền và bất kỳ tên miền 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ã dưới đây, có một số ví dụ được sử dụng để minh họa cách chính xác cho các mục nhập định dạng:

~/myproject/myproject/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', . . .]

Tiếp theo, tìm phần cấu hình truy cập cơ sở dữ liệu. Nó sẽ bắt đầu với DATABASES. Cấu hình trong tệp là dành cho cơ sở dữ liệu SQLite. Chúng tôi đã tạo ra một cơ sở dữ liệu PostgreSQL cho dự án của chúng tôi, vì vậy chúng tôi cần phải điều chỉnh các thiết lập.

Thay đổi các thiết lập với thông tin cơ sở dữ liệu PostgreSQL của bạn. Chúng tôi nói với Django để sử dụng psycopg2 bộ điều hợp mà chúng tôi đã cài đặt pip. Chúng ta cần cung cấp tên cơ sở dữ liệu, tên người dùng cơ sở dữ liệu, mật khẩu của người dùng cơ sở dữ liệu, và sau đó xác định rằng cơ sở dữ liệu nằm trên máy tính cục bộ. Bạn có thể rời khỏi PORT thiết lập dưới dạng chuỗi rỗng:

~/myproject/myproject/settings.py

. . .

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproject',
        'USER': 'myprojectuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

. . .

Tiếp theo, chuyển xuống cuối tệp và thêm cài đặt cho biết vị trí đặt các tệp tĩnh. Đ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 nói với Django để đặt chúng trong một thư mục gọi là static trong thư mục dự án cơ sở:

~/myproject/myproject/settings.py

. . .

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

Lưu và đóng tệp khi bạn hoàn tất.

Hoàn thành thiết lập dự án ban đầu

Bây giờ, chúng ta có thể di chuyển lược đồ cơ sở dữ liệu ban đầu đến cơ sở dữ liệu PostgreSQL của chúng tôi bằng cách sử dụng kịch bản quản lý:

cd ~/myproject

./manage.py makemigrations

./manage.py migrate

Tạo người dùng quản trị cho dự án bằng cách nhập:

./manage.py createsuperuser

Bạn sẽ phải chọn tên người dùng, cung cấp địa chỉ email và chọn và xác nhận mật khẩu.

Chúng tôi có thể thu thập tất cả nội dung tĩnh vào vị trí thư mục mà chúng tôi đã định cấu hình bằng cách nhập:

./manage.py collectstatic

Bạn sẽ phải xác nhận hoạt động. Các tệp tĩnh sau đó sẽ được đặt trong một thư mục có tên static trong thư mục dự án của bạn.

Chú thích: Trước khi bạn thử máy chủ phát triển, hãy chắc chắn rằng bạn mở cổng trong tường lửa của mình.

Nếu bạn tình cờ chạy ufw tường lửa, bạn có thể mở cổng thích hợp bằng cách gõ:

sudo ufw allow 8000

Nếu bạn đang chạy iptables tường lửa, lệnh chính xác mà bạn cần phụ thuộc vào cấu hình tường lửa hiện tại của bạn. Dành cho hầu hết các cấu hình, lệnh này sẽ hoạt động:

sudo iptables -I INPUT -p tcp --dport 8000 -j ACCEPT 

Cuối cùng, bạn có thể kiểm tra dự án của bạn bằng cách khởi động máy chủ 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 của bạn, hãy truy cập vào tên miền hoặc địa chỉ IP của máy chủ của bạn theo sau :8000:

http://server_domain_or_IP:8000

Bạn sẽ thấy trang chỉ mục Django mặc định:

Django index page

Nếu bạn nối thêm /admin đến cuối URL trong thanh địa chỉ, bạn sẽ được nhắc nhập tên người dùng và mật khẩu quản trị mà bạn đã tạo bằng createsuperuser chỉ huy:

Django admin login

Sau khi xác thực, bạn có thể truy cập giao diện quản trị Django mặc định:

Django admin interface

Khi bạn kết thúc khám phá, nhấn CTRL-C trong cửa sổ đầu cuối để tắt máy chủ phát triển.

Kiểm tra khả năng phục vụ dự án của Gunicorn

Điều cuối cùng chúng ta muốn làm trước khi rời khỏi môi trường ảo là kiểm tra Gunicorn để đảm bảo rằng nó có thể phục vụ ứng dụng. Chúng ta có thể làm điều này một cách dễ dàng bằng cách gõ:

cd ~/myproject

gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application

Điều này sẽ bắt đầu Gunicorn trên cùng một giao diện mà máy chủ phát triển Django đang chạy. Bạn có thể quay lại và thử lại ứng dụng.

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

Chúng tôi đã vượt qua Gunicorn một mô-đun bằng cách chỉ định đường dẫn thư mục tương đối cho Django's wsgi.py tệp, là điểm vào ứng dụng của chúng tôi, sử dụng cú pháp mô-đun của Python. Bên trong tệp này, một hàm được gọi là application được định nghĩa, được sử dụng để giao tiếp với ứng dụng. Để tìm hiểu thêm về đặc tả của WSGI, hãy nhấp vào đây.

Khi bạn kết thúc kiểm tra, nhấn CTRL-C trong cửa sổ đầu cuối để dừng Gunicorn.

Bây giờ chúng ta đã hoàn tất việc cấu hình ứng dụng Django của chúng ta. Chúng ta có thể quay trở lại môi trường ảo bằng cách gõ:

deactivate

Tiền tố môi trường ảo cần được loại bỏ khỏi dấu nhắc trình bao của bạn, cho biết rằng bạn không còn trong môi trường ảo.

Tạo một tệp dịch vụ hệ thống Gunicorn

Chúng tôi đã thử nghiệm rằng Gunicorn có thể tương tác với ứng dụng Django của chúng tôi, nhưng chúng ta nên thực hiện một cách mạnh mẽ hơn để bắt đầu và dừng máy chủ ứng dụng. Để thực hiện điều này, chúng tôi sẽ tạo một tệp dịch vụ systemd.

Tạo và mở một tệp dịch vụ systemd cho Gunicorn với sudo đặc quyền trong trình soạn thảo văn bản của bạn:

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

Bắt đầu với [Unit] , được sử dụng để chỉ định siêu dữ liệu và phụ thuộc. Chúng tôi sẽ mô tả dịch vụ của chúng tôi tại đây và yêu cầu hệ thống init chỉ bắt đầu dịch vụ này sau khi đã đạt được mục tiêu mạng:

/etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
After=network.target

Tiếp theo, chúng tôi sẽ mở [Service] phần. Chúng tôi sẽ chỉ định người dùng và nhóm mà chúng tôi muốn xử lý để chạy theo. Chúng tôi sẽ cung cấp quyền sở hữu tài khoản người dùng thông thường của chúng tôi cho quy trình vì nó sở hữu tất cả các tệp có liên quan. Chúng tôi sẽ cung cấp quyền sở hữu nhóm cho www-data để Nginx có thể giao tiếp dễ dàng với Gunicorn.

Sau đó chúng tôi sẽ vạch ra thư mục làm việc và chỉ định lệnh để sử dụng để khởi động dịch vụ. Trong trường hợp này, chúng ta sẽ phải xác định đường dẫn đầy đủ đến thực thi Gunicorn, được cài đặt trong môi trường ảo của chúng ta. Chúng tôi sẽ liên kết nó với Ổ cắm Unix trong thư mục dự án vì Nginx được cài đặt trên cùng một máy tính. Điều này an toàn hơn và nhanh hơn việc sử dụng cổng mạng. Chúng tôi cũng có thể chỉ định bất kỳ chỉnh sửa Gunicorn tùy chọn nào tại đây. Ví dụ, chúng tôi đã xác định 3 quy trình công nhân trong trường hợp này:

/etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
ExecStart=/home/sammy/myproject/venv/bin/gunicorn --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application

Cuối cùng, chúng tôi sẽ thêm [Install] phần. Điều này sẽ cho systemd những gì để liên kết dịch vụ này để nếu chúng ta kích hoạt nó để bắt đầu lúc khởi động. Chúng tôi muốn dịch vụ này bắt đầu khi hệ thống đa người dùng thông thường được thiết lập và chạy:

/etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
ExecStart=/home/sammy/myproject/venv/bin/gunicorn --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application

[Install]
WantedBy=multi-user.target

Cùng với đó, tệp dịch vụ systemd của chúng tôi đã hoàn tất. Lưu và đóng nó ngay bây giờ.

Bây giờ chúng ta có thể bắt đầu dịch vụ Gunicorn mà chúng ta tạo ra và kích hoạt nó để nó bắt đầu lúc khởi động:

sudo systemctl start gunicorn

sudo systemctl enable gunicorn

OutputCreated symlink from /etc/systemd/system/multi-user.target.wants/gunicorn.service to /etc/systemd/system/gunicorn.service.

Kiểm tra trạng thái của dịch vụ bằng cách nhập:

sudo systemctl status gunicorn

Output● gunicorn.service - gunicorn daemon
   Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled)
   Active: active (running) since Wed 2016-12-21 21:05:07 UTC; 49s ago
 Main PID: 10154 (gunicorn)
   CGroup: /system.slice/gunicorn.service
           ├─10154 /home/sammy/myproject/venv/bin/python3 /home/sammy/myproject/venv/bin/gunicorn --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application
           ├─10157 /home/sammy/myproject/venv/bin/python3 /home/sammy/myproject/venv/bin/gunicorn --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application
           ├─10158 /home/sammy/myproject/venv/bin/python3 /home/sammy/myproject/venv/bin/gunicorn --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application
           └─10159 /home/sammy/myproject/venv/bin/python3 /home/sammy/myproject/venv/bin/gunicorn --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application

Dec 21 21:05:07 debian-512mb-nyc3-01 systemd[1]: Started gunicorn daemon.
Dec 21 21:05:07 debian-512mb-nyc3-01 gunicorn[10154]: [2016-12-21 21:05:07 +0000] [10154] [INFO] Starting gunicorn 19.6.0
Dec 21 21:05:07 debian-512mb-nyc3-01 gunicorn[10154]: [2016-12-21 21:05:07 +0000] [10154] [INFO] Listening at: unix:/home/sammy/myproject/myproject.sock (10154)
Dec 21 21:05:07 debian-512mb-nyc3-01 gunicorn[10154]: [2016-12-21 21:05:07 +0000] [10154] [INFO] Using worker: sync
Dec 21 21:05:07 debian-512mb-nyc3-01 gunicorn[10154]: [2016-12-21 21:05:07 +0000] [10157] [INFO] Booting worker with pid: 10157
Dec 21 21:05:07 debian-512mb-nyc3-01 gunicorn[10154]: [2016-12-21 21:05:07 +0000] [10158] [INFO] Booting worker with pid: 10158
Dec 21 21:05:07 debian-512mb-nyc3-01 gunicorn[10154]: [2016-12-21 21:05:07 +0000] [10159] [INFO] Booting worker with pid: 10159

Điều quan trọng nhất cần tìm là thiết bị đang hoạt động.

Đây cũng là thời điểm tốt để kiểm tra xem tệp socket đã được tạo chưa. Nếu bạn liệt kê nội dung của ~/myproject thư mục, bạn sẽ thấy tập tin socket Unix:

ls -l ~/myproject

Outputtotal 16
-rwxr-xr-x 1 sammy sammy     807 Dec 21 20:46 manage.py
drwxr-xr-x 3 sammy sammy    4096 Dec 21 20:54 myproject
srwxrwxrwx 1 sammy www-data    0 Dec 21 21:05 myproject.sock
drwxr-xr-x 3 sammy sammy    4096 Dec 21 20:54 static
drwxr-xr-x 5 sammy sammy    4096 Dec 21 20:41 venv

Như bạn thấy, ổ cắm ở đó và www-data nhóm có quyền sở hữu nhóm.

Định cấu hình Nginx thành Proxy Pass to Gunicorn

Bây giờ Gunicorn đã được thiết lập, chúng ta cần phải cấu hình Nginx để truyền lưu lượng cho tiến trình.

Bắt đầu bằng cách tạo và mở một khối máy chủ mới trong Nginx's sites-available danh mục:

sudo nano /etc/nginx/sites-available/myproject

Bên trong, mở một khối máy chủ mới. Chúng ta sẽ bắt đầu bằng cách xác định rằng khối này nên lắng nghe trên cổng thông thường 80 và nó sẽ đáp ứng với tên miền hoặc địa chỉ IP của máy chủ của chúng ta:

/etc/nginx/sites-available/myproject

server {
    listen 80;
    server_name server_domain_or_IP;
}

Tiếp theo, chúng ta có thể nói Nginx bỏ qua lỗi nếu không tìm thấy favicon. Chúng tôi cũng sẽ cho biết nơi tìm các tài sản tĩnh mà chúng tôi thu thập được trong ~/myproject/static danh mục. Tất cả các tệp này đều có tiền tố URI chuẩn là "/ static", vì vậy chúng tôi có thể tạo khối vị trí để khớp với các yêu cầu đó:

/etc/nginx/sites-available/myproject

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/sammy/myproject;
    }
}

Cuối cùng, chúng tôi sẽ tạo location / {} chặn để khớp với tất cả các yêu cầu khác. Bên trong vị trí này, chúng tôi sẽ bao gồm tiêu chuẩn proxy_params tập tin đi kèm với cài đặt Nginx và sau đó chúng tôi sẽ chuyển lưu lượng vào ổ cắm mà quy trình Gunicorn của chúng tôi đã tạo:

/etc/nginx/sites-available/myproject

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/sammy/myproject;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/sammy/myproject/myproject.sock;
    }
}

Lưu và đóng tệp khi bạn hoàn tất. Bây giờ, chúng tôi có thể bật tệp bằng cách liên kết tệp với sites-enabled danh mục:

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

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

sudo nginx -t

Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nếu không có lỗi nào được báo cáo, hãy tiếp tục và khởi động lại Nginx bằng cách gõ:

sudo systemctl restart nginx

Chú thích: Nếu bạn đã bật tường lửa, hãy điều chỉnh nó để loại bỏ cổng 8000 một lần nữa và cho phép truy cập bình thường vào cổng 80.

Nếu bạn tình cờ chạy ufw tường lửa, bạn có thể mở cổng thích hợp bằng cách gõ:

sudo ufw delete allow 8000

sudo ufw allow 'WWW'

Nếu bạn đang chạy iptables tường lửa, các lệnh chính xác mà bạn cần phụ thuộc vào cấu hình tường lửa hiện tại của bạn. Dành cho hầu hết các cấu hình, các lệnh này sẽ hoạt động:

sudo iptables -D INPUT -p tcp --dport 8000 -j ACCEPT

sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT 

Bây giờ bạn có thể truy cập miền hoặc địa chỉ IP của máy chủ để xem ứng dụng của mình mà không chỉ định cổng.

Note

Sau khi cấu hình Nginx, bước tiếp theo cần bảo vệ lưu lượng đến máy chủ bằng SSL / TLS. Điều này là quan trọng bởi vì không có nó, tất cả thông tin, bao gồm cả mật khẩu được gửi qua mạng trong văn bản thuần túy.

Nếu bạn có một tên miền, cách dễ nhất có được một chứng chỉ SSL để đảm bảo lưu lượng truy cập của bạn là sử dụng Let's Encrypt. Làm theo hướng dẫn này để thiết lập Hãy mã hóa với Nginx trên Debian 8.

Nếu bạn không có tên miền, bạn vẫn có thể bảo mật trang web của bạn để thử nghiệm và học tập với chứng chỉ SSL tự ký.

Phần kết luận

Trong hướng dẫn này, chúng tôi đã thiết lập một dự án Django trong môi trường ảo của riêng nó. Chúng tôi đã cấu hình Gunicorn để dịch các yêu cầu của khách hàng để Django có thể xử lý chúng. Sau đó, chúng tôi thiết lập Nginx hoạt động như một proxy ngược để xử lý các kết nối máy khách và phục vụ dự án đúng tùy thuộc vào yêu cầu của máy khách.

Django giúp tạo các dự án và ứng dụng đơn giản bằng cách cung cấp nhiều phần phổ biến, cho phép bạn tập trung vào các yếu tố độc đáo. Bằng cách tận dụng chuỗi công cụ chung được mô tả trong bài viết này, bạn có thể dễ dàng phục vụ các ứng dụng bạn tạo từ một máy chủ duy nhất.