[Apache+WSGI] CentOS离线搭建Aapche+WSGI环境

CentOS离线搭建Apache+WSGI环境

最近的工作中,需要搭建Apache+WSGI环境,而且同样是没有外网的。于是乎,愉快的踩坑之旅就又开始了。在此记录下这个十分欢快的过程。本次安装操作的系统为:CentOS7,编译器为:gcc8.3.0

Apache2

组件安装

第1步,需要安装apache2。这里不作介绍,如需详细了解,请移步至官网

主要的组件及依赖:
httpdhttp://httpd.apache.org/download.cgi#apache24
apr+apr-utilhttps://apr.apache.org/download.cgi
pcrehttp://ftp.pcre.org/pub/pcre/

可选项:
opensslhttps://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需要依赖:perl5https://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.1libcrypto.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

httpdconfigure选项参见: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

设置监听端口

ApacheConfListen

设置ServerName

ApacheConfServerName
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 running
防火墙处于运行状态,继续查看开放的端口:

firewall-cmd --zone=public --list-ports

port1
没有开放的端口,需开放8081端口:

firewall-cmd --zone=public --add-port=8081/tcp --permanent

port2
为使上述命令生效,需继续执行:

firewall-cmd --reload

执行成功后,8081端口已开放:
port3

基本启停操作
启动服务

启动命令为:

/usr/local/apache2/bin/apachectl -k start -f /usr/local/apache2/conf/httpd.conf

执行上述命令后,浏览器访问:
succeed
出现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-developenssl-devel,踩了无数的坑,才找到正确的依赖顺序。这里附上上文所列的依赖包(获取地址: 链接:https://pan.baidu.com/s/1TrSGbl7SjTWQnzW-n0thzA
提取码:ssz7),并在autoinstall.sh中列出了依赖顺序,可尝试通过./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,查看结果:
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_wsgiconfigure需要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
mod_wsgi.so已成功安装至apache2/modules目录下:
mod_wsgi.so

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
命令执行后,查看venv目录:
llveve
虚拟环境创建完成。

激活

关于虚拟环境激活的详细说明,参见:https://virtualenv.pypa.io/en/latest/user_guide.html#activators
激活:
activate
可见命令行最开始处多出了(venv),说明当前正处于虚拟环境中。

退出

退出虚拟环境:
deactivate

启用mod_wsgi模块

详细说明参见:https://modwsgi.readthedocs.io/en/develop/user-guides/quick-installation-guide.html
需在配置中加入:

LoadModule wsgi_module modules/mod_wsgi.so

以导入mod_wsgi模块:
modwsgi

VirtutalHost及WSGI相关配置
VirtualHost配置

关于Apache2VirtualHost,参见配置样例: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

本文涉及的参数为:

WSGISocketPrefix

该参数需配置到alias_module
wsgisocketprefix
其中,wsgiprefix为我自己新建的文件夹。

WSGIProcessGroup

在这里插入图片描述

WSGIDaemonProcess

在这里插入图片描述

其中,python-path参数指向了虚拟环境中依赖包的路径。

WSGIApplicationGroup

%{GLOBAL}参数说明:
在这里插入图片描述

WSGIScriptAlias

别名设置:
在这里插入图片描述

编写脚本及运行服务
一个简单地例子

本文关于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

浏览器访问:
helloworld

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


  1. http://httpd.apache.org/docs/2.4/ssl/ ↩︎

  2. https://blog.csdn.net/elija940818/article/details/79238813 ↩︎

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值