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 ของเราก็พร้อมทำงานแล้ว :)



Home | Back