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.plist
và httpd_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.
Nó được cài đặt tại '/ Applications/Server.app/Contents/ServerRoot/usr/libexec/apache2/mod_wsgi.so' – bloudraak
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