怎样部署基于Flask和Apache的web service?

环境配置

Ubuntu 16.04 安装了LAMP环境
Python 2.7.12

Flask的介绍

Flask是一个用Python编写的微框架(Micro-framework),基于Werkzeug和Jinja2模板引擎开发。基于Flask,可以快速的部署Python的Wep服务。

网上资源有很多介绍Flask部署web service的教程,大多数只能demo本地访问,也就是访问127.0.0.1:5000,而实际上要部署真正可用的,远程可访问的web service,还需要部署Apache,安装WSGI。

这边文章将会完成介绍基于Apache和Flask的web service 部署。

前期准备需要部署好LAMP环境,也就是说假设你的网站已经可以访问了,可以看到Apache的默认页面。

Flask安装步骤

1. 安装并启用mod_wsgi

WSGI(Web服务器网关接口)是Web服务器和python的Web应用程序之间的接口。Mod_wsgi是一个Apache HTTP服务器模块,使Apache能够提供Flask应用程序。

打开终端并键入以下命令来安装mod_wsgi:

sudo apt install libapache2-mod-wsgi python-dev

要启用mod_wsgi,运行以下命令:

sudo a2enmod wsgi 

2. 创建Flask应用程序

在这一步中,将创建一个web应用程序。我们将我们的应用程序放在/var/www目录中。

运行以下命令:

cd /var/www 
sudo mkdir CodeWenda
cd CodeWenda
sudo mkdir CodeWenda
cd CodeWenda
mkdir static templates
sudo vim __init__.py (先wq保存空文件)

这目录结构如下:

|----CodeWenda
|---------CodeWenda
|--------------static
|--------------templates
|--------------__init__.py

将以下内容copy到__init__.py中:

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello, CodeWenda.com~"
if __name__ == "__main__":
    app.run()

3. 安装Flask

pip安装Flask:

sudo pip install Flask

接下来,运行以下命令来测试安装是否成功并且应用程序正在运行:

sudo python __init__.py 

应该显示“Running on http://localhost:5000/”或“Running on http://127.0.0.1:5000/”。如果看到这个消息,那么说明Flask已经安装好了。

4 配置站点信息

创建apache配置文件:

sudo vim /etc/apache2/sites-available/CodeWenda.conf

输入以下内容并保存文件:

<VirtualHost *:80>
		ServerName codewenda.com
		ServerAdmin yourName
		WSGIScriptAlias / /var/www/CodeWenda/codewenda.wsgi
		<Directory /var/www/CodeWenda/CodeWenda/>
			Order allow,deny
			Allow from all
		</Directory>
		Alias /static /var/www/CodeWenda/CodeWenda/static
		<Directory /var/www/CodeWenda/CodeWenda/static/>
			Order allow,deny
			Allow from all
		</Directory>
		ErrorLog ${APACHE_LOG_DIR}/error.log
		LogLevel warn
		CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

使用以下命令启用站点:

sudo a2ensite CodeWenda

5. 创建.wsgi文件

Apache使用.wsgi文件来调用Flask应用程序。在/var/www/FlaskApp目录,创建codewenda.wsgi的文件:

cd /var/www/CodeWenda 
sudo vim codewenda.wsgi

codewenda.wsgi的内容为:

#!/usr/bin/python
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/CodeWenda/")

from CodeWenda import app as application
application.secret_key = 'your secret key'

现在目录结构如下了:

|----CodeWenda
|---------CodeWenda
|--------------static
|--------------templates
|--------------__init__.py
|---------codewenda.wsgi

6 重新启动Apache

使用以下命令重新启动Apache:

sudo service apache2 restart 

完成验证

这时,可以在浏览器中输入网站的域名(这里为codewenda.com)或者是主机的ip地址,浏览器中显示”Hello, CodeWenda.com~”
那么基于Apache+Flask的站点已经搭建好了。

以上仍然是一个demo,需要加入更多的server逻辑,例如添加Restful API的逻辑。

By Code问答

解决Azure上虚拟机搭建的Apache网站无法访问的问题

在Azure上创建了一个Linux的虚拟机,然后安装好了Apache,然后在一个远程的机器上通过浏览器去访问这台vm的ip,发现网站无法访问,而在vm上Apache是正常运行的,那是什么原因呢?
这是因为处于安全考虑,Azure上的80端口也是被禁止的,即这台vm既不能通过http访问其它机器,而外网的机器也不能访问vm上部署的apache测试主页。

解决办法是将80端口打开,具体方法如下:

  • 在左边的导航栏打开VM列表
  • 点击你的VM
  • 选择网络接口 Network interfaces
  • 点击网络接口的名字
  • 然后选择SETTINGS里面的网络安全组 Network security group
  • 点击列出来具体的security group名称 (<vm名称>-nsg)
  • 然后会看到列出来的Inbound security rules 和Outbound security rules
  • 分别点击粗体的Inbound security rules 和outbound security rules
  • 点击+Add,可以添加新的rules,这里我们给Inbound和Outbound都添加上HTTP端口即可(在Service选项中选择HTTP,会自动选择80端口)

等security rules添加成功后,这时候再去外网访问vm的主页应该可以访问了。