[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
环境搭建完成。