Nginx-->进阶-->原理-->Nginx+php+fastcgi的原理与关系

1、用户对动态PHP网页访问过程php

用户浏览器发起对网页的访问:http://192.168.1.103/index.phphtml

用户和nginx服务器进行三次握手进行TCP链接(忽略包括nginx访问控制策略、nginx防火墙等访问控制策略)node

第一步:用户将http请求发送给nginx服务器linux

第二步:nginx会根据用户访问的URI和后缀对请求进行判断nginx

1.例如用户访问的index.php,nginx则会根据配置文件中的location进行匹配,例如:web

复制代码
root@json:/data/web# cat /etc/nginx/conf.d/blog.conf 
server {
    root /data/web/blog/;
    index index.html index.htm;
    server_name www.fwait.com;
    location / {
        try_files $uri $uri/ /index.html;
    }
    location /blog/ {
        #alias /usr/share/doc/;
        auth_basic "authorized users only";
        auth_basic_user_file /etc/nginx/passwd.conf;
        #autoindex on;
        allow 192.168.1.103;
        deny all;
    }
    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_intercept_errors on;
        fastcgi_pass 127.0.0.1:9000;
    }

}
复制代码

用户访问的是index.php,则会匹配到location ~ \.php$,这个的含义是对用户经过URI访问的资源进行区分大小的匹配,而且访问的资源是以.php结尾的。数据库

nginx根据用户请求的资源匹配到具体的location后,会执行location对应的动做,location中动做的含义是:json

include /etc/nginx/fastcgi_params; #表示nginx会调用fastcgi这个接口后端

fastcgi_intercept_errors on; #表示开启fastcgi的中断和错误信息记录浏览器

fastcgi_pass 127.0.0.1:9000; # 表示nginx经过fastcgi_pass将用户请求的资源发给127.0.0.1:9000进行解析,这里的nginx和php脚本解析服务器是在同一台机器上,因此127.0.0.1:9000表示的就是本地的php脚本解析服务器。

根据nginx服务器的配置,能够看出,用户访问的是动态的php资源,nginx会调用php相关脚本解析程序对用户访问的资源进行解析。

第三步:经过第二步能够看出,用户请求的是动态内容,nginx会将请求交给fastcgi客户端,经过fastcgi_pass将用户的请求发送给php-fpm

若是用户访问的是静态资源呢,那就简单了,nginx直接将用户请求的静态资源返回给用户。

第四步:fastcgi_pass将动态资源交给php-fpm后,php-fpm会将资源转给php脚本解析服务器的wrapper

 

 

第五步:wrapper收到php-fpm转过来的请求后,wrapper会生成一个新的线程调用php动态程序解析服务器

若是用户请求的是须要读取例如MySQL数据库等,将会触发读库操做;

若是用户请求的是如图片/附件等,PHP会触发一次查询后端存储服务器如经过NFS进行存储的存储集群;

第六步:php会将查询到的结果返回给nginx

第七步:nginx构造一个响应报文将结果返回给用户

这只是nginx的其中一种,用户请求的和返回用户请求结果是异步进行,即为用户请求的资源在nginx中作了一次中转,nginx能够同步,即为解析出来的资源,服务器直接将资源返回给用户,不用在nginx中作一次中转。

2、相关疑问

1.是否是每次用户对动态资源的请求都须要触发一次完整的动态资源解析过程?

不是,能够有两种方法解决这个问题:

第一,启用nginx自己具有的缓存功能,将动态资源解析结果缓存起来,下次用户进行对应资源访问时,nginx进行本次缓存查询,若是查询成功,则直接动态资源被解析后的静态资源返回给用户;

第二,在nginx后端部署缓存机器,如部署varnish缓存集群,对资源进行缓存,用户请求的资源,能够先在缓存集群上进行查找;

2.用nginx作缓存是否可行?看实际状况,若是在整个web架构中,nginx不是瓶颈的前提下,nginx能够用来作缓存,可是不建议这么作,由于nginx是用户请求和应答用户请求的必经之路,若是nginx出现了瓶颈,后端的其余如存储集群等性能再好也没用,因此在实际的部署中,不建议启用nginx的缓存功能(在将nginx做为http server的状况下)。由于启用nginx缓存功能,一是会下降nginx性能,二是会消耗部署nginx的对应服务器的硬件资源。

3.若是用一张图表示nginx fastcgi wrapper php之间的关系

4.fastcgi具体是个什么东西

CGI全称通用网关接口 Commmon Gateway Interface

用于HTTP服务上的程序服务通讯交流的一种工具,CGI程序须运行在网络服务器上。

传统CGI接口方式性能较差,因为每次HTTP服务器遇到动态程序须要重启解析器来执行解析,而后结果被返回给HTTP服务器。这在处理高并发时,几乎是不可能的,所以诞生了FastCGI。另外传统的CGI接口方式安全性也不好

一个可伸缩地。高速地在HTTP服务器和动态脚本语言间通讯的接口

接口在linux下是socket(这个socket能够是文件socket也能够是ip socket)

主要优势把动态语言和HTTP服务器分离开来。多数流行的HTTP服务器都支持FsatCGI包括Apache/Nginx/lighttpd等

支持语言比较流行的是PHP,接口方式采用C/S架构,能够将HTTP服务器和脚本解析器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。

当HTTP服务器每次遇到动态程序时,能够将其直接交付给FastCGI进程来执行,而后将获得的结果返回给浏览器。这种方式可让HTTP服务器专注地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提升了整个应用系统的性能。

5.具体的nginx + php的nginx相关配置

 

复制代码
root@json:/data/web# cat /etc/nginx/nginx.conf|egrep -v "#|^$"
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
events {
    worker_connections 768;
}
http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    gzip on;
    gzip_disable "msie6";
    
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
root@json:/data/web#
复制代码

 

复制代码
root@json:/data/web# cat /etc/nginx/conf.d/blog.conf
server {
    root /data/web/blog/;
    index index.html index.htm;
    server_name www.fwait.com;
    location / {
        try_files $uri $uri/ /index.html;
    }
    location /blog/ {
        #alias /usr/share/doc/;
        auth_basic "authorized users only";
        auth_basic_user_file /etc/nginx/passwd.conf;
        #autoindex on;
        allow 192.168.1.103;
        deny all;
    }
    location ~ \.php$ {
        #include /usr/local/etc/nginx/fastcgi.conf;
        include /etc/nginx/fastcgi_params;
        fastcgi_intercept_errors on;
        fastcgi_pass 127.0.0.1:9000;
    }

}
root@json:/data/web# 
复制代码

 参考连接:

http://runningyongboy.blog.51cto.com/8234857/1722299

相关文章
相关标签/搜索