2012-09-02 17 views
6

Làm cách nào để triển khai một ứng dụng Django trên OS X Server 2.0 mà không cần sử dụng homebrew hoặc một hương vị khác của python so với ứng dụng được vận chuyển với OS X 10.8.1? Tôi đang sử dụng các ràng buộc cacao trong một ứng dụng Django và gặp khó khăn khi làm việc với homebrew trên máy tính để bàn của tôi (chạy OS X 10.8.1); do đó yêu cầu triển khai ứng dụng trên phiên bản hệ thống đã cài đặt của Python.Làm thế nào để triển khai một ứng dụng django trên OS X Server?

Tôi có môi trường OS X Server sau, với những điều sau đây đã được cài đặt:

  • OS X 10.8.1
  • OS X Server 2.0
  • Python 2.7.2
  • Apache 2.2. 22

Django 1.4.1 được cài đặt bằng lệnh sau:

sudo easy_install django 

Nỗ lực đầu tiên của tôi là triển khai một trang web trống và một khi thành công, triển khai một ứng dụng thực tế được sử dụng trong sản xuất. Dự án được tạo tại /Library/Server/Web/Data/WebApps/mysite/ bằng cách sử dụng lệnh sau

django-admin.py startproject mysite 

Tôi đã chạy ứng dụng bằng lệnh sau đây. Nó chỉ đơn giản xác nhận rằng ứng dụng đã được thiết lập và đang chạy. Nó là tiêu chuẩn "Nó hoạt động!" trang khi bạn tạo dự án lần đầu tiên.

python manage.py runserver 8080 

sau đó tôi đã tạo ra một tập tin /Library/Server/Web/Config/apache2/httpd_mysite.conf với nội dung sau:

WSGIScriptAlias /mysite /Library/Server/Web/Data/WebApps/mysite/mysite/wsgi.py 

tôi tiếp tục tạo ra một tập tin /Library/Server/Web/Config/apache2/webapps/com.example.mysite.wsgi.plist với nội dung sau:

<?xml version="1.0" encoding="UTF-7"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
     <key>name</key> 
     <string>com.example.mysite.wsgi</string> 
     <key>displayName</key> 
     <string>Python "My Site" app</string> 
     <key>launchKeys</key> 
     <array/> 
     <key>proxies</key> 
     <dict/> 
     <key>installationIndicatorFilePath</key> 
     <string>/Library/Server/Web/Data/WebApps/mysite/mysite/wsgi.py</string> 
     <key>includeFiles</key> 
     <array> 
       <string>/Library/Server/Web/Config/apache2/httpd_mysite.conf</string> 
     </array> 
     <key>requiredModuleNames</key> 
     <array> 
       <string>wsgi_module</string> 
     </array> 
</dict> 
</plist> 

File com.example.mysite.wsgi.plist được chuyển thể từ com.apple.webapp.wsgi.plisthttpd_mysite.conf được điều chỉnh từ httpd_wsgi.conf. Cả hai tệp này được sử dụng để chạy ứng dụng python "độc lập" thành công khi được định cấu hình thông qua trình quản lý máy chủ.

Sau đó, tôi đã tạo trang web có trình quản lý máy chủ, xác nhận ứng dụng của tôi nằm trong danh sách ứng dụng web. Tuy nhiên, khi tôi truy cập http://example.com/mysite tôi nhận được lỗi 500. Các bản ghi có các mục sau (địa chỉ IP thay đổi để 1.2.3.4 vì lý do riêng tư):

[Sat Sep 01 21:49:17 2012] [warn] Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366) 
[Sat Sep 01 21:49:17 2012] [notice] Apache/2.2.22 (Unix) PHP/5.3.13 with Suhosin-Patch mod_wsgi/3.3 Python/2.7.2 mod_fastcgi/2.4.6 mod_ssl/2.2.22 OpenSSL/0.9.8r DAV/2 configured -- resuming normal operations 
[Sat Sep 01 21:50:13 2012] [error] [client 1.2.3.4] (8)Exec format error: exec of '/Library/Server/Web/Data/WebApps/mysite/mysite/wsgi.py' failed 
[Sat Sep 01 21:50:13 2012] [error] [client 1.2.3.4] Premature end of script headers: wsgi.py 

Nó dường như không phải là module WSGI là xử lý các yêu cầu, nhưng thay vào đó, các yêu cầu có thể được xử lý bằng FCGI . Tuy nhiên, nhật ký chỉ ra rằng mod_wsgi/3.3 đã được tải.

Khi tôi tạo ra một ứng dụng Python tiêu chuẩn mà trông như sau:

def application(environ, start_response): 
    status = '200 OK' 
    output = 'Hello World!' 

    response_headers = [('Content-type', 'text/plain'), 
         ('Content-Length', str(len(output)))] 
    start_response(status, response_headers) 

    return [output] 

Và cập nhật các tập tin để trỏ đến /Library/Server/Web/Data/WebApps/helloworld.wsgi hơn /Library/Server/Web/Data/WebApps/mysite/mysite/wsgi.py sau đó "Hello World" được hiển thị. Do đó, tôi giả định rằng wsgi được cấu hình đúng và có thể thực hiện các ứng dụng và điều gì đó khác là sai với thiết lập của tôi.

Trả lời

0

Một số cấu hình với distro Apache map py hoặc là CGI hoặc FastCGI và điều này sẽ mâu thuẫn với mod_wsgi. Đây là lý do tại sao mod_wsgi đề xuất sử dụng phần mở rộng .wsgi. Vì vậy, đổi tên 'wsgi.py' thành 'site.wsgi' và sau đó sử dụng 'site.wsgi' trong WSGIScriptAlias.

BTW, bạn có thể xác nhận rằng có một mod_wsgi.so được biên dịch sẵn được cung cấp cùng với máy chủ Mountain Lion.

+0

Nó được cài đặt tại '/ Applications/Server.app/Contents/ServerRoot/usr/libexec/apache2/mod_wsgi.so' – bloudraak

+0

Bạn đã chính xác, đổi tên' wsgi.py' thành 'mysite.wsgi' được gọi' mod_wsgi'. Tôi chạy vào các vấn đề khác đã được giải quyết bằng cách thêm các đường dẫn bằng cách sử dụng 'sys.path.append' trong' mysite.wsgi' như được mô tả trong [câu trả lời này] (http: // stackoverflow.com/questions/2587251/configuration-problems-with-django-và-mod-wsgi). Cảm ơn. – bloudraak

-1

Hai điều:

  1. Nếu bạn muốn sử dụng WSGIScriptAlias ​​chỉ thị bạn cần phải có mod_wsgi apache module. Tôi không có máy chủ OS X nhưng theo tôi có thể thấy mô-đun không tồn tại trong thư mục/usr/libexec/apache2 trên tiêu chuẩn sư tử núi. Bạn sẽ phải tải xuống từ here. Không biết liệu các công cụ dòng lệnh có được bao gồm trong máy chủ OS X hay không. Tôi cần phải cài đặt mã X để có được chúng trên phiên bản tiêu chuẩn. Dường như có một số instruction on how to install it on macos x

  2. Hãy xem Homebrew. Đây là một cách thực sự tuyệt vời để thêm phần mềm thêm vào mac. Trong một twist bạn có thể cài đặt python mới nhất, nginx và uwsgi. Nginx và uwsgi là một cách tuyệt vời để triển khai các ứng dụng django. Tôi thấy nó linh hoạt và hiệu quả hơn mod_wsgi (điểm thứ hai này rất có tính chủ quan).

Chúc may mắn

+0

Gói mod_wsgi có thể không ở trong tiêu chuẩn Mountain Lion, nhưng một báo cáo tôi đã có trước khi nó được phát hành cho biết rằng nó đã được trong máy chủ Mountain Lion. Chưa có xác nhận về điều đó mặc dù kể từ khi được phát hành. –

+0

Mô-đun tồn tại tại '/ Applications/Server.app/Contents/ServerRoot/usr/libexec/apache2/mod_wsgi.so' – bloudraak

+0

Như được mô tả trong câu hỏi của tôi, tôi sử dụng kết buộc Cocoa trong ứng dụng của tôi và gặp một số vấn đề làm việc bằng Homebrew. Do đó, tôi sẽ tránh nó. – bloudraak

1

Tôi thấy mình đang vật lộn để di chuyển macports django của mình sang Mountain Lion Server 10.8.2 và vì lý do nào đó, câu trả lời ở đây đã giúp tôi nhớ sự khác biệt về mod_wsgi.so.

Tôi ghi đè /Applications/Server.app/Contents/ServerRoot/usr/libexec/apache2/mod_wsgi.so bằng /opt/local/apache2/modules/mod_wsgi.so của tôi.

Tôi đã hy vọng xóa hoàn toàn MacPorts apache2, nhưng tôi nghĩ tôi nên giữ nó tốt hơn. Tôi vẫn thích MacPorts Python tại thời điểm này, vì nó dễ dàng hơn để giữ cho đến ngày với các gói số lượng chuyên sâu.

Có, cũng đảm bảo bạn thay đổi wsgi.py thành wsgi.wsgi.

Tôi đã sao chép httpd_wsgi.conf vào httpd_mywsgi.conf; Tôi đã thêm django.wsgi vào/Library/Server/Web/Data/WebApps.
Trong/Library/Server/Web/Config/apache2/webapps, tôi đã sao chép com.apple.webapp.wsgi.plist.

Dường như bạn đã chọn cùng một kiểu mẫu.

Tôi vẫn đang làm việc với nội dung tĩnh của mình, tuy nhiên, nghĩ rằng khám phá mod_wsgi.so có thể giúp người khác di chuyển từ MacPorts.

+1

Tệp .so của bạn sẽ bị ghi đè trên bản cập nhật hệ điều hành nếu chúng cập nhật mod_wsgi. Bạn nên đặt phiên bản của mình ở nơi khác và thay đổi dòng LoadModule cho mod_wsgi trong cấu hình Apache. –

+0

Điểm tốt @GrahamDumpleton, và nó là một lá cờ đỏ bất cứ khi nào bạn thấy mình sao chép qua các mô-đun tải. – zerocog