标签: quic

  • Nginx原生HTTP3预览安装测试

    Nginx原生HTTP3预览安装测试

    千呼万唤始出来的NGINX适配原生HTTP3终于开始测试了。在nginx的官方git库上新增了一个http://hg.nginx.org/nginx-quic/,就是大家所期待的NGINX的官方QUIC和HTTP/3实现的初始版本,内含http_v3_module模块.

    目前为实验性的–不适用于生产.目前基于在nginx主线1.19.x上,同时也在计划合并新的Nginx定期发布到该分支。

    #boringssl分支
    git clone https://github.com/google/boringssl.git
    #tatsuhiro-t 分支
    git clone --depth 1 --branch master-quic-support https://github.com/akamai/openssl
    #akamai 分支
    git clone --depth 1 --branch master-quic-support https://github.com/akamai/openssl
    Bash

    NGINX官方也声明了这个QUIC + HTTP/3实现是全新的,与Cloudflare作为其quiche项目的一部分提供的补丁程序无关。

    这里我们作为测试,来吃螃蟹。其实本质基本编译方式与nginx1.19.X系列一致,只是增加boringssl作为加密库,其中只要包含quic和http/3的加密库和能够被nginx支持的,理论上都是可以的。比如对应的分支:

    我门在CentOS下按照

    #按照编译依赖和工具
    yum install mercurial psmisc net-tools wget curl build-essential lsb-release cmake golang libunwind-dev git libpcre3-dev zlib1g-dev hg
    #下载nginx-quic和boringssl源码
    hg clone -b quic https://hg.nginx.org/nginx-quic --insecure
    git clone https://boringssl.googlesource.com/boringssl
    #编译boringssl的密码库,以备nginx编译引用
    cd boringssl
    mkdir -p build .openssl/lib .openssl/include
    # 建立软链接,注意其中的路径根据你的下载路径的情况进行调整
    ln -sf /root/src/boringssl/include/openssl /root/src/boringssl/.openssl/include/openssl
    # 生成库文件
    touch /root/src/boringssl/.openssl/include/openssl/ssl.h
    # 预编译
    cmake -B/root/src/boringssl/build -H/root/src/boringssl
    # 编译 
    make -C /root/src/boringssl/build
    # 拷贝编译好的库文件
    cp /root/src/boringssl/build/crypto/libcrypto.a /root/src/boringssl/build/ssl/libssl.a /root/src/boringssl/.openssl/lib
    #增加nginx运行用户和用户组
    /usr/sbin/groupadd -f www
    /usr/sbin/useradd -g www www
    cd ..
    cd nginx-quic 
    #取消 debug 模式进行编译设置
    sed -i 's@CFLAGS="$CFLAGS -g"@#CFLAGS="$CFLAGS -g"@' auto/cc/gcc
    #configure
    #注意需要密码库的引用和nginx模块的启用;详见:http://hg.nginx.org/nginx-quic/file/tip/README
    ./auto/configure \
     --prefix=/usr/local/nginx  \
     --user=www  \
     --group=www \
     --with-http_stub_status_module \
     --with-http_v2_module \
     --with-http_ssl_module \
     --with-http_gzip_static_module \
     --with-http_realip_module \
     --with-http_flv_module \
     --with-http_mp4_module \
     --with-pcre\
     --with-pcre-jit \
     --with-zlib=../zlib-cf  \
     --add-module=../nginx-ct \
     --add-module=../ngx_brotli \
     --with-ld-opt='-ljemalloc' \
     --with-cc-opt="-I../boringssl/include"   \
     --with-ld-opt="-L../boringssl/build/ssl \
     -L../boringssl/build/crypto"  \
     --with-debug --with-http_v3_module  \
     --with-http_quic_module \
     --with-stream_quic_module
    #编译安装
    make && make install
    #其他参照nginx编译后配置如下:
    vim /etc/profile
    #末尾增加以下内容
    PATH=$PATH:/usr/local/php/bin:/usr/local/nginx/sbin
    export PATH
    #内容结尾
    source /etc/profile
    #增加系统服务
    vim  /lib/systemd/system/nginx.service
    #输入以下内容
    [Unit]
    Description=nginx - high performance web server
    Documentation=http://nginx.org/en/docs/
    After=network.target
    [Service]
    Type=forking
    PIDFile=/var/run/nginx.pid
    ExecStartPost=/bin/sleep 0.1
    ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
    ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s QUIT $MAINPID
    LimitNOFILE=1000000
    LimitNPROC=1000000
    LimitCORE=1000000
    [Install]
    WantedBy=multi-user.target
    #内容结束
    #赋予启动服务权限
    chmod +x  /lib/systemd/system/nginx.service
    #设置开机启动
    systemctl enable nginx
    #设置nginx配置文件,根据自己实际情况
    vim /usr/local/nginx/conf/nginx.conf
    #输入以下内容
    user www www;
    worker_processes auto;
    error_log /data/wwwlogs/error_nginx.log crit;
    pid /var/run/nginx.pid;
    worker_rlimit_nofile 51200;
    events {
      use epoll;
      worker_connections 51200;
      multi_accept on;
    }
    http {
      include mime.types;
      default_type application/octet-stream;
      server_names_hash_bucket_size 128;
      client_header_buffer_size 32k;
      large_client_header_buffers 4 32k;
      client_max_body_size 1024m;
      client_body_buffer_size 10m;
      sendfile on;
      tcp_nopush on;
      keepalive_timeout 120;
      server_tokens off;
      tcp_nodelay on;
      fastcgi_connect_timeout 300;
      fastcgi_send_timeout 300;
      fastcgi_read_timeout 300;
      fastcgi_buffer_size 64k;
      fastcgi_buffers 4 64k;
      fastcgi_busy_buffers_size 128k;
      fastcgi_temp_file_write_size 128k;
      fastcgi_intercept_errors on;
      #Gzip Compression
      gzip on;
      gzip_buffers 16 8k;
      gzip_comp_level 6;
      gzip_http_version 1.1;
      gzip_min_length 256;
      gzip_proxied any;
      gzip_vary on;
      gzip_types
        text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
        text/javascript application/javascript application/x-javascript
        text/x-json application/json application/x-web-app-manifest+json
        text/css text/plain text/x-component
        font/opentype application/x-font-ttf application/vnd.ms-fontobject
        image/x-icon;
      gzip_disable "MSIE [1-6]\.(?!.*SV1)";
      ##Brotli Compression
      #brotli on;
      #brotli_comp_level 6;
      #brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;
      ##If you have a lot of static files to serve through Nginx then caching of the files' metadata (not the actual files' contents) can save some latency.
      #open_file_cache max=1000 inactive=20s;
      #open_file_cache_valid 30s;
      #open_file_cache_min_uses 2;
      #open_file_cache_errors on;
    ######################## default ############################
      server {
        listen 80;
        server_name _;
        access_log /data/wwwlogs/access_nginx.log combined;
        root /data/wwwroot/default;
        index index.html index.htm index.php;
        #error_page 404 /404.html;
        #error_page 502 /502.html;
        location /nginx_status {
          stub_status on;
          access_log off;
          allow 127.0.0.1;
          deny all;
        }
        location ~ [^/]\.php(/|$) {
          #fastcgi_pass remote_php_ip:9000;
          fastcgi_pass unix:/dev/shm/php-cgi.sock;
          fastcgi_index index.php;
          include fastcgi.conf;
        }
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
          expires 30d;
          access_log off;
        }
        location ~ .*\.(js|css)?$ {
          expires 7d;
          access_log off;
        }
        location ~ ^/(\.user.ini|\.ht|\.git|\.svn|\.project|LICENSE|README.md) {
          deny all;
        }
      }
    ########################## vhost #############################
      include vhost/*.conf;
    }
    #输入内容结束
    mkdir -p /data/wwwlogs/
    mkdir -p /data/wwwroot/default
    mkdir -p /usr/local/nginx/conf/vhost
    vim /data/wwwlogs/access_nginx.log
    service nginx start
    service nginx status
    #配置示例
    # 以官方配置为例
    server {
                # for better compatibility it's recommended
                # to use the same port for quic and https
                listen 443 http3 reuseport;
    #注意reuseport参数只能在整个nginx配置文件中出现一次,不必每个vhost都使用,否则会报错
                listen 443 ssl http2;
     
                ssl_certificate     certs/example.com.crt;
                ssl_certificate_key certs/example.com.key;
                ssl_protocols       TLSv1.3;
     
                location / {
                    # required for browsers to direct them into quic port
                    add_header Alt-Svc '$http3=":443"; ma=86400';
                    #以下为兼容的http3格式
                    # add_header Alt-Svc  'h3-29=":443"; ma=2592000,h3-28=":443";ma=2592000,h3-27=":443"; ma=2592000,h3-25=":443";ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443";ma=2592000,h3-Q049=":443";ma=2592000,h3-Q048=":443";ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443";ma=2592000,quic=":443"; ma=2592000; v="46,43"';
                }
            }
    Bash

    至此,我们完成了nginx-http/3的安装。测试我们需要使用http3check进行测试.如下图:

    Http3-test
  • Dbian10编译nginx实验部署HTTP3(Quiche)

    Dbian10编译nginx实验部署HTTP3(Quiche)

    前面我们写过centos7编译nginx支持http的实验部署,这次我们使用新版的Debian10实现编译,主要是看有哪些小的注意点。使用nginx-1.19.0版本和0.4.0版本的Cloudflare开发的quiche

    1.安装依赖软件及更新

    sudo apt update &&  apt upgrade && dist-upgrade && apt autoremove
    apt install make build-essential clang golang cmake -y

    2.安装构建quiched的Rust cargo

     curl https://sh.rustup.rs -sSf | sh

    选择1按照默认设置安装,然后执行临时系统环境设置,并测试cargo是否输出

     source $HOME/.cargo/env
    cargo -v

    由于cargo的Rust Crates 源在国外,国内在编译调用在线的依赖的时候很慢很慢,我们更新使用国内中科大的源.新增cargo的配置文件$HOME/.cargo/config

    vim $HOME/.cargo/config
    
    [source.crates-io]
    registry = "https://github.com/rust-lang/crates.io-index"
    replace-with = 'ustc'
    [source.ustc]
    registry = "git://mirrors.ustc.edu.cn/crates.io-index"

    这里对debian有一个问题,编译的时候bash命令好像不会寻找系统环境中我们刚才安装的cargo命令,会出现/bin/sh: cargo: 未找到命令,因此我们专门做一条软链便于系统寻找cargo命令。

     ln -s $HOME/.cargo/bin/cargo /usr/local/bin/cargo

    3.nginx编译参数,nginx configure参数需要包含以下内容

    --build="quiche-$(git --git-dir=../quiche/.git rev-parse --short HEAD)" --with-http_v3_module  --with-openssl=../quiche/deps/boringssl --with-quiche=../quiche
    4.具体编译nginx和正常一样即可

    5.nginx网站配制参数

    # Enable QUIC and HTTP/3.
    listen 443 quic reuseport;
     
    # Enable HTTP/2 (optional).
    listen 443 ssl http2;
    
    # Add Alt-Svc header to negotiate HTTP/3.
    add_header alt-svc 'quic=":443"; ma=2592000; v="46,43",h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000';
    

    6.测试,可以使用https://http3check.net进行测试.

    至此,我们完成了http3在debian10上的部署,主要核心还是要搞定cargo组件,有点麻烦!See U!

  • NGINX启动支持HTTP/3主线版本开发

    NGINX启动支持HTTP/3主线版本开发

    2020年4-30日,NGINX官方终于启动支持HTTP/3主线版本开发,为期一年内。

    盼星星盼月亮,希望能够尽快落地吧。不然NGINX都玩不过OpenLiteSpeed了。

    路线图

    里程碑: nginx-1.19

    12个月内 到期(04/30/21 18:00:00)

    现状:持续发展中

    干线:主线

    1.19计划的功能和改进

    • [进行中] HTTP / 3支持
    • [进行中] OCSP对客户端证书的支持

  • HTTP3的nginx-quiche实验部署

    Quic已经作为了下一代http协议HTTP3的实现。以前给大家介绍过quic的实现智能依靠Golang的quic库实现。在web中的表现即为前文所述的CADDY服务器实现quic:CentOS7.6安装Caddy服务器及PHP7.4环境,实现QUIC配置

    作为web服务器两大扛把子Apache httpd和NGINX一直没有动静。httd目前为止是没有任何动静,但是NGINX有传言开发原生支持quic.但目前到了1.17.4版仍然没有测试版发出。

    这个时候我们就要感谢边缘计算CDN行家CloudFlare了。他们家的特色就是精研各种有利于CDN类边缘计算web服务的开源技术实现。从他们以前支持 openresty 开源开发就可见一斑。最新消息 CloudFlare 已经成功在CDN业务中实现了QUIC的部署,那意思就是已经成熟了。其基于HTTP3 Quic的实现靠的就是他们开发的Quiche实现。其中有一个patch就是为了NGINX补丁实现基于其Quiche和谷歌Boringssl 实现的HTTP3 Quic协议。 https://blog.cloudflare.com/experiment-with-http-3-using-nginx-and-quiche/

    言归正传,开工。注意:本文只探讨关于nginx编译实现quic

    1.下载最新的nginx,解压缩

    wget http://nginx.org/download/nginx-1.19.0.tar.gz
    tar xvzf  nginx-1.19.0.tar.gz

    2.下载最新的CloudFlare QUICHE及其子项目,其子项目就是BoringSSL.这里作了版本现在,我们下载的是发布的版本号,它的master版本一直在持续更新,会存在一些无法编译的bug.

    git clone --recursive -b 0.4.0 https://github.com/cloudflare/quiche

    3.运用QUCHE中的NGINX补丁包为NGINX打上补丁

    cd nginx-1.19.0
    patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch

    4.完成NGINX编译的关联软件

    为了实现QUIC,NGINX编译必须用到quiche的相关库及BoringSSL的库文件。但这个两个东东编译起来有些软件是必须的,并且要求还挺高。难就难在这了。

    BoringSSL编译需要CMake 3.0或更高版本 、 需要最新版本的Perl 环境、需要 GCC(4.8+)和Clang 、 需要Go语言最新稳定版本。

    QUICHE Rust 1.38或更高版本才能构建。可以使用rustup安装最新的稳定Rust版本、新版本的 cargo命令

    CMKAE和Perl环境更新安装请参照
    CENTOS7安装最新版的CMKE3
    CENTOS7安装最新Perl环境

    安装 GCC(4.8+)和Clang、Go语言 ;安装Rust和 cargo

    yum install gcc clang go rust cargo -y

    5. NGINX编译设置

    NGINX的configure设置必须包括以下设置:(注意删除原nginx编译设置中的openssl设置,这里它已经被boringssl取代)

    --build="quiche-$(git --git-dir=../quiche/.git rev-parse --short HEAD)" --with-http_v3_module  --with-openssl=../quiche/deps/boringssl --with-quiche=../quiche 

    6.编译完成NGINX配置文件设置

    NGINX编译完成后建立自己的网站,NGINX网站配置文件中需包括以下配置,注意对应区块的位置。

    http {
        server {
            # Enable QUIC and HTTP/3.
            listen 443 quic reuseport;
    
            # Enable HTTP/2 (optional).
            listen 443 ssl http2;
    
            ssl_certificate      cert.crt;
            ssl_certificate_key  cert.key;
    
            # Enable all TLS versions (TLSv1.3 is required for QUIC).
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
            
            # Add Alt-Svc header to negotiate HTTP/3.
    add_header alt-svc 'quic=":443"; ma=2592000; v="46,43",h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000';
        }
    }
    

    7.检查HTTP3开启效果:

    在CHROME浏览器开发工具中NETWORK中点击对应页面,查看Response headers出现 alt-svc: h3-23=”:443″; ma=86400,即为正确实现了NGINX HTTP3:QUIC.

    8.主要相关项目地址:

    https://github.com/google/boringssl
    https://github.com/cloudflare/quiche
    https://github.com/kn007/patch/blob/master/nginx_with_quic.patch

  • CentOS7.6安装Caddy服务器及PHP7.4环境,实现QUIC配置

    本文旨在描述使用CADDY启用QUIC协议-
    QUIC(Quick UDP Internet Connection)是谷歌制定的一种基于UDP的低时延的互联网传输层协议。在2016年11月国际互联网工程任务组(IETF)召开了第一次QUIC工作组会议,受到了业界的广泛关注。这也意味着QUIC开始了它的标准化过程,成为新一代传输层协议 。

    1.安装CADDY服务器。本文采用CENTOS7.5安装。

     curl https://getcaddy.com | bash -s personal http.cache,http.geoip,http.git,http.grpc
    
    Downloading Caddy for linux/amd64...
    https://caddyserver.com/download/linux/amd64?plugins=
    Extracting...
    Putting caddy in /usr/local/bin (may require password)
    [sudo] password for sammy:
    Caddy 0.10.2
    Successfully installed

    查询caddy位置

    which caddy
    /usr/local/bin/caddy

    为了安全起见,不要以root用户身份运行Caddy二进制文件。为了使Caddy能够以非root用户身份绑定到特权端口(例如80、443),您需要运行以下setcap命令:

    sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

    创建专用的系统用户和用户组caddy,创建的用户caddy只能用于管理Caddy服务,而不能用于登录.

    sudo useradd -r -d /var/www -M -s /sbin/nologin caddy

    设定站点主目录 /var/www

    sudo mkdir -p /var/www/example.com
    sudo chown -R caddy:caddy /var/www

    创建SSL证书存放目录,并设定权限。注意权限很重要。

    sudo mkdir /etc/ssl/caddy
    sudo chown -R caddy:root /etc/ssl/caddy
    sudo chmod 0770 /etc/ssl/caddy

    创建 Caddy配置文件 存储目录,并设定权限。

    sudo mkdir /etc/caddy
    sudo chown -R root:caddy /etc/caddy

    创建CADDY配置文件和设定权限,并简单设置配置文件.注意这里只是简单的配置示例文件,更多的配置设置方式可以参考官方文档。

    sudo touch /etc/caddy/Caddyfile
    sudo chown caddy:caddy /etc/caddy/Caddyfile
    sudo chmod 444 /etc/caddy/Caddyfile
    cat <<EOF | sudo tee -a /etc/caddy/Caddyfile
    example.com {
        root /var/www/example.com
        gzip
        tls admin@example.com
    }
    EOF

    创建Caddy的systemd系统服务管理文件

    sudo vi /etc/systemd/system/caddy.service

    输入以下内容并保存。

    [Unit]
    Description=Caddy HTTP/2 web server
    Documentation=https://caddyserver.com/docs
    After=network-online.target
    Wants=network-online.target systemd-networkd-wait-online.service
    
    [Service]
    Restart=on-abnormal
    
    ; User and group the process will run as.
    User=caddy
    Group=caddy
    
    ; Letsencrypt-issued certificates will be written to this directory.
    Environment=CADDYPATH=/etc/ssl/caddy
    
    ; Always set "-root" to something safe in case it gets forgotten in the Caddyfile.
    ExecStart=/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp
    ExecReload=/bin/kill -USR1 $MAINPID
    
    ; Use graceful shutdown with a reasonable timeout
    KillMode=mixed
    KillSignal=SIGQUIT
    TimeoutStopSec=5s
    
    ; Limit the number of file descriptors; see `man systemd.exec` for more limit settings.
    LimitNOFILE=1048576
    ; Unmodified caddy is not expected to use more than that.
    LimitNPROC=512
    
    ; Use private /tmp and /var/tmp, which are discarded after caddy stops.
    PrivateTmp=true
    ; Use a minimal /dev
    PrivateDevices=true
    ; Hide /home, /root, and /run/user. Nobody will steal your SSH-keys.
    ProtectHome=true
    ; Make /usr, /boot, /etc and possibly some more folders read-only.
    ProtectSystem=full
    ; … except /etc/ssl/caddy, because we want Letsencrypt-certificates there.
    ;   This merely retains r/w access rights, it does not add any new. Must still be writable on the host!
    ReadWriteDirectories=/etc/ssl/caddy
    
    ; The following additional security directives only work with systemd v229 or later.
    ; They further retrict privileges that can be gained by caddy. Uncomment if you like.
    ; Note that you may have to add capabilities required by any plugins in use.
    ;CapabilityBoundingSet=CAP_NET_BIND_SERVICE
    ;AmbientCapabilities=CAP_NET_BIND_SERVICE
    ;NoNewPrivileges=true
    
    [Install]
    WantedBy=multi-user.target

    启动Caddy服务,并使其在系统启动时自动启动:

    sudo systemctl daemon-reload
    sudo systemctl start caddy.service
    sudo systemctl enable caddy.service

    如果有开启防火墙,还需要设定防火墙规格 打开端口80和443端口如下:

    sudo firewall-cmd --permanent --zone=public --add-service=http 
    sudo firewall-cmd --permanent --zone=public --add-service=https
    sudo firewall-cmd --reload

    您的网站创建测试页

    echo '<h1>Hello World!</h1>' | sudo tee /var/www/example.com/index.html

    启动Caddy服务以加载新 配置

    sudo systemctl restart caddy.service

    你将看到成功的示例首页。

    2.安装php7.4

    由于Centos系统默认的php版本仍然为古董的php5.6版本,目前最新版为RC的7.4版本。只能从第三方源中安装。

    首先安装 EPEL 源, REMI 源 , Yum 源管理工具 ,更新yum缓存

    rpm -vih http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
    rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
    yum install yum-utils
    yum clean all && yum makecache

    设置PHP默认版本为php74,如果你想安装其他版本可以设置为对应版本。如5.6,7.0,7.3,7.4等

     yum-config-manager --enable remi-php74

    安装php核心

     yum -y install php php-fpm php-opcache

    安装常用php扩展组件

    yum -y install php-mysql php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-soap curl curl-devel

    如果想安装php其他组件,可以按照以下查询php扩展组件

    rpm -qa | grep 'php'
    php-json-7.4.0~RC3-5.el7.remi.x86_64
    php-7.4.0~RC3-5.el7.remi.x86_64
    php-xml-7.4.0~RC3-5.el7.remi.x86_64
    php-gd-7.4.0~RC3-5.el7.remi.x86_64
    php-common-7.4.0~RC3-5.el7.remi.x86_64
    php-cli-7.4.0~RC3-5.el7.remi.x86_64
    php-opcache-7.4.0~RC3-5.el7.remi.x86_64
    php-process-7.4.0~RC3-5.el7.remi.x86_64
    php-fedora-autoloader-1.0.0-1.el7.noarch
    php-mbstring-7.4.0~RC3-5.el7.remi.x86_64
    php-odbc-7.4.0~RC3-5.el7.remi.x86_64
    php-xmlrpc-7.4.0~RC3-5.el7.remi.x86_64
    php-ldap-7.4.0~RC3-5.el7.remi.x86_64
    php-soap-7.4.0~RC3-5.el7.remi.x86_64
    php-pdo-7.4.0~RC3-5.el7.remi.x86_64
    php-pear-1.10.9-3.el7.remi.noarch
    php-mysqlnd-7.4.0~RC3-5.el7.remi.x86_64
    php-fpm-7.4.0~RC3-5.el7.remi.x86_64

    设置php服务,设置开机启动,启动php

    systemctl enable php-fpm
    systemctl start php-fpm

    vi /etc/php-fpm.d/www.conf

    变更其中的user = 和group =字段为设定的caddy服务器执行用户caddy和caddy,然后启动php

    systemctl start php-fpm

    一般为/etc/php-fpm.conf或者/etc/php-fpm.d/www.conf文件中

    3.修改Caddy配置

    mkdir /etc/caddy
    mkdir /etc/caddy/conf
    echo 'import ./conf/*' >> /etc/caddy/Caddyfile
    sudo mkdir /etc/ssl/caddy

    4.开启caddy QUIC协议

    修改 /etc/systemd/system/caddy.service ,在 ExecStart=/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp 后面加上 -quic ,如下。 重启服务即可启用。

    vim /etc/systemd/system/caddy.service
    
    ExecStart=/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp -quic
    
    sudo systemctl daemon-reload
    sudo systemctl restart caddy.service
    

    php启用配置文件实例。要确保PHP-FPM正在运行并侦听指定的unix套接字 ;检查 php-fpm.conf 中的 listen =  字段后面的内容,作为caddy配置后的php fastcgi监听字段。

    abc.com {
        tls XXX@XXX.com
        root /data/wwwroot/abc.com
        gzip
        fastcgi / listen = 127.0.0.1:9000
        rewrite {
            if {path} not_match ^\/wp-admin
            to {path} {path}/ /index.php?_url={uri}
        }
    }

    注意:php在caddy中启用fastcgi接入,所以php-fpm配置文件中的用户名和监控的sock字段的listen值必须和caddy中对应。