唠叨几句,我真的不知道现在的很多人拷贝粘贴别人的博客,甚至只是别人提的问题,就复制到自己的博客中,这样真的是学到东西了么?况且复制的还是错误的,有的时候真的不愿意看国内的这些烂博客,平时代码CV习惯了吧,博客这种东西也CV,没意思了吧~
序
因为这个春节哪里都去不了了,闲来无事,整理一下之前的flask部署遇到的问题,其实不难,但是中间有很多小坑,踩上的话,也可能会浪费不少时间,所以总结一下。
正文开始
前提
首先,你需要有一个服务器,比如阿里云之类。然后才能开始后面的工作。
或者,你可以在自己电脑上测试架设一个也行,学习嘛。我就是在子系统中安装的。
注:我是用的CentOS,下面命令全部基于CentOS。
安装必要软件
apache
你需要安装apache:
sudo yum install httpd
python(anaconda)
因为我希望使用科学计算,所以不会用自带python,而是使用anaconda:
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-4.1.1-Linux-x86_64.sh
我用的清华的源,因为我需要用到某些特殊版本的包,所以python需要3.5版本以下,我这个是3.5.2版本的。现在最新anaconda的已经5.x,支持python3.7,可以自行选择,网址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
插一句:清华的源非常全,速度也非常快。但是据说目前不更新了?小道消息,听说而已,没有确认过,如果是真的就太可惜了。不过目前还可以用。
下载好了之后,直接安装:
bash Anaconda3-4.1.1-Linux-x86_64.sh
运行如下:
输入ENTER
:
一直到:
然后输入yes
,确认:
这里需要注意一下,这里有三个选项:
- 直接回车安装,这样会安装到
/root/anaconda3
中 - 按
CTRL-C
取消安装 -
输入一个路径进行自定义安装
-
我们一定要在这里输入自定义安装,可以输入如图的
opt/anaconda3
,这就是一个小坑,因为apache无法读取/root
目录,我设置了权限也不可以,在StackOverflow.com中看有人也出现此问题,故认为不是我的设置问题,应该是apache本身权限设置有冲突。最好的解决方案也是从StackOverflow.com看到,就是安装到/opt
中方可解决。 -
还有第二个坑就是安装的时候会出现如下提示:这时候需要安装bzip2,命令:
yum install -y bzip2
,这样既可解决问题。
-
之后按下回车,即可开始安装。还需要注意安装完成,最后一步需要确认是否将安装目录添加到系统环境中,我建议是yes
,因为毕竟我们不用原生的,所以自动添加一劳永逸,否则还要自行修改~/.bashrc
,比较麻烦,这里就不过多废话了。
配置
配置其实也没啥问题,之前讲过网站如何配置,如果对apache本身的配置有不了解的朋友可以去看我之前的帖子。Apache部署多网站(二级域名同理),根据这里的帖子创建一个新的二级网站空间,我们暂且取名为ft
(flask_test),其目录在/var/www/ft
。
这里重点说一下怎么让flask跑起来。
首先在ft
文件夹中创建一个app
文件夹:
cd /var/www/ft
mkdir app
然后新建一个__init__.py
文件
touch app/__init__.py
打开该文件并输入如下内容:
# !/usr/bin/env python
# -*- coding:utf8 -*-
from flask import Flask
app = Flask(__name__)
@app.route("/")
def get_home():
return "Hello world"
if __name__ == "__main__":
app.run()
具体内容含义可以自行了解,最简单的一个flask程序。
我们在本地测试时,可以直接运行该文件,然后就可以在浏览器访问,那么现在在服务器该如何访问呢?换句话说,我们该如何使用apache调用该程序呢?
WSGI
没错,就是WSGI,Python Web Server Gateway Interface,Web服务器网关接口,它是python web框架与服务器(apache等)的一种简单而通用的接口。
我们使用mod_wsgi
,其GitHub,它的具体安装和详细配置都在文档中。
不想看文档,可以参照我下面的操作:
安装mod_wsgi
注意,这里不能使用系统命令进行安装,它的编译方式不对,因为我们需要使用自己安装的python环境,而系统安装的mod_wsgi会默认查找系统环境,所以会出现问题,尤其是我们使用的是anaconda环境
当然,你可以使用系统的,正如官方文档中介绍的一样,但是,这种方式会衍生出很多后续问题,比如致命的prefix
问题就会一直伴随,各种奇奇怪怪的问题,反正很多吧,这个坑我踩了2天。
言归正传,安装,使用anaconda环境安装。建议使用pip,因为他很简单,编译的很完美。当然,前提是你需要确认你的pip命令是anaconda环境中的。
这里安装的时候需要注意版本问题,如果按照我这样使用不是最新的anaconda包的话,也不要使用最新的mod_wsgi包,这点需要注意,不过我已经给出了一种方案,这个是我多次实验后的最佳搭配:
pip install mod_wsgi==4.6.5
安装的时候可能会遇到如下问题:
这个时候需要是因为我们没有安装一个httpd-devel的工具,先安装这个工具:
yum install httpd-devel
安装完成后,就可以顺利安装我们的wsgi了。
安装完成后,开始配置。
配置mod_wsgi
首先运行如下命令:
mod_wsgi-express module-config
会生成一个so文件,记录好生成后的信息,将信息复制,粘贴到/etc/httpd/conf/http.conf
中去。如图:
图中我还另外添加了WSGIPythonPath
,可以手动自行添加上去,这个后面会用到。
添加wsgi.py文件
在/var/www/ft
中添加wsgi.py文件
touch wsgi.py
同时,添加如下内容:
#!/usr/bin/env python
import sys
sys.path.insert(0, "/var/www/ft")
from app import app as application
将wsgi添加到apache中
打开apache的配置文件:
vim /etc/httpd/conf/httpd.conf
如果开始没有创建名为ft
的虚拟主机,根据上面提到的『Apache部署多网站』,添加如下语句;如果已添加,则去重添加如下语句:
<VirtualHost *:80>
ServerAdmin root@localhost.com
ServerName ft
WSGIScriptAlias / /var/www/ft/wsgi.py
<Directory "/var/www/ft">
WSGIApplicationGroup %{GLOBAL}
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
这里重点是WSGIScriptAlias
属性,它表示将后面的/var/www/ft/wsgi.py
路径作为当前运行的/
目录,也就是根目录,当然也可以写别的目录,只是网站链接需要注意。
运行
按照这样的操作后,重启服务器:
systemctl restart httpd
即可在浏览器中输入网址,得到相应结果:
这样就完成了配置。
注意的坑
1、版本问题
Python以及其环境的版本一直是比较头疼的问题,所以一定要选择好,搭配好,以防出现不可预见的错误。
这里我给出了一种方案,如果你的环境和需求跟我差不多,完全可以使用我的选择。
2、权限问题
因为权限导致的问题也不在少数。anaconda环境的安装一定要注意不要使用默认的/root/anaconda3
路径,而是改为/opt/anaconda3
,这样apache有权限访问,不会出现Permission denied
的错误。
另外,如果遇到/usr/share/httpd
这个文件夹出现了权限问题,只需要将其改为可读可写即可,因为某些需求,可能会有保留token的操作,会用到这里。
sudo chmod -R 777 /usr/share/httpd/
3、mod_wsgi的安装
一定不要用系统命令安装,换用pip进行安装,安装的时候注意pip是我们需要的python环境。
同时注意mod_wsgi的版本,不同版本之间还是有一定差别的。
4、配置httpd
配置httpd时,主要是WSGI的配置问题,在全局中配置WSGIPythonHome
和WSGIPythonPath
,在虚拟主机中配置WSGIScriptAlias
,这样就完成了全部配置。
如果使用虚拟环境,那么就需要用到WSGIDaemonProcess
这样的命令,它有参数python-home
和python-path
,具体参见官方文档。
其实没有多难,但是开始总有很多小坑,我在环境的配置中踩了两天坑,然后发现我查的一些博客根本就是错误的,所以才有了开始的唠叨。最后还是OverStackflow.com解决了我大部分的问题,剩下的自己看日志一点一点解决。
日志路径:/var/log/httpd/
,里面都是各种apache的日志记录,通常看error_log
即可。
嗯,完成了。
文章评论
127.0.0.1:5000还是flask进程,不是wsgi
@qq 还真没发现,可能当时截图没注意,过程是没有问题的。
还是不行啊,wsgi没法运行啊
@单独 你是啥问题?按照我的方式应该是可以的,我配了很多次了。