写入uWSGI Unix套接字
我有一个用Python写的wsgi应用,它通过uWSGI在NGinx后面运行。NGinx负责监听网络请求,并把这些请求转发到位于/tmp/uwsgi.socket
的uWSGI Unix套接字。
现在,我想模拟一下NGinx与这个套接字通信时的情况。我用Python尝试了以下操作:
import socket
uwsgi_socket_address = "/tmp/uwsgi.sock"
socket_client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
socket_client.connect(uwsgi_socket_address)
msg = "GET /index HTTP/1.1\r\n"
socket_client.sendall(msg)
但是我得到了这个错误信息:
/usr/lib/python2.7/socket.pyc in meth(name, self, *args)
222
223 def meth(name,self,*args):
--> 224 return getattr(self._sock,name)(*args)
225
226 for _m in _socketmethods:
error: [Errno 32] Broken pipe
1) 我尝试的操作在这个套接字和uWSGI上是否可行?如果可以的话,缺少什么才能让它正常工作?
2) 有没有什么Python工具可以帮助我构造文本HTTP请求,而不仅仅是代表我查询服务器?比如这样:
>>> import somehttplib
>>> http = somehttplib()
>>> request = http.get('/index')
>>> request.text=='GET /index HTTP/1.1\r\n'
True
2 个回答
2
可以看看这个uwsgi-tools
包。它使用的是IP套接字,不过只要稍微改动一下,也可以用在unix套接字上。
4
你不能用HTTP协议和一个使用'uwsgi'协议的服务器进行交流。uwsgi协议是一种简单的二进制格式,用来表示数组和字典。如果你想和uWSGI服务器用HTTP交流,你需要把它配置成用--http-socket,而不是--socket。
你可以在同一个实例中同时使用这两种协议,方法是:
uwsgi --http-socket <address1> --socket <address2> ...
最后,你可以用几行代码轻松实现一个uwsgi的序列化器。
这里有一个解析器的例子(你需要的是相反的东西,显而易见):
https://github.com/unbit/blastbeat#uwsgi
这里可以找到相关的规格说明: