flask+mod_wsgi+apache站点部署(Ubuntu16.04)

8 篇文章 0 订阅
4 篇文章 0 订阅

在网上找了很多都没有找到好的教程,要不就是一笔带过,要不就是默默糊糊说不清楚,如果配置服务器得搞个两三天甚至一两个星期,对新手来说是巨大的打击,所以总结一下,希望帮助到有需要的朋友。

本文的主要内容是配置基于flask开发的web站点,虽然文章的标题是本地站点,其实也适用于在远程服务器上配置flask站点,下面是我们需要的物品清单:

  1. 可以联网的PC或者laptop一台,操作系统为 Ubuntu 16.04 或者 Ubuntu Server 16.04 (14.04也行,再低版本的我没有试过)
  2. 一个智力健全长相帅气的程序员或者一个貌美如花程序媛(开玩笑:)

动态网站的工作原理

在讲解如何配置站点之前,我们来看看动态网站的工作原理,这里以flask为例:

这里写图片描述

如上图所示,动态网站的大致工作流程如下:
首先,浏览器(用户)向服务器( apache)发起请求,服务器接收到请求后,将请求分发给 WSGI 应用程序( flask应用), WSGI 应用程序响应请求后(如一个 html页面),将响应内容发送给服务器,然后服务器再通过网络发送给浏览器。注意,服务器可以指物理的一台实实在在的机器(如 IBM xSeries 346),也可以指一个服务器软件(如 apache


安装 apache2 服务器

Ubuntu中的apahce名字叫apache2,目前最新版本为apache 2.4,所以安装apache2的命令为:sudo apt-get install apache2

apache2安装好之后,我们来测试一下apache2是否工作正常:

  1. 启动apache2服务器:sudo service apache2 start,或者可以输入:sudo /etc/init.d/apache2 restart
  2. 打开浏览器(我的是chrome),在地址栏输入localhost后按回车键,如果出现如下页面,说明安装成功了:
    这里写图片描述
  3. 我们也可停止apache2服务器:sudo service apache2 stop,停止后在浏览器中访问localhost将不会出现任何页面。

安装 mod_wsgi

mod_wsgi的安装很简单:sudo apt-get install libapache2-mod-wsgi


安装 python、在虚拟环境中安装 flask

  1. flask开发团队建议我们使用python2flaskpython3的支持还不够好),安装python很简单:sudo apt-get install python
  2. python虚拟环境的安装以及在虚拟环境中安装flask可以参考我的另一篇文章:在Python的虚拟环境中安装flask

配置站点

我们知道了如何配置一个虚拟环境后,下面就要来建立一个测试站点,apache有个默认的站点存放目录:/var/www,在第一次成功安装apache2后,这个目录下有个默认的叫做html的站点目录,里面只有一个文件:index.html,也就是上面我们测试时打开localhost的页面。这个站点存放目录的默认结构如下所示:

www 
├── html
    └── index.html

现在我们要在 www 文件夹下新建一个名为test的测试站点,我们在www文件夹中创建一个名为test的目录(需要root权限):sudo mkdir test,现在站点存放目录的机构如下:

www 
├── html
│   └── index.html
├── test

test站点目录创建好之后,为了不影响系统中的python环境,我们需要在test目录下安装一个python虚拟环境:sudo virtualenv venv
激活虚拟环境:source venv/bin/activate
并在虚拟环境中安装flaskpip install flask

然后我们向test目录中添加两个文件,一个是app.wsgi一个是hello.py
1、hello.py:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>Hello, world</h1>'

if __name__ == '__main__':
    app.run()

2、app.wsgi

import sys

activate_this = '/var/www/mlfans/venv/bin/activate_this.py' # 虚拟环境的启动脚本
execfile(activate_this, dict(__file__=activate_this)) # 执行虚拟环境启动脚本

sys.path.insert(0, '/var/www/mlfans')

from hello import app as application

下面来配置apache2

  1. 打开apache2的站点配置目录:cd /etc/apache2/sites-avalible
  2. 创建一个名为test.conf的站点配置文件:sudo gedit test.conf
  3. test.conf中输入以下内容:
<virtualhost *:80>
    ServerName www.test.com
    ServerAlias *.test.com

    WSGIDaemonProcess mlfans threads=5 
    WSGIScriptAlias / /var/www/mlfans/app.wsgi

    <directory /var/www/mlfans>
        WSGIProcessGroup mlfans
        WSGIApplicationGroup %{GLOBAL}
        WSGIScriptReloading On
        Order deny,allow
        Allow from all
    </directory>
</virtualhost>

保存文件test.conf,然后修改系统的hosts文件:sudo gedit /etc/hosts
添加如下内容: 127.0.0.1 www.test.com,修改后的hosts文件如下图所示:

这里写图片描述

然后输入命令 a2ensite test使站点生效
重启 apahce2sudo service apache2 reload
打开浏览器,输入 test.com,如果出现如下页面,说明你的测试站点配置成功啦。
这里写图片描述


总结

最后,我们再来梳理一下整个test站点的结构:

这里写图片描述

首先,用户使用浏览器发起对 test.com的访问, apache接收访问请求,发现自己的配置文件中有 test.com站点的配置信息, test.conf文件中包含了站点所在的目录的位置,和wsgi脚本的位置, apache2调用 app.wsgi脚本, app.wsgi脚本又调用 hello.py,完成了请求工作。 flask生产响应后,返回给 apache2,随后 apache2又将响应回送到发起请求的客户端,完成一次完整的访问请求。(大致流程如此,细节可能与真实情况有所出入)

虽然本文讲的是本地站点的配置,但也同样适用于在远程服务器上配置可以公开访问的站点。


另外,如果不能访问配置好的本地站点,可以查看apache2的错误日志,仔细排查出错的地方到底在哪里,查看错误日志的命令如下:
cat /var/log/apache2/error.log

仔细阅读其中的traceback即可逐步排查出错误的原因。

如果仍有问题,欢迎加入 Q群 532232743 ,互相交流学习,如文中有错误的地方,欢迎留言批评指正。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值