nginx与fastcgi(主要是php)的结合

一、nginx的fastcgi模块

1、nginx中如何解析PHP等动态语言呢?

原理就是当用户的请求是以.php结尾时,那就将请求转发给php后台进程处理,然后把php等后台进程处理后的结果返回给nginx,再返回给用户

2、fastcgi模块的主要指令:
(1)fastcgi_pass 指定fastcgi服务器的地址
  • 用法一:对于TCP套接字

fastcgi_pass 主机名:端口号;

如:

  1. fastcgi_pass 127.0.0.1:9000;
  • 用法二:对于UNIX套接字

fastcgi_pass unix:socket连接地址;

如:

  1. fastcgi_pass unix:/tmp/fastcgi.socket
  • 用法三:对于区块(upstream区块)

fastcgi_pass 区块名;

定义区块

  1. upstream webserver {
  2. server 192.168.18.101;
  3. server 192.168.18.102;
  4. server 192.168.18.103;
  5. }

使用区块:

  1. fastcgi_pass webserver;
(2)fastcgi_index 指定fastcgi索引

以PHP为例

如:

  1. fastcgi_index index.php;
(3)fastcgi_param 允许传递给fastcgi服务器的请求中的参数

用法:fastcgi_param 参数 参数值

其中有两个参数是必须的:SCRIPT_FILENAMEQUERY_STRING

那nginx中默认有哪些参数呢?

可以查看/usr/local/nginx/confi/fastcgi.conf文件即可

  1. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #脚本文件地址
  2. fastcgi_param QUERY_STRING $query_string; #查询字符串
  3. fastcgi_param REQUEST_METHOD $request_method; #请求方式(如GET/POST)
  4. fastcgi_param CONTENT_TYPE $content_type; #请求的文件的内容类型
  5. fastcgi_param CONTENT_LENGTH $content_length; #请求的文件的大小
  6. fastcgi_param SCRIPT_NAME $fastcgi_script_name; #请求的文件名称(相对于根目录而言的文件路径及文件名)
  7. fastcgi_param REQUEST_URI $request_uri; #请求的URI
  8. fastcgi_param DOCUMENT_URI $document_uri; #根目录访问URI
  9. fastcgi_param DOCUMENT_ROOT $document_root; #根目录地址
  10. fastcgi_param SERVER_PROTOCOL $server_protocol; #服务协议类型
  11. fastcgi_param HTTPS $https if_not_empty; #是否启用HTTPS服务
  12. fastcgi_param GATEWAY_INTERFACE CGI/1.1; #网关接口协议
  13. fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; #软件版本
  14. fastcgi_param REMOTE_ADDR $remote_addr; #访问者IP地址
  15. fastcgi_param REMOTE_PORT $remote_port; #访问者端口
  16. fastcgi_param SERVER_ADDR $server_addr; #服务器IP地址
  17. fastcgi_param SERVER_PORT $server_port; #服务器端口号
  18. fastcgi_param SERVER_NAME $server_name; #服务器名称(如域名)
  19. # PHP only, required if PHP was built with --enable-force-cgi-redirect
  20. fastcgi_param REDIRECT_STATUS 200; #状态码
(4)fastcgi_connect_timeout 定义服务器连接超时时间(单位为秒,默认为60秒)

用法:fastcgi_connect_timeout 60s;

(5)fastcgi_send_timeout 发送数据到服务器的超时时间

用法:fastcgi_send_timeout 60s;

(6)fastcgi_split_path_info 以pathinfo模式分隔uri

用法:fastcgi_split_path_info 模式

例:

  1. fastcgi_split_path_info ^(.+.php)(.*)$

如果我们的uri是这样的:http://www.shixinke.com/index.php/page/1

通过这个指令会影响两个变量

  • $fastcgi_script_name 实际的文件名 如上面的那个uri中的index.php

  • $fastcgi_path_info uri中脚本名之后的部分,如上面的uri中的page/1

这些参数我们可以进一步使用:

  1. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  2. fastcgi_param PATH_INFO $fastcgi_path_info;
(7)fastcgi_buffer_size 定义缓冲区大小

用法:fastcgi_buffer_size 大小;

  1. fastcgi_buffer_size 4k;
(8)fastcgi_buffers 定义缓冲区的数量与大小

用法:fastcgi_buffers 数量 大小;

如:

  1. fastcgi_buffers 8 4k;

二、nginx中如何处理php请求

将以.php结尾的请求指向php后台服务器

  1. location ~* .php$ {
  2. fastcgi_pass 127.0.0.1;
  3. fastcgi_index inde.php;
  4. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  5. include fastcgi_params;
  6. }