专栏首页服务器安全专线Nginx中优化FastCGI配置

Nginx中优化FastCGI配置

FastCGI:

  FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。

  FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

  Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。详细的过程,如图所示。

  例子:

  Nginx中FastCGI参数的优化配置实例

  在配置完成Nginx+FastCGI之后,为了保证Nginx下PHP环境的高速稳定运行,需要添加一些FastCGI优化指令。下面给出一个优化实例,将下面代码添加到Nginx主配置文件中的HTTP层级。

  fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;

  fastcgi_connect_timeout 300;

  fastcgi_send_timeout 300;

  fastcgi_read_timeout 300;

  fastcgi_buffer_size 64k;

  fastcgi_buffers 4 64k;

  fastcgi_busy_buffers_size 128k;

  fastcgi_temp_file_write_size 128k;

  fastcgi_cache TEST;

  fastcgi_cache_valid 200 302 1h;

  fastcgi_cache_valid 301 1d;

  fastcgi_cache_valid any 1m;

  上述代码的含义:

  第一行代码是为FastCGI缓存指定一个文件路径、目录结构等级、关键字区域存储时间和非活动删除时间。

  fastcgi_connect_timeout指定连接到后端FastCGI的超时时间。

  fastcgi_send_timeout指定向FastCGI传送请求的超时时间,这个值是已经完成两次握手后向FastCGI传送请求的超时时间。

  fastcgi_read_timeout指定接收FastCGI应答的超时时间,这个值是已经完成两次握手后接收FastCGI应答的超时时间。

  fastcgi_buffer_size用于指定读取FastCGI应答第一部分需要用多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为fastcgi_buffers选项指定的缓冲区大小。

  fastcgi_buffers指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求。如果一个PHP脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“16 16k”、“4 64k”等。

  fastcgi_busy_buffers_size的默认值是fastcgi_buffers的两倍。

  fastcgi_temp_file_write_size表示在写入缓存文件时使用多大的数据块,默认值是fastcgi_buffers的两倍。

  fastcgi_cache表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502错误的发生,但是开启缓存也会引起很多问题,要视具体情况而定。

  fastcgi_cache_valid、fastcgi用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一个小时,将301应答缓存1天,其他应答均缓存1分钟。

原文链接:http://www.cqgua.com

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 1-PLC基础入门系列(PLC介绍,连接下载说明)

    阅读这节文章之前请先阅读这一篇  https://www.cnblogs.com/yangfengwu/p/7681702.html

    杨奉武
  • Ruff物联网开发套件轻松入门

    原文链接:http://www.shuaihuajun.com/article/ruff-beginner/

    陈帅华
  • R包install失败:cannot open URL

    Warning: unable to access index for repository https://mirrors.ustc.edu.cn/CRAN/...

    用户1359560
  • 学了四年的电路,却看不懂电路图?

    原文是有一位同学提了一个关于电路图的问题,然后一位叫LordPGM的答主针对该问题,给出了自己的解答。

    鲜枣课堂
  • 【Rust日报】 2019-07-17:微软安全响应中心:一种主动性的方式来提升安全

    本文简单介绍了在Rust中编写一个工程性更强的组件(crate)所必须要遵循的一些原则:

    MikeLoveRust
  • 什么时候应该使用volatile

    volatile 修饰符告诉编译程序不要对该变量所参与的操作进行某些优化。在两种特殊的情况下需要使用volatile 修饰符:第一种情况涉及到内存映射硬件(me...

    morixinguan
  • Android安全-SO动态库注入

    所谓的SO注入就是将代码拷贝到目标进程中,并结合函数重定向等其他技术,最终达到监控或改变目标进程行为的目的。Android是基于Linux内核的操作系统...

    战神伽罗
  • 程序是怎样跑起来--读书笔记

    使用一次hash 判断一个时间段内的验证数据是否正确,也就是验证一个数据生成的token,是否正确

    solate
  • Arduino硬件开发入门点亮LED

    原文链接:http://www.shuaihuajun.com/article/arduino-led/

    陈帅华
  • 【Rust日报】 2019-07-19 微软:我们需要更安全的系统编程语言

    libre graphics meeting 是一个图形相关的会议,本次会议 Colin Rofls 和 Raph Levien 一起分享了他们使用 rust ...

    MikeLoveRust

扫码关注云+社区

领取腾讯云代金券