标签: NGINX

  • Nginx禁止未绑定的域名访问

    Nginx禁止未绑定的域名访问

    Nginx默认会启用未绑定的域名解析访问,也就是只要解析到你的IP,即使你服务器未绑定该域名,这样的坏处就是别人可以用你的服务器ip造成嫁祸做一些坏事

    使用以下nginx.conf配置默认解析,用于避免未绑定的域名访问到你的服务器。

     server {
       
            listen 80 default_server;
            listen 443 ssl;
            server_name _;
    
            ssl_certificate       /credential/default/default.crt;
            ssl_certificate_key   /credential/default/default.key;
    
            return       444;
        }
    JavaScript

    这里我们采用设定default_server锁定回收未绑定的解析域名,然后使用访问处理444输出拦截并断开链接。虽然比较粗暴,当时这样可以尽可能减少暴露服务器信息。当然你也可以用403 404等状态码拦截。

  • Nginx发布新的稳定版本Nginx-1.26.0

    Nginx发布新的稳定版本Nginx-1.26.0

    Nginx社区于2024-04-23发布了新的稳定版本nginx-1.26.0.新版本带来1.25.x上的一些新的更新内容:

    实验性的HTTP/3的支持

    新的HTTP/2针对单独Server的设置

    流模块中的虚拟服务器、将流连接传递到侦听套接字等.

    https://nginx.org/en/CHANGES-1.26

  • 使用Nginx FastCGI Cache缓存WordPress

    使用Nginx FastCGI Cache缓存WordPress

    前言

    目前Wordpress缓存方案有很多,主流的静态页面缓存插件也是有很多,代表的WP RocketWP super cacheW3 Total Cache等,也有用key-value缓存数据库的方案,代表的有RedisMemcached缓存方案。前者静态页面插件采用PHP方式把页面缓存为静态文件,访问的时候通过Nginx-PHP-数据库-静态缓存页面,后者是通过Nginx-PHP-键值缓存数据库-生产页面。通过以上对比我们就会发现,都依然无法避免访问到后台的PHP和数据库或者键值缓存数据库。而我们理想最快的方式是通过Nginx直接访问静态页面,但是可惜除了整站生成静态没有其他办法,并且整站静态的文件更新是个大问题。因此很多人采用了Nginx FastCGI Cache缓存方案。让Nginx通过自带的FastCGI Cache直接缓存页面到内存,访问的时候可以最快的访问到我们请求的页面。

    1.Nginx FastCGI Cache是什么?

    NGINX中的fastcgi_cache缓存器是用于缓存动态生成的内容的,以减轻后端服务器的负担并提高网站的性能。当请求到达NGINX时,如果缓存中已经有了对应的响应,NGINX将直接返回缓存中的响应,而不需要再向后端服务器发起请求。这可以大大减少网站的响应时间和服务器负载。

    fastcgi_cache缓存器的底层原理是在内存中缓存动态内容的响应。当有请求到达时,NGINX将检查缓存中是否有对应的响应,如果有,就直接返回缓存的响应,如果没有,就向后端服务器发起请求,并将响应缓存起来。缓存的响应是根据缓存键(cache key)来存储的。缓存键是一个字符串,由多个变量组成,如请求协议、请求方法、主机名、URI等。

    在使用fastcgi_cache缓存器时,您可以根据需要配置缓存的失效时间、缓存的大小、缓存的键等。缓存的失效时间可以根据您的应用程序的实际情况进行设置,以确保缓存的内容始终是最新的。缓存的大小可以根据服务器的内存容量和应用程序的负载进行调整,以确保缓存不会过度消耗服务器资源。缓存的键可以根据您的应用程序的逻辑进行设置,以确保缓存的命中率最高。

    总之,fastcgi_cache缓存器是一个非常有用的工具,可以帮助您优化网站的性能,降低服务器负载,提高用户体验。但需要注意的是,缓存器的设置和优化需要根据具体的应用程序和服务器环境进行调整。

    2.如何实现FastCGI Cache缓存Wordpress

    我们需要对FastCGI Cache做的任务如下:

    1. 设置缓存池信息(fastcgi_cache_path);
    2. 设置缓存key(fastcgi_cache_key);
    3. 过期文件处理(fastcgi_cache_use_stale)
    4. 缓存策略(fastcgi_cache_bypass/fastcgi_no_cache
    5. 后端请求成功时缓存时间(fastcgi_cache_valid
    6. 增加了调试信息头(add_header)

    2.1Nginx.conf缓存配置

    在Nginx.conf配置文件的server之前增加FastCGI缓存的配置:

    FastCGI缓存可以选择文件缓存还是内存缓存:

    • 在fastcgi_cache_path中,可以将它设置为内存缓存路径,例如:/dev/shm/nginx-cache,如果你的磁盘IO不够快的话建议采用此方式,内存的读取速度是最快的。
    • 正常我们也可以使用文件缓存路径:/tmp/nginx-cache

    选择好了以后,需要在对应的目录(/dev/shm或者/tmp)下创建对应的文件夹nginx-cache

    单站点(文件缓存):

    fastcgi_cache_path /tmp/nginx-cache levels=1:2 keys_zone=zach:256m inactive=1d max_size=1G;
    #公共缓存配置
    fastcgi_temp_path /tmp/nginx-cache/temp;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    fastcgi_cache_use_stale error timeout invalid_header http_500;
    #忽略一切nocache申明,避免不缓存伪静态
    fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
    Bash

    多站点(文件缓存):

    #站点 1 缓存配置
    fastcgi_cache_path /tmp/nginx-cache/xxx levels=1:2 keys_zone=xxx:128m inactive=1d max_size=1G;
    #站点 2 缓存配置
    fastcgi_cache_path /tmp/nginx-cache/yyy levels=1:2 keys_zone=yyy:128m inactive=1d max_size=1G;
    #公共缓存配置
    fastcgi_temp_path /tmp/wpcache/temp;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    fastcgi_cache_use_stale error timeout invalid_header http_500;
    #忽略一切nocache申明,避免不缓存伪静态等
    fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
    Bash

    注意:如果要开启更多站点缓存,请继续增加,注意每个站点的 缓存路径 和 keys_zone 要自定义区分一下,不要一样。

    注意:

    上述代码中得 fastcgi_cache_path 的参数也可以根据自己站点的需要来设定,具体含义如下:

    • path 表示缓存存放目录。
    • levels 表示指定该缓存空间有两层 hash 目录,第一层目录为 1 个字母,第二层目录为 2 个字母,保存的文件名会类似/tmp/blogcache/c/29/XXXXXX ;
    • keys_zone 参数用来为这个缓存区起名。
    • 128m 指内存缓存空间大小为 128MB。
    • inactive 的 1d 指如果缓存数据在 1 天内没有被访问,将被删除。相当于 expires 过期时间的配置。
    • max_size 的 1g 是指硬盘缓存空间为 1G。

    2.2.增加缓存规则

    缓存规则需要根据站点的本身的设置,不同类型的CMS使用的不一样。下面是针对Wordpress的配置:

    # Cache START #
         set $skip_cache 0;
             #post访问不缓存
             if ($request_method = POST) {
                 set $skip_cache 1;
             }  
             #动态查询不缓存
             if ($query_string != "") {
                 set $skip_cache 1;
             }  
             #后台等特定页面不缓存(其他需求请自行添加即可)
             if ($request_uri ~* "/wp-admin/|/wp-admin/*|/wp-json/*|/xmlrpc.php|wp-.*.php|/feed|/rss|/pay|/notify|/opc|/p.php|/return|/download|/redirect|index.php|sitemap.xml|sitemap(_index)?.xml|sitemap.*.xml|sitemap.*.*.xml") {
                 set $skip_cache 1;
             }  
           #对登录用户、评论过的用户不展示缓存
             if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|wordpress_logged_in_[a-f0-9]+") {
                 set $skip_cache 1;
             }
             location ~ [^/]\.php(/|$)
                 {
                     try_files $uri =404;
                     fastcgi_pass unix:/tmp/php-cgi-74.sock;
                     fastcgi_index index.php;
                     include fastcgi.conf;  
                     #新增的缓存规则
                     fastcgi_cache_bypass $skip_cache;
                     fastcgi_no_cache $skip_cache;
                     #添加一个头部,用于判断缓存状态
                     add_header X-Cache "$upstream_cache_status From $host";
                     add_header Cache-Control  max-age=0;
                     add_header Nginx-Cache "$upstream_cache_status";
                     add_header Last-Modified $date_gmt;
                     add_header X-Frame-Options SAMEORIGIN; 
                     #只允许本站用 frame 来嵌套
                     add_header X-Content-Type-Options nosniff; 
                     #禁止嗅探文件类型
                     add_header X-XSS-Protection "1; mode=block"; 
                     #XSS 保护
                     etag  on;
                     fastcgi_cache xxx;
                     #fastcgi_cache_valid 200 301 302 1h;
                     fastcgi_cache_valid 200 12h;
                     fastcgi_cache_valid 301 302 3d;
                     fastcgi_cache_valid 304 1d;
                     #expires 45m;
             }
         # Cache END #
         
         # Cache purge START #
             location ~ /purge(/.*) {
                allow 127.0.0.1;
                allow 服务器IP;
                deny all;
                fastcgi_cache_purge xxx "$scheme$request_method$host$1";
             }    
         # Cache purge END #
    Bash

    2.3注意事项:

    1.以上规则设置需要注意fastcgi_cache这里需要写上文对应的keys_zone,这也是不同站点用不同keys_zone的原因。

    2. add_header Cache-Control如果是动态内容要实时更新的话,可以设置为0,否则可以设置时间大一些,单位是秒。

    3.代码里面的服务器公网IP换成你的服务器公网IP。

    4.可选缓存配置:某些主题如果移动端访问报错,可以设置不缓存移动端 :

        #不缓存移动端访问
        if ($http_user_agent ~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry|windowss(ce|phone))) {
                set $skip_cache 1;
        }
    Bash

    5.以上配置需要放置在server段。

    6.如果出现评论过的用户依然用的是缓存,那应该是wordpress没有记住cookie,把以下代码加入到functions.php 中即可:

    add_action('set_comment_cookies','coffin_set_cookies',10,3);
    function coffin_set_cookies( $comment, $user, $cookies_consent){
       $cookies_consent = true;
       wp_set_comment_cookies($comment, $user, $cookies_consent);
    }
    Bash

    7.启用fastcgi_cache缓存时,发现在Nginx配置文件中添加了Cache-Control信息,但是总是不生效。HTTP头部信息会总会包含以下信息:Cache-Control: no-store,no-cache,must-revalidate,post-check=0,pre-check=0 和 Pragma: no-cache,可以修改你php.ini配置文件中的session.cache_limiter设置:

    session.cache_limiter=none
    Bash

    3.Wordpress Nginx FastCGI Cache缓存管理插件

    WordPress后台安装Nginx Helper 插件后,点击Setting设置,开启Enable Purge,启用nginx Fastcgi cache (requires external settings for nginx),你还可以再页面源码底部增加FastCache的缓存时间戳:开启Enable Nginx Timestamp in HTML;选择Delete local server cache files.

    插件使用注意事项:插件作者定义的缓存路径是 /var/run/nginx-cache ,而我们可能会根据服务器实际情况来自定义缓存路径,这样一来,缓存路径的不同就会导致插件无法找到缓存文件并删除。添加以下代码到WordPress根目录的wp-config.php文件中。

    define('RT_WP_NGINX_HELPER_CACHE_PATH','/tmp/nginx-cache/');
    Bash

    4.缓存效果验证:

    采用浏览器开发工具重点网络响应标头,查询其中的缓存标识:

    X-Cache:HIT From zach.vip

    • HIT代表缓存命中
    • MISS 代表没有找到缓存
    • BYPASS 代表跳过缓存
    • EXPIRED 代表缓存过期

    同时我们可以查看网页源码的时间戳:

    <!--Cached using Nginx-Helper on 2024-04-19 21:37:12. It took 347 queries executed in 0.811 seconds.-->
    <!--Visit http://wordpress.org/extend/plugins/nginx-helper/faq/ for more details-->

    愿你的网站飞起来!!!

  • NGINX + BoringSSL 编译错误

    NGINX + BoringSSL 编译错误

    在使用最新版本的Nginx和Boringssl编译的时候会出现如下错误提示:

    ./configure: error: SSL modules require the OpenSSL library.
    You can either do not enable the modules, or install the OpenSSL library
    into the system, or build the OpenSSL library statically from the source
    with Angie by using --with-openssl=<path> option.

    出现以上的原因在于Boringssl项目在清除其他代码后遗留下来了一个C或者C++的运行时runtime检查.

    因此libssl 现在需要 C++ 运行时,除了
    预先存在的 C++ 要求。某些项目可能需要将最终链接切换到使用 C++ 链接器而不是 C 链接器。

    以上参考链接https://github.com/google/boringssl/commit/c52806157c97105da7fdc2b021d0a0fcd5186bf3

    Nginx社区有人给出了针对三个平台的解决方案如下:

    MacOS:

    auto/configure \
    --with-cc-opt="-I../boringssl/include" \
    --with-ld-opt="-L../boringssl/build/ssl -L../boringssl/build/crypto -lc++"

    C语言环境下Linux:

    auto/configure /
    --with-cc=clang /
    --with-cc-opt="-I../boringssl/include" /
    --with-ld-opt="-L../boringssl/build/ssl -L../boringssl/build/crypto -lstdc++"

    C++语言环境下Linux:

    auto/configure \
    --with-cc=c++ \
    --with-cc-opt="-I../boringssl/include -x c" \
    --with-ld-opt="-L../boringssl/build/ssl -L../boringssl/build/crypto"

    多少情况下用的C++环境。通过以上方式编译,即可解决openssl库无法连接的问题。

  • Angie–Nginx的俄罗斯本土分支

    Angie–Nginx的俄罗斯本土分支

    Angie 是 NGINX Web 服务器的代替品,旨在扩展原始版本的功能。

    让我们从一些背景开始。NGINX 股份有限公司由 NGINX 的原始作者 Igor Sysoev 和 Maxim Konovalov 于 2011 年 7 月成立,旨在为该软件提供商业产品和支持。它是 F5 Networks Inc. 的一部分,F5 Networks Inc.于2019年3月斥资6.7亿美元收购了它,以帮助它们从一家硬件公司发展成为一家更专注于服务的公司。今年 8 月,拥有 NGINX 版权并负责其开发的 F5 Networks Inc. 停止了在俄罗斯的业务,完全退出了市场。几乎所有俄罗斯办公室的开发商都接受了搬迁到加利福尼亚州圣何塞的提议。

    然而,事情似乎发生了变化。一些 NGINX 的首席工程师已经回来了,因此,一家新公司 Web Server LLC 已经成立,其旗舰产品是 Angie Web Server。所以,让我们看看我们目前对它的了解。Angie 是 NGINX 的一个分支,旨在扩展远超原始版本的功能。它可以用作 NGINX 的替代品,因此您可以使用现有的 NGINX 配置而无需进行重大更改。

    可供安装的初始稳定版本是 Angie 1.0.0。该软件在 BSD 2-Clause “Simplified”许可下分发,可在项目的 GitHub 页面上免费获得。该许可证允许 Angie 在商业上免费、修改、分发和私人使用。Angie Web 服务器包括以下内置模块:http_addition_module http_auth_request_module http_dav_module http_flv_module http_gunzip_module http_gzip_static_module http_mp4_module http_random_index_module http_realip_module http_secure_link_module http_slice_module http_ssl_module http_stub_status_module http_sub_module http_v2_module mailmail_ssl_module streamstream_realip_module stream_ssl_module stream_ssl_preread_module

    此外,用户还可以在项目的 GitHub 存储库中找到以下动态模块:angie-module-geoipangie-module-geoip2angie-module-njs目前,Angie Web 服务器目前只能安装在两个 Linux 发行版上:Ubuntu 和 Debian。更具体地说,是 Debian 10 (Buster)、Debian 11 (Bullseye)、Ubuntu 20.04 LTS (Focal Fossa) 和 Ubuntu 22.04 LTS (Jammy Jellyfish)。

    该项目的 GitHub 存储库正在积极开发中;因此,受支持的 Linux 发行版列表预计会大幅度增长。最后,我们要指出的是,NGINX 的原作者 Igor Sysoev 没有参与这两个项目。他于今年 1 月正式离开 F5 Networks Inc.,专注于个人项目并享受与家人和朋友在一起的快乐时光。您可以从项目页面获取有关 Angie Web 服务器的更多信息。

    Angie官方网站:https://angie.software/en/

  • FreeNginx的前世今生

    FreeNginx的前世今生

    Freenginx Web服务器致力于重现开源开发“造福公众”的精神,摆脱企业控制。

    译自Freenginx: A Fork of Nginx,作者 Steven J. Vaughan-Nichols 也称为 sjvn,自从 CP/M-80 成为尖端的 PC 操作系统,300bps 成为快速的互联网连接,WordStar 成为最先进的文字处理器以来,他就一直撰写有关技术和技术业务的文章,而我们也很享受这一切。

    一名志愿的 Nginx 开发者正在把Nginx(发音为 EngineX,是世界上最流行的 Web 服务器分叉为 Freenginx。

    根据Netcraft的统计,Nginx 是世界上最受欢迎的 Web 服务器。因此,当 Nginx 的顶级开发者 MaximDounin宣布他要分支 Nginx时,这可能是一个巨大的举动。

    Dounin 做出这个决定是因为他对 Nginx 的企业所有者F5在项目管理方面的过度干预感到不满。具体来说,他讨厌管理层在安全策略方面所做的事情,以及他们现在如何在 Nginx 的实验性 HTTP/3 代码中分配常见漏洞和披露(CVE)错误。

    正如 Dounin 写的:”F5 的一些新的非技术管理人员最近决定他们更了解如何运行开源项目。特别是,他们决定干预 Nginx 多年来使用的安全策略,无视策略和开发者的立场。” 具体来说,Douin 反对将这些错误视为安全问题,而是将其视为普通错误,这并不值得进行安全公布。

    然而,与其说是这个具体问题,不如说是 F5 的态度,正如他在另一个说明中解释的那样。”并没有公开讨论。我所知道的唯一讨论发生在 security-alert@ 邮件列表中,共识是该错误应该作为普通错误进行修复。尽管如此,我还是在几天前收到信息,说一些无名的管理层不管政策和开发者的立场,坚持要求发布安全公告和安全版本。”

    被忽视的高级程序员就是火气很大的程序员。

    根据他自己的说法,自从 F5 公司因入侵乌克兰而在 2022 年退出俄罗斯以来,Dounin 就不再是 F5 的员工。相反,在过去两年中,他一直是重要的志愿贡献者。

    现在,他觉得虽然由于“我不再能够控制 F5 内的 Nginx 更改,也不再将 nginx 视为为公共利益开发和维护的自由开源项目”,F5 有权随意处置这个项目,但他不会再为 Nginx 工作。相反,他将为Freenginx工作,“这是一个替代项目,它将由开发者而不是企业实体来运行。”

    正因如此,Dounin 没有加入之前的开源 Nginx 分支Angie。这个程序是由在 F5 退出莫斯科后遭遇困境的俄罗斯 Nginx 开发者创建的。Angie 属于俄罗斯公司 Web Server,Dounin 担心任何营利公司都可能干扰代码的适当开发和维护。

    这一发展的背景复杂,涉及地缘政治紧张局势、企业收购以及在商业利益与开源理念之间寻求平衡的固有挑战。Nginx 的历史一直很动荡。F5 在 2019 年收购 Nginx被视为一个带来财务稳定和增长的新篇章。然而,随后俄罗斯国家代理人代表俄罗斯网络公司 Rambler 突袭 Nginx 在莫斯科的办公室,声称拥有 Nginx 代码的所有权,这使该公司陷入困境。F5 关闭莫斯科办事处只增加了叙述的复杂性。

    Dounin 的新创业 Freenginx 旨在重拾开源开发的精神,“为公共利益”服务,摆脱企业控制。Freenginx 的第一个代码版本freenginx-1.25.4已于 2024 年 2 月 20 日发布。这是一个旧代码库的克隆,只做了几项较小的更改。其中一项是修复导致分叉的错误。

    那么 F5 对此作何反应呢?一位公司代表说:“F5 致力于提供成功的开源项目,这需要大量不同的贡献者社区,以及运用严格的行业标准来分配和评分已识别的漏洞。我们认为这是为客户和社区开发高度安全软件的正确方法,我们鼓励开源社区加入我们的努力。” 在我看来,他们对这个分支并不担心。

    因此,至少就目前而言,Dounin 似乎可以自由地尝试在无干扰的情况下获得网络服务器的关注度。但是,根据 Freenginx 邮件列表中的低活跃度,似乎兴趣不大,但只有时间才能告诉我们这个项目是否会在用户或开发者中获得热度。

  • Nginx的非商业运营社区分支–Freenginx

    Nginx的非商业运营社区分支–Freenginx

    核心 Nginx 开发者创建新分支 Freenginx:引领 Web 服务器性能与安全性新篇章

    一、引言

    近日,核心 Nginx 开发者 Igor Sysoev 宣布创建了一个名为 Freenginx 的新分支。这一举措旨在进一步提高 Nginx Web 服务器的性能和安全性,满足日益增长的网络需求。本文将详细介绍 Freenginx 的背景、目标以及潜在影响。

    二、背景介绍

    Nginx 是一款高性能、高并发的 Web 服务器和反向代理服务器,广泛应用于互联网和企业内部网络。自 2004 年首次发布以来,Nginx 已经成为全球最受欢迎的 Web 服务器之一,市场份额远超其他竞争对手。

    Igor Sysoev 是 Nginx 的核心开发者之一,他长期致力于优化 Nginx 的性能和安全性。此次创建 Freenginx 分支,是他对 Nginx 未来发展方向的又一重要探索。

    三、Freenginx 的目标

    Freenginx 分支的主要目标是进一步提升 Nginx 的性能和安全性,以满足以下需求:

    1. 高并发场景下的性能优化:随着互联网用户数量的不断增长,Web 服务器需要应对更高的并发连接数。Freenginx 将通过优化内核参数、改进事件处理机制等方式,提高 Nginx 在高并发场景下的性能表现。

    2. 安全性增强:网络安全是当今互联网领域的重要议题。Freenginx 将引入新的安全特性,如更好的 DDoS 防护、更严格的访问控制等,以提高 Nginx 的安全性。

    3. 模块化和可定制性:为了满足不同用户的个性化需求,Freenginx 将提供更加模块化和可定制的解决方案。这将允许开发者在 Freenginx 基础上构建定制化的 Web 服务器,以满足特定应用场景的需求。

    四、潜在影响

    Freenginx 分支的创建将对 Nginx 社区和整个 Web 服务器市场产生深远影响

    1. 促进 Nginx 社区的发展:Freenginx 将吸引更多开发者参与到 Nginx 的开发和维护工作中,进一步推动 Nginx 社区的发展和壮大。

    2. 提升 Nginx 的竞争力:凭借卓越的性能和安全性,Freenginx 有望巩固 Nginx 在 Web 服务器市场的领先地位,甚至吸引更多原本使用其他 Web 服务器的用户转向 Nginx。

    3. 推动 Web 服务器技术的进步:Freenginx 的探索和尝试将为整个 Web 服务器行业带来新的启示和技术创新,推动整个行业的发展和进步。

    五、结语

    核心 Nginx 开发者 Igor Sysoev 创建 Freenginx 分支,预示着 Nginx 将迎来性能和安全性方面的全面提升。我们期待 Freenginx 能够引领 Web 服务器技术的新篇章,为全球互联网用户提供更加高效、安全和可靠的 Web 服务。

    FreeNginx官网:https://freenginx.org/

    FreeNginx源码:http://freenginx.org/hg/nginx

  • Drupal Nginx rewrite配置

    Drupal Nginx rewrite配置

    Drupal推荐一般使用Apache Httpd进行部署,但是我们也可以直接使用Nginx进行部署,只是官方的nginx配置一直没有名正言顺的写出来,一直琢磨和查询了很久其实只有3条配置如下,即可。

    rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1;
    if (!-e $request_filename) {
      rewrite ^/update.php(.*)$ /update.php?q=$1 last;
      rewrite ^/(.*)$ /index.php?q=$1 last;
    }

  • 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
  • CENTOS8编译LNMP(HTTP3)

    yum install cargo patch jemalloc-devel pcre-devel cmake gcc gcc-c++
    
    wget http://nginx.org/download/nginx-1.19.1.tar.gz
    tar xvzf nginx-1.19.1.tar.gz
    git clone https://github.com/cloudflare/zlib.git zlib-cf
    cd zlib-cf
    make -f Makefile.in distclean
    cd ..
    git clone https://github.com/grahamedgecombe/nginx-ct.git
    git clone https://github.com/eustas/ngx_brotli.git
    cd ngx_brotli
    git submodule update --init --recursive
    cd ..
    
    git clone --recursive  https://github.com/cloudflare/quiche
    cd nginx-1.19.1
    patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch
    
    /usr/sbin/groupadd -f www
    /usr/sbin/useradd -g www www
    
    ./configure --prefix=/usr/local/nginx  \
    --build="quiche-$(git --git-dir=../quiche/.git rev-parse --short HEAD)" \
    --with-http_v3_module  \
    --with-openssl=../quiche/deps/boringssl \
    --with-quiche=../quiche --with-zlib=../zlib-cf  \
    --add-module=../nginx-ct \
    --add-module=../ngx_brotli \
    --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-ld-opt='-ljemalloc' 
    
    make && make install
    
    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
    
    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
    
    
    
    #安装PHP7.4
    
    yum install autoconf automake bison libxml2 libxml2 openssl-devel sqlite-devel libcurl-devel libpng-devel libjpeg-devel freetype-devel libicu-devel  libsodium-devel argon2 libargon2-devel libxslt-devel libzip-devel
    dnf --enablerepo=PowerTools install oniguruma-devel
    yum -y install git automake gcc gcc-c++ libtool
    
    git clone https://github.com/skvadrik/re2c.git re2c
    cd re2c
    mkdir -p m4
    ./autogen.sh && ./configure 
    make && make install
    cd ..
    
    wget https://www.php.net/distributions/php-7.4.8.tar.gz
    tar xvzf https://www.php.net/distributions/php-7.4.8.tar.gz
    cd php-7.4.8
    ./configure --prefix=/usr/local/php \
    --with-config-file-path=/usr/local/php/etc \
    --with-config-file-scan-dir=/usr/local/php/etc/php.d \
    --with-fpm-user=www \
    --with-fpm-group=www \
    --enable-mbstring  \
    --enable-ftp  \
    --enable-gd   \
    --enable-opcache   \
    --enable-gd-jis-conv \
    --enable-mysqlnd \
    --enable-pdo   \
    --enable-sockets   \
    --enable-fpm   \
    --enable-xml  \
    --enable-soap  \
    --enable-pcntl   \
    --enable-cli   \
    --with-freetype   \
    --with-jpeg \
    --with-openssl  \
    --with-mysqli=mysqlnd   \
    --with-pdo-mysql=mysqlnd   \
    --with-pear   \
    --with-zlib  \
    --with-iconv \
    --with-curl \
    --enable-bcmath \
    --enable-shmop \
    --enable-exif  \
    --enable-sysvsem \
    --enable-mbregex \
    --with-password-argon2 \
    --with-sodium=/usr/local \
    --with-mhash \
    --enable-ftp \
    --enable-intl \
    --with-xsl \
    --with-gettext \
    --with-zip \
    --disable-debug  \
    PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/: 
    
    vim  /lib/systemd/system/php-fpm.service
    #输入以下内容
    [Unit]
    Description=The PHP FastCGI Process Manager
    Documentation=http://php.net/docs.php
    After=network.target
    
    [Service]
    Type=simple
    PIDFile=/usr/local/php/var/run/php-fpm.pid
    ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
    ExecReload=/bin/kill -USR2 $MAINPID
    LimitNOFILE=1000000
    LimitNPROC=1000000
    LimitCORE=1000000
    
    [Install]
    WantedBy=multi-user.target
    #输入完成
    
    
    #安装mariadb10.5
    vim  /etc/yum.repos.d/MariaDB.repo
    #输入以下内容
    
    # MariaDB 10.5 CentOS repository list - created 2020-08-01 16:01 UTC
    # http://downloads.mariadb.org/mariadb/repositories/
    [mariadb]
    name = MariaDB
    baseurl = http://yum.mariadb.org/10.5/centos8-amd64
    module_hotfixes=1
    gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
    gpgcheck=1
    #输入内容结束
    
    sudo dnf install MariaDB-server
    sudo systemctl start mariadb
    
    mysql_secure_installation
    #默认密码为空,需要修改密码,不设置unix socket验证方式,其他选no
    
    
  • Debian编译安装nginx

    Debian编译安装nginx

    1.安装编译器软件及依赖。这里需要注意里面有些依赖是我其他软件是,大家可以根据实际情况取舍.

    apt install libjemalloc-dev uuid-dev libatomic1 libatomic-ops-dev expat unzip autoconf automake libtool libgd-dev libmaxminddb-dev libxslt1-dev libxml2-dev g++ curl libpcre3-dev cmake libunwind-dev golang

    如果jemalloc无法安装可以自己编译如下:

    wget https://github.com/jemalloc/jemalloc/archive/5.2.1.tar.gz
    mv 5.2.1.tar.gz jemalloc-5.2.1.tar.gz
    tar xvzf jemalloc-5.2.1.tar.gz
    cd jemalloc-5.2.1
    ./autogen.sh
    make && make install

    2.下载nginx最新版原版和我需要的一些nginx扩展.这里我引入了zlib (Cloudflare优化版本)、Certificate Transparency (CT)、Brotli (eustas版本)以及实现http3测试cloudflare的quiche patch补丁.

    wget http://nginx.org/download/nginx-1.19.0.tar.gz
    tar xvzf nginx-1.19.0.tar.gz
    /usr/sbin/groupadd -f www
    /usr/sbin/useradd -g www www
    git clone https://github.com/cloudflare/zlib.git zlib-cf
    cd zlib-cf
    make -f Makefile.in distclean
    cd ..
    git clone https://github.com/grahamedgecombe/nginx-ct.git
    git clone https://github.com/eustas/ngx_brotli.git
    cd ngx_brotli
    git submodule update --init --recursive
    cd ..
    apt install make build-essential clang golang cmake -y
     curl https://sh.rustup.rs -sSf | sh
    1
     source $HOME/.cargo/env
    cargo -v
    
    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"
    
     ln -s $HOME/.cargo/bin/cargo /usr/local/bin/cargo
    
    git clone --recursive  https://github.com/cloudflare/quiche
    cd nginx-1.19.0
    patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch

    3.编译安装nginx

    cd nginx-1.19.0  
    ./configure --prefix=/usr/local/nginx  --build="quiche-$(git --git-dir=../quiche/.git rev-parse --short HEAD)" --with-http_v3_module  --with-openssl=../quiche/deps/boringssl --with-quiche=../quiche --with-zlib=../zlib-cf  --add-module=../nginx-ct --add-module=../ngx_brotli --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-ld-opt='-ljemalloc' 
    make && make test && make install

    4.配置nginx

    #增加系统变量:
    vim /etc/profile
    #增加以下内容
    PATH=$PATH:/usr/local/php/bin:/usr/local/nginx/sbin
    export PATH
    
    #激活系统变量
    source /etc/profile
    
    #增加nginx系统服务
    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_pass   127.0.0.1:9000;
          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
    #启动nginx
    service nginx start
    #查询nginx状态
    service nginx status

    至此,我们完成了nginx的手动编译与安装,可以配套php-fpm的设置使用.

  • 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!