在 apache 上部署 python 项目
最近在用 python 搞微信公众号开发,由于公众平台强制要服务器 80 端口,手头又没有空闲的资源,于是想到通过现有的 apache 来跑 python 程序。通过检索找到了 mod_wsgi 这样一个 apache 扩展模块,恰好能满足需求。
简单科普一下:WSGI(Web Server Gateway Interface)是专为 Python 定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。mod_wsgi 实现了 WSGI 标准,可以支持任何兼容该标准的 Python 应用。
一、安装 apache 开发包
首先需要安装 apache 开发包,因为 mod_wsgi 的安装需要依赖模块编译工具 apxs。
1 | yum install -y httpd httpd-devel |
修改 /etc/httpd/conf/httpd.conf 中 servername 等配置项,使得 http://{server-ip}:{port} 能够正常访问。
1 | service httpd start |
二、升级 python 版本
CentOS 6 上的 Python 版本是 2.6.6,太过于老旧,很多新的模块无法使用。因此,我们需要拉源码包编译安装最新的 2.7 版本。
这里有一个坑:pip 需要依赖 Python 的 zlib 及 openssl 相关模块,而这些模块的编译以来于系统的相应开发库。因此必须先安装 zlib 和 openssl 开发库,然后再编译安装 Python,否则这些 python 模块不会参与编译。
1 2 3 4 5 6 7 | yum -y install zlib* openssl-devel wget https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tgz tar -zxvpf Python-2.7.15.tgz cd Python-2.7.15 ./configure --enable-shared make && make install |
安装后,将原有 python 替换为新版本:
1 | ln -sf /usr/local/bin/python2.7 /usr/bin/python |
执行 python -v,检测是否为新版本。如果报错:
1 | python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory |
则需要将 python2.7 的运行库路径加速动态装载器的搜寻路径:
1 | echo "/usr/local/lib" >> /etc/ld.so.conf.d/python2.7.conf |
然后通过 ldconfig 更新共享库的缓存即可:
1 | ldconfig |
注意:由于 yum 依赖于 python,我们需要让其使用 python2.6 版本,不然会报错。
1 2 | vi /usr/bin/yum #!/usr/bin/python --> #!/usr/bin/python2.6 |
三、安装 mod_wsgi 模块
这个 python 的模块需要通过 pip 安装,因此需要先升级 pip。通过一行命令搞定:
1 | curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && python get-pip.py |
与上面 python 的安装相似,我们需要让其成为系统默认的版本:
1 | ln -sf /usr/local/bin/pip /usr/bin/pip |
然后通过 pip 安装 mod_wsgi 和 web.py:
1 | pip install mod_wsgi web.py |
apache 中加载 wsgi 模块,在 /etc/httpd/conf/httpd.conf 中一堆的 module 后加入:
1 | LoadModule wsgi_module modules/mod_wsgi.so |
四、部署 python 程序
在 /etc/httpd/conf/httpd.conf 中加入下面配置:
1 2 3 4 5 6 7 8 | WSGIScriptAlias /wx /var/www/wx/main.py/ Alias /wx/static /var/www/wx/static/ AddType text/html .py <Directory /var/www/wx/> Order deny,allow Allow from all </Directory> |
其中,wx 为 web 程序目录。main.py 的代码为:
1 2 3 4 5 6 7 8 | import web urls = ('/.*', 'code') class code: def GET(self): return "Hello, world." application = web.application(urls, globals()).wsgifunc() |
测试 http://{server-ip}:{port}/wx/ 访问正常,说明配置 ok。