php环境搭建(正确配置nginx和php)
前言:
首先来了解一下nginx工作原理:https://blog.csdn.net/hguisu/article/details/8930668
一.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)代理可以记录用户访问记录上网行为管理,对外隐藏用户信息)反向代理的用途:反向代理,"它代理的是服务端",主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
(1)保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网
(2)负载均衡,通过反向代理服务器来优化网站的负载
二.nginx实现php动态解析.之如何配置nginx
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=esdfif (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; }
(https://www.jianshu.com/p/9bae5c49a163)
- php-fpm.conf
- php.ini 使用php --ini查看php加载的配置文件路径(https://www.jianshu.com/p/a118f10d738c)
查看发现配置文件目录在/etc目录,但是加载php.ini显示为none;切换到/etc下目录查看,确实没有php.ini文件。
复制php.ini.default为php.ini,再次执行php --ini 查看发现加载php.ini文件成功
php -m 查看会列出命令行 PHP Cli 已经安装的扩展。
查看php拓展安装目录命令: php-config | grep -i extension (http://www.blogdaren.com/post-2520.html)
切换到该目录下查看拓展
其次了解一些nginx.conf中常用fastcgi配置的含义
- fastcgi_pass:该参数设置的是nginx与php-fpm的通信方式,nginx和php-fpm的通信方式有两种,一种是socket形式,一种是tcp形式。配置两种方式都可以,但是必须保证nginx配置的监听方式,和php-fpm.conf配置的监听方式保持一致性!(https://segmentfault.com/q/1010000004854045、https://www.jianshu.com/p/eab11cd1bb28)
其中TCP是IP加端口,可以跨服务器.而UNIX Domain Socket不经过网络,只能用于Nginx跟PHP-FPM都在同一服务器的场景.用哪种取决于你的PHP-FPM配置:
方式1:
php-fpm.conf: listen = 127.0.0.1:9000
nginx.conf: fastcgi_pass 127.0.0.1:9000;
方式2:
php-fpm.conf: listen = /tmp/php-fpm.sock
nginx.conf: fastcgi_pass unix:/tmp/php-fpm.sock;
其中php-fpm.sock是一个文件,由php-fpm生成,类型是srw-rw----.UNIX Domain Socket可用于两个没有亲缘关系的进程,是目前广泛使用的IPC机制,比如X Window服务器和GUI程序之间就是通过UNIX Domain Socket通讯的.这种通信方式是发生在系统内核里而不会在网络里传播.UNIX Domain Socket和长连接都能避免频繁创建TCP短连接而导致TIME_WAIT连接过多的问题.对于进程间通讯的两个程序,UNIX Domain Socket的流程不会走到TCP那层,直接以文件形式,以stream socket通讯.如果是TCP Socket,则需要走到IP层,对于非同一台服务器上,TCP Socket走的就更多了.
UNIX Domain Socket:
Nginx <=> socket <=> PHP-FPM
TCP Socket(本地回环):
Nginx <=> socket <=> TCP/IP <=> socket <=> PHP-FPM
TCP Socket(Nginx和PHP-FPM位于不同服务器):
Nginx <=> socket <=> TCP/IP <=> 物理层 <=> 路由器 <=> 物理层 <=> TCP/IP <=> socket <=> PHP-FPM
- fastcgi_index:
- fastcgi_param:
以上配置文件全部修改完成以后,需要进行重启nginx和php-fpm,修改的内容才能生效:
- 修改配置(nginx.conf,php-fpm.conf,php.ini)需要进行的操作(修改配置的时候通过 find / -name php-fpm.conf命令来查找),另外重启php-fpm(mac重启php-fpm)和nginx (nginx -s reload https://www.jianshu.com/p/2726ca520f4a 、 https://www.jianshu.com/p/9bae5c49a163)
三.nginx实现php动态解析.之配置过程中常见错误
- php-fpm需要进行一些配置修改(超时时长:request_slowlog_timeout等 php-fpm 的request_terminate_timeout设置不当导致的502错误)
- Nginx-配置误区 (fastcgi_param SCRIPT_FILENAME)
- Nginx + Php-fpm 一个神奇的502错误
- nginx+php-fpm打开index.php显示空白
- php国际化插件安装、debug插件安装(extension php.ini)
- php缓存信息关闭(https://www.cnblogs.com/JohnABC/p/3529786.html !!开启缓存会引起许多问题,视情况而定)
- ?php执行流程:https://www.jianshu.com/p/042c56e08939
四.Mac下配置神器PhpStrom开发环境
https://blog.csdn.net/tfy_2425482491/article/details/79377672
点击debug报如下错误:安装debug扩展
五.php依赖管理工具-composer
六.其他
redis(https://www.jianshu.com/p/018bbf5ff42a)
php call_user_func_array(https://www.jianshu.com/p/1c0f30d8722d)
参考文献:
http://www.cnblogs.com/mangguoxiansheng/p/5967745.htmll
https://segmentfault.com/q/1010000004854045
nginx rewrite规则 https://segmentfault.com/a/1190000002797606
php环境搭建(正确配置nginx和php)相关推荐
- nagios+nginx从环境搭建到配置
nagios+nginx从环境搭建到配置 nagios是一个开源免费的系统监控工具,官网地址 http://www.nagios.org/ 截止2011-07-27 nagios的最新版 ...
- WNMP环境搭建(Win10+Nginx+MySQL+PHP)
文章目录 准备工作 安装Nginx 安装PHP PHP关联Nginx 安装MySQL 一键启动.关闭(MySQL,Nginx,PHP) bat 准备工作 官网下载 Nginx.MySQL.PHP到本地 ...
- mysql slave 详细配置_进击的MysqlSlave环境搭建及配置
一)环境拓扑今天讨论的是mysql集群这一块,资源如下所示:二)Mysql安装配置这里不一一赘述,可以选择源代码编译安装,也可以参考我之前的一篇博文"懒人"速成 一)环境拓扑 二) ...
- 正确配置nginx和php
如何正确配置Nginx+PHP 假设用PHP实现了一个前端控制器,或者直白点说就是统一入口:把PHP请求都发送到同一个文件上,然后在此文件里通过解析「REQUEST_URI」实现路由. 此时很多教程会 ...
- phonegap安装 环境搭建与配置详解(3.4 完整版 提供下载地址)
phonegap安装 环境搭建与配置详解(3.4 完整版 提供下载地址) 原文连接:http://blog.csdn.net/aaawqqq/article/details/19755179 phon ...
- Solr7.2.1环境搭建和配置ik中文分词器
solr7.2.1环境搭建和配置ik中文分词器 安装环境:Jdk 1.8. windows 10 安装包准备: solr 各种版本集合下载:http://archive.apache.org/dist ...
- Windows下Android开发环境搭建和配置
关于Windows下Android开发环境搭建.配置方面文章,网上一搜一堆,为方便以后参考,权且做个记录,主要关注安装过程中的注意事项.对新手提醒的是,本文介绍SDK开发Android APK环境搭建 ...
- WinMail邮件服务器(客户端)环境搭建与配置
WinMail邮件服务器(客户端)环境搭建与配置 一.在搭建WinMail邮件服务器(客户端)之前必备 (1).在虚拟机上安装两个干净无毒的操作系统 ...
- Eclipse IDE 使用技巧和Android App 开发环境搭建和配置
写在前面: 本片文章只是记录了自己学习时的一些笔记,纯粹是为了自己后面方便查找,片言碎语,不适合大家浏览,请大家不要参考这篇文章. 正文: Eclipse IDE 使用技巧 ...
- 《服务器(CentOS7.7)深度学习环境搭建、配置及使用》之一:服务器情况简介
Author kangzhiheng E-mail kangzhiheng@sjtu.edu.cn 本文链接 Github:https://github.com/kangzhiheng/GitLoca ...
最新文章
- three.js 贴图只显示颜色_C4D作品“花里胡哨”?我怀疑你贴图方式有问题……
- 深圳.NET俱乐部7月活动小结及照片
- 怎么把文件放在python目录下-python – 如何将文件下载到特定目录?
- Spring如何将事件分配给专门的监听器?
- 尚学堂java培训_IT培训教育平台课程分享
- JAVA高并发秒杀系统构建之——高并发优化分析
- flask中关于endpoint端点、url_map映射、view_func视图函数,view_functions、及视图函数名是否何以相同的问题?
- 496. 下一个更大元素 I/503. 下一个更大元素 II/739. 每日温度
- 26日直播预告丨 经典知识库:ASM元数据简介及案例分享
- (转)CentOS 和 Ubuntu 下的网络配置
- $ is not defined与SpringMVC访问静态资源
- 使用ssh公钥密钥自动登陆linux服务器
- 紫鸟超级浏览器-SeleniumAPI通信
- 公文写作神器 v2.8.1.20 去更新去广告版
- 鸡得呼吸道病会易发啥病 鸡喂什么药预防打喷嚏
- 四、Mosquitto 高级应用之用户配置
- UVA10158 - War(并查集)
- 用Typora+PicGo搞定多个平台发文和微信公众号排版
- 网络编程培训之七 实现Traceroute
- flappybird android源码,iOS学习之flappyBird游戏的实现
热门文章
- 十分钟玩转 vue3+高德地图AMap+geojson批量绘制Polygon地块数据展示【二、创建地图】
- 用R语言抓取历史天气数据
- Android锁屏的实现原理及技术要点
- 京东AI研究院8篇论文被AAAI 2019收录,国际顶会彰显京东科技实力
- Macromedia Captivate 使用手册(转)
- 这是我认识最强的大专生了!!!
- cpu要和gpu搭配吗_显卡和CPU搭配有要求吗 CPU和显卡怎么搭配最好? (全文)
- 牛客寒假算法基础集训营2:处女座的期末复习(贪心入门)
- 第七章:python的字典和元组及集合
- DataGrip汉化设置