之前在学校用的 cow, cow 向外提供 HTTP, 虽然有认证,但多少还是有些不安全。受博文 使用 nghttpx 搭建 HTTP/2 代理 影响,最近开始尝试使用 HTTP/2 作为前端接入,配合证书使用安全性得到了极大地提升。证书可以使用 Let’s Encrypt, 方便好使,生成方法可参考 Let’s Encrypt for Archlinux.

nghttp2 已经进入 extra 仓库,使用 packer -S nghttp2 即可安装。我的 nghttpx 配置文件如下: {% gist id=“billryan/718af2a3500bdf93a30e225d1e7dd725”,file=“nghttpx.conf” %}{% endgist %}

  • 前端接受 HTTP/2 请求,并监听 11111 端口
  • 后端与 Squid 对接,Squid 的配置可参考 家用服务器之 Squid 分流
  • private-key 等证书使用 Let’s Encrypt 生成,免去了申请商业证书的麻烦
  • workers 根据你的 CPU 核数设定
  • add-x-forwarded-for=yes 设定 forwarded-for 参数,让 Squid 能获取到客户端的真实 IP,便于 Squid 层面的鉴权
  • accesslog-file 便于分析不明 IP

对比过不使用 nghttp2 的代理情况,HTTP 1.1 的代理分分钟被不明 IP 访问,使用 nghttp2 后几乎没有再遇到骚扰。Chrome/Firefox 对 HTTP/2 的支持应该是毫无压力,Chrome 下 SwitchOmega 插件甚是好用。至此,HTTP proxy 层面已经十分完善,nghttp2 作为前端接入,Squid 作为分流、鉴权和缓存,polipo 提供 socks5 转 HTTP, ss 提供 socks5, HAProxy 提供高可用和负载均衡。