Cách thiết lập Django với Postgres, Nginx và Gunicorn trên CentOS 7
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 . Django bao gồm một server phát triển được đơn giản hóa để kiểm tra mã local của bạn, nhưng đối với bất kỳ thứ gì thậm chí liên quan đến production một chút, cần phải có một web server mạnh mẽ và an toàn hơn.Trong hướng dẫn này, ta sẽ trình bày cách cài đặt và cấu hình một số thành phần trên CentOS 7 để hỗ trợ và phục vụ các ứng dụng Django. Ta sẽ cài đặt database PostgreSQL thay vì sử dụng database SQLite mặc định. Ta sẽ cấu hình server ứng dụng Gunicorn để giao diện với các ứng dụng của ta . Sau đó, ta sẽ cài đặt Nginx để đảo ngược proxy cho Gunicorn, cấp cho ta quyền truy cập vào các tính năng bảo mật và hiệu suất của nó để phục vụ các ứng dụng của ta .
Yêu cầu và Mục tiêu
 Để hoàn thành hướng dẫn này, bạn phải có version   server  CentOS 7 mới với  user  không phải root có  quyền  sudo  cấu hình . Bạn có thể tìm hiểu cách  cài đặt  điều này bằng cách chạy qua hướng dẫn  cài đặt   server  ban đầu của  ta .
Ta sẽ cài đặt Django trong môi trường ảo. Việc cài đặt Django vào một môi trường dành riêng cho dự án của bạn sẽ cho phép các dự án của bạn và các yêu cầu của chúng được xử lý riêng biệt.
Khi ta đã cài đặt và chạy database và ứng dụng của bạn , ta sẽ cài đặt và cấu hình server ứng dụng Gunicorn. Điều này sẽ đóng role như một giao diện cho ứng dụng của ta , dịch các yêu cầu của khách hàng trong các cuộc gọi HTTP sang Python mà ứng dụng của ta có thể xử lý. Sau đó, ta sẽ cài đặt Nginx trước Gunicorn để tận dụng các cơ chế xử lý kết nối hiệu suất cao và các tính năng bảo mật dễ triển khai của nó.
Bắt đầu nào.
Cài đặt các Gói từ EPEL và Kho lưu trữ CentOS
 Để bắt đầu quá trình,  ta  sẽ  download  và cài đặt tất cả các mục  ta  cần từ repository  CentOS.  Ta  cũng  cần  sử dụng kho EPEL, nơi chứa các gói bổ sung không có trong repository  lưu trữ CentOS chính. Sau đó,  ta  sẽ sử dụng pip quản lý gói Python để cài đặt một số thành phần bổ sung.
Trước tiên, hãy kích hoạt kho EPEL để ta có thể lấy các thành phần ta cần:
sudo yum install epel-release Với repository mới có sẵn, ta có thể cài đặt tất cả các phần ta cần trong một lệnh:
sudo yum install python-pip python-devel postgresql-server postgresql-devel postgresql-contrib gcc nginx  Điều này sẽ cài đặt pip , trình quản lý gói Python. Nó cũng sẽ cài đặt hệ thống database  PostgreSQL và một số thư viện và file  khác mà  ta   cần  phải tương tác với nó và xây dựng dựa trên nó.  Ta  đã bao gồm trình biên dịch GCC để pip có thể xây dựng phần mềm và  ta  đã cài đặt Nginx để sử dụng làm Reverse Proxy  cho quá trình cài đặt của  ta .
Cài đặt PostgreSQL cho Django
Ta sẽ bắt đầu ngay và cài đặt PostgreSQL để cài đặt.
Cấu hình và khởi động PostgreSQL
Để bắt đầu, ta cần khởi tạo database PostgreSQL. Ta có thể làm điều đó bằng lệnh :
sudo postgresql-setup initdb Sau khi database đã được khởi tạo, ta có thể khởi động dịch vụ PostgreSQL bằng lệnh :
sudo systemctl start postgresql Khi database  khởi động,  ta  thực sự cần điều chỉnh các giá trị trong một trong các file  cấu hình đã được điền. Sử dụng  editor  và sudo để mở file  ngay bây giờ:
sudo nano /var/lib/pgsql/data/pg_hba.conf File này có nhiệm vụ cấu hình các phương thức xác thực cho hệ thống database . Hiện tại, nó được cấu hình để chỉ cho phép kết nối khi user hệ thống trùng với user database . Điều này là ổn đối với các việc bảo trì local , nhưng version Django của ta sẽ có một user khác được cấu hình bằng password .
  Ta  có thể cấu hình điều này bằng cách sửa đổi hai dòng host ở cuối file . Thay đổi cột cuối cùng (phương thức xác thực) thành md5 . Điều này sẽ cho phép xác thực password :
. . .  # TYPE  DATABASE        USER            ADDRESS                 METHOD  # "local" is for Unix domain socket connections only local   all             all                                     peer # IPv4 local connections: #host    all             all             127.0.0.1/32            ident host    all             all             127.0.0.1/32            md5 # IPv6 local connections: #host    all             all             ::1/128                 ident host    all             all             ::1/128                 md5 Khi bạn hoàn tất, hãy lưu file .
Với những thay đổi cấu hình mới của ta , ta cần khởi động lại dịch vụ. Ta cũng sẽ kích hoạt PostgreSQL để nó tự động khởi động khi server khởi động :
sudo systemctl restart postgresql sudo systemctl enable postgresql Tạo Database và User PostgreSQL
Bây giờ ta đã có PostgreSQL và chạy theo cách ta muốn, ta có thể tạo database và user database cho ứng dụng Django của ta .
 Để làm việc với Postgres local , cách tốt nhất là tạm thời thay đổi thành  user  hệ thống postgres . Làm điều đó ngay bây giờ  bằng lệnh :
sudo su - postgres Khi hoạt động  với quyền   user  postgres , bạn có thể đăng nhập ngay vào phiên tương tác PostgreSQL mà không cần xác thực thêm. Điều này là do dòng  ta  đã không thay đổi trong file  pg_hba.conf :
psql Bạn sẽ nhận được dấu nhắc PostgreSQL để ta có thể cài đặt các yêu cầu của bạn .
Đầu tiên, tạo database cho dự án của bạn:
CREATE DATABASE myproject; Mọi lệnh phải kết thúc bằng dấu chấm phẩy, vì vậy hãy kiểm tra xem lệnh của bạn có kết thúc bằng một nếu bạn đang gặp sự cố.
Tiếp theo, tạo một user database cho dự án của ta . Đảm bảo chọn một password an toàn:
CREATE USER myprojectuser WITH PASSWORD 'password'; 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 myproject 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 Bây giờ, thoát ra khỏi phiên shell của  user  postgres để quay lại phiên shell của  user  bình thường của bạn  bằng lệnh :
exit Tạo môi trường ảo Python cho dự án của bạn
Bây giờ ta đã có database của bạn , ta có thể bắt đầu chuẩn bị phần còn lại của các yêu cầu dự án của ta . Ta sẽ cài đặt các yêu cầu Python của bạn trong môi trường ảo để quản lý dễ dàng hơn.
 Để 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 điều này bằng pip :
sudo pip install virtualenv Với virtualenv được cài đặt,  ta  có thể bắt đầu hình thành dự án  của bạn . Tạo một folder  mà bạn muốn giữ dự án  của bạn  và chuyển vào folder  sau đó:
mkdir ~/myproject cd ~/myproject Trong folder dự án, hãy tạo một môi trường ảo Python bằng lệnh :
virtualenv myprojectenv Thao tác này sẽ tạo một folder  có tên myprojectenv trong folder  myproject của bạn. 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 myprojectenv/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 : ( myprojectenv ) user @ host :~/ myproject $ .
 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 :
pip install django gunicorn psycopg2 Tạo và cấu hình một dự án Django mới
Với các thành phần Python được cài đặt, ta có thể tạo các file dự án Django thực tế.
Tạo Dự án Django
Vì ta đã có folder dự án, ta sẽ yêu cầu Django cài đặt các file ở đây. Nó sẽ tạo một folder cấp hai với mã thực, điều này bình thường và đặt một tập lệnh quản lý vào folder này. Key của điều này là dấu chấm ở cuối yêu cầu Django tạo các file trong folder hiện tại:
django-admin.py startproject myproject . Điều chỉnh cài đặt dự án
Điều đầu tiên ta nên làm với các file dự án mới tạo của bạn là điều chỉnh cài đặt. Mở file cài đặt trong editor của bạn:
nano myproject/settings.py Bắt đầu bằng cách tìm phần 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ài đặt.
 Thay đổi cài đặt với thông tin database  PostgreSQL của bạn.  Ta  yêu cầu Django sử dụng bộ điều hợp psycopg2 mà  ta  đã cài đặt bằng pip .  Ta  cần cung cấp tên database , tên  user  database , password  của tên  user  database  và sau đó chỉ định rằng database  được đặt trên máy tính local . Bạn có thể để cài đặt PORT dưới dạng một chuỗi trống:
DATABASES = {     'default': {         'ENGINE': 'django.db.backends.postgresql_psycopg2',         'NAME': 'myproject',         'USER': 'myprojectuser',         'PASSWORD': 'password',         'HOST': 'localhost',         '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ở:
STATIC_ROOT = os.path.join(BASE_DIR, "static/") Lưu file khi bạn hoàn tất.
Hoàn thành cài đặt dự án ban đầu
Bây giờ, ta có thể di chuyển schemas database ban đầu sang database PostgreSQL của ta bằng cách sử dụng tập lệnh quản lý:
cd ~/myproject ./manage.py makemigrations ./manage.py migrate 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 Bạn sẽ phải xác nhận hoạt động. 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.
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 sau:
./manage.py runserver 0.0.0.0:8000 Trong  trình duyệt web , hãy truy cập vào domain  hoặc địa chỉ IP của  server , sau đó là :8000 :
http://server_domain_or_IP:8000 Bạn sẽ thấy trang index Django mặc định:
 Nếu bạn thêm /admin vào cuối URL trong thanh địa chỉ, bạn sẽ  được yêu cầu  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 giao diện quản trị Django mặc định:
Khi bạn khám phá xong, hãy nhấn CTRL-C trong cửa sổ terminal để tắt server phát triển.
Kiểm tra khả năng phục vụ dự án của Gunicorn
Điều cuối cùng ta muốn làm trước khi rời khỏi môi trường ảo của bạn 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 một cách dễ dàng bằng lệnh :
cd ~/myproject gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application 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 về nội dung 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, là điểm vào ứng dụng của  ta , sử dụng cú pháp module  của Python. Bên trong file  này, một chức năng đượ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 đ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 đã hoàn tất việc cấu hình ứng dụng Django của bạn . Ta có thể thoát khỏi môi trường ảo của bạn bằng lệnh :
deactivate Tạo file dịch vụ Gunicorn Systemd
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 một file dịch vụ Systemd.
 Tạo và mở file  dịch vụ Systemd cho Gunicorn với các  quyền  sudo trong editor  của bạn:
sudo nano /etc/systemd/system/gunicorn.service Bắt đầu với phần [Unit] , được sử dụng để 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:
[Unit] Description=gunicorn daemon 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   user  Nginx để nó 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 nó với một socket Unix trong folder 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 so với sử dụng cổng mạng. Ta 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ụ: ta đã chỉ định 3 quy trình công nhân trong trường hợp này:
[Unit] Description=gunicorn daemon After=network.target  [Service] User=user Group=nginx WorkingDirectory=/home/user/myproject ExecStart=/home/user/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.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:
[Unit] Description=gunicorn daemon After=network.target  [Service] User=user Group=nginx WorkingDirectory=/home/user/myproject ExecStart=/home/user/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.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ể bắt đầu dịch vụ Gunicorn mà ta đã tạo và kích hoạt nó để nó bắt đầu khi server khởi động :
sudo systemctl start gunicorn sudo systemctl enable gunicorn Cấu hình Nginx thành Proxy Pass tới Gunicorn
Bây giờ Gunicorn đã được cài đặt , ta cần cấu hình Nginx để chuyển lưu lượng truy cập vào quy trình.
Sửa đổi file cấu hình Nginx
Ta có thể tiếp tục và sửa đổi cấu hình khối server bằng cách chỉnh sửa file cấu hình Nginx chính:
sudo nano /etc/nginx/nginx.conf Bên trong, mở một khối server mới ngay phía trên khối server đã có mặt:
http {     . . .      include /etc/nginx/conf.d/*.conf;      server {     }      server {         listen 80 default_server;          . . . Ta sẽ đặt tất cả cấu hình cho ứng dụng Django của ta bên trong khối mới này. Ta sẽ bắt đầu bằng cách chỉ định rằng khối này sẽ lắng nghe trên cổng thông thường 80 và nó sẽ phản hồi với domain hoặc địa chỉ IP của server của ta :
server {     listen 80;     server_name server_domain_or_IP; } Tiếp theo,  ta  sẽ yêu cầu Nginx bỏ qua bất kỳ vấn đề nào với việc tìm biểu tượng yêu thích.  Ta  cũng sẽ cho nó biết nơi tìm các tài sản tĩnh mà  ta  đã thu thập trong folder  ~/ myproject /static của  ta . Tất cả các file  này đều có tiền tố URI tiêu chuẩn là “/ static”, vì vậy  ta  có thể tạo khối vị trí để  trùng với  các yêu cầu đó:
server {     listen 80;     server_name server_domain_or_IP;      location = /favicon.ico { access_log off; log_not_found off; }     location /static/ {         root /home/user/myproject;     } } Cuối cùng,  ta  sẽ tạo khối location / {} để  trùng với  tất cả các yêu cầu khác. Bên trong vị trí này,  ta  sẽ đặt một số tiêu đề HTTP proxy tiêu chuẩn để Gunicorn có thể có một số thông tin về kết nối client  từ xa. Sau đó,  ta  sẽ chuyển lưu lượng đến socket mà  ta  đã chỉ định trong file  đơn vị Gunicorn Systemd của  ta :
server {     listen 80;     server_name server_domain_or_IP;      location = /favicon.ico { access_log off; log_not_found off; }     location /static/ {         root /home/user/myproject;     }      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:/home/user/myproject/myproject.sock;     } } Lưu file khi bạn hoàn tất.
Điều chỉnh quyền và thành viên group
  User  nginx phải có quyền truy cập vào folder  ứng dụng của  ta  để nó có thể phục vụ các file  tĩnh, truy cập file  socket, v.v. CentOS khóa rất hạn chế folder  chính của mỗi  user , vì vậy  ta  sẽ thêm  user  nginx vào  group   user  của  ta  để  ta  có thể sau đó mở các quyền tối thiểu cần thiết để làm cho nó hoạt động.
 Thêm  user  nginx vào  group  của bạn bằng lệnh sau. Thay thế tên  user   của bạn  cho user trong lệnh:
sudo usermod -a -G user nginx Bây giờ, ta có thể cấp quyền thực thi cho group user trên folder chính của ta . Điều này sẽ cho phép tiến trình Nginx nhập và truy cập nội dung bên trong:
chmod 710 /home/user Với các quyền được cài đặt , ta có thể kiểm tra file cấu hình Nginx của bạn để tìm lỗi cú pháp:
sudo nginx -t Nếu không có lỗi nào, hãy khởi động lại dịch vụ Nginx bằng lệnh :
sudo systemctl start nginx Yêu cầu hệ thống init khởi động server Nginx khi khởi động bằng lệnh :
sudo systemctl enable nginx Đến đây bạn sẽ có quyền truy cập vào ứng dụng Django của bạn trong trình duyệt qua domain hoặc địa chỉ IP của server mà không cần chỉ định cổng.
Kết luận
Trong hướng dẫn này, ta đã cài đặt một dự án Django trong môi trường ảo của riêng nó. Ta đã 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 đó, ta cài đặt Nginx hoạt động như một Reverse Proxy để xử lý các kết nối của client và phục vụ đúng dự án tùy thuộc vào yêu cầu của khách hàng.
Django làm cho việc tạo các dự án và ứng dụng trở nên đơn giản bằng cách cung cấp nhiều phần chung, 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 server duy nhất.
Các tin liên quan
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Ubuntu 14.042015-03-18
Cách thiết lập uWSGI và Nginx để cung cấp các ứng dụng Python trên CentOS 7
2015-03-13
Cách cung cấp các ứng dụng Django với uWSGI và Nginx trên CentOS 7
2015-03-13
Cách cung cấp các ứng dụng Django với uWSGI và Nginx trên Ubuntu 14.04
2015-03-11
Cách thiết lập uWSGI và Nginx để cung cấp các ứng dụng Python trên Ubuntu 14.04
2015-03-06
Cách nhắm mục tiêu người dùng của bạn với Nginx Analytics và Thử nghiệm A / B
2015-01-26
Cách cài đặt Nginx, MySQL và PHP (FEMP) trên FreeBSD 10.1
2015-01-14
Cách cài đặt WordPress với Nginx trên server FreeBSD 10.1
2015-01-14
Hiểu và triển khai FastCGI Proxying trong Nginx
2014-12-08
Hiểu về Nginx HTTP Proxying, Cân bằng tải, Bộ đệm và Bộ nhớ đệm
2014-11-25
 

