Skip to content

evansun922/quic_proxy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 

Repository files navigation

介绍

推荐我的新项目 https://github.com/evansun922/nginx-quic

quic_proxy是一个quic代理服务,接收前端发来的quic协议请求,然后http代理到后端业务服务,例如nginx等。

chromium 项目本身提供了一个测试用的quic服务,但是这个服务是单进程,且http回源需要整个文件下载完才能发给前端,大的视频文件这种方式是不能接受的。 在epoll_quic_server这个demo基础上,基于chromium架构,重新开发了一个支持高并发,可商用的quic to http代理服务,其特点:

  • 使用SO_REUSEADDR,提高udp服务使用多核的能力。
  • 使用recvmmsg,sendmmsg减少用户态与内核态切换,降低cpu,提高服务性能。
  • 使用chromium项目提供的quic协议,保证了总能使用最新版本的quic协议,避免使用其他quic开源项目协议更新慢,实现不完全的苦恼。
  • 本项目是c++项目,仅支持linux系统。
  • 由于chromium项目过于复杂难读,目前回源使用的是libcurl,未使用chromium项目自带的http代码。

编译步骤

  1. 下载chromium,详见: chromium下载

  2. 下载编译libcurl, 请使用boringssl编译libcurl,或者 --without-ssl,参考编译选项:./configure --enable-debug --disable-optimize --with-ssl=/path/boringssl --enable-shared=no --disable-pthreads

  3. copy代码目录proxy_quic到net/third_party/quiche/src/quic/下。

  4. 修改 chromium项目的 net/BUILD.gn 文件,找到 epoll_quic_server 服务配置,在下面追加以下内容:

    sources = [
      "third_party/quiche/src/quic/proxy_quic/quic_proxy_server_bin.cc",
      "third_party/quiche/src/quic/proxy_quic/quic_proxy_server.cc",
      "third_party/quiche/src/quic/proxy_quic/quic_proxy_backend.cc",
      "third_party/quiche/src/quic/proxy_quic/quic_proxy_curl.cc",
      "third_party/quiche/src/quic/proxy_quic/quic_curl_timer.cc",
      "third_party/quiche/src/quic/proxy_quic/quic_proxy_packet_writer.cc",
      "third_party/quiche/src/quic/proxy_quic/quic_proxy_packet_reader.cc",
      "third_party/quiche/src/quic/proxy_quic/sendmmsgtimer.cc",
      "third_party/quiche/src/quic/proxy_quic/quic_proxy_dispatcher.cc",
      "third_party/quiche/src/quic/proxy_quic/quic_proxy_session.cc",
      "third_party/quiche/src/quic/proxy_quic/quic_proxy_stream.cc",
    ]
    include_dirs = [
      "/usr/local/include"
    ]
    deps = [
      ":epoll_quic_tools",
      ":epoll_server",
      ":net",
      ":simple_quic_tools",
      "//base",
      "//third_party/boringssl",
    ]
    lib_dirs = [
      "/usr/local/lib"
    ]
    libs = [
      #"curl",
      "/usr/local/lib/libcurl.a",
      "/usr/lib/x86_64-linux-gnu/libz.a",
    ]
    }
    
  5. cd src; gn gen out/Debug

  6. ninja -C out/Debug quic_proxy_server (5,6两步具体参数的使用,详见:Build the QUIC client and server

运行

前台运行:

out/Debug/quic_proxy_server --quic_proxy_backend_url=http://backend-host --certificate_file=/path/you.crt --key_file=/path/you.pkcs8

后台运行:

./logrun.pl /path/log-dir out/Debug/quic_proxy_server --port=443 --daemon=true --quic_proxy_backend_url=http://backend-host --certificate_file=/path/you.crt --key_file=/path/you.pkcs8

联系

欢迎提出改进或者bug等问题,作者邮箱:[email protected], QQ:15543852

About

A high-performance QUIC proxy service.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published