先抛出一个问题,是这样的这是一段睡眠的 php 代码;
<?php
sleep(5);
echo "hello world!!!";
当睡眠五秒后就会打印出 hello world!!!
用chrome 发送二十个请求;
chrome 发送二十个请求是这样的
每5秒处理6个请求;
经过百度,这发现了这是浏览器在同一域名或ip 下同时请求最大为6(chrome)
nginx 是异步不阻塞的,可以写一段 shell 来创建 curl 进程实验一下上面的请求
#!/bin/sh
int=1
while(( $int<=20 ))
do
curl http://127.0.0.1:9885/index.php >> in &
let "int++"
done
这是一段请求 20 次 index.php 的脚本,把返回结果 输出 到 in 文件,之后自己 用
tail -f in
来监听返回结果,可以看到是一次性返回 20 个 “hello world!!!”的
可能发生的原因是用shell 发送也是 5个6个的返回,这估计是 php-fpm 的 进程数不足的原因
可以使用 ps -axf | grep php 来看看当前运行的php进程数
例如我的是
ps -axf | grep php
501 38618 1 0 6:59下午 ?? 0:00.42 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38619 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38620 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38621 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38622 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38623 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38624 38618 0 6:59下午 ?? 0:00.00 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38625 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38626 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38627 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38628 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38629 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38630 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38631 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38632 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38633 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38634 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38635 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38636 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38637 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38638 38618 0 6:59下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38642 38618 0 7:00下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38643 38618 0 7:00下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38644 38618 0 7:00下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38645 38618 0 7:00下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 38646 38618 0 7:00下午 ?? 0:00.01 /usr/local/Cellar/php70/7.0.15_8/sbin/php-fpm --daemonize --fpm-config /usr/local/etc/php/7.0/php-fpm.conf --pid /usr/local/var/run/php-fpm.pid
501 39868 28576 0 2:13下午 ttys003 0:00.00 grep php
开了不下二十个了
可以在php-fpm 配置文件修改
pm.max_children = 25
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 25
这是随意修改的,不一定是 25 ,这是便于测试重启 php-fpm
这时再执行脚本应该是 5 秒处理完20个请求的,但再回浏览器测试,仍然是每5秒6个6个的的处理的,这是需要使用到 http2.0技术,也就是这里说的nginx 配置 http2.0
需要注意的是为什么http2.0 有那么多优势,但仍然不普遍,是因为不是大部分浏览器支持的,火狐是支持的,但 chrome 是5.1 后去掉spdy ,要想在 chrome 上 访问 http2.0
需要 web 服务端 支持 ALPN,就是 openssl 1.0.2 to use ALPN rather ... 需要 openssl 1.0.2 以上,而且nginx 需要 http2.0 的模块,这个不是默认安装的,所以需要编译安装nginx
安装 nginx 和 openssl (注意需要 1.0.2 以上)还有就是 好像 ubuntu 16.04 或以上的 的linux系统才支持 openssl 1.0.2,这个没有验证,
wget https://www.openssl.org/source/openssl-1.1.0e.tar.gz
wget http://nginx.org/download/nginx-1.10.2.tar.gz
tar zxf openssl-1.1.0e.tar.gz && tar zxf nginx-1.10.2.tar.gz
cd nginx-1.10.2
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_v2_module --with-openssl=../openssl-1.1.0e
make
make install
时 出错一般时缺少什么库,例如gcc ,需要 补充所需条件的库存
安装完毕后需要生成证书,最好生成个 ssl 目录进行保存
#生成证书,第一步生成的时候要输入密码,自己记住即可,后续步骤,包括重启都要使用。
#生成秘钥对,有私钥、公钥、密码
openssl genrsa -des3 -out server.key 2048
#根据秘钥对生成无密码秘钥对,和server.key是同一个东西,只是有无密码的区别
openssl rsa -in server.key -out server_nopwd.key
#根据秘钥对生成签名请求(启动需要输入密码),有组织信息、salt密码
openssl req -new -key server.key -sha256 -out server.csr
#生成的根证书(生成根证书的时候,也可以使用server.key,但是需要输入密码)
openssl x509 -req -in server.csr -signkey server_nopwd.key -out server.crt -days 365
配置 nginx 这里面需要时 443 端口
server {
listen 443 http2 ssl default_server;
server_name 127.0.0.1;
ssl_certificate ../ssl/server.crt; # 这里面时刚刚生成证书的位置,自己手动更改
ssl_certificate_key ../ssl/server.key; # 一样,自己手动更改
#ssl_session_timeout 5m;
location / {
root html;
index index.html index.htm;
}
location ~ .*\.(php|php5)?$
{ #配置php
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www/$fastcgi_script_name;
include fastcgi_params;
}
}
基本上可以了,其他的端口也可以重定向到这里面
location / {
return 301 https://$host$remote_port$request_uri;
}
然后重启 nginx 再次发送 20 个请求
一次请求完毕了,用了5秒
注意请求的 地址 是 https://xxxx/index.php
是 https