在网上找了很多都没有找到好的教程,要不就是一笔带过,要不就是默默糊糊说不清楚,如果配置服务器得搞个两三天甚至一两个星期,对新手来说是巨大的打击,所以总结一下,希望帮助到有需要的朋友。
本文的主要内容是配置基于flask开发的web站点,虽然文章的标题是本地站点,其实也适用于在远程服务器上配置flask站点,下面是我们需要的物品清单:
- 可以联网的PC或者laptop一台,操作系统为 Ubuntu 16.04 或者 Ubuntu Server 16.04 (14.04也行,再低版本的我没有试过)
- 一个智力健全长相帅气的程序员或者一个貌美如花程序媛(开玩笑:)
动态网站的工作原理
在讲解如何配置站点之前,我们来看看动态网站的工作原理,这里以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
是否工作正常:
- 启动
apache2
服务器:sudo service apache2 start
,或者可以输入:sudo /etc/init.d/apache2 restart
- 打开浏览器(我的是
chrome
),在地址栏输入localhost
后按回车键,如果出现如下页面,说明安装成功了:
- 我们也可停止
apache2
服务器:sudo service apache2 stop
,停止后在浏览器中访问localhost
将不会出现任何页面。
安装 mod_wsgi
mod_wsgi
的安装很简单:sudo apt-get install libapache2-mod-wsgi
安装 python、在虚拟环境中安装 flask
flask
开发团队建议我们使用python2
(flask
对python3
的支持还不够好),安装python
很简单:sudo apt-get install python
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
并在虚拟环境中安装flask
:pip 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
:
- 打开
apache2
的站点配置目录:cd /etc/apache2/sites-avalible
- 创建一个名为
test.conf
的站点配置文件:sudo gedit test.conf
- 在
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
使站点生效
重启
apahce2
:
sudo 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 ,互相交流学习,如文中有错误的地方,欢迎留言批评指正。