K.I.S.S---Keep IT Simple,Stupid!    人生苦短,我用Python

uwsgi.ini常用配置参数详解

 
分类: 问答 2024年2月4日

CGI(Common Gateway Interface)通用网关接口,是一个协议,是外部应用程序(CGI 程序)与 Web 服务器之间的接口标准,该协议定义了 Web 服务器调用外部应用程序的时候需要输入的参数,和给 Web 服务器的返回结果。

通俗来说,它规定一个程序该如何与 Web 服务器程序之间通信,从而可以让这个程序跑在 Web 服务器上。

起源

最早的 Web 服务器简单地响应浏览器发来的 HTTP 请求,并将存储在服务器上的 HTML 文件返回给浏览器,也就是静态 HTML。这个场景下的服务器一般被称为 HTTP 服务器,常见的有 Apache 的 httpd 和 Nginx。

事物总是不 断发展,网站也越来越复杂,所以出现动态技术。但是服务器并不能直接运行 php、asp这样的文件,自己不能做,外包给别人吧,但是要与第三做个约定,我给你什么,然后你给我什么,就是握把请求参数发送给你,然后我接收你的处 理结果给客户端。

那这个约定就是 Common Gateway Interface,简称 CGI。这个协议可以用 VB、C、PHP、Python 来实现。CGI只是接口协议,根本不是什么语言。

1、Nginx 和 uWSGI

使用 Nginx 相当于实现了一次反向代理,也可以通过使用 Nginx 实现负载均衡,将请求分配给不同的后端服务,同时静态文件和动态接口分开请求,提高服务响应性能。

如果部署操作直接使用 uWSGI + Django,那么 uWSGI 就相当于一个 web 服务器,用于直接处理 HTTP 请求。如果是配合 Nginx 使用,相当于是一个中间件的作用,起到转发来自 Nginx 请求的作用。

2、WSGI、uWSGI 和 uwsgi

接下来理解一下 uWSGI,WSGI 和 uwsgi 这几个概念。

WSGI

web server gateway interface,web 服务器网关接口,是一种协议规范,是用于 wsgi 服务器(比如 uWSGI) 和 wsgi 应用(比如 Django)之间进行通信的规范。

uWSGI

web 服务器,或者叫 wsgi 服务器,实现 http 协议,用于接收 http 请求并能够解析信息。要将信息发给 Django,必须要用到 WSGI 协议,所以同时也可以实现 WSGI 协议。

uwsgi

是 uWSGI 服务器自有的线路协议,用于与 Nginx 等代理服务器通信。

uwsgi.ini常用配置参数详解:

  • chdir=/xxx/xxx # 指定项目目录, 这里写上程序根目录(即app.py文件所在目录)对应上述目录结构为src
  • home=/xxx/xxx # 指定虚拟环境变量
  • wsgi-file=xxx # 指定加载WSGI文件
  • socket=xxx # 指定uwsgi的客户端将要连接的socket的路径(使用UNIX socket的情况)或者地址(使用网络地址的情况)。#socket协议,用于和nginx通讯,端口可配置成别的端口;如果有nginx在uwsgi之前作为代理的话应该配socket 如:socket=0.0.0.0:5000。当然也可以使用http-socket #而如果客户端请求不经过(不搭建)Nginx代理服务器,服务请求直接到uwsgi服务器的话那么就配http。如:http=0.0.0.0:5000;IP和端口与项目启动文件app.py中一致; 127.0.0.1虽然是表示本地IP,但想要在网络上访问必须设置host=0.0.0.0才不受IP限制。
  • callable=app # 这个 app 指的是 flask 项目启动程序中定义的 flask name 的名字,我的启动程序是 app.py , 里面定义的 flask 的名字是 app 。
  • module = mysite.wsgi # 加载一个WSGI模块,这里加载mysite/wsgi.py这个模块
  • `master=true # 指定启动主进程
  • `processes=4 # 设置工作进程的数量
  • threads=2 # 设置每个工作进程的线程数
  • vacuum=true # 当服务器退出时自动删除unix socket文件和pid文件
  • logfile-chmod=644 # 指定日志文件的权限
  • daemonize=%(chdir)/xxx.log # 进程在后台运行,并将日志打印到指定文件
  • pidfile=%(chdir)/xxx.pid # 在失去权限前,将主进程pid写到指定的文件
  • uid=xxx # uWSGI服务器运行时的用户id
  • gid=xxx # uWSGI服务器运行时的用户组id
  • procname-prefix-spaced=xxx # 指定工作进程名称的前缀
  • chdir=/xxx/xxx # 指定项目目录, 这里写上程序根目录(即app.py文件所在目录)对应上述目录结构为/opt/uwsgi/
  • listen = 120 # 设置socket的监听队列大小(默认:100)

在命令行中启动 uWSGI:

uwsgi --ini uwsgi.ini###或者uwsgi uwsgi.ini
### 重启uwsgi --reload /opt/myapp/myapp.pid
###关闭uwsgi --stop /opt/myapp/myapp.pid

http、http-socket 和 socket 区别

uwsgi开头当然少不了通信的接口。

有3种方式:

socket=127.0.0.1:8888
​
http=0.0.0.0:8888
 
http-socket=127.0.0.1:8888
  • http和http-socket的区别在于,如果我们想直接将uwsgi用作服务器(例如Apache和nginx那样)直接暴露在公网那么就使用http;
  • 如果有单独的服务器(例如Apache或者nginx),由服务器将请求转发给uwsgi处理,并且使用http协议,那么此时使用http-socket。
  • http: 自己会产生一个http进程(可以认为与nginx同一层)负责路由http请求给worker, http进程和worker之间使用的是uwsgi协议。
  • http-socket: 不会产生http进程, 一般用于在前端webserver不支持uwsgi而仅支持http时使用, 他产生的worker使用的是http协议。
  • 因此, http 一般是作为独立部署的选项; http-socket 在前端webserver不支持uwsgi时使用, 如果前端webserver支持uwsgi, 则直接使用socket即可(tcp or unix)。



注:当前文章会不定期进行更新。如果您对本文有更好的建议,有新资料推荐, 可以点击: 欢迎分享优秀网站
这个位置将来会放广告

我想等网站访问量多了,在这个位置放个广告。网站纯公益,但是用爱发电服务器也要钱啊 ----------狂奔的小蜗牛