[Apache+WSGI] CentOS离线搭建Aapche+WSGI环境
CentOS离线搭建Apache+WSGI环境
最近的工作中,需要搭建Apache+WSGI环境,而且同样是没有外网的。于是乎,愉快的踩坑之旅就又开始了。在此记录下这个十分欢快的过程。本次安装操作的系统为:CentOS7,编译器为:gcc8.3.0。
Apache2
组件安装
第1步,需要安装apache2。这里不作介绍,如需详细了解,请移步至官网。
主要的组件及依赖:
httpd:http://httpd.apache.org/download.cgi#apache24
apr+apr-util:https://apr.apache.org/download.cgi
pcre:http://ftp.pcre.org/pub/pcre/
可选项:
openssl:https://www.openssl.org/source/
关于安装的更多选项,参见官网说明:http://httpd.apache.org/docs/2.4/install.html。
其中,apr需要先于apr-util安装。openssl不是必选,这里选择安装,其作用是获取https相关的库1。
安装
apr
apr步骤:
tar -zxvf apr-1.7.0.tar.gz
cd apr-1.7.0
./configure
make -j4
make install
make clean
安装完成后,执行一下命令查看:
[root@localhost apache2]# whereis apr
apr: /usr/local/apr
apr默认安装到了/usr/local下。
安装
expat-devel
apr-util的安装需要expat-devel依赖:
rpm -ivh expat-devel-2.1.0-10.el7_3.x86_64.rpm
rpm包可到这里(http://rpmfind.net/linux/centos)获取。
安装
apr-util
apr-util步骤:
tar -zxvf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1
./configure --with-apr=/usr/local/apr # 需指定apr的位置
make -j4
make install
make clean
安装
pcre
pcre安装步骤如下:
tar -zxvf pcre-8.00.tar.gz
cd pcre-8.00
./configure
make
make install
make clean
安装openssl
openssl需要依赖:perl5(https://dev.perl.org/perl5/)
perl5安装步骤(会花费较长时间):
tar -zxvf perl-5.30.2.tar.gz
cd perl-5.30.2
sh Configure -de
make
make test
make install
make clean
openssl安装步骤如下:
tar -zxvf openssl-1.1.1g.tar.gz
cd openssl-1.1.1g
./config
make -j4
make install
make clean
安装完成后,需将libssl.so.1.1、libcrypto.so.1.1复制到/usr/lib64下:
cp /usr/local/lib64/libssl.so.1.1 /usr/lib64
cp /usr/local/lib64/libcrypto.so.1.1 /usr/lib64
至此,openssl安装完成。
安装
httpd
httpd的configure选项参见:http://httpd.apache.org/docs/2.4/install.html。或这行./configure --help查看。
步骤:
tar -zxvf httpd-2.4.43.tar.gz
cd httpd-2.4.43
./configure
make -j4
make install
make clean
安装完成后,可通过命令whereis apache2查找安装位置,默认安装为/usr/local下。
至此,apache2安装完成。
Apache服务基本操作
基本配置
apache2的默认安装路径为/usr/local/apache2,这里用APACHE_HOME指代该路径。
配置文件位于#{APACHE_HOME}/conf下,其中主配置为httpd.conf。
设置监听端口

设置ServerName

ServerName可设置为域名,若没有域名,则可设置为ip地址。
上述两步即完成基础配置,更多配置选项参见:http://httpd.apache.org/docs/2.4/configuring.html,以及http://httpd.apache.org/docs/2.4/sections.html
CentOS7开放端口
在启动服务之前,需检查防火墙状态:
firewall-cmd --state

防火墙处于运行状态,继续查看开放的端口:
firewall-cmd --zone=public --list-ports

没有开放的端口,需开放8081端口:
firewall-cmd --zone=public --add-port=8081/tcp --permanent

为使上述命令生效,需继续执行:
firewall-cmd --reload
执行成功后,8081端口已开放:

基本启停操作
启动服务
启动命令为:
/usr/local/apache2/bin/apachectl -k start -f /usr/local/apache2/conf/httpd.conf
执行上述命令后,浏览器访问:

出现It works!即成功启动。
服务重启即停止
重启:/usr/local/apache2/bin/apachectl -k restart
停止:/usr/local/apache2/bin/apachectl -k stop
更多启停操作参见:http://httpd.apache.org/docs/2.4/invoking.html,及http://httpd.apache.org/docs/2.4/stopping.html。
Python3
本文均为离线安装。
前置依赖安装
安装python3需要以下依赖2:
zlib-devel
bzip2-devel
openssl-devel
ncurses-devel
sqlite-devel
readline-devel
tk-devel
gdbm-devel
libpcap-devel
xz-devel
libffi-devel
可通过rpm -ivh *.rpm安装。
bzip2-devel
bzip2-devel-1.0.6-13.el7.x86_64.rpm
gdbm-devel
gdbm-devel-1.10-8.el7.x86_64.rpm
ncurses-devel
ncurses-devel-5.9-14.20130511.el7_4.x86_64.rpm
readline-devel
readline-devel-6.2-11.el7.x86_64.rpm
sqlite-devel
sqlite-devel-3.7.17-8.el7.x86_64.rpm
tk-devel
libX11-common-1.6.7-2.el7.noarch.rpm
libXau-1.0.8-2.1.el7.x86_64.rpm
libxcb-1.13-1.el7.x86_64.rpm
libX11-1.6.7-2.el7.x86_64.rpm
xorg-x11-proto-devel-2018.4-1.el7.noarch.rpm
libXau-devel-1.0.8-2.1.el7.x86_64.rpm
libxcb-devel-1.13-1.el7.x86_64.rpm
libX11-devel-1.6.7-2.el7.x86_64.rpm libXft-devel
tcl-devel-8.5.13-8.el7.x86_64.rpm
fontpackages-filesystem-1.44-8.el7.noarch.rpm
dejavu-fonts-common-2.33-6.el7.noarch.rpm
dejavu-sans-fonts-2.33-6.el7.noarch.rpm
fontconfig-2.13.0-4.3.el7.x86_64.rpm
libXrender-0.9.10-1.el7.x86_64.rpm
libXft-2.3.2-2.el7.x86_64.rpm
tk-8.5.13-6.el7.x86_64.rpm
libpng-devel-1.5.13-7.el7_2.x86_64.rpm
freetype-devel-2.8-14.el7.x86_64.rpm
libuuid-devel-2.23.2-61.el7.x86_64.rpm
fontconfig-devel-2.13.0-4.3.el7.x86_64.rpm
libXrender-devel-0.9.10-1.el7.x86_64.rpm
libXft-devel-2.3.2-2.el7.x86_64.rpm
tk-devel-8.5.13-6.el7.x86_64.rpm
xz-devel
xz-devel-5.2.2-1.el7.x86_64.rpm
zlib-devel
zlib-devel-1.2.7-18.el7.x86_64.rpm
libffi-devel
libffi-devel-3.0.13-18.el7.x86_64.rpm
openssl-devel
keyutils-libs-devel-1.5.8-3.el7.x86_64.rpm
libcom_err-devel-1.42.9-16.el7.x86_64.rpm
libkadm5-1.15.1-37.el7_6.x86_64.rpm
libsepol-devel-2.5-10.el7.x86_64.rpm
pcre-devel-8.32-17.el7.x86_64.rpm
libselinux-devel-2.5-14.1.el7.x86_64.rpm
libverto-devel-0.2.5-4.el7.x86_64.rpm
krb5-devel-1.15.1-37.el7_6.x86_64.rpm
openssl-devel-1.0.2k-19.el7.x86_64.rpm
所选依赖涉及到的依赖包较多,特别是tk-devel和openssl-devel,踩了无数的坑,才找到正确的依赖顺序。这里附上上文所列的依赖包(获取地址: 链接:https://pan.baidu.com/s/1TrSGbl7SjTWQnzW-n0thzA
提取码:ssz7),并在autoinstall.sh中列出了依赖顺序,可尝试通过./autoinstall.sh对依赖进行一键安装:

安装Python
本次采用./configure --enable-optimizations --enable-shared进行configure,更多选项可使用./configure --help查看。
tar -zxvf Python-3.8.3.tar.gz
cd Python-3.8.3
./configure --enable-optimizations --enable-shared
make -j4
make install
make clean
安装完成后,将libpython3.8.so.1.0复制到/usr/lib64下。
执行命令:python3,查看结果:

mod_wsgi及Apache配置
mod_wsgi模块安装
要启用mod_wsgi模块,首先需要安装mod_wsgi的相关库。mod_wsgi官网说明:https://modwsgi.readthedocs.io/en/develop/,下载地址:https://pypi.org/project/mod-wsgi/。根据官网对mod_wsgi安装的说明:https://modwsgi.readthedocs.io/en/develop/user-guides/quick-installation-guide.html,开始执行安装操作:
tar -zxvf mod_wsgi-4.7.1.tar.gz
cd mod_wsgi-4.7.1
mod_wsgi的configure需要apxs,而apxs是随着apache2一起安装的,其路径为#{Apache_Home}/bin目录下。
./configure --with-python=/usr/local/bin/python3.8 --with-apxs=/usr/local/apache2/bin/apxs
make
make install
make clean
安装结果:

mod_wsgi.so已成功安装至apache2/modules目录下:

wsgi相关配置
我们在这里将Python的虚拟环境与wsgi结合起来,因此,首先需准备Python虚拟环境;其次,我们将wsgi相关配置放入VirtualHost中,作为独立的服务配置;最后,需编写wsgi的运行脚本,验证配置是否成功。
python虚拟环境准备
创建虚拟环境
关于虚拟环境及其创建的详细说明,请参见:https://www.python.org/dev/peps/pep-0405/#creating-virtual-environments
本文使用如下方式创建:
python3 -m venv /path/to/new/virtual/environment
其中,/path/to/new/virtual/environment为你所指定的虚拟环境的目录,可以是绝对路径,也可以是相对路径。

命令执行后,查看venv目录:

虚拟环境创建完成。
激活
关于虚拟环境激活的详细说明,参见:https://virtualenv.pypa.io/en/latest/user_guide.html#activators
激活:

可见命令行最开始处多出了(venv),说明当前正处于虚拟环境中。
退出
退出虚拟环境:

启用mod_wsgi模块
详细说明参见:https://modwsgi.readthedocs.io/en/develop/user-guides/quick-installation-guide.html
需在配置中加入:
LoadModule wsgi_module modules/mod_wsgi.so
以导入mod_wsgi模块:

VirtutalHost及WSGI相关配置
VirtualHost配置
关于Apache2的VirtualHost,参见配置样例:http://httpd.apache.org/docs/2.4/vhosts/examples.html
本文的VirtualHost配置如下:
<VirtualHost 192.168.0.101:8081>
ServerName 192.168.0.101:8081
DocumentRoot "/usr/www/domain8081"
<IfModule alias_module>
#WSGISocketPrefix /usr/local/apache2/wsgiprefix
WSGIProcessGroup testwsgi
WSGIDaemonProcess testwsgi python-path=/data/venv/lib/python3.8/site-packages
WSGIApplicationGroup %{GLOBAL}
WSGIScriptAlias /hello "/data/wsgipro/test/hello.wsgi"
</IfModule>
<Directory "/data/wsgipro/test">
Require all granted
</Directory>
</VirtualHost>
其中,以WSGI为前缀的,都是WSGI的相关配置。
WSGI相关配置
关于WSGI的所有配置参数说明,参见:https://modwsgi.readthedocs.io/en/develop/configuration.html。
本文涉及的参数为:
该参数需配置到alias_module下:

其中,wsgiprefix为我自己新建的文件夹。


其中,python-path参数指向了虚拟环境中依赖包的路径。
%{GLOBAL}参数说明:

别名设置:

编写脚本及运行服务
一个简单地例子
本文关于wsgi脚本的编写,采用了官网的Hello, World!的例子:
def application(environ, start_response):
status = '200 OK'
output = b'Hello World!'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
即,创建WSGIScriptAlias参数中对应的hello.wsgi,并将上述代码添加到该文件中。
重启服务:
/usr/local/apache2/bin/apachectl -k restart
浏览器访问:

一个Flask的简单例子
先附上Flask官网。
以下为一个基于flask的简单demo服务:
链接:https://pan.baidu.com/s/1QSvXe4xj9lSvBlmTnMFTvQ
提取码:uwou
本节会演示如何将上述demo部署到apache server中。
step0
安装flask依赖。由于需要在虚拟环境中运行demo服务,因此需要将flask依赖安装到虚拟环境中。
首先,需激活虚拟环境:
source bin/activate
其次,解压flask及其前置依赖安装包(下载地址:https://pypi.org/project/Flask/#files)并安装:
依赖安装
依次安装click、itsdangerous、MarkupSafe、Jinja2、Werkzeug
flask
tar -zxvf Flask-1.1.2.tar.gz
cd Flask-1.1.2
python3 setup.py install
cd ../
rm -rf Flask-1.1.2
用相同的方式安装pymysql(地址:https://pypi.org/project/PyMySQL/#files)。
step1
新建flask-pro目录,作该demo程序的工程目录:
mkdir flask-pro
cd flask-pro
将demo程序传到上述文件夹并解压:
unzip flask-demo.zip
mv -f flask-demo/* .
step2
编写.wsgi文件(此处为run.wsgi,配置参考:https://dormousehole.readthedocs.io/en/latest/deploying/mod_wsgi.html):
import sys
sys.path.insert(0, r'/data/flask-pro') # 加入当前路径
if sys.getdefaultencoding() != 'utf-8': # 设置编码为utf8
reload(sys)
sys.setdefaultencoding('utf-8')
from starter import app as application # 将starter.py中的app对象导入为application
step3
apache配置(httpd.conf):
VirtualHost:
<VirtualHost 192.168.0.101:8082>
ServerName 192.168.0.101:8082
DocumentRoot "/usr/www/domain8082"
<IfModule alias_module>
#WSGISocketPrefix /data/apache2/wsgiprefix
WSGIProcessGroup testflask
WSGIDaemonProcess testflask python-path=/data/venv/lib/python3.8/site-packages
WSGIApplicationGroup %{GLOBAL}
WSGIScriptAlias / "/data/flask-pro/run.wsgi"
</IfModule>
<Directory "/data/flask-pro">
Require all granted
</Directory>
</VirtualHost>
设置apache监听8082端口:

重启服务:
/usr/local/apache2/bin/apachectl -k restart
浏览器访问:

至此,Apache+WSGI环境搭建完成。
本文详述了在CentOS7系统下,离线搭建Apache+WSGI环境的全过程,包括Apache2、Python3及mod_wsgi的安装配置,以及通过WSGI部署Flask应用的具体步骤。
1942

被折叠的 条评论
为什么被折叠?



