Thứ tư, 18/03/2015 | 00:00 GMT+7

Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Ubuntu 14.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 . 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 Ubuntu 14.04 để 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 nên có version server Ubuntu 14.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. 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ừ 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. 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.

Đầu tiên, hãy cập nhật index gói local , sau đó download và cài đặt các gói:

sudo apt-get update sudo apt-get install python-pip python-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 .

Để làm việc với Postgres trong cấu hình mặc định của nó, 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 bằng lệnh :

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 ta 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:

Trang index  Django

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 :

Đăng nhập quản trị Django

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

Giao diện quản trị Django

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 tin khởi độ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 kịch bản Khởi động lại.

Tạo và mở file Upstart cho Gunicorn với các quyền sudo trong editor của bạn:

sudo nano /etc/init/gunicorn.conf 

Ta sẽ bắt đầu với một chuỗi mô tả đơn giản để nêu rõ file dịch vụ của ta dùng để làm gì. Sau đó, ta sẽ chuyển sang xác định các cấp chạy hệ thống nơi dịch vụ này sẽ được tự động khởi động. Các runlevel thông thường để chạy các dịch vụ là 2, 3, 4 và 5. Ta sẽ chạy dịch vụ của bạn khi hệ thống ở bất kỳ mức nào trong số đó. Ta sẽ yêu cầu nó dừng lại khi nó ở bất kỳ cấp độ chạy nào khác (chẳng hạn như khi hệ thống đang khởi động lại, tắt hoặc ở chế độ một user ):

description "Gunicorn application server handling myproject"  start on runlevel [2345] stop on runlevel [!2345] 

Tiếp theo, ta sẽ yêu cầu Upstart tự động khởi động lại dịch vụ nếu nó không thành công. Ta cũng muốn chỉ định user và group để điều hành. Ta sẽ sử dụng user bình thường của bạn vì tất cả các file của ta đều do user đó sở hữu. Ta sẽ để group www-data mà Nginx thuộc về chủ sở hữu group . Ta cũng cần thay đổi folder của dự án để các lệnh Gunicorn thực thi chính xác:

description "Gunicorn application server handling myproject"  start on runlevel [2345] stop on runlevel [!2345]  respawn setuid user setgid www-data chdir /home/user/myproject 

Bây giờ, ta chỉ cần đưa ra lệnh sẽ bắt đầu quá trình Gunicorn. Ta cần cung cấp đường dẫn đến file thực thi Gunicorn, file này được lưu trữ trong môi trường ảo của ta . Ta sẽ yêu cầu nó sử dụng socket Unix thay vì cổng mạng để giao tiếp với Nginx, vì cả hai dịch vụ sẽ chạy trên server này. Điều này an toàn hơn và nhanh hơn. Bạn cũng có thể thêm bất kỳ cấu hình nào khác cho Gunicorn tại đây. Ví dụ: ta sẽ chỉ định rằng ta muốn có 3 trình tự nhân viên:

description "Gunicorn application server handling myproject"  start on runlevel [2345] stop on runlevel [!2345]  respawn setuid user setgid www-data chdir /home/user/myproject  exec myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.wsgi:application 

Khi bạn hoàn tất, hãy lưu file .

Bắt đầu dịch vụ Gunicorn bằng lệnh :

sudo service gunicorn start 

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 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ẽ 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/user/myproject;     }      location / {         include proxy_params;         proxy_pass http://unix:/home/user/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 

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 service nginx restart 

Đế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 .

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.


Tags:

Các tin liên quan

Cách thiết lập Django với Postgres, Nginx và Gunicorn trên CentOS 7
2015-03-18
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 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 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 WordPress với Nginx trên server FreeBSD 10.1
2015-01-14
Cách cài đặt Nginx, MySQL và PHP (FEMP) trên 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