2011-07-06 31 views
39

Tôi đang cố gắng để có được hai (hoặc nhiều hơn) các ứng dụng Django thiết lập tại thư mục con dưới cùng một tên miền, ví dụ:Nhiều ứng dụng mod_wsgi trên một máy chủ ảo chỉ đạo để sai ứng dụng

http://example.com/site1/ 
http://example.com/site2/ 

Tôi biết rằng bình thường này hoạt động tốt bằng cách thiết lập một apache VirtualHost như thế này:

<VirtualHost *:80> 
    ... 
    WSGIScriptAlias /site1 /path/to/site1.wsgi 
    WSGIScriptAlias /site2 /path/to/site2.wsgi 
</VirtualHost> 

Bây giờ, tôi đã xác minh rằng mỗi trang web làm việc riêng rẽ. Nhưng khi tôi cố gắng chạy cả hai side-by-side, apache gửi cho tôi đến bất kỳ trang web nào quy trình công nhân được tải trước. Ví dụ:

  1. Khởi động lại apache cấu hình để phục vụ cho 6 bài
  2. tải example.com/site1/, có được đúng trang
  3. tải example.com/site2/, có được đúng trang
  4. Lặp lại 2 và 3 2 lần nữa.
  5. Làm mới example.com/site1/ nhiều lần, xem chu kỳ từ trang này đến trang khác.

Có hiệu quả, đối với bất kỳ số lượng quy trình công nhân cụ thể nào, nó sẽ chuyển qua tổng số họ gửi yêu cầu đến bất kỳ số nào nó truy cập đầu tiên bất kể chỉ thị WSGIScriptAlias. Không có vấn đề gì tôi làm (thiết lập WSGIProcessGroup, chế độ daemon so với chế độ nhúng, hoặc chỉ thị) nó tiếp tục thể hiện hành vi này.

Nếu có ai có thể chỉ ra những gì tôi đang làm sai ở đây, đó sẽ là hiện tượng!

+0

gì bạn nhận được khi bạn thay thế các tập tin WSGI kịch bản với điều đó được mô tả trong 'http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Sub_Interpreter_Being_Used'? –

Trả lời

48

Tôi đã có nhiều ứng dụng WSGI chạy trên một cài đặt Apache, và thấy rằng điều dễ nhất cần làm là chỉ có nhiều nhóm quá trình-- một cho mỗi ứng dụng.

Một nhược điểm, so với thực sự cố gắng để có được một quy trình duy nhất để chạy cả hai (hoặc nhiều hơn) ứng dụng, là điều này có thể sử dụng bộ nhớ ít hơn một chút so với bạn có thể lấy đi bằng cách khác. Nhưng nó giữ chúng khá tách biệt và tránh rắc rối. Và đó có thể không phải là một mối quan tâm cho bạn (nó không phải dành cho tôi).

(Có thể không tệ đến nỗi họ có thể chia sẻ nhiều trang văn bản? Đó chỉ là suy đoán nhàn rỗi; Tôi chưa xác minh điều này theo bất kỳ cách nào vì thiết lập của tôi không bị bỏ đói)

Dưới đây là một số câu liên quan httpd.conf của tôi, khoảng: Câu trả lời

WSGIDaemonProcess khdx_wsgi user=galdosd group=galdosd maximum-requests=10000 
WSGIScriptAlias /khdx /home/galdosd/khdxweb/rel/khdx/apache/django.wsgi 
<Location /khdx> 
WSGIProcessGroup khdx_wsgi 
</Location> 

WSGIDaemonProcess sauron_wsgi user=galdosd group=galdosd maximum-requests=10000 
WSGIScriptAlias /sauron /home/galdosd/finalsauronweb/django-root/apache/django.wsgi 
<Location /sauron> 
WSGIProcessGroup sauron_wsgi 
</Location> 
+3

Sử dụng các yêu cầu tối đa được khuyến khích cho các trang web sản xuất trừ khi bạn thực sự có một rò rỉ bộ nhớ làm tê liệt bạn không thể sửa chữa ngay lập tức. –

+1

Tuyệt vời! Các nhóm quy trình riêng được xác định bên trong khối Vị trí hoạt động. Niềm tiếc duy nhất của tôi là tôi đã không hỏi ở đây sớm hơn ;-) –

+0

Cảm ơn, Graham! Đó có phải là do sự chậm trễ khởi động không thường xuyên không? –

1

Tôi đã gặp sự cố với chính điều này. Thay vì cố gắng để có được cấu hình Apache đúng, tôi quyết định thay vì sử dụng một WSGIScriptAlias ​​đơn lẻ và có phần mềm trung gian WSGI để định tuyến các yêu cầu đến các ứng dụng chính xác. Mã của tôi là https://github.com/zhemao/flotilla. Tôi đã không thử nghiệm nó nhiều, vì vậy sử dụng nó một cách thận trọng, nhưng tôi hy vọng nó sẽ giúp.

+1

Bạn không thể làm điều đó với hai trang web Django khác biệt vì sự phụ thuộc của Django vào biến môi trường đơn DJANGO_SETTINGS_MODULE, giá trị không thể thay đổi từ yêu cầu này sang yêu cầu tiếp theo. –

+0

Ồ đúng, quên mất điều đó. –

10

Domingo Ignacio của thiết cho tôi đi đúng hướng. Tôi muốn chỉ ra một thực tế quan trọng về việc làm cho nó hoạt động: Hai nhóm quá trình phải nằm trong cùng một VirtualHost. (Điều này dựa trên các thử nghiệm của tôi với Ubuntu 12.04.3 LTS, Apache 2.2.22 và một vài ứng dụng WSGI được viết bằng Python.)

Ví dụ, điều này đã làm không làm việc cho tôi, dẫn đến khả năng truy cập app1 nhưng một lỗi 404 cho app2:

<VirtualHost *> 
     WSGIDaemonProcess app1 user=someuser group=somegroup threads=5 
     WSGIScriptAlias /app1 /app1/app1.wsgi 

     <Location /app1> 
       WSGIProcessGroup app1 
     </Location> 
</VirtualHost> 

<VirtualHost *> 
     WSGIDaemonProcess app2 user=someuser group=somegroup threads=5 
     WSGIScriptAlias /app2 /app2/app2.wsgi 

     <Location /app2> 
       WSGIProcessGroup app2 
     </Location> 
</VirtualHost> 

Loại bỏ giữa và thẻ, để có một đĩa đơn VirtualHost, giải quyết vấn đề:

<VirtualHost *> 
     WSGIDaemonProcess app1 user=someuser group=somegroup threads=5 
     WSGIScriptAlias /app1 /app1/app1.wsgi 

     <Location /app1> 
       WSGIProcessGroup app1 
     </Location> 

     WSGIDaemonProcess app2 user=someuser group=somegroup threads=5 
     WSGIScriptAlias /app2 /app2/app2.wsgi 

     <Location /app2> 
       WSGIProcessGroup app2 
     </Location> 
</VirtualHost> 
Các vấn đề liên quan