项目为什么需要部署到Apache上?
一般来说在测试环境上,大家都是直接用app.run(host=‘0.0.0.0’,port=5000)这样的形式来发布自己的项目并观察网页结构的改变,这样并不是不可以,只是只适用于测试环境上,如果进入线上环境的话会因为并发和性能的问题而导致网页非常的卡顿以致于给用户的体验造成影响,所以为了避免这种情况的发生,我们使用apache来发布自己的项目是非常友好的。
为什么使用mod_wsgi?
因为正常来说apache是不支持python所编写的web项目,这个时候我们需要给apache打上一个模块,让他支持python所编写的web项目,而这个模块就是mod_wsgi了,所以mod_wsgi是必不可少的部分。
好了,废话就不多说了,下面进入正题吧!!!
下载所需软件包
Flask所编写的程序环境基于Python3,所以下载Python3所需要的所有软件包,也可以称为是依赖包,这样可以避免Python3在编译安装的时候出现编译错误的情况,也可以防止Apache在编译安装时所出现的错误。
下载安装包命令如下:
yum -y install gcc gcc-c++ autoconf libxml2 libxml2-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers
#基础包,防止出现其他错误,如果安装出现个别软件包不能安装实属正常
上述安装包是基础包,下面会介绍一些编译时所需的安装包,如果没有会提示缺少某个模块而导致不能正常编译安装软件,所以在这里把他们提出来重点讲讲。
yum -y install openssl openssl-devel #pip安装模块时需要,否则提示没有ssl模块
yum -y install expat-devel #apr-util安装时需要,否则会报错提示没有expat.h
Yum -y install libffi-devel #python安装时需要,否则会报错提示没有_ctypes.h
下载软件源码包
进入"/usr/src/"目录下,这个目录经常被用于放置一些编译安装的源码包,所以提前来到这里面。
cd /usr/src
然后在这个目录中使用wget命令下载网上的源码包,之后用来编译安装他们。
wget http://mirror.bit.edu.cn/apache/apr/apr-1.6.5.tar.gz
wget http://mirror.bit.edu.cn/apache/apr/apr-util-1.6.1.tar.gz
wget http://mirror.bit.edu.cn/apache/httpd/httpd-2.4.39.tar.gz
wget -c https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.6.5.tar.gz
上述这些软件的用途我就不多说了,简单描述一下,apr和apr-util以及pcre都是用来编译apache时所需的,而mod_wsgi是用来让apache支持这个模块而已,httpd就是apache本身。
编译安装软件包
安装apr
tar -zxvf apr-1.6.5.tar.gz
cd apr-1.6.5/
./configure --prefix=/usr/local/apr
make && make install
cd …/
安装apr-util:
tar -zxvf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1/
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/apr-1-config
make && make install
cd …/
安装pcre-devel
tar -zxvf pcre-8.41.tar.gz
cd pcre-8.41/
./configure --prefix=/usr/local/pcre
make && make install
cd …/
安装python3.7:
tar -zxvf Python-3.7.0.tgz
cd Python-3.7.0/
./configure --prefix=/usr/local/python3 --enable-shared CFLAGS=-fPIC #–enable-shared是用来共享python的,这样wsgi才能访问到,CFLAGS=-fPIC是用来加载模块的,结束会提示”please run ./configure --enable-optimizations”,一定不要使用那条命令,否则会需要等待非常长的时间
make && make install
ln -s /usr/local/python3/bin/python3.7 /usr/local/bin/python3 #将python3.7作为软链接,这样就可以正常使用python3了,否则需要去python的bin目录中使用
ln -s /usr/local/python3/bin/pip3.7 /usr/local/bin/pip3 #跟上面同样
cd …/
安装apache(apache就是httpd):
rpm -e --nodeps httpd* #建议忽略这步(这步只适合测试环境,上线环境请忽略这步骤,因为他可能使你apache无法工作)卸载所有已经安装的httpd包,否则默认会使用你安装的httpd来运行程序
tar -zxvf httpd-2.4.39.tar.gz
cd httpd-2.4.39/
cp -r …/apr-1.6.5 srclib/apr #不复制过去会提示没有apr
cp -r …/apr-util-1.6.1 srclib/apr-util #不复制过去会提示没有apr-util
./configure --prefix=/usr/local/apache2 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ -
with-pcre=/usr/local/pcre --enable-mods-shared=most --enable-so --enable-rewrite --with-included-apr
make && make install
cd …/
安装mod_wsgi:
tar -zxvf 4.6.5.tar.gz
cd mod_wsgi-4.6.5/
vim /etc/ld.so.conf.d/python3.conf
添加:
/usr/local/python3/lib #这是因为默认python3的lib没有进入到/usr/lib中
ldconfig
./configure --with-apxs=/usr/local/apache2/bin/apxs --with-python=/usr/local/bin/python3
make && make install
vim /usr/local/apache2/conf/httpd.conf #在最后一行添加
Include conf.d/*
LoadModules wsgi_module modules/mod_wsgi.so #添加结束按esc,然后再按shift+;,再输入wq就可以
cd …/
编辑配置文件
Apache配置文件:
cd /usr/local/apache2/conf.d/
vim case.conf #名字可以随便取,最好跟项目有关,最后再加上.conf就可以
<VirtualHost *:80>
ServerName www.case.com #域名
ErrorLog logs/case-error.log #错误日志存放路径加名称,这不是apache错误日志
WSGIScriptAlias / /usr/local/apache2/htdocs/case/run.wsgi #wsgi文件
<Director ”/usr/local/apache2/htdocs/case/“> #htdocs中的case为项目路径
Order allow,deny
allow from all
</Director>
</VirtualHost>
虚拟环境配置:
pip3 install --upgrade pip
pip3 install virutalenv
ln -s /usr/local/python3/bin/virtualenv /usr/local/bin
cd /usr/local/apache2/htdocs/case #case为项目路径
virtualenv --no-site-package venv #创建不带真实环境中的包的虚拟环境
source venv/bin/activate #进入虚拟环境
pip3 install -r requirements.txt #下载requirements.txt中的所有包,进入项目里面使用pip3 freeze > requirements.txt可以获得项目所需的所有包并导出到requirements.txt文件中
或者使用:pip3 install flask #一个一个的安装,比较麻烦而已
注:如果项目不使用虚拟环境可省略此步骤
WSGI配置文件:
vim run.wsgi #名称一定要跟apache配置文件中的一致
#!/usr/local/bin/python3
# -*- coding:UTF-8 -*-
import sys
sys.path.append(‘/usr/local/apache2/htdocs/case’) #这是项目绝对路径
sys.path.append(‘/usr/local/apache2/htdocs/case/venv/lib/python3.7/site-packages/’) #虚拟环境的包的绝对路径,如果不使用虚拟环境可去掉这行代码
from case import app as application #这里的case是指case.py文件,而不是case的项目路径,导入app到此文件,mod_wsgi才能识别出来
启动apache服务
配置apache启动配置文件:
vim /etc/init.d/httpd #因为是源码安装,所以需要自己配置
#!/bin/bash
# chkconfig: 12345 80 90
function start_http(){
/usr/local/apache2/bin/apachectl start
}
function stop_http(){
/usr/local/apache2/bin/apachectl stop
}
case “$1” in
start)
start_http
;;
stop)
stop_http
;;
restart)
stop_http
start_http
;;
*)
echo “Usage : start | stop | restart”
;;
esac
给与启动文件可执行权限
chmod a+x /etc/init.d/httpd
重新加载systemctl的进程,不重新加载会找不到新建的启动文件在那里
systemctl daemon-reload
启动apache服务:
systemctl start httpd
以上就是完整的flask项目上线到Apache服务上的流程。