Cách cài đặt Django với Postgres, Nginx và Gunicorn trên Rocky Linux 9

theanh

Administrator
Nhân viên
Django là một framework python được sử dụng để phát triển các trang web và ứng dụng động. Nó tuân theo kiến trúc MVC (Model-View-Controller). Sử dụng Django giúp tăng tốc quá trình phát triển ứng dụng vì nó xử lý hầu hết các tác vụ cơ bản.

Trong hướng dẫn này, bạn sẽ học cách cài đặt framework Django trên máy chủ Rocky Linux 9. Bạn cũng sẽ tạo một dự án demo và thử nghiệm nó.

Điều kiện tiên quyết​


  • Một máy chủ chạy Rocky Linux 9.

  • Một người dùng không phải root có quyền sudo.

  • Một tên miền đủ điều kiện (FQDN) trỏ đến máy chủ của bạn. Đối với mục đích của chúng tôi, chúng tôi sẽ sử dụng django.example.com làm tên miền.

  • Đảm bảo mọi thứ đều được cập nhật.
Mã:
$ sudo dnf update
[*]
Cài đặt các gói tiện ích cơ bản. Một số trong số chúng có thể đã được cài đặt.
Mã:
$ sudo dnf install wget curl nano unzip yum-utils -y
  • SELinux đã bị vô hiệu hóa.

Bước 1 - Cấu hình Tường lửa​

Bước đầu tiên là cấu hình tường lửa. Rocky Linux sử dụng Tường lửa Firewalld. Kiểm tra trạng thái của tường lửa.
Mã:
$ sudo firewall-cmd --state
running
Tường lửa hoạt động với nhiều vùng khác nhau và vùng công cộng là vùng mặc định mà chúng ta sẽ sử dụng. Liệt kê tất cả các dịch vụ và cổng đang hoạt động trên tường lửa.
Mã:
$ sudo firewall-cmd --permanent --list-services
Kết quả đầu ra sau sẽ hiển thị.
Mã:
cockpit dhcpv6-client ssh
Django cần có cổng HTTP và HTTPS để hoạt động. Mở chúng ra.
Mã:
$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --add-service=https --permanent
Tải lại tường lửa để áp dụng các thay đổi.
Mã:
$ sudo firewall-cmd --reload

Bước 2 - Cài đặt PostgreSQL và Tiện ích​

Rocky Linux 9 đi kèm với phiên bản PostgreSQL cũ hơn. Chúng tôi sẽ cài đặt Postgres 14 cho hướng dẫn của mình.

Cài đặt kho lưu trữ RPM cho PostgreSQL.
Mã:
$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
Cài đặt máy chủ PostgreSQL 14.
Mã:
$ sudo dnf install -y postgresql14-server postgresql14-contrib postgresql14-devel python3-psycopg2
Khởi tạo cơ sở dữ liệu.
Mã:
$ sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
Kích hoạt và khởi động PostgreSQL dịch vụ.
Mã:
$ sudo systemctl enable postgresql-14 --now
Kiểm tra trạng thái của dịch vụ.
Mã:
$ sudo systemctl status postgresql-14
? postgresql-14.service - PostgreSQL 14 database server Loaded: loaded (/usr/lib/systemd/system/postgresql-14.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2022-09-12 01:17:24 UTC; 2s ago Docs: https://www.postgresql.org/docs/14/static/ Process: 87995 ExecStartPre=/usr/pgsql-14/bin/postgresql-14-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS) Main PID: 88000 (postmaster) Tasks: 8 (limit: 5915) Memory: 16.5M CPU: 60ms CGroup: /system.slice/postgresql-14.service ??88000 /usr/pgsql-14/bin/postmaster -D /var/lib/pgsql/14/data/ ??88001 "postgres: logger " ??88003 "postgres: checkpointer " ??88004 "postgres: background writer " ??88005 "postgres: walwriter " ??88006 "postgres: autovacuum launcher " ??88007 "postgres: stats collector " ??88008 "postgres: logical replication launcher "
Sep 12 01:17:24 board.example.com systemd[1]: Starting PostgreSQL 14 database server...
Chúng ta hãy cài đặt một số tiện ích bổ sung mà chúng ta sẽ cần để Django làm việc.
Mã:
$ sudo dnf install -y python3 python3-devel python3-pip gcc
Để giải quyết bất kỳ lỗi nào trong tương lai liên quan đến pg_config không được tìm thấy, bạn cần thêm đường dẫn đến thư mục bin PostgreSQL. Mở tệp .bashrc để chỉnh sửa.
Mã:
$ nano ~/.bashrc
Thêm dòng sau vào cuối tệp.
Mã:
export PATH=$PATH:/usr/pgsql-14/bin
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Bước 3 - Cấu hình PostgreSQL​

Đăng nhập vào shell PostgreSQL.
Mã:
$ sudo -i -u postgres psql
Tạo cơ sở dữ liệu mới cho Django.
Mã:
postgres=# CREATE DATABASE djangoapp;
Tạo người dùng cơ sở dữ liệu mới với mật khẩu mạnh.
Mã:
postgres=# CREATE USER djangouser WITH ENCRYPTED PASSWORD 'dbpassword';
Cấp quyền cho người dùng sử dụng cơ sở dữ liệu.
Mã:
postgres=# GRANT ALL PRIVILEGES ON DATABASE djangoapp TO djangouser;
Thoát khỏi Postgres Shell.
Mã:
postgres=# \q

Bước 4 - Cài đặt Django​

Có một số phương pháp để bạn có thể cài đặt Django. Quyết định phương pháp nào phù hợp nhất với bạn phụ thuộc vào cách bạn muốn cấu hình môi trường phát triển và nhu cầu của bạn. Mỗi phương pháp đều có ưu và nhược điểm riêng. Chúng ta hãy cùng xem qua tất cả các phương pháp này.

Cài đặt bằng pip​

Đây là cách phổ biến nhất để cài đặt Django. Cách được khuyến nghị là sử dụng tạo môi trường Python ảo. Điều này cho phép bạn cài đặt các gói Python mà không ảnh hưởng đến hệ thống.

Chúng ta hãy tạo một thư mục dự án demo.
Mã:
$ mkdir ~/sampleproject
$ cd ~/sampleproject
Tạo môi trường ảo bằng lệnh sau. Thay thế sample_env bằng tên bạn muốn gọi cho môi trường ảo của mình.
Mã:
$ python3 -m venv sample_env
Thao tác này sẽ cài đặt phiên bản Python di động, pip trong thư mục dự án của bạn. Để cài đặt bất kỳ gói nào vào dự án, bạn cần kích hoạt môi trường bằng lệnh sau.
Mã:
$ source sample_env/bin/activate
Dấu nhắc shell của bạn sẽ thay đổi để phản ánh môi trường ảo.
Mã:
(sample_env) navjot@django:~/sampleproject$
Bây giờ môi trường ảo đã được kích hoạt, hãy sử dụng pip để cài đặt Django. Chạy lệnh sau để cài đặt Django.
Mã:
(sample_env) $ pip install django
Xác minh cài đặt.
Mã:
(sample_env) $ django-admin --version
4.1.2
Tùy thuộc vào yêu cầu của dự án, bạn có thể cài đặt phiên bản Django khác trong các mục sau cách.
Mã:
(sample_env) $ pip install django==3.2.1
Xác minh cài đặt.
Mã:
(sample_env) $ django-admin --version
3.2.1
Như bạn thấy, phương pháp này cài đặt phiên bản Django mới hơn phiên bản lấy từ kho lưu trữ Rocky Linux.

Để thoát khỏi môi trường ảo, hãy chạy lệnh sau lệnh.
Mã:
(sample_env) $ deactivate

Cài đặt phiên bản phát triển​

Bạn cũng có thể sử dụng pip để cài đặt phiên bản phát triển của Django. Đối với điều này, chúng ta sẽ lấy phiên bản phát triển từ kho lưu trữ Github của Django.

Sao chép kho lưu trữ vào thư mục ~/django-dev bằng lệnh sau.
Mã:
$ git clone https://github.com/django/django ~/django-dev
Chuyển sang thư mục mới tạo thư mục.
Mã:
$ cd ~/django-dev
Tạo môi trường ảo.
Mã:
$ python3 -m venv dev_django_env
Kích hoạt môi trường.
Mã:
$ source dev_django_env/bin/activate
Cài đặt Django bằng pip. Cờ -e cài đặt nó ở chế độ có thể chỉnh sửa, chế độ này là bắt buộc nếu bạn đang cài đặt từ kiểm soát phiên bản.
Mã:
(dev_django_dev) $ pip install -e ~/django-dev
Xác minh cài đặt.
Mã:
(dev_django_dev) $ django-admin --version
4.2.dev20221012095013
Như bạn thấy, phiên bản ở đây là phiên bản phát triển mới nhất. Phiên bản phát triển của Django không hữu ích cho môi trường sản xuất.

Bước 5 - Tạo một dự án mẫu​

Chúng ta hãy xây dựng một dự án Django mẫu. Tạo một thư mục cho dự án mẫu.
Mã:
$ mkdir ~/dj-sample
$ cd ~/dj-sample
Tạo một môi trường ảo Python.
Mã:
$ python3 -m venv sample_proj
Kích hoạt môi trường.
Mã:
$ source sample_proj/bin/activate
Cài đặt gói Wheel.
Mã:
(sample_proj) $ pip install wheel
Cài đặt Django và các gói.
Mã:
(sample_proj) $ pip install django psycopg2 psycopg2-binary
Để xây dựng dự án, chúng ta cần sử dụng lệnh startproject. Lệnh này tạo một thư mục khác bao gồm:
  • Một tập lệnh quản lý, manage.py, được sử dụng để quản lý các tác vụ cụ thể của Django.
  • Một thư mục có cùng tên với dự án bao gồm mã dự án.
Chúng ta sẽ tạo thư mục dự án trong thư mục làm việc hiện tại của mình. Để thực hiện điều đó, hãy sử dụng ký tự dot(.) ở cuối lệnh sau.
Mã:
(sample_proj) $ django-admin startproject demoproject .
Django sử dụng biến SECRET_KEY để cung cấp chữ ký mật mã. Nó tạo ra một giá trị mặc định trong quá trình cài đặt. Bạn nên thay thế nó bằng một giá trị an toàn. Chạy lệnh sau để tạo khóa và sao chép để sử dụng sau.
Mã:
(sample_proj) $ python3 -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'
Bạn sẽ nhận được đầu ra sau với khóa.
Mã:
wm#dzb^ymuo3s3tza=f5cx^kan!$4sch1!b-q=v%)=d0pb(jqf
Bước đầu tiên là điều chỉnh cài đặt dự án. Mở tệp cài đặt để chỉnh sửa.
Mã:
(sample_proj) $ nano demoproject/settings.py
Thay thế giá trị hiện tại của biến SECRET_KEY bằng khóa bạn được tạo ra.
Mã:
SECRET_KEY = 's)3m=4s&!a=p#brttcqu@1s$8(z6e+u8(^tkpw28qyj0t#8ku2'
Thay đổi cài đặt cho phần DATABASES thành tiếp theo.
Mã:
DATABASES = { 'default': {	'ENGINE': 'django.db.backends.postgresql_psycopg2',	'NAME': 'DATABASE_DB',	'USER': 'DATABASE_USER',	'PASSWORD': 'DATABASE_PASSWORD',	'HOST': 'DATABASE_HOST',	'PORT': 'DATABASE_PORT',	},
}
Tiếp theo, di chuyển đến cuối tệp và thêm cài đặt cho vị trí của các tệp tĩnh. Điều này rất quan trọng để Nginx hoạt động và xử lý các yêu cầu cho các tệp này. Thêm dòng sau vào phía trên biến STATIC_URL.
Mã:
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
Vì Biến STATIC_ROOT sử dụng mô-đun os, chúng ta cần nhập mô-đun này vì mặc định mô-đun này không được nhập. Thêm dòng sau phía trên dòng from pathlib import Path.
Mã:
import os
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Xác minh cơ sở dữ liệu cài đặt.
Mã:
(sample_proj) $ python manage.py check --database default
Bạn sẽ nhận được kết quả sau.
Mã:
System check identified no issues (0 silenced).
Tiếp theo, chúng ta cần di chuyển cơ sở dữ liệu bằng cách sử dụng Lệnh migrate. Di chuyển trong Django sẽ truyền bá những thay đổi bạn thực hiện cho mô hình của mình vào lược đồ cơ sở dữ liệu.
Mã:
(sample_proj) $ python manage.py makemigrations
(sample_proj) $ python manage.py migrate
Bạn sẽ nhận được kết quả sau.
Mã:
Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions
Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying auth.0012_alter_user_first_name_max_length... OK Applying sessions.0001_initial... OK
Tiếp theo, tạo một người dùng quản trị để truy cập vào quản trị của Django giao diện.
Mã:
(sample_proj) $ python manage.py createsuperuser
Bạn sẽ được nhắc nhập tên người dùng, email và mật khẩu.
Mã:
Username (leave blank to use 'navjot'):
Email address: [emailprotected]
Password:
Password (again):
Superuser created successfully.
Sao chép các tệp tĩnh vào thư mục tĩnh. Nhập yes khi được nhắc.
Mã:
(sample_proj) $ python manage.py collectstatic
130 static files copied to '/home/navjot/dj-sample/static'.

Bước 6 - Kiểm tra Máy chủ phát triển​

Đã đến lúc kiểm tra ứng dụng. Để thực hiện được điều đó, bạn cần sửa đổi lệnh ALLOWED_HOSTS trong cài đặt Django. Chỉ thị này định nghĩa danh sách các địa chỉ IP và tên miền được cấp quyền truy cập vào ứng dụng Django.

Mở tệp cài đặt bằng lệnh sau.
Mã:
(sample_proj) $ nano demoproject/settings.py
Tìm mục sau.
Mã:
ALLOWED_HOSTS = []
Nhập địa chỉ IP máy chủ của bạn vào trong dấu ngoặc vuông. Mỗi mục nhập phải được đặt trong dấu ngoặc kép và nhiều mục nhập phải được phân tách bằng dấu phẩy. Nhập www.example.com sẽ khớp chính xác. Tuy nhiên, .example.com sẽ khớp với example.comwww.example.com và bất kỳ tên miền phụ nào khác của example.com. Do đó, nên sử dụng dấu chấm để thêm tiền tố cho tên miền để khớp với tên miền đó và các tên miền phụ của nó.
Mã:
ALLOWED_HOSTS = ['']
Chúng tôi đã sử dụng địa chỉ IP để khớp với máy chủ của mình. Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Trước khi bạn kiểm tra máy chủ phát triển, bạn cần định cấu hình tường lửa để cho phép Django hoạt động. Django sử dụng cổng 8000 theo mặc định. Mở cổng bằng Tường lửa đơn giản (UFW).
Mã:
(sample_proj) $ sudo firewall-cmd --add-port=8000/tcp --permanent
(sample_proj) $ sudo firewall-cmd --reload
Khởi động máy chủ phát triển.
Mã:
(sample_proj) $ python manage.py runserver 0.0.0.0:8000
Khởi chạy URL http://:8000 trong trình duyệt của bạn và bạn sẽ nhận được màn hình sau.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22687%22%3E%3C/svg%3E


Bạn có thể truy cập giao diện quản trị bằng cách theo URL http://:8000/admin/ và bạn sẽ thấy màn hình đăng nhập sau.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22718%22%20height=%22446%22%3E%3C/svg%3E


Nhập thông tin đăng nhập đã tạo trước đó để đăng nhập vào bảng quản trị hiển thị bên dưới.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22281%22%3E%3C/svg%3E


Sau khi hoàn tất dự án demo, bạn có thể đóng máy chủ bằng cách nhấn Ctrl + C trong thiết bị đầu cuối của mình.

Bước 7 - Cài đặt và kiểm tra Gunicorn​

Chạy máy chủ Django liên tục bằng nohup​

Cho đến nay, dịch vụ của Django không liên tục. Để làm cho dịch vụ liên tục, có hai phương pháp. Phương pháp đầu tiên liên quan đến việc sử dụng tiện ích nohup. nohup là lệnh POSIX có nghĩa là không cúp máy. Nó được sử dụng để thực thi các lệnh theo cách không dừng lại ngay cả khi người dùng đăng xuất.

Đảm bảo rằng bạn đã thoát khỏi máy chủ từ thiết bị đầu cuối bằng cách nhấn Ctrl + C.

Chạy lệnh sau để chạy máy chủ phát triển Django.
Mã:
(sample_proj) $ nohup python manage.py runserver 0.0.0.0:8000 &
Bây giờ, máy chủ Django của bạn sẽ tiếp tục chạy cho đến khi bạn tắt nó theo cách thủ công. Lệnh sẽ cung cấp cho bạn ID tiến trình và xuất ra một lệnh khác.
Mã:
[1] 42595
(sample_proj) $ nohup: ignoring input and appending output to 'nohup.out'
^C
Nhấn Ctrl + C để thoát. Máy chủ Django gốc sẽ tiếp tục chạy. Bạn có thể xác minh bằng cách mở URL trong trình duyệt của mình.

Sau khi hoàn tất, bạn cần phải kết thúc tiến trình. Lệnh nohup cung cấp cho bạn một ID tiến trình. Nhưng trên thực tế, có hai tiến trình đang được chạy. Để tìm ID cho cả hai tiến trình, hãy chạy lệnh sau.
Mã:
(sample_proj) $ ps aux | grep manage.py
navjot 153474 1.6 3.9 46264 39016 pts/0 S 04:15 0:00 python manage.py runserver 0.0.0.0:8000
navjot 153475 3.0 4.4 196060 43500 pts/0 Sl 04:15 0:00 /home/navjot/dj-sample/sample_proj/bin/python manage.py runserver 0.0.0.0:8000
navjot 153483 0.0 0.2 6420 2248 pts/0 S+ 04:15 0:00 grep --color=auto manage.py
Như bạn thấy, có hai tiến trình đang được chạy, một tiến trình có ID 153474 và tiến trình còn lại có ID 153475.

Chạy lệnh sau để tắt máy chủ bằng ID tiến trình bạn đã lấy được ở trên.
Mã:
(sample_proj) $ sudo kill -9 153474 153475

Cài đặt Gunicorn​

Phương pháp thứ hai để chạy máy chủ Django liên tục yêu cầu bạn cài đặt máy chủ web Gunicorn và Nginx. Gunicorn là máy chủ Python WSGI HTTP. Nó sẽ giao tiếp với ứng dụng Django và sau đó Nginx sẽ hoạt động như một proxy ngược cho Gunicorn. Phương pháp này có thêm lợi ích là cung cấp cho bạn tính bảo mật và hiệu suất đi kèm với việc sử dụng Nginx.

Cài đặt Gunicorn.
Mã:
(sample_proj) $ pip install gunicorn
Trước khi tiếp tục, chúng ta cần kiểm tra khả năng phục vụ dự án của Gunicorn. Chạy lệnh sau để chạy Gunicorn.
Mã:
(sample_proj) $ gunicorn --bind 0.0.0.0:8000 demoproject.wsgi:application
Điều này sẽ khởi động Gunicorn trên cùng một giao diện mà Django đang chạy. Để xác minh, hãy mở URL http://:8000 trong trình duyệt của bạn và bạn sẽ nhận được cùng một trang chủ Django. Điều này có nghĩa là Gunicorn đang chạy hoàn hảo.

Khi bạn hoàn tất quá trình kiểm tra, hãy nhấn Ctrl + C trên thiết bị đầu cuối để thoát Gunicorn.

Hủy kích hoạt môi trường ảo để quay lại shell thông thường của bạn.
Mã:
(sample_proj) $ deactivate

Bước 8 - Tạo tệp Socket và Dịch vụ cho Gunicorn​

Bước đầu tiên là tạo tệp socket Gunicorn. Socket Gunicorn sẽ được tạo khi khởi động và lắng nghe các kết nối. Khi có kết nối xảy ra, systemd sẽ tự động khởi động tiến trình Gunicorn để xử lý kết nối đó.

Tạo và mở tệp socket Gunicorn để chỉnh sửa.
Mã:
$ sudo nano /etc/systemd/system/gunicorn.socket
Dán mã sau vào nó.
Mã:
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Tiếp theo, tạo và mở tệp dịch vụ Gunicorn để chỉnh sửa.
Mã:
$ sudo nano /etc/systemd/system/gunicorn.service
Dán mã sau vào nó.
Mã:
[Unit]
Description=django gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=navjot
Group=nginx
WorkingDirectory=/home/navjot/dj-sample
ExecStart=/home/navjot/dj-sample/sample_proj/bin/gunicorn \ -t 3000 \ --access-logfile - \ --workers 3 \ --bind unix:/run/gunicorn.sock \ demoproject.wsgi:application -w 2
[Install]
WantedBy=multi-user.target
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc. Thay thế navjot bằng tên người dùng hệ thống của bạn. Nhóm nginx sẽ cho phép máy chủ Nginx giao tiếp với Django.

Tải lại daemon hệ thống để làm mới các tệp systemd.
Mã:
$ sudo systemctl daemon-reload
Kích hoạt và khởi động socket Gunicorn tập tin.
Mã:
$ sudo systemctl start gunicorn.socket
$ sudo systemctl enable gunicorn.socket
Kiểm tra trạng thái của ổ cắm Gunicorn.
Mã:
$ sudo systemctl status gunicorn.socket
Bạn sẽ nhận được một đầu ra.
Mã:
? gunicorn.socket - gunicorn socket Loaded: loaded (/etc/systemd/system/gunicorn.socket; enabled; vendor preset: disabled) Active: active (listening) since Thu 2022-10-13 04:19:28 UTC; 14s ago Until: Thu 2022-10-13 04:19:28 UTC; 14s ago Triggers: ? gunicorn.service Listen: /run/gunicorn.sock (Stream) CGroup: /system.slice/gunicorn.socket
Oct 13 04:19:28 django.nspeaks.xyz systemd[1]: Listening on gunicorn socket.
Dịch vụ Gunicorn vẫn không chạy như bạn có thể kiểm tra.
Mã:
$ sudo systemctl status gunicorn.service
? gunicorn.service - django gunicorn daemon Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled) Active: inactive (dead)
TriggeredBy: ? gunicorn.socket
Để kiểm tra cơ chế kích hoạt ổ cắm, hãy chạy lệnh sau lệnh.
Mã:
$ curl --unix-socket /run/gunicorn.sock localhost
Bạn sẽ nhận được đầu ra HTML của trang chủ Django trong thiết bị đầu cuối của mình. Điều này cũng khởi động Gunicorn để phục vụ ứng dụng. Kiểm tra lại trạng thái của dịch vụ và bạn sẽ thấy rằng nó đang chạy ngay bây giờ.
Mã:
$ sudo systemctl status gunicorn.service
? gunicorn.service - django gunicorn daemon Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: disabled) Active: active (running) since Thu 2022-10-13 06:13:55 UTC; 1min 34s ago
TriggeredBy: ? gunicorn.socket Main PID: 157742 (gunicorn) Tasks: 4 (limit: 5915) Memory: 96.2M CPU: 1.198s CGroup: /system.slice/gunicorn.service ??157742 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application -w 2 ??157746 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application -w 2 ??157747 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application -w 2 ??157748 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application -w 2
.......

Bước 9 - Cài đặt Nginx​

Bước cuối cùng là cài đặt và cấu hình Nginx. Rocky Linux đi kèm với phiên bản Nginx cũ hơn. Bạn cần tải xuống kho lưu trữ Nginx chính thức để cài đặt phiên bản mới nhất.

Tạo và mở tệp /etc/yum.repos.d/nginx.repo để tạo kho lưu trữ Nginx chính thức.
Mã:
$ sudo nano /etc/yum.repos.d/nginx.repo
Dán mã sau vào nó.
Mã:
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Cài đặt máy chủ Nginx.
Mã:
$ sudo dnf install nginx -y
Xác minh cài đặt.
Mã:
$ nginx -v
nginx version: nginx/1.22.1
Bật và khởi động máy chủ Nginx.
Mã:
$ sudo systemctl enable nginx --now
Kiểm tra trạng thái của server.
Mã:
$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2022-10-13 06:17:24 UTC; 1s ago Docs: http://nginx.org/en/docs/ Process: 157900 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS) Main PID: 157901 (nginx) Tasks: 2 (limit: 5915) Memory: 1.9M CPU: 18ms CGroup: /system.slice/nginx.service ??157901 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf" ??157902 "nginx: worker process"
Oct 13 06:17:24 django.example.com systemd[1]: Starting nginx - high performance web server...

Bước 10 - Cài đặt SSL​

Cho đến nay, ứng dụng Django của bạn đang được phục vụ qua kết nối HTTP dạng văn bản thuần túy. Bạn nên bảo vệ ứng dụng này thông qua chứng chỉ SSL. Để thực hiện việc này, hãy sử dụng công cụ Certbot bằng công cụ Snapd. Cần có kho lưu trữ EPEL để hoạt động.
Mã:
$ sudo dnf install epel-release
Chúng tôi sẽ sử dụng Snapd để cài đặt Certbot. Cài đặt Snapd.
Mã:
$ sudo dnf install snapd
Kích hoạt và khởi động dịch vụ Snap.
Mã:
$ sudo systemctl enable snapd.socket --now
Tạo các liên kết cần thiết cho Snapd tới làm việc.
Mã:
$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh
Cài đặt kho lưu trữ Snapd cốt lõi.
Mã:
$ sudo snap install core
$ sudo snap refresh core
Cài đặt Certbot.
Mã:
$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Tạo chứng chỉ. Lệnh sau cũng sẽ tự động cấu hình Nginx.
Mã:
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [emailprotected] -d django.example.com
Lệnh trên sẽ tải xuống chứng chỉ vào thư mục /etc/letsencrypt/live/django.example.com trên máy chủ của bạn.

Tạo nhóm Diffie-Hellman chứng chỉ.
Mã:
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Để kiểm tra xem quá trình gia hạn SSL có hoạt động tốt không, hãy chạy thử quy trình.
Mã:
$ sudo certbot renew --dry-run
Nếu không thấy lỗi nào, bạn đã hoàn tất. Chứng chỉ của bạn sẽ tự động gia hạn.

Bước 11 - Cấu hình Nginx​

Tạo và mở tệp /etc/nginx/conf.d/django-gunicorn.conf để chỉnh sửa.
Mã:
$ sudo nano /etc/nginx/conf.d/django-gunicorn.conf
Dán mã sau vào nó.
Mã:
# enforce HTTPS
server { listen 80 default_server; server_name django.example.com; return 301 https://$server_name$request_uri;
}
server { listen 443 ssl http2; server_name django.example.com; access_log /var/log/nginx/django.access.log; error_log /var/log/nginx/django.error.log; http2_push_preload on; # Enable HTTP/2 Server Push ssl_certificate /etc/letsencrypt/live/django.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/django.example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/django.example.com/chain.pem; ssl_session_timeout 1d; # Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC). ssl_protocols TLSv1.2 TLSv1.3; # Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to # prevent replay attacks. # # @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data ssl_early_data on; ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384'; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:50m; # OCSP Stapling --- # fetch OCSP records from URL in ssl_certificate and cache them ssl_stapling on; ssl_stapling_verify on; ssl_dhparam /etc/ssl/certs/dhparam.pem; add_header X-Early-Data $tls1_3_early_data; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/navjot/dj-sample; } location / { 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 $scheme; proxy_pass http://unix:/run/gunicorn.sock; }
}
# This block is useful for debugging TLS v1.3. Please feel free to remove this
# and use the `$ssl_early_data` variable exposed by NGINX directly should you
# wish to do so.
map $ssl_early_data $tls1_3_early_data { "~." $ssl_early_data; default "";
}
Thay thế vị trí gốc trong tệp trên bằng thư mục trên máy chủ của bạn.

Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Mở tệp /etc/nginx/nginx.conf để chỉnh sửa.
Mã:
$ sudo nano /etc/nginx/nginx.conf
Thêm dòng sau vào trước dòng include /etc/nginx/conf.d/*.conf;.
Mã:
server_names_hash_bucket_size 64;
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Xác minh Nginx của bạn cấu hình.
Mã:
$ sudo nginx -t
Nếu bạn không thấy lỗi nào, điều đó có nghĩa là bạn có thể tiếp tục.

Bạn cũng sẽ cần thêm tên miền vào lệnh ALLOWED_HOSTS của mình. Mở tệp settings.py.
Mã:
$ nano ~/dj-sample/demoproject/settings.py
Thay đổi giá trị cho ALLOWED_HOSTS biến.
Mã:
ALLOWED_HOSTS = ['','django.example.com']
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Khởi động lại Gunicorn Socket và Dịch vụ.
Mã:
$ sudo systemctl restart gunicorn.socket
$ sudo systemctl restart gunicorn.service
Tải lại máy chủ Nginx.
Mã:
$ sudo systemctl reload nginx
Mở cổng HTTP. Bạn cũng có thể xóa cổng 8000 nếu không sử dụng nữa.
Mã:
$ sudo firewall-cmd --remove-port=8000/tcp --permanent
$ sudo firewall-cmd --reload
Xác minh bằng cách mở URL http://django.example.com và trang chủ Django sẽ tải lên.

Kết luận​

Như vậy là kết thúc bài hướng dẫn của chúng tôi, trong đó bạn đã học cách cài đặt Django cùng với Gunicorn và Nginx trên máy chủ Rocky Linux 9. Bạn cũng đã cài đặt chứng chỉ SSL để tăng cường bảo mật cho dự án Django của mình. Nếu bạn có bất kỳ câu hỏi nào, hãy đăng chúng trong phần bình luận bên dưới.
 
Back
Bên trên