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 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.
Đượ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
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!
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
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 =)
Đố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.
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?
Nó đã làm việc!!!!
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