Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Debian 8
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 Debian 8 để 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ó một version   server  Debian 8 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 Gói từ Kho Debian
 Để bắt đầu quá trình này,  ta  sẽ  download  và cài đặt tất cả các mục  ta  cần từ kho Debian.  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.
  Ta  cần cập nhật  index gói  apt local , sau đó  download  và cài đặt các gói. Các gói  ta  cài đặt phụ thuộc vào version  Python nào mà dự án của bạn sẽ sử dụng.
Nếu bạn đang sử dụng Python 2 , hãy nhập:
- 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 , hãy nhập:
- 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 file  phát triển Python cần thiết để xây dựng Gunicorn sau này, hệ thống database  Postgres và các thư viện cần thiết để tương tác với nó và  web server  Nginx.
Tạo Database và User PostgreSQL
Ta sẽ bắt đầu ngay lập tức và tạo database và user database cho ứng dụng Django của ta .
Theo mặc định, Postgres sử dụng một schemas xác thực được gọi là “xác thực ngang hàng” cho các kết nối local . Về cơ bản, điều này nghĩa là nếu tên user hệ điều hành của user trùng với tên user Postgres hợp lệ, user đó có thể đăng nhập mà không cần xác thực thêm.
 Trong quá trình cài đặt Postgres,  user  hệ điều hành có tên là postgres đã được tạo để tương ứng với  admin-user  PostgreSQL của postgres .  Ta  cần sử dụng  user  này để thực hiện  các việc  quản trị.  Ta  có thể sử dụng sudo và nhập tên  user  với tùy chọn -u .
Đăng nhập vào một phiên Postgres tương tác bằng lệnh :
- sudo -u postgres 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; 
OutputCREATE DATABASE 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'; 
OutputCREATE ROLE Tiếp theo, 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 :
- 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ờ, 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; 
OutputGRANT Khi bạn hoàn tất, hãy thoát khỏi dấu nhắc PostgreSQL bằng lệnh :
- \q 
Bạn sẽ được quay lại phiên shell của bạn .
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ị sẵn sàng phần còn lại của các yêu cầu dự án. 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 cái này bằng pip .
Nếu bạn đang sử dụng Python 2 , hãy nhập:
- sudo pip install virtualenv 
Nếu bạn đang sử dụng Python 3 , hãy nhập:
- sudo pip3 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 và di chuyển vào một folder  nơi  ta  có thể giữ các file  dự án  của bạn :
- 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 venv 
Thao tác này sẽ tạo một folder  có tên venv 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 venv/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 : ( venv ) 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 (không phải 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 ta , cách ly với các gói global của ta .
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. Bây giờ  ta  có thể bắt đầu một dự án Django trong folder  myproject của  ta . Thao tác này sẽ tạo một folder  con có cùng tên để chứa mã và sẽ tạo một tập lệnh quản lý trong folder  hiện tại:
 Lưu ý: Đảm bảo thêm dấu chấm ở cuối lệnh để điều này được  cài đặt  chính xác. Vì  ta  đã tạo một folder  dự án mẹ để chứa folder  môi trường ảo của  ta ,  ta  không muốn cấp folder  bổ sung sẽ được tạo nếu  ta  bỏ dấu chấm.
- django-admin.py startproject myproject . 
Cấu trúc folder 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 thấy ,  ta  có một folder  dự án mẹ chứa tập lệnh manage.py , một folder  dự án bên trong và venv mục môi trường ảo venv mà  ta  đã tạo trước đó.
Đ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/myproject/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 trắng các địa chỉ hoặc domain   được dùng  để kết nối với version  Django. Bất kỳ yêu cầu nào đến có tiêu đề  Server  lưu trữ không có trong danh sách này sẽ dẫn đến 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 . Nếu bạn muốn trả lời các yêu cầu về 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ã dưới đây, có một số ví dụ được comment được sử dụng để chứng minh cách chính xác để định dạng mục nhập:
. . . # 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 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  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_URL = '/static/' 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.
Lưu ý: Trước khi bạn thử server phát triển, hãy đảm bảo bạn đã mở cổng trong firewall của bạn .
 Nếu bạn đang chạy firewall  ufw , bạn có thể mở cổng thích hợp  bằng lệnh :
- sudo ufw allow 8000 
Nếu bạn đang chạy firewall  iptables , lệnh chính xác bạn cần tùy thuộc vào cấu hình firewall  hiện tại của bạn. Đối với 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 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  administrator  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 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, 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 
Tiền tố môi trường ảo phải được xóa khỏi dấu nhắc shell của bạn, cho biết rằng bạn không còn ở trong môi trường ảo nữa.
Tạo file dịch vụ hệ thống Gunicorn
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  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 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=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,  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=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 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 
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 lệnh :
- 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à đơn vị đang hoạt động.
 Đây cũng là thời điểm tốt để kiểm tra xem file  socket đã được tạo chưa. Nếu bạn liệt kê nội dung của folder  ~/ myproject , bạn sẽ thấy file  Unix socket:
- 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 , socket ở đó và www-data group có quyền sở hữu  group .
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.
 Bắt đầu bằng cách tạo và mở một khối  server  mới trong folder  sites-available của Nginx:
- sudo nano /etc/nginx/sites-available/myproject 
Bên trong, mở một khối server mới. 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  có thể yêu cầu Nginx bỏ qua lỗi nếu không tìm thấy 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/sammy/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ẽ bao gồm file  proxy_params tiêu chuẩn  có trong  cài đặt Nginx và sau đó  ta  sẽ chuyển lưu lượng truy cập đến socket mà quy trình Gunicorn của  ta  đã tạo:
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 file   khi bạn hoàn tất. Bây giờ,  ta  có thể kích hoạt file  bằng cách liên kết file  với folder  sites-enabled :
- sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled 
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 
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 lệnh :
- sudo systemctl restart nginx 
Lưu ý: Nếu bạn đã bật firewall , hãy điều chỉnh để loại bỏ cổng 8000 và cho phép truy cập bình thường vào cổng 80.
 Nếu bạn đang chạy firewall  ufw , bạn có thể mở cổng thích hợp  bằng lệnh :
- sudo ufw delete allow 8000 
- sudo ufw allow 'WWW' 
Nếu bạn đang chạy firewall  iptables , các lệnh chính xác bạn cần tùy thuộc vào cấu hình firewall  hiện tại của bạn. Đối với hầu hết các cấu hình , 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 
Đế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 mà không cần chỉ định cổng.
Sau khi cấu hình Nginx, bước tiếp theo phải đảm bảo lưu lượng truy cập vào server bằng SSL / TLS. Điều này rất quan trọng vì không có nó, tất cả thông tin, bao gồm cả password được gửi qua mạng ở dạng văn bản thuần túy.
Nếu bạn có domain , cách dễ nhất để có được certificate 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 để cài đặt Let's Encrypt with Nginx trên Debian 8 .
 Nếu bạn không có domain , bạn vẫn có thể bảo mật trang web  của bạn  để thử nghiệm và học hỏi bằng chứng chỉ SSL tự ký .
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 tạo chứng chỉ SSL tự ký cho Nginx trên Debian 82016-12-20
Cách bảo mật Nginx bằng Let's Encrypt trên Debian 8
2016-12-19
Cách tạo chuyển hướng tạm thời và vĩnh viễn với Nginx
2016-12-19
Cách cung cấp các ứng dụng Django với uWSGI và Nginx trên Debian 8
2016-12-19
Cách thêm module gzip vào Nginx trên Ubuntu 16.04
2016-12-02
Cơ sở hạ tầng SaltStack: Tạo Salt State cho web server Nginx
2016-11-07
Cách thêm module log vào Nginx trên Ubuntu 16.04
2016-10-31
Cách thêm module log vào Nginx trên CentOS 7
2016-10-31
Cách di chuyển web root Nginx đến vị trí mới trên Ubuntu 16.04
2016-07-29
Cách cấu hình Nginx làm web server và reverse-proxy (reverse proxy) cho Apache trên một server Ubuntu 16.04
2016-07-06
 

