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 ดังนี้ครับ

ผมสมมุติว่าได้พัฒนา 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 ของเราครับ

เนื่องจากว่าโปรแกรม 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 ดังนี้ครับ

ตอนนี้ 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