WordPress Web.py uWSGI Nginx 集成配置

wordpress webpy uwsgi nginx

Python 目前在编程语言方面非常受欢迎,使用 Python 开发的各种应用覆盖面广,使用灵活方便。本篇文章将介绍一个方法可以在同一个域名(Domain)和 Nginx 服务的环境中集成WordPress(PHP)、Web.py(Python 框架)、Python 应用,其中Nginx 和 Web.py 的集成使用了 uWSGI 服务。

一、安装配置uWSGI

uSWGI 项目提供基于WSGI(Python Web Server Gateway Interface)协议的全栈服务,uSWGI 以 Plugin 的方式拓展对多平台和语言的支持,本篇文章介绍使用 Python 插件,更多关于该项目的信息,请参考官网的相关文档。

1、创建Python应用目录

$mkdir /home/user/www/webpy/app ## wordpress 位置可以在…/www/wordpress
$mkdir /home/user/www/webpy/logs

2、到官网下载源代码,然后编译安装uSWGI,命令如下:

$apt-get install python3-dev
$tar -xzvf uwsgi-2.0.20.tar.gz
$cd uwsgi-2.0.20
$python3 uwsgiconfig.py –build
$sudo python3 setup.py install ##安装服务到系统相关目录下
$PYTHON=python3.x ./uwsgi –build-plugin “plugins/python python3” ##编译python插件
# 完成后会生成一个库文件python3_plugin.so
$mv python3_plugin.so /home/user/www/webpy/app/ ##移动到上面建立好的应用目录中

3、配置uWSGI服务运行参数文件

$vi /home/user/www/webpy/app/uwsgi.xml

<uwsgi>
	<uid>user</uid>
	<gid>user</gid>
	<plugin>python3</plugin>
	<socket>/home/user/www/webpy/app/uwsgi.socket</socket>
	<pythonpath>/home/user/www/webpy/app/</pythonpath>
	<module>myuwsgiapp</module>
	<master/>
	<processes>4</processes>
	<harakiri>60</harakiri>
	<reload-mercy>8</reload-mercy>
	<cpu-affinity>1</cpu-affinity>
	<stats>/tmp/stats.socket</stats>
	<max-requests>2000</max-requests>
	<limit-as>512</limit-as>
	<reload-on-as>256</reload-on-as>
	<reload-on-rss>192</reload-on-rss>
	<no-orphans/>
	<vacuum/>
</uwsgi>

二、安装Web.py

参考官网的安装指南。这里使用Python组件的方式,命令如下:

$sudo pip3 install web.py

三、配置Nginx

在Nginx的原配置文件中加入uWSGI相关的访问配置信息。

location /uwsgi-test {
	uwsgi_pass      unix:///home/user/www/webpy/app/uwsgi.socket;
	include         uwsgi_params;
	uwsgi_param     UWSGI_SCHEME $scheme;
	uwsgi_param     SERVER_SOFTWARE    nginx/$nginx_version;

	access_log /home/user/www/webpy/logs/access.log;
	error_log  /home/user/www/webpy/logs/error.log;
}

四、创建Python应用

$vi /home/user/www/webpy/app/myuwsgiapp.py

import os
import sys

sys.path.append('/home/user/www/webpy/app')

os.environ['PYTHON_EGG_CACHE'] = '/home/user/www/webpy/.python-egg'

def application(environ, start_response):
	status = '200 OK'
	output = 'Hello World!'

	response_headers = [('Content-type', 'text/plain'),
	                ('Content-Length', str(len(output)))]
	start_response(status, response_headers)

	return [output.encode('utf-8')]

或者使用web.py的web模块的方式,编辑myuwsgiapp.py。

import os
import sys
import web

sys.path.append('/home/user/www/webpy/app')

os.environ['PYTHON_EGG_CACHE'] = '/work/www/webpy/.python-egg'

urls = (
  '/uwsgi-test', 'index'
)

app = web.application(urls, globals())

class index:
        def GET(self):
                return "Hello, world!"

if __name__ == "__main__": app.run()

application = app.wsgifunc()

五、启动服务,运行Python应用

$uwsgi uwsgi.xml
### 或者后台运行 ###
$nohup uwsgi uwsgi.xml > logs/uwsgi.log 2>&1 &
#nginx -s stop
#nginx

如果希望某个 Python 代码文件修改后,uWSGI 主进程自动重启,同时uWSGI的输出重定向到一个文件中,可以使用下面的命令。

$nohup uwsgi –touch-reload=./myuwsgiapp.py uwsgi.xml > logs/uwsgi.log 2>&1 &

代码修改后,输入下面的命令,uWSGI服务会自动重启。

$touch myuwsgiapp.py

打开浏览器输入 localhost/uwsgi-test,就可以看到“Hello World!”了。

发表评论

邮箱地址不会被公开。 必填项已用*标注