CakePHP app กับ userdir

เวลาเอา web app ที่เขียนด้วย cakephp ไปใส่ใน userdir เช่น /home/veer/public_html/myapp (ซึ่งมักจะไปตรงกับ url http://hostname/~veer/myapp) มักจะมีปัญหากับ mod_rewrite ขึ้นมา แต่ก็แก้ไม่ยาก เพียงแต่แก้ .htaccess ใน myapp กับ myapp/app/webroot

เดิมทีจะเขียนไว้ประมาณนี้ (ใน myapp กับ myapp/app/webroot ไม่เหมือนกัน แต่ก็แก้เหมือนกัน)


   RewriteEngine on
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]

ก็แก้โดยใส่ RewriteBase เข้าไปเป็นแบบนี้


   RewriteEngine on
   RewriteBase    /~veer/myapp
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]

เสร็จแล้ว

Advertisements

What I did for pylons app deployment.

I try to install my application created on Pylons on the Debian server that has already Apache2 + mod_wsgi + virtualenv + userdir.

What I did:

  1. creating prod.ini by copying development.ini.
  2. Change sqlalchemy.url
  3. set debug = false
  4. write a script in ~/public_html/wsgi-script as follow:
    import os
    import site
    os.environ['PYTHON_EGG_CACHE'] = "/home/myhome/egg"
    site.addsitedir("/home/myhome/wsgiapp/basa2")
    site.addsitedir("/home/myhome/pyenv/PYLONS-1/lib/python2.5/site-packages")
    
    from paste.deploy import loadapp
    APP_CONFIG = "/home/myhome/wsgiapp/basa2/prod.ini"
    application = loadapp("config:" + APP_CONFIG)
    
    
  5. I also modify this file: /home/vee/pydev/PYLONS-1/lib/python2.5/site-packages/Pylons-0.9.7rc3-py2.5.egg/pylons/wsgiapp.py by checking before the command:
    del  environ['pylons.pylons']

    following this changeset. (I use Pylons 0.9.7rc3)

The procedures above are just conclusion. I did a lot of trial and error. I also restart Apache web server (I must not have to do). By the ways, it works now.

Pylons + mod_wsgi + mod_userdir

ต่อจาก ติดตั้ง Django ก็ต่อด้วย Pylons. ก่อนหน้าจะพยายามลง Pylons ผมก็ลองพวก WSGIDaemonProcess ไปแล้ว แต่ว่าไม่สำเร็จก็เลยข้ามๆ ไป. ใช้ user เป็น www-data ก็ได้ :-P.

Pylons ก็มา pattern เดิมๆ ที่อ่านมาจาก http://code.google.com/p/modwsgi/wiki/IntegrationWithPylons เริ่มด้วยสร้าง pylons.wsgi ใน /home/veer/public_html/wsgi-scripts ตามนี้

APP_CONFIG = "/home/veer/Develop/pylons/mydb4/production.ini"
import os
os.environ['PYTHON_EGG_CACHE'] = "/home/veer/egg"
import sys
sys.path.append("/home/veer/Develop/pylons/mydb4")
from paste.deploy import loadapp
application = loadapp("config:" + APP_CONFIG)

แล้วก็สร้าง /home/veer/egg เปลี่ยน permission ( mkdir /home/veer/egg; chmod 777 /home/veer/egg )

แล้วก็แก้สร้าง production.ini โดยการ copy มาจาก development.ini แล้วก็แก้ให้
full_stack = false
และ
debug = false

เท่านี้ก็น่าจะพอใช้ได้แล้ว

ลืมไปผมสร้าง app ไว้ใน /home/veer/Develop/mydb4 นะครับ พวก development.ini ก็อยู่ในนี้ล่ะ

Django + userdir + mod_wsgi

แน่นอนเป็นภาคต่อมาจาก Turbogears + userdir + mod_wsgi. Django ก็ใช้ท่าคล้ายๆ Turbogears เปลี่ยน prefix นิดๆ หน่อยก็ใช้ได้แล้ว

หลังจากศึกษาวิธีใช้จาก http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango ผมสร้าง django.wsgi ไว้ใน /home/veer/public_html/wsgi-scrips อีกเช่นเคย

import os, sys
sys.path.append('/home/veer/Develop/django/mysite') # site ของผมเก็บไว้ที่นี้
sys.path.append('/home/veer/Develop/django')
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()

ที่ลำบากนิดหน่อยคือพวก media ทั้งหลาย ผมก็ copy มาไว้ใน home เลย (ขนาดประมาณ 300KiB กว่าๆ)

cp -r /usr/share/python-support/python-django/django/contrib/admin/media/ /home/veer/public_html/django_admin_media

แล้วก็ไปแก้ settings.py ใน /home/veer/Develop/django/mysite นิดหน่อย แก้ ADMIN_MEDIA_PREFIX จากเท่ากับ ” เป็น ADMIN_MEDIA_PREFIX = ‘/~veer/django_admin_media/’

เท่านี้ก็ไปเปิดเว็บดูก็ใช้ได้ (ถ้าผมไม่ได้ลืมเขียนอะไรไปนะ)

พรุ่งนี้น่าจะได้ลอง Pylons กับ WSGIDaemonProcess username user=username อะไรทำนองนี้.

mod_wsgi + userdir + Turbogears

อาจจะดูคลั่งๆ หน่อยแต่ mod_wsgi + userdir + Turbogears ก็ใช้ได้แล้ว. ด้วยพื้นฐานจากการใช้ mod_wsgi+userdir , การใช้ mod_wsgi กับ Turbogears และ การใช้ mod_wsgi กับ Turbogears แบบ non-root-mount. ก็แทบจะไม่ต้องทำอะไรแล้ว :-P.

แค่ copy ไฟล์ tg.wsgi ที่เคยอยู่ใน /home/veer/tg/tgapp/apache ไปไว้ใน /home/veer/public_html/wsgi-scripts/ แล้วก็แก้ prod.cfg ใน /home/veer/tg/tgapp นิดหน่อยที่ server.webpath ให้เปลี่ยนเป็น server.webpath=”/~veer/wsgi-scripts/tg.wsgi” เท่านี้ก็ใช้ซะงั้น.

สำหรับ Turbogears แล้วสำคัญมาที่ต้องใช้ tg.url เวลาเขียน URL ไม่ใส่ URL เอาเองตรงๆ (แบบที่ผมเคยทำ) … ไม่งั้นเวลามา deploy แบบนี้ก็แก้กันอ้วก :-P.

mod_wsgi + userdir บน ubuntu 8.04

ผมอ่านเรื่องเปิดเทียบ web app tech ต่างๆ มา. เห้น mod_wsgi น่าสนใจดีก็เลยจะลองเล่นบ้าง (เอาแบบให้ใช้ได้หลายๆ user ด้วย น่าจะเหมาะกับ lab ดี) ก็เริ่มจากไปอ่าน http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines

แต่ก่อนจะทำตามตำรา ผมก็ลง mod_wsgi ก่อนเลย

 sudo aptitude install libapache2-mod-wsgi

ตามด้วย enable มันซะ

sudo a2enmod mod-wsgi

แปลกนะมีคำว่า mod ติดมาด้วย หาตั้งนาน 😛 ปกติเวลาจะใช้ mod_userdir ก็แค่

sudo a2enmod userdir

(ไม่ใช่เหรอ? …. รวมถึง mod_rewrite และอื่นๆ ด้วย)

ด้วยความพิเศษของ Ubuntu/Debian นิดหน่อยๆ ไฟล์ที่ผมเข้าไปแก้คือ /etc/apache2/mods-enabled/userdir.conf ก็ดัดแปลงตามตัวอย่างอะนะแก้แล้วเป็นแบบนี้

<IfModule mod_userdir.c>
        UserDir public_html
        UserDir disabled root

        <Directory /home/*/public_html/>
                AllowOverride FileInfo AuthConfig Limit
                Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
        </Directory>

        RewriteEngine On
        RewriteCond %{REQUEST_URI} ^/~([^/]+)
        RewriteRule . - [E=APPLICATION_GROUP:~%1]

        <Directory /home/*/public_html/wsgi-scripts/>
                Options ExecCGI
                SetHandler wsgi-script
                WSGIApplicationGroup %{ENV:APPLICATION_GROUP}
        </Directory>
</IfModule>

เสร็จแล้วผมก็เข้าไปสร้าง folder ที่ /home/veer/public_html/wsgi-scripts พร้องเปลี่ยน permission เป็น 755 ตามด้วยเอา myapp.wsgi ตามตัวอย่างไปวางในนั้น

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]

จากนั้นก็ไปที่ web browser เรียก http://127.0.0.1/~vee/wsgi-scripts/myapp.wsgi (ตามรูป)

ขั้นตอนถัดไปก็จะลองลง Pylons และ Django ดู