apache和nginx都属于web服务器
web服务器只支持处理静态资源(html、jpg、css、js)
静态资源:服务器文件原封不动的通过http协议发送收到客户端,客户端看到的文件和服务器是一样的。
动态资源:是程序,用户执行不了程序,所以在服务端执行程序,把执行结果封装为html、json格式,通过http协议发送给客户,用户看到的是结果。(php、jsp、asp)
php和web服务组合有两种模式(web服务器处理不了程序,怎么才能处理 )
模块模式:附加web服务上的一个模块实现,让web服务带有处理php的能力。(线程来处理,兼职干活)
fastcgi:独立服务(进程来处理,专职干活,实现动静分离,性能更佳)
FastCGI配置指令(动静分离,动态资源交给fastcgi处理,如处理php后缀的文件)
Nginx基于模块ngx_http_fastcgi_module实现通过fastcgi协议将指定的客户端请求转发至php-fpm处 理,其配置指令如下:
fastcgi_pass address;
#转发请求到后端服务器,address为后端的fastcgi server的地址,可用locatio,if in location
示例:
fastcgi_pass localhost:9000;
fastcgi_pass unix:/tmp/fastcgi.socket;
fastcgi_index name;
#fastcgi默认的主页资源,示例:fastcgi_index index.php;
fastcgi_param parameter value [if_not_empty];
#设置传递给FastCGI服务器的参数值,可以是文本,变量或组合,可用于将Nginx的内置变量赋值给自定义 key
fastcgi_param REMOTE_ADDR $remote_addr; #客户端源IP
fastcgi_param REMOTE_PORT $renote_port; #客户端源端口
fastcgi_param SERVER_ADDR $server_addr; #请求的服务器IP地址
fastcgi_param SERVER_PORT $server_port; #请求的服务器端口
fastcgi_param SERVER_NAME $server_name; #请求的server名称
Nginx默认配置示例:
location ~ \.php$ {
root /scripts;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;默认脚本路径
#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;#此行写法不在需要上面的root指令
fastcgi_param HTTPS on; #如果是前端代理采用https,当前后端http服务器需要 加此项,否则会造成页面显示不正常
inculde fastcgi_params; #此文件默认系统以提供,存放的相对路径为perfix/conf
}
FastCGI实战案例 : Nginx与php-fpm在同一服务器
Nginx安装完成之后默认生成了与fastcgi的相关配置文件,一般保存在nginx的安装路径的conf目录当 中,比如/apps/nginx/conf/fastcgi.conf、/apps/nginx/conf/fastcgi_params.
php安装可以通过yum或者编译安装,使用yum安装相对比较简单,编译安装更方便自定义参数或选项
php环境准备
安装7.4版本php和相关APP依赖的包
[root@ubunt ~]# apt -y install php7.4-fpm php7.4-mysql
修改nginx配置文件用户与php配置文件用户为统一用户
[root@ubunt ~]# vim /apps/nginx/conf/nginx.conf
user www-data;
nginx -s reload
ps aux 可查看nginx worker进程用户被修改成www-data
php配置文件修改:
修改php配置文件监听端口
vim /etc/php/7.4/fpm/pool.d/www.conf
#;listen = /run/php/php7.4-fpm.sock #在这一行下面添加
listen = 127.0.0.1:9000 #此为php在本机上,如果不在一个机器上,就得写php在的ip
修改php配置文件进程数量
pm = dynamic
pm.max_children =5 #最多⑦5个进程
pm.start_servers = 2 #刚开始起2个进程
pm.min_spare_servers = 1 #最小空闲1个进程
pm.max_spare_servers = 3 #最大空闲3个进程
pm.process_idle_timeout = 10s; #空闲进程10s干掉
pm.max_requests = 500 #每个进程处理多少个请求
修改php配置文件状态页
pm.status_path = /php-status
开启ping命令,探测php是否健康
ping.path = /ping
ping.response = pang(可改)
开启访问日志并配置路径
access.log = /var/log/$pool.access.log (不指定路径,服务起不来)
开启慢查询
slowlog = log/$pool.log.slow
root@ubunt ~]# grep -Ev "^;|^$" /etc/php/7.4/fpm/pool.d/www.conf (查看修改内容)
[www]
user = www-data #默认值
group = www-data #默认值
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children =5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.status_path = /php-status
ping.path = /ping
ping.response = pang
access.log = /var/log/$pool.access.log
slowlog = log/$pool.log.slow
重启php
[root@ubunt ~]# systemctl restart php7.4-fpm.service
在nginx配置文件下增加include /apps/nginx/conf/conf.d/*.conf;
增加位置在:配置文件最下面 }内。
mkdir /apps/nginx/conf/conf.d/
vim /apps/nginx/conf/conf.d/php.conf (必须以conf结尾)
server {
listen 80;
server_name www.meng.org;
root /data/html; #静态页面存放路径
location ~ \.php$|ping|php-status { #开启ping和status
root /data/php; #动态页面存放路径
fastcgi_pass 127.0.0.1:9000; #php放在本机上,指定本机
fastcgi_index index.php; #默认页面
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
[root@ubunt conf.d]# nginx -s reload 重新加载
创建静态页面目录并写入:[root@ubunt ~]# mkdir /data/html/ -p
vim /data/html/index.html
www.meng.org
创建动态页面目录并写入:[root@ubunt ~]# mkdir /data/php/
vim /data/php/test.php
<?php
phpinfo();
?>
DNS解析,用windows的cmd命令测试是否可以连接
C:\Users\Administrator>ping www.meng.org
正在 Ping www.meng.org [10.0.0.200] 具有 32 字节的数据:
来自 10.0.0.200 的回复: 字节=32 时间<1ms TTL=64
来自 10.0.0.200 的回复: 字节=32 时间<1ms TTL=64
来自 10.0.0.200 的回复: 字节=32 时间<1ms TTL=64
来自 10.0.0.200 的回复: 字节=32 时间<1ms TTL=64
10.0.0.200 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
连接成功,去网页访问
先访问静态页面:www.meng.org 显示静态页面www.meng.org
再访问动态页面:www.meng.org/test.php 显示成功,可查看是否开启加速功能 opcache
连接后端mysql
创建mysql连接账号
mysql> create user test@'10.0.0.%' identified by '123456';
测试连接数据库
vim /data/php/mysql.php
<?php
$servername = "10.0.0.8";
$username = "test";
$password = "123456";
//创建链接
$conn = mysqli_connect($servername,$username, $password);
//创建链接
if (!$conn) {
die("php连接MySQL数据库失败:" . mysqli_connect_error());
}
echo "php连接MySQL数据库成功!";
?>
在网页访问www.meng.org/mysql.php
php连接MySQL数据库成功!
访问www.meng.org/ping
pang
访问www.meng.org/php-status 显示状态页
pool: www
process manager: dynamic
start time: 23/Sep/2022:14:12:26 +0000
start since: 3606
accepted conn: 5
listen queue: 0
max listen queue: 0
listen queue len: 511
idle processes: 1
active processes: 1
total processes: 2
max active processes: 1
max children reached: 0
slow requests: 0
访问www.meng.org/php-status?full 每个worker进程单独显示
访问www.meng.org/php-status?xml xml格式
访问www.meng.org/php-status?json json格式
访问www.meng.org/php-status?html html格式