一、演示
1、规划
a、我们前面一台主机为nginx主机,用来处理静态资源和代理php资源。192.168.10.13
b、后端的一台主机作为fpm server和mysql server。192.168.10.14
2、实验
a、在后端主机安装相应的程序包。
(1)、安装程序包
[root@rs1 ~]# yum install -y php-fpm php-mysql php-mbstring php-mcrypt mariadb-server
(2)、下载phpMyAdmin包
(3)、配置fpm进程参数
1)、配置进程参数
[root@rs1 /]# cat /etc/php-fpm.d/www.conf |grep -Ev "^;|^$|^ " [www] listen = 0.0.0.0:9000 user = apache group = apache pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35 slowlog = /var/log/php-fpm/www-slow.log php_admin_value[error_log] = /var/log/php-fpm/www-error.log php_admin_flag[log_errors] = on php_value[session.save_handler] = files php_value[session.save_path] = /var/lib/php/session
2)、创建相应的目录并给其相应的用户权限
[root@rs1 /]# mkdir -p /var/lib/php/session [root@rs1 /]# chown apache:apache /var/lib/php/session
3)、然后启动我们的php-fpm进程即可
[root@rs1 /]# systemctl start php-fpm [root@rs1 /]# netstat -anpt |grep 9000 tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN 2664/php-fpm: maste
b、我们在前端nginx节点上配置相应参数
(1)、配置
[root@www ~]# cat /etc/nginx/conf.d/fpm_proxy.conf server { listen 80; server_name www.ilinux.io; index index.php index.html; location / { root /data/nginx/html; } location ~* .hph$ { fastcgi_pass 192.168.10.14:9000; #指明代理到哪个地址的哪个端口上去,这儿是走的fastcgi协议。用的是我们nginx的fastcgi模块。但是只有这一项是远远不够的,因为我们在向后端进行传递时还需要传递很 多参数到后端服务器,否则后端服务器运行将无法获得用户请求时用户自己的各种属性信息。我们作为代理服务器来讲他会把客户端各种信息都隐藏起来,然后用自己向服务端发送请求,但是实际上很多客户端信息是需要发给服务器的,尤其是php服务器,因为他只有这样才能根据不同的用户请求生成不同的内容,这个传递是需要靠/etc/nginx/fastcgi_params这个文件来实现的。 } }
(2)、我们/etc/nginx/fastcgi_params文件中定义了要把什么参数传递给后端主机
1)、fastcgi_param QUERY_STRING $query_string; #这段的意思是把nginx自己的变量 $query_string中保存的客户端信息的值传递给fastcgi所使用的变量QUERY_STRING。他们的名字很相像,只是nginx用的是小写字符,fastcgi使用的是大写字符。
[root@www nginx]# cat /etc/nginx/fastcgi_params fastcgi_param QUERY_STRING(fastcgi中使用的变量名) $query_string(通过nginx的这个变量传过去); fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param REQUEST_SCHEME $scheme; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200;
2)、在代理服务器中配置
server { listen 80; server_name www.ilinux.io; index index.php index.html; location / { root /data/nginx/html; } location ~* .php$ { fastcgi_pass 192.168.10.14:9000; #指明代理到哪个地址的哪个端口上去,这儿是走的fastcgi协议。用的是我们nginx的fastcgi模块。但是只有这一项是远远不够的,因为我们在向后端进行传递时 还需要传递很多参数到后端服务器,否则后端服务器运行将无法获得用户请求时用户自己的各种属性信息。我们作为代理服务器来讲他会把客户端各种信息都隐藏起来,然后用自己向服务端发送请求,但是实际上很多客 户端信息是需要发给服务器的,尤其是php服务器,因为他只有这样才能根据不同的用户请求生成不同的内容,这个传递是需要靠/etc/nginx/fastcgi_params这个文件来实现的。 fastcgi_index index.php; #fastcgi自己的主页为index.php
fastcgi_param SCRIPT_FILENAME /data/apps/$fastcgi_script_name; #路径映射,这儿写了后后面的/etc/nginx/fastcgi_params文件中就不生效了。这个的意思是当我们客户端请求一个脚本时> 我们就把这个脚本名称传到后端去,比如我们客户端请求的是 http://www.ilinux.io/admin/index.php,对应的脚本路径就是 /admin/index.php这个名称,那么其传递到后端去,后端的fastcgi server就收到了用户请求 /admin/index.php 的这个内容,那么此uri对应的文件到底在哪个路径下呢?作为页面资源文件肯定是放在本地文件系统上的,比如我没有反代的时候都容易理解,当用户请求这个资源的时候就相当于 /admin/ind ex.php,其中的/ 是我们的root定义的。比如我们root定义的是/root/data/nginx/html,那么他就访问的是/root/data/nginx/html/admin/index.php,同样的道理,我们现在这个uri不是放在本地的而是传递到后端>的fastcgi server上的,我们后端的fastcgi server怎么去理解这个url呢?他肯定也应该是在本地对应的哪个文件系统下的这个路径,我们在fpm的配置过程中没有说哪个地方要定义成Docuement root,那么怎么办呢?因此我们将请求传递给fastcgi server时我们要补在 fastcgi server真正的对应的路径上,比如在我们的fastcgi server服务器上是放在 /data/apps下的,那么我们就要在fastcgi server中找/data/apps/admin/i ndex.php这个路径,因此我们脚本文件参数就应该这样来写。
include fastcgi_params; #其它的就在fastcgi_params扩展文件中。
} }
c、在后端主机配置相应页面并且访问 www.ilinux.io/index.php即可
[root@rs1 ~]# mkdir -p /data/apps [root@rs1 ~]# cat /data/apps/index.php <?php phpinfo(); ?> [root@rs1 ~]# systemctl restart php-fpm
d、然后我们在192.168.10.14上启动mysql