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)。
注:当前文章会不定期进行更新。如果您对本文有更好的建议,有新资料推荐,
可以点击:
欢迎分享优秀网站
。