码字,杂谈

将flask程序部署在apache上

唠叨几句,我真的不知道现在的很多人拷贝粘贴别人的博客,甚至只是别人提的问题,就复制到自己的博客中,这样真的是学到东西了么?况且复制的还是错误的,有的时候真的不愿意看国内的这些烂博客,平时代码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

运行如下:
《将flask程序部署在apache上》

输入ENTER
《将flask程序部署在apache上》

一直到:
《将flask程序部署在apache上》

然后输入yes,确认:
《将flask程序部署在apache上》

这里需要注意一下,这里有三个选项:

  • 直接回车安装,这样会安装到/root/anaconda3
  • CTRL-C取消安装
  • 输入一个路径进行自定义安装

    • 我们一定要在这里输入自定义安装,可以输入如图的opt/anaconda3,这就是一个小坑,因为apache无法读取/root目录,我设置了权限也不可以,在StackOverflow.com中看有人也出现此问题,故认为不是我的设置问题,应该是apache本身权限设置有冲突。最好的解决方案也是从StackOverflow.com看到,就是安装到/opt中方可解决。

    • 还有第二个坑就是安装的时候会出现如下提示:《将flask程序部署在apache上》这时候需要安装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环境中的。

《将flask程序部署在apache上》

这里安装的时候需要注意版本问题,如果按照我这样使用不是最新的anaconda包的话,也不要使用最新的mod_wsgi包,这点需要注意,不过我已经给出了一种方案,这个是我多次实验后的最佳搭配:

pip install mod_wsgi==4.6.5

安装的时候可能会遇到如下问题:

《将flask程序部署在apache上》

这个时候需要是因为我们没有安装一个httpd-devel的工具,先安装这个工具:

yum install httpd-devel

安装完成后,就可以顺利安装我们的wsgi了。

安装完成后,开始配置。

配置mod_wsgi

首先运行如下命令:

 mod_wsgi-express module-config

《将flask程序部署在apache上》

会生成一个so文件,记录好生成后的信息,将信息复制,粘贴到/etc/httpd/conf/http.conf中去。如图:

《将flask程序部署在apache上》

图中我还另外添加了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

即可在浏览器中输入网址,得到相应结果:

《将flask程序部署在apache上》

这样就完成了配置。

注意的坑

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的配置问题,在全局中配置WSGIPythonHomeWSGIPythonPath,在虚拟主机中配置WSGIScriptAlias,这样就完成了全部配置。

如果使用虚拟环境,那么就需要用到WSGIDaemonProcess这样的命令,它有参数python-homepython-path,具体参见官方文档。


其实没有多难,但是开始总有很多小坑,我在环境的配置中踩了两天坑,然后发现我查的一些博客根本就是错误的,所以才有了开始的唠叨。最后还是OverStackflow.com解决了我大部分的问题,剩下的自己看日志一点一点解决。

日志路径:/var/log/httpd/,里面都是各种apache的日志记录,通常看error_log即可。

嗯,完成了。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注