2012-03-06 19 views
11

Tôi đang cố gắng chạy hai dự án Django cùng một lúc. Tôi tình cờ sử dụng mod_wsgi và thấy trang web đang hoạt động lạ. Có lẽ sẽ có một cách giải quyết, nhưng tôi muốn biết những gì tôi đang thiếu và cách giải quyết vấn đề.Hai dự án Django chạy đồng thời và mod_wsgi hoạt động werid

Trong cấu hình apache

# Setup the Python environment 
# As root owns basically everything on a Amazon AMI and root 
# cannot be used. Create a folder under /var/run/wsgi 
# with the owner as ec2-user and group ec2-user. 
WSGISocketPrefix /var/run/wsgi 
# Call your daemon process a name 
WSGIDaemonProcess pydaemon processes=1 threads=5 
# Call your daemon process group a name 
WSGIProcessGroup pydaemon 
# Point to where the handler file is. This will be different 
# If you are using some other framework. 
WSGIScriptAlias /test /var/www/html/test/wsgi.py 
WSGIScriptAlias /proto /var/www/html/proto/wsgi.py 

Sau Apache khởi động lại, nếu tôi kết nối với '/ proto', sau đó trang web proto được hiển thị. Tuy nhiên, sau đó tôi kết nối với '/ test', mà không cần khởi động lại Apache, trang web proto vẫn được hiển thị và tôi không thể truy cập vào trang thử nghiệm.

Bây giờ tôi khởi động lại Apache, lần này tôi đi đến '/ test' trước. Các trang web thử nghiệm đi lên! Tuy nhiên, nếu tôi đi đến '/ proto' nó vẫn hiển thị trang web thử nghiệm, không phải trang web proto.

Điều gì có thể làm cho điều này xảy ra? Tôi đã thêm SESSION_COOKIE_PATH khác nhau cho mỗi ứng dụng chỉ trong trường hợp, nhưng vấn đề vẫn tồn tại.


[CẬP NHẬT]

Tôi cũng đã cố gắng như sau, để cung cấp cho tên nhóm ứng dụng WSGI khác nhau, nhưng không có may mắn.

Alias /cuedit /var/local/test/wsgi.py 
<Location /test> 
SetHandler wsgi-script 
Options +ExecCGI 
WSGIApplicationGroup test 
</Location> 
Alias /proto /var/local/proto/wsgi.py 
<Location /proto> 
SetHandler wsgi-script 
Options +ExecCGI 
WSGIApplicationGroup proto 
</Location> 

[CẬP NHẬT]

tôi đã thay đổi từ chế độ daemon sang chế độ nhúng. Tôi đoán vấn đề là hai trường hợp được chia sẻ cùng một quá trình daemon mod_wsgi để không gian tên của chúng va chạm nhau.

Tôi cho rằng chúng sẽ được xử lý đúng cách, nhưng ở chế độ daemon tôi không thể làm đúng.

+0

Vui lòng không đặt mã của bạn dưới '/ var/www/html'. –

+0

Và trong mỗi trường hợp tôi không tìm thấy lỗi trong nhật ký lỗi Apache, trong khi nhật ký truy cập hiển thị HTTP GET trên mỗi thư mục chính xác – MHC

+0

@DanielRoseman Bạn có ý định đặt các thư mục HTML bên ngoài không? – MHC

Trả lời

14

Sử dụng điều này như một cách giải quyết:

WSGIDaemonProcess pydaemon-1 processes=1 threads=5 
WSGIDaemonProcess pydaemon-2 processes=1 threads=5 

WSGIScriptAlias /test /var/www/html/test/wsgi.py 

<Location /test> 
WSGIProcessGroup pydaemon-1 
WSGIApplicationGroup %{GLOBAL} 
</Location> 

WSGIScriptAlias /proto /var/www/html/proto/wsgi.py 

<Location /proto> 
WSGIProcessGroup pydaemon-2 
WSGIApplicationGroup %{GLOBAL} 
</Location> 

Điều này sẽ buộc mỗi ứng dụng vào nhóm quá trình daemon riêng biệt và không có cách nào họ có thể can thiệp với nhau.

Nếu vẫn không hiệu quả, bạn có vấn đề với tệp kịch bản WSGI của bạn bằng cách nào đó.

+0

Chính xác những gì tôi hy vọng tôi có thể làm. Cảm ơn bạn rất nhiều! – MHC

+0

Đó là một giải pháp thay thế. Những gì bạn phải làm việc trừ khi WSGIApplicationGroup đã bị ghi đè theo một cách để buộc sử dụng thông dịch viên duy nhất. –

1

Sự cố có thể liên quan đến Apache chia sẻ trình thông dịch phụ Python giữa các ứng dụng WSGI. Thử thêm này để cấu hình Apache để tránh chia sẻ:

WSGIApplicationGroup %{GLOBAL} 

Kiểm tra this blog post cho sâu lời giải thích và lời khuyên bổ sung (kiểm tra các ý kiến ​​quá).

+1

Bạn chắc chắn không muốn điều này. Điều này sẽ buộc họ chạy trong cùng một, không tách biệt. Mặc định sẽ là 'WSGIApplicationGroup% {RESOURCE}' để giữ chúng tách biệt. Bài đăng trên blog cho thấy điều này để giải quyết một loại vấn đề khác. –

+0

Tôi đoán giải pháp của @Lycha có thể liên quan, bởi vì mặc dù% {GLOBAL} buộc chúng chạy giống nhau, nó cấm sử dụng trình thông dịch phụ, và nếu vấn đề nằm trong trình thông dịch phụ, nó có thể giải quyết được vấn đề. Thật không may,% {GLOBAL} đã không giải quyết được sự cố. – MHC

+0

@GrahamDumpleton Không phải% {GLOBAL} và% {RESOURCE} (mặc định) đã giải quyết được vấn đề, nhưng cảm ơn cả ý kiến! Bạn đã giúp tôi tìm hiểu thêm về mod_wsgi. – MHC

4

Tôi cũng có 2 dự án Django tuy nhiên mỗi người đang chạy trên một cổng khác (httpd config), nó trông giống như sau:

<VirtualHost *:80> 
    ServerAdmin xx 
    ServerName xx 
    ServerAlias xx 
    ErrorLog /path/to/first/project/logs/error.log 
    CustomLog /path/to/first/project/logs/access.log combined 

    Alias /static/ /path/to/first/project/sitestatic 

    WSGIDaemonProcess app processes=1 threads=15 display-name=%{GROUP} 
    WSGIProcessGroup app 

    WSGIScriptAlias//path/to/first/project/django.wsgi 

    <Directory /path/to/first/project/apache> 
     Order deny,allow 
     Allow from all 
    </Directory> 
</VirtualHost> 

<VirtualHost *:8080> 
    ServerAdmin xx 
    ServerName xx 
    ServerAlias xx 
    ErrorLog /path/to/second/project/logs/error.log 
    CustomLog /path/to/second/project/logs/access.log combined 

    WSGIDaemonProcess app1 processes=1 threads=15 display-name=%{GROUP} 
    WSGIProcessGroup app1 

    WSGIScriptAlias//path/to/second/project/apache/django.wsgi 

    <Directory /path/to/second/project/apache> 
     Order deny,allow 
     Allow from all 
    </Directory> 
</VirtualHost> 
+0

Cảm ơn bạn đã trả lời. Bất kỳ ý tưởng tại sao vấn đề xảy ra nếu tôi không sử dụng máy chủ ảo? – MHC

+0

Đây là câu trả lời được đánh giá thấp. Nó hoạt động hoàn hảo cho nhu cầu của tôi. –

0

Không thể nhận xét về câu trả lời được đưa ra bởi Graham, vì vậy hãy thêm một câu trả lời của riêng tôi.

Vấn đề đối với tôi thực sự là phiên dịch Python, nhưng tôi cũng phải thêm đường dẫn python cho mỗi trình thông dịch.Dưới đây là một cấu hình ví dụ:

WSGIDaemonProcess py_app1 processes=1 threads=5 python-path=/path/to/app1 
WSGIScriptAlias /app1 /path/to/app1/wsgi.py 
<Directory /path/to/app1> 
    <Files wsgi.py> 
     Order deny,allow 
     Allow from all 
    </Files> 
</Directory> 
<Location /app1> 
    WSGIProcessGroup py_app1 
    WSGIApplicationGroup %{GLOBAL} 
</Location> 

WSGIDaemonProcess py_app2 processes=1 threads=5 python-path=/path/to/app2 
WSGIScriptAlias /app2 /path/to/app2/wsgi.py 
<Directory /path/to/app2> 
    <Files wsgi.py> 
     Order deny,allow 
     Allow from all 
    </Files> 
</Directory> 
<Location /app2> 
    WSGIProcessGroup py_app2 
    WSGIApplicationGroup %{GLOBAL} 
</Location> 
Các vấn đề liên quan