① mac配置php-fpm,nginx运行多版本php
1、brew 安装 php5.6 php5.7 nginx
2、配置php-conf
3、配置虚拟主机
安装好brew
用brew 命令安装,如果速度太慢或访问不了,自行goole brew 换源
brew search php 查看可用的php版本
brew install [email protected] 安装php5.6
brew install [email protected] 安装php5.6
brew install nginx 安装nginx
1、修改php5.6 php-fpm的端口为9056
cd usr/local/etc/php/5.6 # 到php5.6的目录下
vi php-fpm.conf # 修改文件
listen = 127.0.0.1:9056 # 修改此端口
daemonize = yes # 修改为允许后台启动php-fpm
2、修改php5.6 php-fpm的端口为9070
cd /usr/local/etc/php/7.1/php-fpm.d # 到php7.1的目录下
vi www.conf # 修改端口
listen = 127.0.0.1:9056 # 修改此端口
vi php-fpm.conf # 修改文件
daemonize = yes # 修改为允许后台启动php-fpm
3、启动php-fpm
cd /usr/local/sbin # 到此目录,建立两个软链接指向不同版本的php
切换到root用户
./php-fpm56
./php-fpm71
启动后可看到php-fpm的进程,则成功
ps-ef | grep php-fpm
cd /usr/local/etc/nginx/ # 到nginx的目录下
复制默认的配置文件到server下(此目录用来存虚拟主机文件)
这里我在server创建了这两个
vi local.phpinfo56.com.conf # 修改本地域名和nginx代理到php-fpm端口,按照这种方法修改另一个
nginx # 启动nginx
nginx -s reload # 修改配置文件,重新加载nginx
vi /etc /hosts # 修改host 加上映射关系
cd /usr /local/var/www # 在此目录下建立一个index.php
echo "<?php phpinfo();" > index.php
在浏览器访问可看到
② nginx与php-fpm的简单的关系流程图
流程:
1,首先Browser通过Http协议发送一个请求到Nginx服务器
2,Nginx服务判断是否为静态资源是的话直接放回,否则加载nginx.conf配置文件里的fastcgi模块。
3,Nginx通过fastcgi_pass (默认是127.0.0.0:9000)把对应的请求按照fastcgi协议转发到PHP-FPM,php-fpm的master进程会监听9000端口,然后给php-fpm work进程,work进程 再调用php-cgi解析器并且生成php执行环境再去执行解析对应的PHP文件
4,解析完成再返回给nginx,然后返回给浏览器。
注:
1,php-fpm会生成一个master进程用于监控9000端口,负责分发给下面的work进程
2,fastcgi 是一种协议用于解析器和服务器之间的交互
③ 用nginx+php-fpm怎么设置多个php应用才是对的
问得不是很清楚,我就解决两个问题吧。
1、你是想实现一个php-fpm监听多个端口。默认是监听9000,你想监听多几个php-fpm。可以复制多几份php-fpm.conf文件,每个的端口不一样,然后通过php-fpm命令的-y参数,指定启动的不同conf文件,即可。
2、不知道php-fpm要设置多少进程?这个要看你的内存宽不宽裕,一个php-fpm的进程大概占用20M的内存。独立的php-fpm应用,用静态好点。还有其它服务程序(如mysql),用动态。
选择静态分配的话,设置pm=static,对应的pm.max_children就是设置进程数量。
选择动态分配的话,设置pm=dynamic,pm.start_servers:动态方式下的起始php-fpm进程数量。pm.min_spare_servers:动态方式下的最小php-fpm进程数量。pm.max_spare_servers:动态方式下的最大php-fpm进程数量。
④ nginx和php-fpm之间是怎样通信的
FastCGI原理
FastCGI是一个运用于Http Server和动态脚本语言间通信的接口,多数流行的Http Server都支持FastCGI,包括Apache、Nginx和lighttpd等。同时,FastCGI也被许多脚本语言支持,其中就有PHP。
FastCGI接口方式采用C/S结构,可以将HttP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HttP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给客户端。这种方式可以让HttP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。
Nginx+php-fpm实现原理
Nginx本身不会对PHP进行解析,终端对PHP页面的请求将会被Nginx交给FastCGI进程监听的IP地址及端口,由php-fpm作为动态解析服务器处理,最后将处理结果再返回给nginx。其实,Nginx就是一个反向代理服务器。Nginx通过反向代理功能将动态请求转向后端php-fpm,从而实现对PHP的解析支持,这就是Nginx实现PHP动态解析的原理。
Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端。
Nginx 简单配置
location ~ \.php$ {
root /home/admin/web/nginx/html/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/admin/web/nginx/html/$fastcgi_script_name;
include fastcgi_params;
}
⑤ Nginx运行原理和配置详解(个人总结笔记)
话不多说,撸起键盘就是干!正所谓知其然知其所以然,个人总结了下Nginx运行原理和配置详解,便于理解和后续复盘。
先来看这一张图。
nginx启动后会有 一个master进程和多个worker进程 。master进程用来管理worker进程, 一个worker进程处理一个请求 ,一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。 worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致 ,这里面的原因与nginx的进程模型以及事件处理模型是分不开的 ,过多的worker数,只会导致进程来竞争cpu资源,从而带来不必要的上下文切换。
PHP WEB服务器目前最佳方式之一就是: Nginx + FastCGI(解决CGI并发重复fork问题) + PHP-FPM(管理PHP-CGI进程) 。nginx是怎么做到把请求抛给PHP解释来处理的呢?这个过程又是怎么实现的呢?稍后我们来看一下参数配置。
代理,反向代理,负载均衡是Nginx常用功能。
Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理。如果你和小马之前一样还是分不清代理和反向代理的区别,下面这个图对理解会有所帮助。
它们的区别就是,前者知道我要找的人并知道地址在哪,代理服务器按这个地址代为请求一下然后把他说的话返回给我。后者就是,我知道我要找谁问话但不知袭冲道地址在哪,我也袜弊不想管,代理服务你自己去找,只要帮我返回他要说的话就可以了。
负载均衡:其实也是 反向代理 的一种。负载均衡,热备等等其实都属于高可用范畴,Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为 轮询,加权轮询,Ip hash 等等。扩展策略,就天马行空,只有你想不到的没有他做不到的啦,你可以参照所有的负载均衡算法,给他做下实现。思考一个问题,IP hash真的能解决session共享的问题么?
我们来简单看下两个 配置示例 。
这个配置将请求转发转向mysvr 定义的服务器列表。 注意proxy_pass配置。其实这块也是负载均衡的配置 。如下:
在访问网站时,由于配置了proxy_pass地址,所有请求都会先通过nginx反向代理服务器,在服务器将请求转发给目的主机时,读取upstream为 tomcatsever1的地址,读取分发策略,配置tomcat1权重为3,所以nginx会告禅族将大部分请求发送给49服务器上的tomcat1,也就是8080端口;较少部分给tomcat2来实现有条件的负载均衡,当然这个条件就是服务器1、2的硬件指数处理请求能力。
负载均衡配置 还有其他的相关参数,这是只是打个样,不赘述。
可以认为fastcgi_pass这个配置非常关键,将Nginx + FastCGI + PHP-FPM串连 。这个配置将PHP请求都交给 fastcgi_pass配置的PHP-FPM处理。 location分别通过正则过滤和转发配置决定了各个请求URL将要转发交与的处理方式 ,location /表示默认请求,location ~\.php(.*)$ 表示PHP 脚本请求全部转发到 FastCGI处理。 使用FastCGI默认配置.。
以上配置指定了这些 静态文件要nginx自己处理 。
NGINX负载均衡可以用于很多服务负载均衡的实现,比如做Redis服务的负载均衡,配置upstream的IP列表再配置 proxy_pass 代理即可。那要实现负载均衡除了NGINX,还有哪些呢?
根据7层OSI模型可将负载均衡分为 :
1)二层负载均衡(一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应);
2)三层负载均衡(一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应);
3)四层负载均衡(在三次负载均衡的基础上,用 ip+port 接收请求,再转发到对应的机器);
4)七层负载均衡(根据虚拟的url或是IP,主机名接收请求,再转向相应的处理服务器)。
这其中,最常见的是四层和七层负载均衡。思考一下,NGINX的负载均衡是属于哪一种?
关于负载均衡的架构