前面,张戈博客在折腾 Nginx 的 SSL 优化时,注意到前人在 Nginx 的 listen 配置中,添加了 fastopen=3 reuseport 这 2 个参数。
于是脑补了下,原来是启用 Nginx 对 TCP_FASTOPEN 和 TCP_SO_REUSEPORT 新特性的支持,至于有什么好处,请自行脑补下-->传送门
一、必要环境
当我依葫芦画瓢也添加这 2 个参数时,报错了:
nginx: [emerg] invalid parameter "fastopen=3" in ***
继续脑补了下,发现系统必须支持 TCP_FASTOPEN 和 TCP_SO_REUSEPORT,然后重新编译 Nginx 加入如下参数:
--with-cc-opt=-DTCP_FASTOPEN=23
TCP_SO_REUSEPORT 特性在 kernel-2.6.32-431.29.2 及 kernel-3.9 被启用,CentOS
6 用户可以通过更新内核到 2.6.32-431 或更高版本来支持这项特性。这个非常简单,直接 yum -y update 就行了。
关于 TCP_FASTOPEN 特性在 kernel-3.6 被客户端支持,在 kernel-3.7 被服务端支持,也就是说使用 TCP_FASTOPEN 需要 CentOS 6 更新内核至 3.7 或更高版本,以便支持这项特性。
——摘自kn007 的个人博客
二、升级内核
1、方式选择
看了下前人的分享,Centos 内核升级一般有 2 种方式:编译安装或利用 EPEL 的 yum 源在线升级
在我看来,下载源码编译安装,不但步骤繁琐,而且容易出错,简直是小白的克星,而 yum 在线升级不易出错且步骤简单,简直是懒人必选良方,因此这里就只分享 yum 在升级方案,如果不是 centos,就只能自己去找下源码编译的教程了。
在 yum 的 ELRepo 源中,有 mainline(3.13.1)、 long- term(3.10.28)这 2 个内核版本,考虑到 long-term 更稳定,会长期更新,所以选择这个版本。
2、导入 public key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
3、安装 ELRepo 到 CentOS-6.5 中
rpm -ivh http://www.elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
4、安装 kernel-lt(lt=long-term)
yum --enablerepo=elrepo-kernel install kernel-lt -y
Ps:如果是安装 kernel-ml(ml=mainline 版本),则把上述代码中的 kernel-lt 改为 kernel-ml。
5、确认 Grub 引导顺序
一般来说,新安装的内核映像会位于第一位,所以只要检查 grub.conf 中的 default 值是否指向新装内核即可,比如我的系统:
#编辑 grub 配置文件 vim /etc/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/sda3 # initrd /initrd-[generic-]version.img #boot=/dev/sda default=0 #一般最新升级的内核映像位于第一位,所以这里保证 default=0 即可! timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (3.10.101-1.el6.elrepo.x86_64) #最新 3.10.101 内核也就是这个了! root (hd0,0) kernel /vmlinuz-3.10.101-1.el6.elrepo.x86_64 ro root=UUID=6e3dc2ee-2daf-48a7-96e4-8b7ca821c23c rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-3.10.101-1.el6.elrepo.x86_64.img title CentOS (2.6.32-573.22.1.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-573.22.1.el6.x86_64 ro root=UUID=6e3dc2ee-2daf-48a7-96e4-8b7ca821c23c rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-573.22.1.el6.x86_64.img title CentOS (2.6.32-431.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=6e3dc2ee-2daf-48a7-96e4-8b7ca821c23c rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-431.el6.x86_64.img
6、启用特性
编辑 /etc/sysctl.conf ,插入 net.ipv4.tcp_fastopen = 3,执行如下命令即可:
echo "net.ipv4.tcp_fastopen = 3" >>/etc/sysctl.conf
搞定一切之后,我们重启系统完成此次内核升级。
——以上参考自 《使用 yum 快速升级 CentOS 6.5 内核到 3.10.28 | 原作者:健富的博客》
三、重新编译
接下来,我们需要重新编译我们的 Nginx 或 Tengine,新增 --with-cc-opt=-DTCP_FASTOPEN=23
1、先查看当前 Nginx 的编译参数:
#执行 nginx -V 命令 ...其他略... configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module
2、新增开启 FASTOPEN 参数,重新编译 Nginx 参数为:
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-cc-opt=-DTCP_FASTOPEN=23
Ps:就是在原有的参数上新增 --with-cc-opt=-DTCP_FASTOPEN=23 ,重新编译前面已经分享过具体操作,这里就不赘述了,不会的朋友请参考:Nginx 在线服务状态下平滑升级或新增模块的详细操作记录
3、重新编译,修改 Nginx 的 listen 配置:
编辑网站的配置文件,比如 zhang.ge.conf,找到 listen,然后再结尾分号前面新增 fastopen=3 reuseport 参数,比如:
listen 80 fastopen=3 reuseport;
如果使用的是 Tengine,这个配置就会报错:
nginx: [emerg] invalid parameter "reuseport" in ****
最后了解到,Tengine 关于 reuserport 的配置并不是在 Listen,而是放到 events 模块。
所以,如果是 Tengine,那么编辑 nginx.conf 主配置文件,找到 events 模块,如下新增 reuse_port on; 参数:
events { use epoll; worker_connections 51200; multi_accept on; reuse_port on; #新增参数 }
然后,在网站的 listen 处新增 fastopen=3 :
listen 80 fastopen=3;
最后,reload 重载 Nginx 即可,这样就不会报错了。
四、其他记录
升级内核,并启用了 Nginx 新特性之后,并没有进行深入的压力测试,所以本文无法给出优化后的各项性能数据,也不知道具体有多少提升,感兴趣的朋友可以自己开启,然后压测看看。
不过,升级内核后,系统多了 200+rcuos 和 rcuob 进程:
实际查看,也并没有占用系统内存或其他资源,看了一些老外论坛相关说明,也没得出一个所以然来,所以先视而不见吧!
看不懂的干货
╮(╯▽╰)╭ 很多人反馈文章把简单的东西写复杂了,看来我得修改下文章风格。
满满的干货,一看到代码就头疼,可惜了。加强学习。。。。
每次一看到Jager博主发新文章了,我就知道我的自信心又要受一次打击了
:eek:
学习了,,,,
学习,学习
ssl没了 :shock:
这些功能都很好,就像http2。能加快网站速度。但是套了一层CDN之后。。。。。。
明眼人。。
终于可以打开了,好像Jager的博客好几天没能打开了
不会吧,只是https打不开吧,浏览器缓存301死循环了
可能我家里电脑的原因,要清一下浏览器了,单位可以正常打开。是https打开出错。
只有买台阿里云ESC来玩玩么。。。
张哥技术牛啊
博客做得不错,风格很喜欢。高大上又有点技术感,赞。
categor 和 tag 你这边是怎么去掉的呢?用.替代的话查看源码发现是影响收录的
以前博客301循环了,然后那个浏览器就打不开了,现在换一个浏览器还可以正常访问
要多学习一下了,都看不懂
干货,但没有看懂! :!:
慢慢消化下 不知道能不能搞懂
霍雨浩看上去确实年纪很轻,但徐默沉却清楚的感觉到这个年轻人不简单。面对他们这么多人并不慌张,虽然也曾出言威胁,但在被王少杰打了之后并没有破口大骂,神色间淡定从容。这必然是有所依仗
挺棒的
都不怎么看得懂。。。。哈哈哈。
谢谢博主分享
还没用过这样的系统
一直用的阿里云
你好,最近在浏览博客的时候看到你的文章,觉得你写的挺实用的,我是一个大学生,自己也想从事运维之类的工作,感觉Linux很好玩,你能不能做一期关于运维你的成长之路的经验贴之类的文章,求解
看啥时候有空我总结总结。。
学习套路:知道做-->有记录-->懂分享-->让看懂(分享的东西有条理,思路清晰,别人能看懂)