最初用浏览器浏览的网页只能是静态html页面。随着社会发展,动态获取数据、操作数据需要变得日益强烈,CGI应运而生。CGI(Common Gateway Interface)公共网关接口,是外部扩展应用程序与静态Web服务器交互的一个标准接口。它可以使外部程序处理浏览器送来的表单数据并对此作出响应,响应结果可直接返回给浏览器 。CGI技术示意图如下:
CGI程序可以用任何脚本语言或独立编程语言实现。然而,由于每次请求都需要启动一个新的程序,导致CGI的性能相对较低,扩展性也较差。因此当前很少直接使用CGI,而是发展出更高效相关技术。
目录
CGI相关技术
FastCGI
配置示例
常用指令
fastcgi_pass
fastcgi_index
fastcgi_param
SCGI
配置示例
常用指令
scgi_pass
UWSGI
配置示例
常用指令
uwsgi_pass
CGI相关技术
从性能、扩展性和安全性方面入手,CGI发展出如下几种主要技术:
1、 FastCGI:快速通用网关接口(FastCommonGatewayInterface),它是早期通用网关接口(CGI)的增强版本FastCGI致力于减少网页服务器与CGI程序之间互动的开销,从而提高服务器的性能,使其可以同时处理更多的网页请求与CGI相比,FastCGI的主要优势在于其性能和扩展性FastCGI典型实现是PHP语言实现的php-fpm,这也是php网站最常使用接口程序;
2、 SCGI:简单网关接口(SimpleGatewayInterface),它是一种介于web服务器和提供HTTP服务的应用程序之间的接口,能够实现HTTP服务进程的管理,为动态web应用程序提供了一个外部接口SCGI的优势在于其简单性和可扩展性,但与FastCGI相比,SCGI的性能可能稍逊一筹;
3、 WSGI,全称WebServerGatewayInterface,是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口它是作为Web服务器与Web应用程序或应用框架之间的一种低级别的接口,以提升可移植Web应用开发的共同点许多框架都自带了WSGIserver,比如Flask、webpy、Django、CherryPy等等;
4、 uWSGI:uWSGI是一种实现了WSGI协议的Web服务器,它具有高性能和可移植性uWSGI是用C语言编写的,因此其性能相对较高uWSGI可以作为Python定义的web服务器和web框架之间的接口标准;
总的来说,这四种技术的主要区别在于性能、扩展性和安全性。相对于CGI来说,FastCGI、SCGI、WSGI和uWSGI的性能和扩展性较好。其中,uWSGI由于其高性能和可移植性,通常被认为是最优的选择。然而,具体选择哪种技术取决于具体的应用场景和需求。
FastCGI
FastCgi由ngx_http_fastcgi_module模块实现,只要满足FastCgi的应用服务器均支持。以PHP(最常用的)为例,Nginx-Php工作示意图如下:
配置示例
server{
listen 8090;
静态网页
location / {
root /usr/share/nginx/html;
index index.html index.php;
}
php页面均转给php-fpm
location ~ \.php$ {
fastcgi_pass localhost:9000;
fastcgi_index index.php;
$fastcgi_script_name代表请求uri
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
包含fastcgi_params文件,定义了fastcgi_param
include fastcgi_params;
}
}
常用指令
fastcgi_pass
格式:fastcgi_pass address
;
设置FastCGI服务器地址,可以是负载均衡服务器组、域名、ip地址+端口、Unix套接字。
fastcgi_index
格式:fastcgi_index name
;
当URI以"/"结尾,用于指定默认访问文件。如果未设置,则默认为index.php。
fastcgi_param
格式:fastcgi_param parameter
value
;
设置应传递给FastCGI服务器参数。该值可以包含文本、变量及其组合。当且仅当在当前级别上没有定义fastcgi_param指令时,这些指令才会从以前的配置级别继承。
需要设置的常见参数包括:
- SCRIPT_FILENAME参数在PHP中用于确定脚本名称
- QUERY_STRING参数用于传递请求参数。
- REQUEST_METHOD参数用于传递请求方法,POST必传。
- CONTENT_TYPE参数用于传递内容类型,POST必传。
- CONTENT_LENGTH参数用于传递内容长度,POST必传。
Nginx默认在fastcgi_params文件中定义了常用的要传递的参数,内容如下:
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
可根据实际需要再追加。
关于参数,HTTP请求头字段作为默认参数传递给FastCGI服务器。在FastCGI服务器运行的应用程序和脚本中,这些参数通常作为环境变量提供。例如,“User Agent”标头字段作为HTTP_User_Agent参数传递。除了HTTP请求头字段之外,就使用fastcgi_param指令传递任意参数。
其它指令略。
实际上Nginx也可以对FastCGI响应缓冲或对响应缓存,相关指令基本同反向代理对应指令一样,只不过把"proxy_"换成"fascgi_"头,如:fastcgi_buffer_size 就是 proxy_buffer_size
SCGI
SCgi由ngx_http_scgi_module模块实现,只要满足SCgi的应用服务器均支持。
配置示例
location / {
包含传递参数文件
include scgi_params;
scgi_pass localhost:9000;
}
scgi_params是参数文件,默认包含:
scgi_param REQUEST_METHOD $request_method;
scgi_param REQUEST_URI $request_uri;
scgi_param QUERY_STRING $query_string;
scgi_param CONTENT_TYPE $content_type;
scgi_param DOCUMENT_URI $document_uri;
scgi_param DOCUMENT_ROOT $document_root;
scgi_param SCGI 1;
scgi_param SERVER_PROTOCOL $server_protocol;
scgi_param REQUEST_SCHEME $scheme;
scgi_param HTTPS $https if_not_empty;
scgi_param REMOTE_ADDR $remote_addr;
scgi_param REMOTE_PORT $remote_port;
scgi_param SERVER_PORT $server_port;
scgi_param SERVER_NAME $server_name;
可按实际需要增加。
常用指令
scgi_pass
格式:scgi_pass address
;
设置SCGI服务器地址,可以是负载均衡服务器组、域名、ip地址+端口、Unix套接字。
基本指令同fastcgi,只不过前缀"fastcgi_"换成"scgi_"
UWSGI
UWSGI由ngx_http_uwsgi_module模块实现,只要满足uwsgi的应用服务器均支持。
配置示例
location / {
包含传递参数文件
include uwsgi_params;
uwsgi_pass localhost:9000;
}
uwsgi_params是参数文件,默认包含:
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
可按实际需要增加。
常用指令
uwsgi_pass
格式:uwsgi_pass address
;
设置uwsgi服务器地址,可以是负载均衡服务器组、域名、ip地址+端口、Unix套接字。
基本指令同fastcgi,只不过前缀"fastcgi_"换成"uwsgi_"
这篇文章如果对您有所帮助或者启发的话,帮忙关注或点赞,有问题请评论,必有所复。您的支持是我写作的最大动力!