一 了解的基础知识
1) nginx'本身不能'处理PHP,它只是个'web服务器-->只能处理静态请求',当接收到请求后,如果是php请求,则'发给php解释器处理',并把结果返回给'web服务器',最后'再给'客户端备注: nginx'默认并不支持'php等动态语言,nginx是服务器'主要用来'处理HTTP请求,其本身'并不支持'解析运行PHP代码的能力,需要'配置php-fpm'来运行php代码2) nginx一般是把'请求发fastcgi管理进程'处理,fascgi管理进程'选择cgi子进程'处理结果并'返回'被nginx
备注: 原生的Nginx并'不支持动态语句'的解析,它通过'改良过的cgi方式'来实现对后端'动态脚本语言'的支持,像'fastcgi、scgi、uwsgi'或'直接代理到后端'的动态解析服务器
FastCGI模块(FastCGI)
二 nginx中配置php运行环境
① apache的mod_php和nginx的php-fpm区别
+++++++++'apache的mod_php模块'+++++++++1)apache的'mod_php'模块内置于apache中,算是apache派生的子进程2)一旦配置了该模块,不管是静态资源还是动态资源都会使用'mod_php'模块,'开销大'+++++++++'nginx的fastcgi模式'+++++++++说明: fastcgi'不是'nginx派生的'子进程'好处: fastcgi和nginx服务器可以'完全独立'-->'解耦',构成'分布式'
② 对于nginx配置文件中的fastcgi_param相关参数的理解
fastcgi_parms和fastcgi.conf的'区别'和'联系'
+++++++++++++在php可'打印'出上面的'服务环境变量'+++++++++++++echo $_SERVER['REMOTE_ADDR']
③ php的cgi.fix_pathinfo解析
将cgi.fix_pathinfo=1这一行去掉注释将1改为0的用意
高版本的php fpm 设置项 cgi.fix_pathinfo=1 漏洞不再出现
fastcgi_split_path_info含义
Nginx(PHP/fastcgi)的PATH_INFO配
fastcgi_param PATH_INFO $path_info; 可'自定义'变量
参考博客
③ php在nginx中的配置方式
使用'FastCGI方式'-->'PHP'在'Nginx中'运行模式(Nginx+ PHP-FPM)补充: nginx可以和'任何第三方提供解析的处理器'实现连接从而'实现对PHP的解析'
说明: 从前面的'php-fpm.conf'的配置文件中我们知道'只能解析'以'.php、.php5、.php7'结尾的文件++++++++'nginx对以.php结尾url请求的处理'++++++++location ~ \.php$ {# 最好指定root指令try_files $uri =404; '非必要'fastcgi_split_path_info ^(.+.php)(/.+)$;' 非必要' --> '#正则解析路径'## NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini'方式1': With php5-cgi alone:-->'本地'#fastcgi_pass 127.0.0.1:9000;'方式2': With php5-fpm:#fastcgi_pass unix:/var/run/php5-fpm.sock;-->'本地''方式3': 通过'upstream模块' --> '远程'fastcgi_pass http://phpinclude fastcgi_params; --> '先参数初始化'fastcgi_index index.php; '首页'fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; '再修改默认参数'
}+++++++++++++++document的'解读'+++++++++++++++
④ 案例讲解
++++++++++++++'涉及权限问题'++++++++++++++说明: 由于nginx启动的用户身份是'nginx',而'php-fpm'启动的用户身份是'apache'最佳实践: 最好二者都'统一指定'为同一用户,推荐指定为'nginx'说明: php的资源目录'不是必须'放置到'nginx的资源目录'下,任何'可读取的位置'即可
+++++++++'重启服务'+++++++++systemctl restart nginx+++++++++'测试效果'+++++++++
备注: 'nginx日志查看'
⑤ 开启php-fpm的status页面
+++++++++'重启或者重载php-fpm和nginx'+++++++++systemctl reload nginxsystemctl reload php74-php-fpm.service
http://nginx.wzj.com/php-status?full
php-fpm 状态页面详解
三 PHP页面不解析而直接下载
+++++++++++++++'客户端.php结尾文件逻辑'+++++++++++++++1)nginx配置php的话-->以'php'结尾的请求,nginx'直接转发给'fastcgi进行处理,nginx只需要接收'fastcgi'处理后的内容即可2)'没有配'置的话-->nginx首先会在'/etc/nginx/mime.types'查询'是否有'该类型-->(默认没有),然后利用nginx自身的' default_type application/octet-stream;'告诉'客户端'是一个二进制流,客户端受到之后'会直接下载''没有配置'的现象:nginx无法解析'PHP、perl、python'程序,一开启网页就'直接下载'程序++++++++'排查思路'++++++++(1)先检查PHP环境(2)再检查php-fpm
四 反向代理和负载均衡的关系
① 关系
+++++++++++'反向代理'和'负载均衡'是什么关系+++++++++++1)反向代理和负载均衡这两个词'经常出现在一起'但他们实际上是'不同的概念'2)'负载均衡'它更多的是'强调'的是一种'算法或策略',将请求'分布到不同的机器上',因此实际上也'起到了反向代理'的作用
② fastcgi与反向代理
+++++++++++'负载均衡'也可以用在 'fastcgi_pass' 上+++++++++++fastcgi_pass http://php-upstream如果使用负载均衡,可能存在一个 'session 失效'的问题你的每次请求可能分配到不同的服务器解决方法: 是把 Memcached 或 Redis '作为 session 存储'的方式,而且还可以'提高性能'-->分布式
③ proxy_pass 和 fastcgi_pass 的区别