第2节. nginx实现fastcgi反向代理
概述
用户还是访问页面,还是http请求,不过请求的内容变成了php文件,也就是程序代码了,是动态资源。
现在nginx反代收到这个php的http请求,本身是处理不了的,需要通过fastcgi协议把php请求发送给后端的php服务器,类似fpm-php服务器,默认监听9000端口。
这种就是异构了👇
搭建一个fastcgi的real server
1、物理上可以将反代nginx和real server放在一台服务器上;
2、也可以分开放。
总结下,一两句简单点就是:fastcgi是快速的网关接口,所谓快速就是 类似nginx的master和worker父子进程的一个处理效率;所谓网关接口,就是web服务和php程序代码的一个通信协议。
实验:反代+real server放在一台机器上
先搞一个fastcgi的服务器:
是epel源里的
需要安装php-fpm作为fastcgi的服务器,还需要安装php-mysql用来连接数据库。
不过现在好像叫php-mysqlnd了,装之
监听的端口没写,而是socket文件,还不是tcp/ip端口。不过由于反代和fastcgi server也就是php-fpm在一个机器上,还想不用改,就用socket文件还不错。
然后listen.allowed_cliants 就是127本地来连接。
需要修改的是user = apache 改为user = nginx,因为php-fpm这里配合的是nginx不是apache。
要用nginx作为服务的启动账户,也会开启类似httpd的worker进程,master进程。这里nginx就是work进程的用户身份。
不改就会存在问题,比如nginx传一个文件过来,php用其他的账号,可能就会存在权限不够的情况。
修改user 和 group 为nginx
重启服务后,work进程的用户就是nginx了,当然master进程还的是root
由于是socket文件,所以ss -tlnup 就没必要看监听端口了
然后php程序放在哪?nginx的站点root路径?往下看,可以不在一起的
由于上图的虚拟主机没有配置root,所以报错
补上root
ok
将php程序放到别的地方,
下面要让nginx收到http请求访问php程序的报文后,nginx要知道去找php-fpm服务,然后该服务(从socket文件或者9000端口收到后)还得知道去哪找php程序,也就是上图的路径。
1、首先nginx反代上要有fastcgi模块:ngx_http_fastcgi_module
2、然后要配置fastcgi服务器的地址:fastcgi_pass address;fastcgi和反代在一起就指向本机,不过是127.0.0.1还是本机的IP地址需要明确一下。
3、指定类似index.html的php资源,一般就是index.php,指定cli为:fastcgi_index index.php;
4、fastcgi和nginx之间的数据交换,需要用一些参数,这些参数是固定格式的,引用就行:fastcgi_param parameter value [if_not_empty]; 所以看看fastcgi_params参数👇,直接引用就行:
参数的使用是需要在配置文件里引用这个文件的,具体就是location里配置 include fastcgi_params;
fastcgi_params里就是一个文件,里面内容上面也讲了。
然后fastcgi_param看起来就是自己定义的一些其他参数咯,比如
SCRIPT_FAILENAME脚本文件名,$document_root就是 root /xx/xx定义的根路径;而fastcgi_script_name就是脚本名称。
上图也写明了,只有访问 ~* .php$的请求才发送到fastcgi_param参数指定的路径/data/php下的$fastcgi_script_name这个文件。
关于$fastcgi_script_name具体是啥,可以在log中配置上,然后去log里查看
上图👆fastcgi_pass unix:xxxx是因为php-fpm配置文件里也是这样写的
如果上图写成listen = 127.0.0.1:9000那么nginx的配置location里一样要写成fastcgi_pass 127.0.0.1:9000;
log里配置这个$fastcgi_script_name变量
可见fastcgi_script_name为php.index,其实就是用户访问的php程序的名称,通常就是url最后一个字段。
nginx+wordpress
wordpress是php写的,所以nginx也是用fastcgi去对接的,其实wordpress就相当于一个fastcgi服务器了。
搞定db
安装这个👆,启动db服务后,创建数据库和用户以及授权👇
确认下
上图/16写错了,改成192.168.%
在远端一台机器上测试联通性,ok👇
wordpress数据库准好了,接下来弄wordpress程序
搞定wordpress程序
直接github拉到自己规划的目录里就行
https://github.com/WordPress/WordPress.git
不过wordpress的版本也要php的版本适配的。
github上也提到了推荐的版本
php是7.4以上,mysql是8.0以上
我用的mariadb-server直接yum的,mariadb的版本和mysql有一个平行分叉点是5.5吧,后面mysql又经过了几个5.x的小版本就直接跳到了8,而mariadb则是跳到了10好像。
所以一般来讲,这里可以认为mariadb10.11满足了wordpress的db要求--mysql8.0以上的这个要求。
利用模板创建wordpress配置文件并修改
然后注意下wordpress文件夹的权限,比如某些文件夹的上传权限wp-content这个文件夹就是接收上传的。而权限是开给nginx这个用户的,因为之前针对fastcgi服务也就是php-fpm已经修改为nginx了
略微改一下php的访问路径
注意上图红框里写错了,大小写不对
修改为root /data/php/WordPress;
重启nginx后,发现访问有点问题,👇是空白页,而且是302重定向
重新git clone不修改wp-config.php就是这样👇
浏览器里输入http://www.site1.com/index.php,就会跳到
不过图片之类的不对,就是一些静态页面包裹css,图片之类的,好像没显示出来。
一下就是除了.php以外的文件,应该都属于静态文件
修改wp-config.php继续空白页,继续研究下
打开wp-confi.php里的debug看到502
也去看看错误日志
看到too big header,增加buffer
再次访问,发现原来是存在大量报错导致buffer不够用👇
网上说
然后我的是rockylinux
没有libpcre2,但是有pcre2
于是果断yum之
再记得重启php-fpm
此时再次浏览器访问http://www.site1.com/index.php就好啦
当然是存在302跳转的。
这里可以简单做一个动静分离
改之
这样xx.php的还是走location去 /data/php/WordPress/下找
而不是xx.php的就去/data/site1/wordpressStatics/下找
再次访问http://www.site1.com/index.php看看
没得问题👇
然后优化成访问http://www.site1.com直接就是上图的页面,也就是说index 设置为index.php了。
安排~具体配置如下
尝试在root下新建一个index.html看看,因为index index.php index.html是从左到右先找先得。
好了
这样就实现了输入http://www.site1.com,注意上图我输入的时候最后是没有/的,是nginx自己302补了一个:
所以index的php文件要有,才能跳到location 的php里
继续排错吧,哈哈
看图是http://site1.com/wp-admin/的403,我基本就认为是该路径下没有index.php和inde.html
还是因为我做了动静分离,所以这个URL走的是下图的框框里的路径
而该路径下是没有index文件的,补一个就行了,如果坚持要动静分离的话。 其实如果不做动静分离也没这么些毛病。
再次登入就OK啦👇,上图的echo 只是满足一下让他有个跳转到location里。而location里的root /data/php/WordPress/下的wp-admin下是有各种php文件的,关键是有index.php
创建文章,上传图片的时候报错
看error log
所以你认为到底是哪个root呢?哈哈,上图是referrer从http://www.site1.com/wp-admin/post.php?post=8&action=eidt跳过来的,姑且认为在下面的root里面吧
所以去/data/php/WordPress/wp-admin/看看
其实想想也知道,这些多层级的文件夹,肯定不用手动创建的嘛,就是动静分离后一些程序没有生效导致的。
这里手动创建目录,然后接着报错变了
继续报错,可能是php程序没有打赏alt attribute,我猜是动静分离后一些程序没有运行起来。
得,我不弄动静分离了,合起来算了
果然好啦
其实很好理解,你强行做的动静分离,人家一些php没有办法起作用了。
php的一个参数项
在fastcgi的配置里,也就是php-fpm服务的配置里
不过和apache的status冲突了,大家都是根路径带一个/status,不知道访问哪一个了,改之
然后测试fastcgi服务器是否ok的
以上完成了①status页面②ping的页面,这是php-fpm也就是fastcgi的设置,
下面做nginx的配置,将这个两个/fpm_stats /ping的页面 路由到fastcgi服务上去才行啊
上图的locaiton 一行 ~*表示正则忽略大小姐, ^表示主机头后面的部分也就是www.site1.com后面的部分以/开头的。
ping pong~
xxxxxx/fpm_status?full查看详情👇 所谓详情就是php-fpm服务的所有进程都给你显示出来了
将nginx和php-fpm分开来
独立安装php-fpm和php-mysqlnd
上面是合在一起的,用的socket文件
①php-fpm的配置,也就是监听
②nginx的fastcgi对接
合在一起,也可以改成listen = 127.0.0.1:9000 以及 nginx的 fastcgi_pass 127.0.0.1:9000
分开来也没啥好说的,无非就是mysql独立、php-fpm独立、nginx独立,用ip port互相连接就行了。
一些信息操作的记录下
安装php-fpm的yum源除了默认EPEL,还可以用REMI仓库,REMI也是依赖EPEL源的。
找到所需的资源
yum install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-9.rpm
或者下载下来后, yum install remi-release-9.rpm
可以用rpm -ql看看installed包里的内容
说白了就是给你安装,也就是自动创建了yum源文件
找到这个版本较高的php-fpm了就
再一个确认下
激活之
发现无所谓了
一样的remi源和remi-safe一样的,估计就是一个更加safe咯。
除了安装这个php-fpm还需要安装这个软件和mysql互通的软件php-mysqlnd
装之 yum -y install php83-php-fpm php83-php-mysqlnd
php-fpm是通过php-pdo或者php-mysqlnd来支持 连接数据库的
配置一下php-fpm
需要在php-fpm服务器上创建nginx用户和用户组,创建之前去nginx机器上看下uid,然后php-fpm创建的时候要保持一致。
groupadd -g 989 nginx
useradd -r -u 989 -g nginx -s /sbin/nologin nginx
如果只是有nginx用户名,不保持ID一致会咋样,我怎么感觉没必要id一致呢,试试
上图的注释方式不适合php-fpm的配置文件,需要将#改成;实现注释,否则报错,如下面stauts
放行所有人连接过来,其实可以写nginx的IP地址会不会安全点👇,结果写错了应该写130而不是134,然后这就导致了502报错了见下面的502报错页面
状态页面也改一下:
改完就启服
这是之前的报错已修正👇
通过status看到具体错误的地方,就是注释#改成;就行了
放置好php程序
把项目down下来,直接git clone url就行,网络不给力就down zip吧
修改一下wordpress的配置文件
修改wp-confi.php连接数据的信息
这里的数据库也是独立的
测试下顺便
所以现在
nginx是192.168.126.130
php-fpm是192.168.126.135
mariadb是192.168.126.134
都分开咯
修改nginx的fastcgi的配置为远端php-fpm服务器
502报错很可能就是php-fpm里没有放开nginx的访问
修改一下
好了就
然后怎么查看php的版本
之前的看法是错误的好像
首先php -v的命令是依赖于php-cli这个包,而这个cli看到的版本其实是php-cli的版本。
status里看不到版本唉
干脆写一个version_look的php页面吧
没问题
再转一个php-cli瞧瞧,看看到底php -v行不行
果然php -v 只是仅仅看php-cli 这个命令函工具的版本的,和php-fpm没有关系
然后这里有一个php-fpm的配置参考