Home | Back
การ Deploy Web Application ที่พัฒนาด้วย Flask ใน Apache2+Gunicorn ใน Ubuntu 12.04
Monday, 14 January 2013
ช่วงนี้ผมอยู่ในระหว่างการพัฒนาระบบสารสนเทศตัวใหม่ ซึ่งผมใช้ Flask เป็น Framework ในการพัฒนา และทำการ Deploy โดยใช้ Apache2 เป็น Front-end Web Server และใช้ Gunicorn เป็น WSGI Server ซึ่งต้องมีการปรับแต่งค่าต่าง ๆ เพื่อให้สามารถใช้งานได้ โดยมีขั้นตอนดังนี้ครับ
1. ติดตั้ง Flask
พัฒนาระบบ Web Application ด้วย Flask Framework โดยผมได้ทำการติดตั้ง python-flask ในระบบปฏิบัติการ Ubuntu 12.04 ดังนี้ครับ
$ sudo aptitude install python-flask
ผมสมมุติว่าได้พัฒนา Web Application เป็นโปรแกรม Hello World โดยเก็บไว้ใน /home/user/webapp/hello.py ดังนี้นะครับ
File : hello.py
# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "Hello World !!"
2. ติดตั้ง Gunicorn
เพื่อใช้เป็น WSGI Server ในการรัน Web Application ของเราครับ
$ sudo aptitude install gunicorn python-gevent
เนื่องจากว่าโปรแกรม Gunicorn จะทำงานเมื่อเราสั่งผ่าน Command Line จึงอาจจะไม่สะดวก ถ้าหากมีการรีบูตเซิร์ฟเวอร์ใหม่ เมื่อมีการบำรุงรักษา เพื่อให้ Gunicorn ทำงานเองทุกครั้งที่รีบูตเซิร์ฟเวอร์ จึงได้ทำการเขียน Script ลงในไฟล์ /etc/rc.local ดังนี้ครับ
File : rc.local
#!/bin/sh -e
cd /home/user/webapp
gunicorn -w 2 -b 127.0.0.1:8800 -k gevent -D --max-requests 500 hello:app
exit 0
โดย -w จะเป็นการกำหนดตัว worker ที่ใช้ทำงาน ซึ่งจะมีสูตรดังนี้
worker = จำนวน Core * 2 + 1
แต่โดยส่วนตัวผมมักจะกำหนดให้เป็น จำนวน core * 2 จะไม่บวกหนึ่ง
ส่วน -b จะเป็นการกำหนด Host ที่จะตอบสนอง โดยกรณีนี้เราจะใช้ Apache2 เป็น Front-end Web Server ซึ่งอยู่ใน localhost เดียวกัน จึงกำหนดให้รับการตอบสนองที่ localhost หรือ 127.0.0.1 เท่านั้น แต่หากจะใช้ Gunicorn เป็น Front-end Web Server เลย ก็ให้กำหนด Host เป็น 0.0.0.0 ส่วน :8800 เป็นหมายเลขพอร์ตที่ใช้
-k คือการกำหนดอัลกอริทึมในการตอบสนองของ WSGI Server ของเรา ซึ่งผมเลือกใช้ gevent
-D คือกำหนดให้ Gunicorn ทำงานในโหมด deamon ซึ่งจะทำงานอยู่เบื้องหลัง ไม่แสดงผลลัพธ์ใด ๆ ออกทาง console
–max-requests เป็นการกำหนดให้ worker รับการตอบสนองกี่ครั้ง จึงจะทำการ restart worker ขึ้นมาใหม่ ซึ่งผมแนะนำว่าควรตั้งไว้ เพื่อแก้ไขปัญหาหน่วยความจำรั่วครับ ซึ่งไม่ควรจะน้อยเกินไป ในกรณีของผมได้ตั้งไว้ที่ 500 ครับ hello:app คือโปรแกรม Web Application ของเราครับ ซึ่งอยู่ในไฟล์ hello.py และในออปเจค app ครับ
3. ติดตั้ง Apache2
โดยปกติไม่มีความจำเป็นต้องติดตั้ง PHP5 แต่เนื่องจากผมลงเผื่อไว้ สำหรับการจัดการบางอย่างเช่น ต้องการใช้ phpmyadmin ด้วยเป็นต้น จึงทำการติดตั้ง Apache2 พร้อมทั้ง PHP5 แล้วทำการเปิดโมดูล ProxyPass ให้กับ Apache2 ดังนี้ครับ
$ sudo aptitude install apache2 libapache2-mod-php5 php5 $ sudo a2enmod proxy $ sudo a2enmod proxy_http $ sudo a2enmod proxy_balancer
ตอนนี้ Apache2 เราก็พร้อมที่จะทำหน้าที่เป็น Front-end Web Server ให้กับโปรแกรม Gunicorn แล้วครับ ขั้นตอนต่อไปคือ แก้ไขไฟล์ /etc/apache2/sites-available/default หรือสร้างไฟล์สำหรับไซต์ใหม่ก็ได้นะครับ โดยภายในไฟล์จะมีการปรับแต่งที่สำคัญดังนี้ครับ
File : /etc/apache2/sites-available/default
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www
# Alias /static /home/user/webapp/static
<proxy balancer://unicornservers>
BalancerMember http://127.0.0.1:8800
</proxy>
# ProxyPass /static !
ProxyPass / balancer://unicornservers/
ProxyPassReverse / balancer://unicornservers/
ProxyPreserveHost on
<proxy *>
Order deny,allow
Allow from all
</proxy>
</VirtualHost>
เพียงเท่านี้ Web Application ของเราก็พร้อมทำงานแล้ว :)