2012-02-18 26 views
70

Tôi đã luôn sử dụng virtualenv để thử nghiệm ứng dụng của mình trong localhost vì tôi có môi trường bị cô lập và có thể thử nghiệm phát hành các gói mới một cách an toàn.Virtualenv có được khuyến nghị cho máy chủ sản xuất django không?

Bây giờ Đến lúc tôi phải triển khai ứng dụng của mình đến máy chủ sản xuất. Tôi tự hỏi nếu tôi cũng nên sử dụng virtualenv cho máy chủ sản xuất hoặc chỉ cần cài đặt bình thường nên làm. Vì đó là máy chủ sản xuất, tôi luôn có thể sử dụng đúng phiên bản mà tôi đã thử nghiệm trong máy chủ dev (dưới virtual-env)

+3

Lưu ý rằng tài liệu chính thức của Django đề cập đến việc sử dụng virtualenv trong sản xuất: https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/#using-a-virtualenv –

+0

Tôi đã đề xuất hướng dẫn này bằng @ bartek [Sự đơn giản đẹp của triển khai nginx và uWSGI] (http://bartek.im/blog/2012/07/08/simplicity-nginx-uwsgi-deployment.html) –

+0

Heroku đề xuất: https: // devcenter. heroku.com/articles/deploying-python –

Trả lời

42

Tôi sẽ làm theo cách đó nếu bạn nghĩ rằng bạn sẽ chạy nhiều hơn một dự án trên máy chủ web. Ngay sau khi bạn có hai dự án bạn chạy nguy cơ nâng cấp tương lai của bất kỳ gói python nào phá vỡ trang web khác.

+1

Điều này đặt ra câu hỏi liệu virtualenv có nên được sử dụng khi bạn biết rằng máy chủ này chỉ tồn tại để phục vụ một ứng dụng đơn lẻ hay không. –

+4

Bạn không thể đảm bảo rằng DevOps sẽ không cuộn thứ gì đó yêu cầu phụ thuộc vào Python. Nên tách biệt mọi lúc. –

9

Vâng, tôi nghĩ rằng bạn nên sử dụng virtualenv để triển khai nó vào sản xuất. Nó giúp mọi thứ trở nên dễ dàng hơn và sạch hơn cho bạn, đặc biệt nếu bạn có kế hoạch triển khai nhiều dịch vụ, ví dụ: django dựa trên các trang web hoặc các dự án python khác. Bạn không muốn mỗi người trong số họ gây ô nhiễm môi trường python toàn cầu với các gói của họ.

Tôi nghĩ virtualenv sẽ giúp bạn quản lý tất cả các phụ thuộc của bạn một cách sạch sẽ.

Để cập nhật env sản xuất của bạn tất cả các bạn cần phải làm là:

pip -r name_of_your_requirements_file.txt 

tôi sử dụng virtualenvs trong sản xuất, và bạn có thể sử dụng uWSGI để phục vụ cho các ứng dụng, với Cherokee như một máy chủ web.

Để sử dụng virtualenv của bạn trong sản xuất, bạn sẽ cần phải thêm đường dẫn của nó vào PYTHONPATH của bạn.

Ví dụ nếu env của bạn có đường dẫn "/ home/www/my_project/env /", con đường để thêm sẽ là:

/home/www/env/lib/python2.7/site-packages/ 

Bạn có thể thiết lập này bằng nhiều cách khác nhau, nhưng nếu bạn đang tạo FCGI hoặc giao diện uWSGI qua manage.py, chỉ cần thêm dòng sau ở đầu rất của manage.py của bạn (trước phần còn lại):

import os 
my_virtualenv_path = "/home/www/my_project/env/lib/python2.7/site-packages/" 
# Add it to your PYTHONPATH 
os.path.append(my_virtualenv_path) 

bạn có thể thích ứng này để thiết lập của bạn, chỉ trong trường hợp bạn cũng có thể làm như sau trong vỏ:

export PYTHONPATH:$PYTHONPATH:/home/www/my_project/env/lib/python2.7/site-packages/ 

Bạn cũng sẽ cần phải thêm thư mục chứa tệp settings.py của bạn vào PYTHONPATH, vì vậy Django sẽ có thể khám phá nó. Chỉ cần tiến hành một cách tương tự để làm như vậy.

14

Virtualenv có được đề xuất cho máy chủ sản xuất django không?

Có, nó làm cho dự án của bạn không phụ thuộc vào một số khía cạnh của môi trường hệ thống và cũng cho phép bạn thực hiện quy trình triển khai rõ ràng hơn và có thể định cấu hình được.

Tôi sử dụng vải, pip và virtualenv để triển khai tất cả các dự án Django của mình.

+0

Tôi không nghĩ rằng "không thể tin được" là từ mà bạn muốn (hệ thống không thể phụ thuộc vào dự án của bạn?). Ngôn ngữ được làm rõ. –

3

Trong hầu hết các trường hợp, tôi đồng ý tốt nhất là có virtualenv ngay cả khi có vẻ như bạn không cần nó khi bạn thiết lập máy chủ lần đầu tiên. Điều đó nói rằng nếu bạn đang sử dụng một số loại dịch vụ đám mây và quay lên máy chủ cho một nhiệm vụ cụ thể trong một thời gian ngắn sau đó tôi không thấy điểm của việc sử dụng một virtualenv.

0

Sử dụng vùng chứa Docker cho cả triển khai phát triển và sản xuất hiện nay khá phổ biến, vì vậy nếu bạn đang cân nhắc theo xu hướng này, bạn sẽ không cần virtualenv nữa.

Các vấn đề liên quan