一.nginx实现php动态解析原理
nginx 是一个高性能的http服务器和反向代理服务器。即nginx可以作为一个HTTP服务器进行网站的发布处理,也可以作为一个反向代理服务器进行负载均衡。 但需要注意的是:nginx本身并不会对php文件进行解析。 对PHP页面的请求将会被nginx交给FastCGI进程监听的IP地址及端口,由php-fpm(第三方的fastcgi进程管理器)作为动态解析服务器处理,最后将处理结果再返回给nginx。即nginx通过反向代理功能将动态请求转向后端php-fpm,从而实现对PHP的解析支持,这就是Nginx实现PHP动态解析的基本原理。
首先需要了解一些概念。( nginx + php-fpm +fastcgi)
Nginx 是 非阻塞IO & IO复用 模型,通过操作系统提供的类似 epoll 的功能,可以在一个线程里处理多个客户端的请求。Nginx 的进程就是线程,即每个进程里只有一个线程,但这一个线程可以服务多个客户端。 PHP-FPM 是阻塞的单线程模型, pm.max_children 指定的是最大的进程数量, pm.max_requests 指定的是每个进程处理多少个请求后重启(因为 PHP 偶尔会有内存泄漏,所以需要重启)。PHP-FPM 的每个进程也只有一个线程,但是一个进程同时只能服务一个客户端。 fastCGI :为了解决不同的语言解释器(如php、python解释器)与webserver的通信,于是出现了cgi协议。只要你按照cgi协议去编写程序,就能实现语言解释器与webwerver的通信。如php-cgi程序。但是webserver每收到一个请求,都会去fork一个cgi进程,请求结束再kill掉这个进程。这样有10000个请求,就需要fork、kill php-cgi进程10000次。 fastcgi是cgi的改良版本。fast-cgi每次处理完请求后,不会kill掉这个进程,而是保留这个进程,使这个进程可以一次处理多个请求。大大提高了效率。补充:反向代理与正向代理的相关知识(简言之,正向代理-代理的是客户端;反向代理-代理的是服务器)
正向代理的用途:
(1)访问原来无法访问的资源,如Google
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录上网行为管理,对外隐藏用户信息)反向代理的用途:反向代理,"它代理的是服务端",主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
二.nginx实现php动态解析.之如何配置nginx
(1)保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网
(2)负载均衡,通过反向代理服务器来优化网站的负载1.了解nginx配置相关常识 (nginx.conf)
nginx.conf组成及基本配置语法讲解详见另外一篇文章,此处将解析php配置用到的几个语法做一下简单介绍:
try_files $uri $uri/ /index.php$is_args$args : (https://blog.51cto.com/13930997/2311716、、、Nginx try_files 里的一个坑--- try_files 的最后一个位置(fall back)是特殊的,它会发出一个内部 “子请求” 而非直接在文件系统里查找这个文件!!! ) 对nginx location ~ \.php$配置的一个疑问 ( https://segmentfault.com/q/1010000012298020) rewrite (https://segmentfault.com/a/1190000002797606) 附录:nginx配置相关语法 (注意nginx里面还包含一些可用的全局变量,详见链接内容;也可以查看nginx官方文档http://www.nginx.org/ https://www.cnblogs.com/knowledgesea/p/5175711.html )2.nginx解析php的配置范例
server { listen 8000 backlog=4096; server_name www.baidu.com localhost; access_log logs/access.log main; root /home/leimengyao/api/app/htdocs; location / { index index.php index.html index.htm; try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { #fastcgi_pass 127.0.0.1:9000; fastcgi_pass unix:/home/leimengyao/php7/var/run/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /home/leimengyao/api/app/htdocs$fastcgi_script_name; include fastcgi_params; } error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ /\.ht { deny all; } }如上配置,当一个http请求到来时,被处理的过程如下:
以http://10.94.120.124:8000/A/B?c=1&d=4为例:
http请求到来后,通过server全局块里监听的端口号,匹配到相应server。然后接下来进行location路径的匹配。 首先匹配到location / ,在这个匹配规则中,通过try_files 先在root目录(/home/leimengyao/api/app/htdocs)下查找是否有 $uri 文件;没有匹配到,然后再查找root目录下是否有 $uri/ 目录;同样没有匹配到,则匹配最后一项/index.php? $args ,即发出一个"内部子请求",也就相当于nginx发起了一个http请求到http://10.94.120.124:8000/index.php?c=1&d=4 这个子请求会被 location ~ \.php${ ... } catch住,也就是进入 FastCGI 的处理程序(nginx需要通过FastCGI模块配置,将相关php参数传递给php-fpm处理。在该项中设置了fastcgi_pass相关参数,将用户请求的资源发给php-fpm进行解析,这里涉及到 nginx FastCGI模块 的相关配置语法下文会介绍)。而具体的 URI 及参数是在 REQUEST_URI 中传递给 FastCGI 和 WordPress 程序的, 因此不受 URI 变化的影响!!!!。public static function detectPath() { if (!empty($_SERVER['SCRIPT_URL'])) { $path = $_SERVER['SCRIPT_URL']; } else { //as: www.baidu.com/A/B?saadf=esdf if (isset($_SERVER['REQUEST_URI'])) { //$_SERVER['REQUEST_URI']="/m/test?saadf=esdf"; $request_uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); if (false !== $request_uri) { $path = $request_uri; //echo $path; /A/B //exit; } elseif ($_SERVER['REQUEST_URI'] && strpos($_SERVER['REQUEST_URI'], '?') !== false) { $path = strstr($_SERVER['REQUEST_URI'], '?', true); } } else { $path = $_SERVER['PHP_SELF']; } } return $path; }3. Nginx配置.之PHP FastCGI
首先需要了解一些文件。 (nginx.conf + fastcgi_params + php-fpm.conf + php.ini)
fastcgi_params 文件一般保存在/usr/local/etc/nginx下(Ubuntu可保存于/etc/nginx下),它为FastCGI模块定义了基本的环境变量。这些fastcgi环境变量,我们在配置nginx的fastcgi_params时会用到。内容见下:Nginx.conf 的PHP FastCGI模块允许nginx同FastCGI协同工作,并且控制哪些参数将被安全传递。常见的fastcgi参数配置含义下文会具体介绍。配置范例如下:
location / { fastcgi_pass localhost:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name; fastcgi_param QUERY_STRING$query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE$content_type; fastcgi_param CONTENT_LENGTH $content_length; }
点击debug报如下错误:安装debug扩展
五.php依赖管理工具-composer
六.其他
redis(https://www.jianshu.com/p/018bbf5ff42a)
php call_user_func_array(https://www.jianshu.com/p/1c0f30d8722d)
推荐学习:《PHP视频教程》
以上就是如何快速正确配置完整的php环境(nginx和php)的详细内容!
查看更多关于如何快速正确配置完整的php环境(nginx和php)的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did51757