Cách cung cấp các ứng dụng Django với Apache và mod_wsgi trên Ubuntu 16.04
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. 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 Django trong môi trường ảo Python. Sau đó,  ta  sẽ  cài đặt  Apache trước ứng dụng  của bạn  để nó có thể xử lý các yêu cầu của khách hàng trực tiếp trước khi chuyển các yêu cầu đòi hỏi logic ứng dụng đến ứng dụng Django.  Ta  sẽ thực hiện việc này bằng cách sử dụng module  mod_wsgi Apache có thể giao tiếp với Django thông qua đặc tả giao diện WSGI.
Yêu cầu và Mục tiêu
 Để hoàn thành hướng dẫn này, bạn nên có version   server  Ubuntu 16.04 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 Python. 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 ứng dụng  của bạn ,  ta  sẽ  cấu hình  Apache để giao diện với ứng dụng Django. Nó sẽ thực hiện điều này với module  mod_wsgi Apache, module  này có thể dịch các yêu cầu HTTP thành một định dạng ứng dụng có thể dự đoán được xác định bởi một đặc tả có tên là WSGI. Bạn có thể tìm hiểu thêm về WSGI bằng cách đọc phần được liên kết trên hướng dẫn này .
Bắt đầu nào.
Cài đặt Gói từ Kho lưu trữ Ubuntu
 Để 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  Ubuntu. Điều này sẽ bao gồm  web server  Apache, module  mod_wsgi được sử dụng để giao diện với ứng dụng Django của  ta  và pip , trình quản lý gói Python  được dùng  để  download  các công cụ liên quan đến Python của  ta .
Để có được mọi thứ ta cần, hãy cập nhật index gói local của server của bạn và sau đó cài đặt các gói thích hợp.
Nếu bạn đang sử dụng Django với Python 2 , các lệnh bạn cần là:
- sudo apt-get update 
- sudo apt-get install python-pip apache2 libapache2-mod-wsgi 
Thay vào đó, nếu bạn đang sử dụng Django với Python 3 , bạn  cần  một module  Apache và gói pip thay thế. Các lệnh thích hợp trong trường hợp này là:
- sudo apt-get update 
- sudo apt-get install python3-pip apache2 libapache2-mod-wsgi-py3 
Cấu hình môi trường ảo Python
Bây giờ ta có các thành phần từ repository Ubuntu, ta có thể bắt đầu làm việc với dự án Django của bạn . Bước đầu tiên là tạo một môi trường ảo Python để dự án Django của ta sẽ tách biệt với các công cụ của hệ thống và bất kỳ dự án Python nào khác mà ta có thể đang làm việc.
  Ta  cần cài đặt lệnh virtualenv để tạo các môi trường này.  Ta  có thể nhận được điều này bằng cách sử dụ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 một folder  mà bạn muốn giữ lại dự án  của bạn  và chuyển vào folder :
- 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 với version  local  của pip :
pip (không phải pip3 ).- pip install django 
Tạo và cấu hình một dự án Django mới
Bây giờ Django đã được cài đặt trong môi trường ảo của ta , 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 bằng editor của bạn:
- nano myproject/settings.py 
Ta sẽ sử dụng database SQLite mặc định trong hướng dẫn này vì mục đích đơn giản, vì vậy ta thực sự không cần phải thay đổi quá nhiều. Ta sẽ tập trung vào việc cấu hình các server được phép để hạn chế các domain mà ta phản hồi và cấu hình folder file tĩnh, nơi Django sẽ đặt các file tĩnh để web server có thể phục vụ chúng dễ dàng.
 Bắt đầu bằng cách tìm dòng ALLOWED_HOSTS . Bên trong dấu ngoặc vuông, hãy nhập địa chỉ IP công cộng, domain  của  server  của bạn hoặc cả hai. Mỗi giá trị phải được đặt trong dấu ngoặc kép và được phân tách bằng dấu phẩy giống như danh sách Python bình thường:
. . . ALLOWED_HOSTS = ["server_domain_or_IP"] . . . Ở cuối file ,  ta  sẽ thêm một dòng để cấu hình folder  này. Django sử dụng cài đặt STATIC_ROOT để xác định folder  chứa các file  này.  Ta  sẽ sử dụng một chút Python để yêu cầu nó sử dụng một folder  có tên là “static” trong folder  chính của dự án của  ta :
. . .  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 SQLite của bạn 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 sẽ được đặt trong một folder  được gọi là static trong folder  dự án của bạn.
Bây giờ, ta có thể điều chỉnh cài đặt firewall của bạn để cho phép lưu lượng truy cập vào server phát triển Django của ta , server mà ta sẽ chạy trên cổng 8000. Nếu bạn đã làm theo hướng dẫn cài đặt server ban đầu trong yêu cầu , bạn nên bật firewall UFW hiện tại.
Cho phép kết nối với server phát triển bằng lệnh :
- sudo ufw allow 8000 
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.
Hiện tại, ta đã hoàn tất với Django, vì vậy ta có thể thoát khỏi môi trường ảo của bạn bằng lệnh :
- deactivate 
Cấu hình Apache
 Bây giờ dự án Django của bạn đang hoạt động,  ta  có thể  cấu hình  Apache làm giao diện  user . Các kết nối client  mà nó nhận được sẽ được dịch sang định dạng WSGI mà ứng dụng Django mong đợi bằng cách sử dụng module  mod_wsgi . Điều này nên được tự động kích hoạt khi cài đặt trước đó.
Để cấu hình thẻ WSGI, ta cần chỉnh sửa file server ảo mặc định:
- sudo nano /etc/apache2/sites-available/000-default.conf 
Ta có thể giữ các chỉ thị đã có trong file . Ta chỉ cần thêm một số mục bổ sung.
 Để bắt đầu, hãy cấu hình các file  tĩnh.  Ta  sẽ sử dụng một alias  để yêu cầu Apache ánh xạ bất kỳ yêu cầu nào bắt đầu bằng /static đến folder  “static” trong folder  dự án của  ta .  Ta  đã thu thập các tài sản tĩnh ở đó trước đó.  Ta  sẽ  cài đặt  alias  và sau đó cấp quyền truy cập vào folder  được đề cập với một khối folder :
<VirtualHost *:80>     . . .      Alias /static /home/sammy/myproject/static     <Directory /home/sammy/myproject/static>         Require all granted     </Directory>  </VirtualHost> Tiếp theo,  ta  sẽ cấp quyền truy cập vào file  wsgi.py trong folder  dự án cấp hai nơi mã Django được lưu trữ. Để làm điều này,  ta  sẽ sử dụng phần folder  với phần file  bên trong.  Ta  sẽ cấp quyền truy cập vào file  bên trong cấu trúc lồng nhau này:
<VirtualHost *:80>     . . .      Alias /static /home/sammy/myproject/static     <Directory /home/sammy/myproject/static>         Require all granted     </Directory>      <Directory /home/sammy/myproject/myproject>         <Files wsgi.py>             Require all granted         </Files>     </Directory>  </VirtualHost> Sau khi phần này được  cấu hình ,  ta  đã sẵn sàng để xây dựng phần của file  thực sự xử lý thẻ WSGI.  Ta  sẽ sử dụng chế độ daemon để chạy quy trình WSGI, đây là cấu hình  được khuyến khích .  Ta  có thể sử dụng chỉ thị WSGIDaemonProcess để  cài đặt  điều này.
 Chỉ thị này có một tên tùy ý cho quy trình.  Ta  sẽ sử dụng myproject để duy trì sự nhất quán. Sau đó,  ta   cài đặt  trang chủ Python nơi Apache có thể tìm thấy tất cả các thành phần có thể được yêu cầu. Vì  ta  đã sử dụng một môi trường ảo,  ta  có thể trỏ nó trực tiếp đến folder  môi trường ảo cơ sở của  ta . Sau đó,  ta  đặt đường dẫn Python để trỏ đến cơ sở của dự án Django của  ta .
 Tiếp theo,  ta  cần chỉ định  group  quy trình. Này phải trỏ đến cùng tên  ta  chọn cho WSGIDaemonProcess chỉ thị ( myproject trong trường hợp của  ta ). Cuối cùng,  ta  cần đặt alias  tập lệnh để Apache sẽ chuyển các yêu cầu cho domain  root  đến file  wsgi.py :
<VirtualHost *:80>     . . .      Alias /static /home/sammy/myproject/static     <Directory /home/sammy/myproject/static>         Require all granted     </Directory>      <Directory /home/sammy/myproject/myproject>         <Files wsgi.py>             Require all granted         </Files>     </Directory>      WSGIDaemonProcess myproject python-home=/home/sammy/myproject/myprojectenv python-path=/home/sammy/myproject     WSGIProcessGroup myproject     WSGIScriptAlias / /home/sammy/myproject/myproject/wsgi.py  </VirtualHost> Khi bạn thực hiện xong những thay đổi này, hãy lưu file .
Tóm tắt một số vấn đề về quyền
Nếu bạn đang sử dụng database SQLite, được sử dụng mặc định trong bài viết này, bạn cần cho phép quá trình Apache truy cập vào file này.
 Để làm như vậy, bước đầu tiên là thay đổi quyền để chủ sở hữu  group  của database  có thể đọc và ghi. Tệp database  được gọi là db.sqlite3 theo mặc định và nó phải được đặt trong folder  dự án cơ sở của bạn:
- chmod 664 ~/myproject/db.sqlite3 
Sau đó,  ta  cần cung cấp cho Apache  group  chạy dưới, www-data group, quyền sở hữu  group  của file :
- sudo chown :www-data ~/myproject/db.sqlite3 
Để ghi vào file , ta cũng cần cấp quyền sở hữu group Apache đối với folder mẹ của database :
- sudo chown :www-data ~/myproject 
Ta cần phải điều chỉnh lại thông qua firewall của bạn . Ta không cần mở cổng 8000 nữa vì ta đang proxy thông qua Apache, vì vậy ta có thể loại bỏ luật đó. Sau đó, ta có thể thêm một ngoại lệ để cho phép lưu lượng truy cập vào tiến trình Apache :
- sudo ufw delete allow 8000 
- sudo ufw allow 'Apache Full' 
Kiểm tra các file Apache của bạn đảm bảo rằng bạn không mắc bất kỳ lỗi cú pháp nào:
- sudo apache2ctl configtest 
Miễn là dòng cuối cùng của kết quả trông giống như thế này, các file của bạn ở trạng thái tốt:
Output. . . Syntax OK Sau khi thực hiện xong các bước này, bạn đã sẵn sàng khởi động lại dịch vụ Apache để áp dụng các thay đổi bạn đã thực hiện. Khởi động lại Apache bằng lệnh :
- sudo systemctl restart apache2 
Đến đây bạn có thể truy cập trang Django của bạn bằng cách truy cập domain hoặc địa chỉ IP của server mà không cần chỉ định cổng. Trang web thông thường và giao diện quản trị sẽ hoạt động như mong đợi.
Bước tiếp theo
Sau khi xác minh ứng dụng của bạn có thể truy cập được, điều quan trọng là phải đảm bảo lưu lượng truy cập vào ứng dụng của bạn.
Nếu bạn có domain cho ứng dụng của bạn , cách dễ nhất để bảo mật ứng dụng của bạn là sử dụng certificate SSL miễn phí từ Let's Encrypt. Làm theo hướng dẫn Let's Encrypt cho Apache trên 16.04 để tìm hiểu cách cài đặt điều này.
Nếu bạn không có domain cho ứng dụng của bạn và đang sử dụng domain này cho mục đích của bạn hoặc để thử nghiệm, bạn luôn có thể tạo certificate tự ký. Bạn có thể tìm hiểu cách cài đặt điều này với hướng dẫn của ta về cách tạo certificate SSL tự ký cho Apache trên Ubuntu 16.04 .
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  Apache với mod_wsgi để xử lý các yêu cầu của khách hàng và giao diện với ứng dụng Django.
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 mã hóa kết nối Tomcat 8 với Apache hoặc Nginx trên Ubuntu 16.042016-04-29
Cách thiết lập server ảo Apache trên Ubuntu 16.04
2016-04-21
Cách tạo chứng chỉ SSL tự ký cho Apache trong Ubuntu 16.04
2016-04-21
Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 16.04
2016-04-21
Cách thiết lập Let's Encrypt chứng chỉ cho nhiều server ảo Apache trên Ubuntu 14.04
2016-01-19
Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 14.04
2015-12-18
Cách thiết lập server lưu lượng truy cập Apache làm Reverse-Proxy trên Ubuntu 14.04
2015-10-03
Cách thiết lập một cụm thụ động chủ động Apache bằng máy tạo nhịp tim trên CentOS 7
2015-09-08
Cách bảo vệ server Apache với Fail2Ban trên Ubuntu 14.04
2015-08-14
Cách cài đặt Apache Kafka trên Ubuntu 14.04
2015-08-12
 

