Nginx(18)-如何支持FastCGI/SCGI/uWSGI

本文介绍了CGI的历史,以及FastCGI、SCGI和UWSGI等技术如何提升Web服务器的性能和扩展性。重点讲解了FastCGI、SCGI和UWSGI的配置示例及常用指令。

        最初用浏览器浏览的网页只能是静态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:快速通用网关接口(Fast Common Gateway Interface),它是早期通用网关接口(CGI)的增强版本。FastCGI致力于减少网页服务器与CGI程序之间互动的开销,从而提高服务器的性能,使其可以同时处理更多的网页请求。与CGI相比,FastCGI的主要优势在于其性能和扩展性。FastCGI典型实现是PHP语言实现的php-fpm,这也是php网站最常使用接口程序。
  2. SCGI:简单网关接口(Simple Gateway Interface),它是一种介于web服务器和提供HTTP服务的应用程序之间的接口,能够实现HTTP服务进程的管理,为动态web应用程序提供了一个外部接口。SCGI的优势在于其简单性和可扩展性,但与FastCGI相比,SCGI的性能可能稍逊一筹。
  3. WSGI,全称Web Server Gateway Interface,是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。它是作为Web服务器与Web应用程序或应用框架之间的一种低级别的接口,以提升可移植Web应用开发的共同点。许多框架都自带了WSGI server,比如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_"

这篇文章如果对您有所帮助或者启发的话,帮忙关注或点赞,有问题请评论,必有所复。您的支持是我写作的最大动力!

root@17e9526c08b8:/# nginx -V 2>&1 | grep njs root@17e9526c08b8:/# nginx -V 2>&1 | grep njs root@17e9526c08b8:/# nginx -V nginx version: nginx/1.21.1 built by gcc 8.3.0 (Debian 8.3.0-6) built with OpenSSL 1.1.1d 10 Sep 2019 TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.21.1/debian/debuild-base/nginx-1.21.1=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie' root@17e9526c08b8:/# nginx -V 2>&1 | grep NJS root@17e9526c08b8:/# nginx -V 2>&1 | grep NJS
09-03
ake -f objs/Makefile install make[1]: Entering directory '/home/cjt/share/nginx-1.16.1' test -d '/usr/local/nginx' || mkdir -p '/usr/local/nginx' test -d '/usr/local/nginx/sbin' \ || mkdir -p '/usr/local/nginx/sbin' test ! -f '/usr/local/nginx/sbin/nginx' \ || mv '/usr/local/nginx/sbin/nginx' \ '/usr/local/nginx/sbin/nginx.old' cp objs/nginx '/usr/local/nginx/sbin/nginx' test -d '/usr/local/nginx/conf' \ || mkdir -p '/usr/local/nginx/conf' cp conf/koi-win '/usr/local/nginx/conf' cp conf/koi-utf '/usr/local/nginx/conf' cp conf/win-utf '/usr/local/nginx/conf' test -f '/usr/local/nginx/conf/mime.types' \ || cp conf/mime.types '/usr/local/nginx/conf' cp conf/mime.types '/usr/local/nginx/conf/mime.types.default' test -f '/usr/local/nginx/conf/fastcgi_params' \ || cp conf/fastcgi_params '/usr/local/nginx/conf' cp conf/fastcgi_params \ '/usr/local/nginx/conf/fastcgi_params.default' test -f '/usr/local/nginx/conf/fastcgi.conf' \ || cp conf/fastcgi.conf '/usr/local/nginx/conf' cp conf/fastcgi.conf '/usr/local/nginx/conf/fastcgi.conf.default' test -f '/usr/local/nginx/conf/uwsgi_params' \ || cp conf/uwsgi_params '/usr/local/nginx/conf' cp conf/uwsgi_params \ '/usr/local/nginx/conf/uwsgi_params.default' test -f '/usr/local/nginx/conf/scgi_params' \ || cp conf/scgi_params '/usr/local/nginx/conf' cp conf/scgi_params \ '/usr/local/nginx/conf/scgi_params.default' test -f '/usr/local/nginx/conf/nginx.conf' \ || cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf' cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf.default' test -d '/usr/local/nginx/logs' \ || mkdir -p '/usr/local/nginx/logs' test -d '/usr/local/nginx/logs' \ || mkdir -p '/usr/local/nginx/logs' test -d '/usr/local/nginx/html' \ || cp -R html '/usr/local/nginx' test -d '/usr/local/nginx/logs' \ || mkdir -p '/usr/local/nginx/logs' make[1]: Leaving directory '/home/cjt/share/nginx-1.16.1' 是否安装成功
08-03
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐享技术

每一个打赏,都是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值