发现一个用uwsgi部署python项目的小技巧
uwsgi需要配置一个uwsgi.ini的启动文件,里边需要写上具体的启动端口拉,log日志目录拉,之类的配置信息。
其中关于端口,有两个配置方法。
[uwsgi]
http = 0.0.0.0:8888
socket = 0.0.0.0:8000 (其中这个socket,也就是http-socket,当前端webserver不支持uwsgi时使用。一般python的接口服务,都是用的socket这个参数)
一般配置的时候,都是只写一个就可,要不写第一行,要不写第二行,但是这里有个巧妙的配置方案。
我们是用了docker技术了,docker里边,是uwsgi启动python服务。
总所周知,你启动uwsgi的时候,假如用http这种的配置,你是可以在命令行里,用curl直接请求你接口做测试的,假如用了socket,就没法直接在命令行里用curl请求你的接口服务,会直接报错没有该服务。
怕有人不理解,直接解释一下:
--http 这个是作为一个独立的服务器启动 然后由NGINX 或apache作为一个80端口的中介用来转发,可以直接用浏览器访问这个9090端口。
--socket 是在内存中遵循socket协议和NGINX 或apache进行内存交换,不可以直接用浏览器直接访问。
可能有人要问,socket这种方法,不能用浏览器直接访问,岂不是项目没法使用?
答案是可以配合nginx,用下边这种方法的。↓
location /v1 {
uwsgi_pass 127.0.0.1:8000;
include uwsgi_params;
}
然后最巧妙的地方来了。用了docker的时候,启动命令有个-p,会把容器里边和容器外边的端口做一个映射,类似于:docker run -p5006:8000 xxxxxx
上边的5006就是宿主机的端口,8000就是容器里边uwsgi启动的指定端口。
直接演示最终效果:
[uwsgi]
http = 0.0.0.0:8888
socket = 0.0.0.0:8000
当你的uwsgi如上进行配置,并打包成镜像文件后。你在宿主机启动这个镜像文件,有两种端口映射可供选择。
1.docker run -p5006:8000 xxxxxxxx (这种的没法用curl直接请求)
2.docker run -p5006:8888 xxxxxxxx (这种的可以用curl直接请求,直接在宿主机上,curl 127.0.0.1:5006/api/v1/......就可以直接请求的)
你完全不用更改你的uwsgi配置,实现了动态的部署方式,基于你的实际项目的部署要求,选择上边两种运行方式就可。