2010-3-21
Linux, Fedora-12
ตัวผมเองยังไม่เคยทำเป็น public website, ปกติทำแค่เป็น web app ที่ใช้ภายในสำนักงาน, ถ้าใครมีความเห็นแล้วให้คำแนะนำผมบ้าง จะขอบคุณมากครับ
เพราะกำลังทำอยู่ แล้วก็อยากจะแชร์, แลกเปลี่ยนความคิดเห็นกับคนอื่น, แล้วก็เก็บไว้เป็นอ่านเองครับ เพราะทำไปนานๆ แล้วชอบลืม >_<
จะแบ่งออกเป็น 2 ส่วนหลักๆ ครับ คือ
1. สำหรับตัว Web Application ของเรา : apache.wsgi, settings.py
2. สำหรับ Apache Web Server : httpd.conf
/home/user/project/my_project/
├── cgi
├── file
├── lib
├── media
└── project
คำอธิบาย (ดูตามรูปภาพใน Concept ด้านบนประกอบ)
./cgi : CGI > สำหรับเก็บ cgi script
./lib : Library,3rd-Application > สำหรับ 3-rd Application ครับ เช่นพวก module ต่างๆ ที่คนอื่นเขียนไว้
./media : StaticMedia > สำหรับเก็บ Static File ต่างๆ ครับ เช่น javascript, css ของ Application
./project : App > django-project ที่เราสร้างขึ้น
./file : Pre-Processed Media > สำหรับเก็บ pre-process file
./cgi/apache.wsgi
จะเป็น Interface ระหว่าง Apache กับ App ของเรา โดยไฟล์นี้จะวางไว้ที่ไหนก็ได้ แต่ apache ต้องสามารถ access เข้าไปใช้งานได้ครับ แล้วค่อยไป set ค่าใน WSGIScriptAlias ใน VirtualHost ให้ link มายังไฟล์นี้ ตัวอย่างนี้เลือกที่จะวางไว้ที่ ./cgi/apache.wsgi ใน my_project
#/home/user/project/my_project/cgi/apache.wsgi
import os
import sys
sys.path.append('/home/user/project/my-project')
sys.path.append('/home/user/project/my-project/lib')
# set environment ตรงนี้ ทำให้สามารถนำ 3-rd module มาวางไว้ใน ./lib
# แล้วสามารถเรียกใช้งานได้เลย (เอา django มาวางในนี้เลยก็ได้ครับ)
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
import django.core.handlers.wsgi.WSGIHandler()
./project/manage.py
แก้ไข manage.py นิดนึง เพื่อเพิ่ม path ไปที่ ./lib ของ project โดยใช้ sys.path.append()
#!/usr/bin/env python
from django.core.management import execute_manager
import sys # << เพิ่ม
try:
import settings # Assumed to be in the same directory.
except ImportError:
import sys
sys.stderr.write("Error: Can't find the file 'settings.py' in the directory
containing %r. It appears you've customized things.\nYou'll have to run django-admin.py,
passing it your settings module.\n(If the file settings.py does indeed exist,
it's causing an ImportError somehow.)\n" % __file__)
sys.exit(1)
sys.path.append('/home/nitipit/project/plaza-project/lib') # << เพิ่ม
if __name__ == "__main__":
execute_manager(settings)
ใน Fedora 12 ผมเจอปัญหาตรงที่ถ้านำไฟล์นี้ไว้ภายใต้ /home/user/ แล้ว apache จะไม่สามารถ access เข้าใช้งานได้ เพราะ /home/user มี permission เป็น 700 อยู่ให้ chmod 711 ก่อน
virtualhost
<VirtualHost *:80>
ServerAdmin admin@project
ServerName project
ErrorLog logs/project-error_log
CustomLog logs/project-access_log common
Alias /media/ /home/user/project/my_project/media/
WSGIScriptAlias / /home/user/project/my_project/cgi/apache.wsgi
</VirtualHost>
น่าสนใจมากครับ จะรออ่านตอนเสร็จสมบูรณ์นะครับ
ขอบคุณครับ >_<