Cách triển khai ứng dụng Django:

Xin chào mọi người, đây là bài viết đầu tiên của tôi trong <» DesdeLinux (trong số một số thứ tôi có trong bản nháp xD), tôi hy vọng nó hữu ích với bạn 😀

Chà, trong công việc mới và hiện tại của tôi, tại thời điểm này, việc chuyển đổi một số hệ thống sang Django đang được thực hiện (sao lạ nhỉ ?? xD) và một trong những nhiệm vụ của tôi, ngoài phát triển, là đưa vào sản xuất những hệ thống này, sau đó là một người học việc giỏi, vì đây là lần đầu tiên tôi đưa một ứng dụng vào sản xuất trên một máy chủ thực: $ Tôi bắt đầu đọc tài liệu chính thức của từng gói yêu cầu của ngăn xếp (hơn tất cả là Gunicorn và Supervisord), và thấy rằng Hướng dẫn bằng tiếng Tây Ban Nha, họ không rõ ràng đối với tôi ở một số khía cạnh, tôi quyết định tạo một hướng dẫn nhỏ với các bước tôi làm theo để đưa ứng dụng vào sản xuất, dựa trên ngăn xếp Django, Gunicorn, Supervisord, Nginx và Postgresql.

Trong trường hợp tôi làm việc, các máy chủ vẫn đang chạy Debian Squeeze, nhưng hướng dẫn sẽ hoàn toàn hợp lệ cho các bản phân phối khác ... vì vậy hãy đi thẳng vào vấn đề và bắt đầu:

Tôi sẽ làm việc như một siêu người dùng. Trước hết, các gói sau được yêu cầu:

PIP -> Công cụ cài đặt và quản lý các gói cho Python
aptitude install python-pip

Nginx -> Máy chủ web (chúng tôi sẽ sử dụng nó làm proxy ngược và để lưu vào bộ đệm ẩn các tệp tĩnh 'img, js, css') Chúng tôi cài đặt nó bằng:
aptitude install nginx

Người giám sát -> Ứng dụng quản lý và giám sát ứng dụng của chúng tôi, mặc dù nó được sử dụng cho nhiều mục đích khác. Chúng tôi cài đặt nó với:
aptitude install supervisor

virtualenv -> Nó giúp chúng tôi tạo ra một môi trường thực thi ảo được cá nhân hóa cho ứng dụng của chúng tôi. Chúng tôi cài đặt nó với:
aptitude install python-virtualenv

bắp súng -> máy chủ web cho python (chúng tôi chưa cài đặt cái này)

Tôi cho rằng họ đã được cài đặt và định cấu hình postgresql

psychopg2 -> Trình kết nối Postgresql cho python (chúng tôi cũng sẽ không cài đặt nó)

Tạo môi trường ảo với virtualenv:

Đầu tiên, chúng tôi sẽ chuyển đến thư mục làm việc mà chúng tôi sẽ sử dụng để đưa vào sản xuất:
cd /var/www/

Sau đó, trong thư mục này, chúng tôi sẽ tạo môi trường ảo:
virtualenv ENV-nombreApp

Chúng tôi chuyển đến thư mục mà tôi vừa tạo virtualenv
cd ENV-nombreAPP

Chúng tôi sao chép ứng dụng trong thư mục này và bây giờ chúng tôi tiến hành kích hoạt môi trường với:
source bin/activate

Lời nhắc bây giờ sẽ giống như (ENV)usuario@host:

Điều này bây giờ sẽ làm cho mọi thứ chúng tôi làm được lưu trữ trong thư mục / var / www / ENV-appname / mà không ảnh hưởng đến các gói hệ thống

Bây giờ chúng ta chuyển đến thư mục ứng dụng:
cd nombreApp

Chúng tôi tiến hành cài đặt danh sách các phụ thuộc ứng dụng (nếu cần), trong đó chúng được chỉ định trong tệp Yêu cầu.txt:
pip install -r requirements.txt

Chúng tôi cũng có thể cài đặt các gói riêng lẻ, chẳng hạn như cài đặt trình kết nối của postgresql:
pip install psycopg2

Cài đặt và cấu hình GUnicorn:

Để cài đặt nó, chúng tôi thực hiện theo cách tương tự:
pip install gunicorn

Bây giờ chúng ta sẽ cấu hình nó, chúng ta sẽ tạo một tệp có tên là gunicorn-triển khai.py trong thư mục gốc của ứng dụng của chúng tôi, (mặc dù tên có thể là bất kỳ thứ gì) với nội dung sau:

bind = "127.0.0.1:8001" # dirección a donde accederá Nginx
logfile = "/var/www/logs/nombreApp/gunicorn.log" # dirección donde estarán los logs de la aplicación
workers = 1 # dependerá en medida de la carga de trabajo que tenga la aplicación, también depende del hardware con que se cuente
loglevel = 'info' # tipo de logging

Cấu hình giám sát viên:

Bây giờ chúng ta hãy thiết lập người giám sát, để chúng tôi tạo tệp cấu hình với

echo_supervisord_conf > /etc/supervisord.conf

Bây giờ chúng tôi chỉnh sửa tệp cấu hình:
vim /etc/supervisord.conf

Và chúng tôi bỏ ghi chú các dòng sau bằng cách xóa; (dấu chấm phẩy):

[unix_http_server] file = / tmp / supervisor.sock [supervisord] logfile = / var / log / supervisord.log logfile_maxbytes = 50MB logfile_backups = 10 loglevel = debug pidfile = / var / run / supervisord.pid nodaemon = false minfds = 1024 minprocs = 200 [rpcinterface: supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface: make_main_rpcinterface [supervisorctl] serverurl = unix: [program: appname] command = / var / www / ENV-appname / bin / django_unicorn -c / var / www / ENV -Appname / appname / gunicorn-deploy.py directory = / var / www / ENV-appname / appname / autostart = true autorestart = true user = Tên người dùng redirect_stderr = true stdout_logfile = / var / www / logs / appname / supervisord.log

Bây giờ chúng ta sẽ tạo tập lệnh để người giám sát bắt đầu với hệ thống, sau đó chúng ta sẽ tạo tệp:
vim /etc/init.d/supervisord

Và chúng tôi thêm nội dung sau:

 # Tự động bắt đầu Supervisord # # description: Tự động khởi động supervisord # processname: supervisord # pidfile: /var/run/supervisord.pid SUPERVISORD = / usr / local / bin / supervisord SUPERVISORCTL = / usr / local / bin / supervisorctl case $ 1 trong đầu) echo -n "Đang bắt đầu giám sát:" $ SUPERVISORD echo ;; stop) echo -n "Người giám sát đang dừng:" $ SUPERVISORCTL tắt tiếng vọng lại ;; khởi động lại) echo -n "Đang dừng người giám sát:" $ SUPERVISORCTL tắt máy echo echo -n "Đang khởi động trình giám sát:" $ SUPERVISORD echo ;; nó C

Và bây giờ chúng tôi cấp quyền thực thi cho tệp để tệp có thể khởi động cùng hệ thống:
sudo chmod +x /etc/init.d/supervisord

Chúng tôi cập nhật các liên kết để bắt đầu dịch vụ:
sudo update-rc.d supervisord defaults

Chúng tôi bắt đầu dịch vụ:
sudo /etc/init.d/supervisord start

Thiết lập nginx:

Bước này cũng khá đơn giản, chúng ta sẽ tạo tệp cấu hình sau của nginx cho ứng dụng của chúng tôi:

vim /etc/nginx/sites-enabled/nombreApp

Và chúng tôi sẽ bổ sung nội dung sau cho bạn

máy chủ {nghe 9001; # cổng nơi họ muốn nginx lắng nghe tên máy chủ www.domain.com; # hoặc 192.168.0.100, địa chỉ mà chúng tôi sẽ truy cập access_log /var/log/nginx/Appname.access.log; # nơi chúng tôi sẽ có vị trí nhật ký ứng dụng / {# nơi nginx sẽ gọi khi truy cập www.dominio.com/ proxy_pass http://127.0.0.1:8001; proxy_set_header Máy chủ lưu trữ $ http_host; } location / static / {# nơi nginx sẽ truy cập khi chúng ta nhập www.dominio.com/static/ alias / var / www / ENV-appname / appname / staticfiles /; }}

Và chúng tôi khởi động lại nginx:
service nginx restart

Thiết lập Django:

Hãy sửa đổi tệp cấu hình django:
vim nombreApp/settings.py

Chúng tôi tìm kiếm dòng nói rằng DEBUG = Đúng và chúng tôi thay đổi giá trị, còn lại DEBUG = Sai

Chúng tôi thêm các tham số DB:

DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql_psycopg2', # hoặc mysql hoặc bất cứ thứ gì họ đang sử dụng 'NAME': 'DBName', 'USER': 'DBUser', 'PASSWORD' : 'password DB', 'HOST': 'localhost', # hoặc cái họ cần 'PORT': '', # hoặc cái họ đang sử dụng}}

Chúng tôi tìm kiếm dòng ALLOWED_HOSTS = [] và chúng tôi thêm miền hoặc địa chỉ mà chúng tôi sẽ truy cập qua đó, để lại những thứ như ALLOWED_HOSTS = ['www.domain.com']

Chúng tôi định cấu hình thư mục cho các tệp tĩnh, chúng tôi tìm kiếm dòng cho biết STATIC_ROOT = ' ' và chúng tôi thay đổi giá trị, đặt đường dẫn tuyệt đối nơi chúng tôi muốn các tệp tĩnh của mình, trong trường hợp của tôi, tôi đã để nó ít nhiều như thế này STATIC_ROOT='/var/www/ENV-nombreApp/nombreApp/statics/'

Gần hoàn tất, chúng tôi thực hiện lệnh sau:
./manage.py collectstatic

Thao tác này sẽ tạo một thư mục với tên 'tĩnh trong đường dẫn mà chúng tôi chỉ định trong cài đặt ', đó là nơi chứa tất cả các tệp tĩnh của chúng ta.

Và cuối cùng, chúng tôi khởi động lại trình giám sát để thực hiện các thay đổi mới:
supervisorctl restart nombreApp

Và đó sẽ là tất cả, cuối cùng nó không phải là quá nhiều sự thật? nó có vẻ đơn giản với tôi 😀

Tôi hy vọng nó hữu ích cho bạn, xin chào 😉

Tài liệu GUnicorn

Tài liệu giám sát


Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.

  1.   f3niX dijo

    Tôi hiểu rằng không nên đặt ứng dụng Django trong thư mục gốc của thư mục máy chủ web (/ var / www)? Vì sự an toàn, tôi không biết mình có nhầm không.

    Chúc mừng.

    1.    uKh dijo

      Được rồi !!! Đó là điều mà tôi hoàn toàn không biết, tôi sẽ cập nhật mục nhập 😛 và ngay sau khi tôi trở lại vào thứ Hai, tôi sẽ thực hiện các thay đổi trong ứng dụng xD
      Cảm ơn

  2.   Rodrigo Bravo (goidor) dijo

    Epale anh em hướng dẫn tốt. Gần đây tôi cũng bị như vậy nhưng trong Debian 7, ít nhiều tôi phải tìm kiếm và đọc. Tôi khuyên bạn nên tạo môi trường ảo virtualenv trong nhà của người dùng trong một thư mục ẩn.

    Chúc mừng!

  3.   phục vụ fenriz dijo

    hahaha ctm hôm qua tôi có ghi lại Django và bạn đã đi qua thiên hà 999999 Chúc mừng các bạn xD

  4.   daniel2ac dijo

    Bài viết rất hay =) cách đây XNUMX tuần mình đã triển khai ứng dụng django nhưng mình đã làm với uwsgi và nginx, bạn có biết gunicorn có ưu điểm gì không? Tôi đã thấy nó được đề cập rất nhiều.
    Thật vui khi thấy django đang trở nên rất phổ biến, sự thật là framework tốt nhất mà tôi từng thấy =)

  5.   ozkar dijo

    Đối với STATIC_ROOT, điều tôi làm là xác định một biến toàn cục. Một cái gì đó như thế này:

    import os
    PROJECT_PATH = os.path.dirname(os.path.abspath(__file__))
    STATIC_ROOT = os.path.join(PROJECT_PATH, '../backend/static')

    Nơi phụ trợ là một ứng dụng mà tôi đã tạo. Bằng cách này, tôi đảm bảo rằng nơi tôi triển khai dự án, đường dẫn toàn cầu là giống nhau.

  6.   sgmart dijo

    Thật thú vị, tôi sẽ cố gắng trong tương lai.

    Nhân tiện, có ai biết Cách bật dấu và ký tự không phải ascii trong ứng dụng django không?

    Tôi đã tìm khắp mọi nơi, không có phương pháp nào sau đây phù hợp với tôi:
    sys.setdefaultencoding ('utf-8') # in sites.py

    # - * - mã hóa: utf-8 - * - # trong mọi tệp python

    Việc chỉnh sửa site.py và đặt utf-8 thay vì ascii được cho là hoạt động, nhưng $ file models.py thông báo cho tôi rằng tệp của tôi vẫn là ascii.

    Bất kỳ đề xuất?

    1.    sgmart dijo

      Nó đã làm việc!!!!

  7.   phim hoạt hình230 dijo

    hướng dẫn rất tốt nhưng bạn có thể thực hiện một trong cách tải ứng dụng của tôi lên máy chủ web đã được sản xuất không
    cảm ơn