uWSGI:
uWSGI:是python的http server服务,也叫做python网关API,主要作用是接收html发送过来的数据并传递给web后台逻辑,实现数据库的交互
python web中,大多数都在讨论flask等框架,个人而言,更喜欢讨论一些server实现而不是现场框架,所以自己写的网站后端处理逻辑也是用的python,
但是并没有用任何的python框架,自写逻辑,这里就要一个httpserver服务把我的html中ajax请求转发给我的处理逻辑。所以用到了uwsgi;
uWSGI:是python已经写好的httpserver,鉴于个人能力有限,暂时没有时间学习,以后学的更多后会尝试自己写一下httpserver实现数据转发。
uWSGI 安装:
uWSGI是基于python的一个存python写的模块,直接pip install即可安装;
启动:
启动前需准备配置文件,用现成封装的软件大多数都是有目的性的,所以根据默认的设置是不能达到自身需求
这时候就需要自定义相关设置,而配置文件则是自定义设置的具体规则;
配置文件格式:
uWSGI的配置文件可以是多种文本格式,比如json、ini、xml、yaml等,所以可以新建配置文件文本例如:
config.json、config.ini、config.xml等,目前主流喜欢用ini等格式,所以我新建一个config.ini作为配置文件文档
配置文件:
一个样例uWSGI INI配置:
[uwsgi]
socket = /tmp/uwsgi.sock
socket = 127.0.0.1:8000
workers = 3
master = true
默认情况下,uWSGI使用 [uwsgi] 段,但是你可以在使用 filename:section 语法加载INI文件的时候指定另一个段名,也就是:
uwsgi --ini myconf.ini:app1
作为选择,你可以通过省略文件名并只指定段名来从相同的文件中加载另一个段。注意,技术上来讲,这会从上个加载的.ini文件中加载命名段,而不是从当前的文件中加载,因此,当包含其他文件的时候,小心为上。
[uwsgi]
# This will load the app1 section below
ini = :app1
# This will load the defaults.ini file
ini = defaults.ini
# This will load the app2 section from the defaults.ini file!
ini = :app2
[app1]
plugin = rack
[app2]
plugin = php
配置文件举例:
master = true
#启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程,如果kill这个master进程,
相当于重启所有的uwsgi进程。
chdir = /web/www/mysite
#在app加载前切换到当前目录, 指定运行目录
module = mysite.wsgi
# 加载一个WSGI模块,这里加载mysite/wsgi.py这个模块
py-autoreload=1
#监控python模块mtime来触发重载 (只在开发时使用)
lazy-apps=true
#在每个worker而不是master中加载应用
socket = /test/myapp.sock
--socket <path/address>
#指定socket文件,也可以指定为127.0.0.1:9000,这样就会监听到网络套接字,监控端口
processes = 2
#启动2个工作进程,生成指定数目的worker/进程
buffer-size = 32768
#设置用于uwsgi包解析的内部缓存区大小为64k。默认是4k。
daemonize = /var/log/myapp_uwsgi.log
# 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器
log-maxsize = 5000000
#设置最大日志文件大小
disable-logging = true
#禁用请求日志记录
vacuum = true
#当服务器退出的时候自动删除unix socket文件和pid文件。
listen = 120
#设置socket的监听队列大小(默认:100)每一个socket都有一个相关联的队列,请求会被放入其中等待进程来处理。
#当这个队列慢的时候,新来的请求就会被拒绝。队列大小的最大值依赖于系统内核。
pidfile = /var/run/uwsgi.pid
#指定pid文件
enable-threads = true
#允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程
reload-mercy = 8
#设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长秒数。
#这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了8秒就会被强行结束(忽略之前已经接收到的请求而直接结束)
max-requests = 5000
#为每个工作进程设置请求数的上限。当一个工作进程处理的请求数达到这个值,那么该工作进程就会被回收重用(重启)。
#你可以使用这个选项来默默地对抗内存泄漏
limit-as = 256
#通过使用POSIX/UNIX的setrlimit()函数来限制每个uWSGI进程的虚拟内存使用数。
#这个配置会限制uWSGI的进程占用虚拟内存不超过256M。
#如果虚拟内存已经达到256M,并继续申请虚拟内存则会使程序报内存错误,本次的http请求将返回500错误。
harakiri = 60
#一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,
#并且当前处理这个请求的工作进程会被回收再利用(即重启)
启动:
nohup uwsgi --ini uwsgi/uwsgi.ini &
其他参数参考地址:
https://www.cnblogs.com/zhouej/archive/2012/03/25/2379646.html
https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/Configuration.html
如何使用:
举例:
1、新建一个hello world输出的test.py文件,即可当作是python脚本文件,内容如下:
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]
2、启动uwsgi,监听一个端口,模拟网页http请求到该端口,测试网页访问该端口,后端的python脚本能否执行输出
启动:uwsgi --http :9090 --wsgi-file test.py
--注意需要在test.py文件夹下执行,否则需要指定该文件路径,这里启动的是http监听,nginx测试需要改成socket
3、通过浏览器访问该机器的IP+9090端口,返回hello world即代表浏览器请求成功,python后端程序能收到数据并返回数据,uwsgi
代理配置成功
由于我是服务器直接测试,所以不是本地127IP,测试结果一样;
uWSGI对端口监听有两种方式,1、http监听,针对网页直接的http请求监听端口处理,这里功能类似与NGINX;
2、socket监听,用来配合代理服务的监听方式,上游对接nginx 阿帕奇等服务。如果上有传过来的数据是nginx发送的,需要使用socket监听;
本次测验解决了python web后端如何处理网页请求的问题,加深了网关api的理解和http server服务的理解;由于网页http请求和https请求
是有一些差异的,https的uwsgi可能需要额外配置,不过我自己是通过nginx代理跳转到uwsgi,所以在nginx转发的时候统一转换成了http请求,
因此没有做https请求实验;
衍生问题:
现在使用框架的API开发,大多数都是在这个http server服务下,里面添加方法判断数据再转发给后续程序,那么产生一个新的疑问,当http
server挂掉,如何保障整体的运行,能否启用集群模式、是否会有冲突等需后续解决 ;