nginx 配置http2.0

先抛出一个问题,是这样的这是一段睡眠的 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

#通过--with-http_v2_module 打包http2 --with-openssl指定openssl目录
./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

等待安装完毕,如果 ./configure

时 出错一般时缺少什么库,例如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





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值