CentOS7 升级网站协议至quic协议

QUIC(Quick UDP Internet Connection)是谷歌制定的一种基于UDP的低时延的互联网传输层协议,较http2具有0RTT的优势,虽然TLS1.3也具有0RTT的特点,但本着不折腾不罢休的学习态度(手动滑稽),笔者查阅众多资料,将本站升级至quic。现将方法记录如下,以服务大众。


QUIC是有Google主导,只在Google、Opera等浏览器上支持,且需要手动开启 开启方法:在 chrome://flags/ 中找到 Experimental 中 QUIC protocol, 设置为Enabled,重启浏览器生效。


服务器部署了nginx,通过nginx来进行代理转发各个请求,但是搜索一圈,了解到nginx暂时没有计划支持quic,于是另寻他径,功夫不负有心人,查阅众多资料了解到caddy支持quic(caddy是一款可以自动部署https的服务器,百度一番,用他来自动部署https的不多,倒是用来支持quic的挺多,这大概不是caddy开发者的初衷吧),caddy虽好,但是不如nginx生态丰富,我也不想放弃nginx,于是采取一个折衷的办法,通过docker镜像来部署caddy支持quic。废话不多说,现在来细说升级步骤:


升级CentOS7的内核,以支持docker镜像


docker安装要求参考:docker CE on CentOS

先决条件:1、linux内核4.0+ 2、linux磁盘格式为ext4或xfs


1、检查内核版本


uname -r


若内核版本低于4.0,需要升级内核,升级内核方法如下


#安装ELRepo仓库,使用清华镜像
rpm -Uhv https://mirrors.tuna.tsinghua.edu.cn/elrepo/kernel/el7/x86_64/RPMS/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

#yum升级内
yum --enablerepo=elrepo-kernel install  kernel-ml-devel kernel-ml -y

#修改启动内核
cat /boot/grub2/grub.cfg |grep menuentry #查看内核
grub2-set-default "CentOS Linux (4.13.0-1.el7.elrepo.x86_64) 7 (Core)"  #默认内核改为最新内核

#重启服务器
reboot


2、安装docker


 yum install docker-ce docker-ce-cli containerd.io


3、修改docker镜像源,加快下载速度


cd /etc/docker && vi daemon.json

#添加如下内容
{
    "registry-mirrors":["http://registry.docker-cn.com"]
}

wq #保存退出


4、启动docker


systemctl start docker


讲完了docker的安装步骤,现在正式进入quic的世界


制作docker镜像


1、在用户目录下新建caddy文件夹,新建Dockerfile文件,添加如下内容


FROM ubuntu:latest
LABEL maintainer="zhangyunlong_fdzs@163.com"

RUN apt-get update

RUN set -x  \
    && apt-get install curl -y \
    && curl https://getcaddy.com | bash -s personal && which caddy


2、制作镜像


docker image build -t docker-caddy .



通过镜像启动caddy服务


在开启docker服务前检查443端口是否放开udp安全限制


1、编写Caddyfile 配置文件


https://www.lcddjm.com
gzip
tls /chain/YOUR.pem /chain/YOUR.key
proxy / http://172.17.0.1:8080 {
  header_upstream Host {host}
  header_upstream X-Real-IP {remote}
  header_upstream X-Forwarded-For {remote}
  header_upstream X-Forwarded-Proto {scheme}
}
log /path/logs/caddy_access.log
errors /path/logs/caddy_errors.log


2、在ng中添加如下请求头,告诉浏览器服务器支持quic


add_header alt-svc 'quic=":443"; ma=2592000; v="46,44,43,39"';


此请求头的作用是告诉浏览器服务器支持quic,若浏览器也支持quic,后续的所有请求都是通过quic来发出,若浏览器不支持quic,还是走正常的http请求

3、启动docker镜像


docker container run -d -p 443:443/udp -v /home/lcddjm/caddy:/caddy -v /chain:/chain docker-caddy:latest caddy -quic -conf /caddy/Caddyfile


至此,quic已完成了部署,在浏览器窗口输入对应网址,查看network中的protocol是否是http2+quic/XX


所遇到问题:


1、最开始,Caddyfile中 proxy配置是转发到127.0.0.1,但是访问网址的时候,总是报502错误,查看日志了解到服务并没有真正转发出去,因为docker容器运行的时候有host、bridge、none三种网络可供配置,默认是bridge,与宿主机网络是互相隔离的。在安装Docker的时候,会在宿主机安装一个虚拟网关docker0,我们可以使用宿主机在docker0上的IP地址来代替localhost/127.0.0.1,查看docker0命令

ip addr show docker0


2、网站服务由node提供,node启动服务是app.listen绑定了127.0.0.1 这个host,导致docker0网段访问不到服务,注释掉绑定的host 服务便正常了



重要更新:


最新版的caddy1已经移除quic实验性功能, caddy2支持quic功能,但不知如何配置,有待后续研究。





本文参考:



确认 取消
1条评论