以下是所有可用的 Nginx 编译参数列表:

--prefix=path                : 安装路径,默认为 /usr/local/nginx。
--sbin-path=path             : nginx 可执行文件的路径,默认为 prefix/sbin/nginx。
--conf-path=path             : nginx 配置文件的路径,默认为 prefix/conf/nginx.conf。
--error-log-path=path        : 错误日志文件的路径,默认为 prefix/logs/error.log。
--pid-path=path              : nginx 主进程 PID 文件的路径,默认为 prefix/logs/nginx.pid。
--lock-path=path             : nginx 锁文件的路径,默认为 prefix/logs/nginx.lock。
--user=name                  : 指定运行 nginx 的用户,默认为 nobody。
--group=name                 : 指定运行 nginx 的用户组,默认为 nobody。
--build=name                 : 指定编译环境,默认为当前主机的信息。
--builddir=path              : 指定编译时生成临时文件的目录,默认为 /tmp/nginx。
--with-select_module         : 启用 select 模块。
--without-select_module      : 禁用 select 模块。
--with-poll_module           : 启用 poll 模块。
--without-poll_module        : 禁用 poll 模块。
--with-threads               : 启用线程池。
--without-threads            : 禁用线程池。
--with-file-aio              : 启用文件异步 IO。
--with-http_ssl_module       : 启用 SSL/TLS 支持。
--without-http_ssl_module    : 禁用 SSL/TLS 支持。
--with-http_v2_module        : 启用 HTTP/2 支持。
--without-http_v2_module     : 禁用 HTTP/2 支持。
--with-http_realip_module    : 启用 realip 模块,用于获取真实客户端 IP。
--without-http_realip_module : 禁用 realip 模块。
--with-http_addition_module  : 启用 addition 模块,用于添加响应体。
--without-http_addition_module: 禁用 addition 模块。
--with-http_sub_module       : 启用 sub 模块,用于替换响应体。
--without-http_sub_module    : 禁用 sub 模块。
--with-http_dav_module       : 启用 dav 模块,用于 WebDAV 支持。
--without-http_dav_module    : 禁用 dav 模块。
--with-http_flv_module       : 启用 flv 模块,用于流媒体服务器。
--without-http_flv_module    : 禁用 flv 模块。
--with-http_mp4_module       : 启用 mp4 模块,用于流媒体服务器。
--without-http_mp4_module    : 禁用 mp4 模块。
--with-http_gunzip_module    : 启用 gunzip 模块,用于动态解压缩响应体。
--without-http_gunzip_module : 禁用 gunzip 模块。
--with-http_gzip_static_module : 启用 gzip_static 模块,用于预压缩静态文件。
--without-http_gzip_static_module : 禁用

Rails is a full-stack framework.  It ships with all the tools needed to build amazing web apps on both the front and back end.

在 Rails 6 中有两种不同的工具可以用来管理前端的 CSS、JavaScript 以及 images 等资源,分别是 “Sprockets” 和 “Webpacker”,“Sprockets” 除了 Rails 应用外很少使用,但是 “Webpacker” 不仅在 Rails 中,在其他应用框架中也被广泛的使用。

在 Rails 7 中静态资源的管理已经从 “Webpacker” 改为了 “Import Maps”,用来简化基于 JavaScript 的工具和包管理器 Webpack、Yarn 或者 npm 的使用。

Rails 7 实现了一个愿景,即一种真正的全栈 Web 开发方式,可以同时应对前端和后端的挑战。

Rails 7.0: Fulffilling a vision

本文将使用 Ruby 3.0 和 Rails 7.0 环境,创建 Rails 7 应用,并在该应用中引入 Bootstrap 5。

第一种方式:仅引入 Bootstrap

创建 Rails 项目

首先使用 rails new 命令创建 Rails 项目:

如果创建项目的时间过长,可以考虑更换 Ruby 的 Gem 源,使用 RubyChina 的源:

# 删除国外源,使用 RubyChina 的源

gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/

安装 importmap

项目创建完成后进入项目目录,首先检查config目录下是否包含 “importmap.rb” 文件,如果没有可以通过 rails importmap 命令来安装:

cat config/importmap.rb



# 安装 importmap
rails importmap:install

添加 Bootstrap 5

# 在项目目录下执行 importmap 命令,安装 Bootstrap 5

bin/importmap pin bootstrap

该命令执行后会在 config/importmap.rb 中添加命令行中打印出的内容。

在安装 importmap 是创建的 app/javascript/application.js 文件中导入 ”bootstrap“:

// ...



// 新增内容

import 'bootstrap'



// ...

安装 Bootstrap 5 Ruby Gem

在 Gemfile 中新增如下内容:

# Gemfile

# ...

gem 'bootstrap', '~> 5.2.3'

# ...

保存后执行 bundle install 命令安装依赖。

application.scss 中导入 bootstrap

app/assets/stylesheets/application.css 重命名为app/assets/stylesheets/application.scss

# 更改文件后缀为 scss

mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss

增加内容:

// app/assets/stylesheets/application.scss

// ...



@import "bootstrap";



// ...

测试 Bootstrap

使用 rails g controller 命令创建一个 home_controller 以及 index 函数:

参考 Bootstrap Navabar 的样式修改 app/views/layouts/application.html.erb 页面

<!DOCTYPE html>

<html>

  <head>

    <title>RailsBootstrap</title>

    <meta name="viewport" content="width=device-width,initial-scale=1">

    <%= csrf\_meta\_tags %>

    <%= csp\_meta\_tag %>



    <%= stylesheet\_link\_tag "application", "data-turbo-track": "reload" %>

    <%= javascript\_importmap\_tags %>

  </head>



  <body>

    <header>

      <nav class="navbar navbar-expand-md navbar-dark bg-dark mb-4">

        <div class="container-fluid">

          <a class="navbar-brand" href="#">Top navbar</a>

          <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">

            <span class="navbar-toggler-icon"></span>

          </button>

          <div class="collapse navbar-collapse" id="navbarCollapse">

            <ul class="navbar-nav me-auto mb-2 mb-md-0">

              <li class="nav-item">

                <a class="nav-link active" aria-current="page" href="#">Home</a>

              </li>

              <li class="nav-item">

                <a class="nav-link" href="#">Link</a>

              </li>

              <li class="nav-item">

                <a class="nav-link disabled">Disabled</a>

              </li>

            </ul>

            <form class="d-flex" role="search">

              <input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">

              <button class="btn btn-outline-success" type="submit">Search</button>

            </form>

          </div>

        </div>

      </nav>

    </header>

    <%= yield %>

  </body>

</html>

修改 app/views/home/index.html.erb 页面:

<div class="bg-light p-5 rounded">

  <h1>Navbar example</h1>

  <p class="lead">This example is a quick exercise to illustrate how the top-aligned navbar works. As you scroll, this navbar remains in its original position and moves with the rest of the page.</p>

  <a class="btn btn-lg btn-primary" href="/docs/components/navbar/" role="button">View navbar docs &raquo;</a>

</div>

通过 rails s 命令启动 Rails 应用,在浏览器中输入 localhost:3000/home/index 查看 index 页面

出现该页面说明引入的 Bootstrap 已经生效。

第二种方式:引入 Bootstrap 和 jQuery

添加 Bootstrap 和 jQuery 的 Ruby Gem

创建一个新的项目 rails-bootstrap-jquery,之后再项目的 Gemfile 中添加如下 Ruby Gems:

gem "sassc-rails"

gem "bootstrap", "~> 5.2.3"

gem "jquery-rails"

执行 bundle install 命令。

接着执行如下命令,修改application.css 后缀,创建 custom.css 以及 my_script.js 文件:

# 修改 application.css 为 application.scss

mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss

# 创建 custom.scss

touch app/assets/stylesheets/custom.scss

# 创建 my\_script.js

touch app/javascript/my\_script.js

在 application.scss 中添加如下内容:

@import "bootstrap";

@import "custom";

config/environments/development.rb 文件中添加如下内容:

config.sass.inline\_source\_maps = true

删除 tmp 文件夹下的缓存:

$ rm -r tmp/cache/assets

config/importmap.rb 文件中添加如下内容:

# From "jquery-rails" gem

pin "jquery", to: "jquery3.min.js", preload: true

pin "jquery\_ujs", to: "jquery\_ujs.js", preload: true



# From "bootstrap" gem

pin "bootstrap", to: "bootstrap.min.js", preload: true

pin "@popperjs/core", to: "popper.js", preload: true



# Custom JS

pin "my\_script", to: "my\_script.js", preload: true

config/initializers/assets.rb 中添加内容:

Rails.application.config.assets.precompile += %w( jquery3.min.js jquery\_ujs.js bootstrap.min.js popper.js )

app/javascript/application.js 中使用 import 关键字导入:

import "jquery";

import "jquery\_ujs";

import "@popperjs/core";

import "bootstrap";

import "my\_script";

app/javascript/my\_script.js 中添加如下 JS 代码:

document.addEventListener("turbo:load", () => {

  const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]');

  const popoverList = [...popoverTriggerList].map((popoverTriggerEl) => new bootstrap.Popover(popoverTriggerEl));

});

app/assets/stylesheets/custom.scss 中添加如下样式:

.body-offset {

  margin-top: 50px;

}

测试 Bootstrap

创建一个 home_controller.rb

rails g controller home index

修改 app/views/layouts/application.html.erb Layout 布局:

<!DOCTYPE html>

<html>

  <head>

    <title>RailsBootstrapJquery</title>

    <meta name="viewport" content="width=device-width,initial-scale=1">

    <%= csrf\_meta\_tags %>

    <%= csp\_meta\_tag %>



    <%= stylesheet\_link\_tag "application", "data-turbo-track": "reload" %>

    <%= javascript\_importmap\_tags %>

  </head>



  <body>

    <header>

      <nav class="navbar navbar-expand-md navbar-dark bg-dark mb-4">

        <div class="container-fluid">

          <a class="navbar-brand" href="#">Top navbar</a>

          <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">

            <span class="navbar-toggler-icon"></span>

          </button>

          <div class="collapse navbar-collapse" id="navbarCollapse">

            <ul class="navbar-nav me-auto mb-2 mb-md-0">

              <li class="nav-item">

                <a class="nav-link active" aria-current="page" href="#">Home</a>

              </li>

              <li class="nav-item">

                <a class="nav-link" href="#">Link</a>

              </li>

              <li class="nav-item">

                <a class="nav-link disabled">Disabled</a>

              </li>

            </ul>

            <form class="d-flex" role="search">

              <input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">

              <button class="btn btn-outline-success" type="submit">Search</button>

            </form>

          </div>

        </div>

      </nav>

    </header>

    <%= yield %>

  </body>

</html>

修改 app/views/home/index.html.erb 页面:

<div class="container">

  <div class="row">

    <div class="col-md-8 mt-4">

      <button type="button" class="btn btn-lg btn-danger" data-bs-toggle="popover" data-bs-title="Popover title" data-bs-content="And here's some amazing content. It's very engaging. Right?">Click to toggle popover</button>

    </div>

  </div>



  <div class="row mt-4">

    <div class="col-md-8">

      <button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="top" data-bs-content="Top popover">

        Popover on top

      </button>

      <button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="right" data-bs-content="Right popover">

        Popover on right

      </button>

      <button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Bottom popover">

        Popover on bottom

      </button>

      <button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="left" data-bs-content="Left popover">

        Popover on left

      </button>

    </div>

  </div>

</div>

使用 rails s 启动 Rails 项目,查看 http://0.0.0.0:3000/home/index

DNS

简介

域名系统(服务)协议(DNS)是一种分布式网络目录服务,主要用于域名与 IP 地址的相互转换,以及控制因特网的电子邮件的发送。

(首先需要打开阿里云官方镜像站:https://developer.aliyun.com/mirror/ 找到DNS服务器地址,再进行后续操作。)

Chrome浏览器配置方法

第一步:打开Chrome浏览器,从菜单栏中点击【设置】选项。

第二步:在搜索框中输入“DNS”,在下方的检索结果中,点击【安全】右侧的展开箭头。

第三步:页面下拉到最下方,在【高级】选项中,开通“使用安全DNS”功能,并在【使用】-【自定义】框中输入“ https://dns.alidns.com/dns-query ”即可完成配置。

VirtualBox 是一款功能强大的虚拟机软件,它具有丰富的功能,性能也很优异,适用服务器、桌面和嵌入式等场景。除了适合企业,也适合家庭使用。VirtualBox 也是目前唯一一个开源的专业虚拟化解决方案。虚拟机的配置设置完全存储在 XML 中,并且独立于本地机器。因此虚拟机的相关设置可以很容易地移植到其他计算机上

目前 VirtualBox 7.0 发布了,上一个大型功能版本还是发布于 2018 年的 VirtualBox 6.0 。VirtualBox 7.0 带来最大的改动是允许虚拟机完全加密运行 —— 包括配置日志和保存状态的加密。但对于 VirtualBox 7.0,这种 VM 加密支持仅支持命令行界面。

此外,该版本还引入了一个基于 DirectX 11 的 3D 堆栈, Oracle 表示正在将 DXVK (尤其是 DXVK-Native)用于非 Windows 主机,意味着 Direct3D 堆栈最终在 Vulkan 上运行。

其他更改项目如下:

  • OCI:可以将云虚拟机添加到 Virtual Machine Manager ,并作为本地 VM 进行控制
  • OCI:可以通过网络管理器工具配置云网络,其方式与主机和 NAT 网络相同
  • 多项 GUI 的优化
  • 录音:使用 Vorbis 作为 WebM 容器的默认音频格式。
  • 音频:添加了 “默认” 主机驱动程序类型,可以在不同平台之间移动虚拟机(设备),无需显式更改音频驱动程序。
  • 来宾控制:实现了对 Linux 来宾 “添加自动更新” 的初始支持
  • 访客控制:通过 VBoxManage 更新添加访客时,实现等待和 / 或重新启动访客的功能
  • VBoxManage:添加了访客控制 “waitrunlevel” 子命令,可以等待访客达到某个运行级别
  • Windows 主机:添加了在会话 0 中运行自动启动 VM 的实验性支持,允许在用户未登录时运行 VMS(默认禁用,请参阅手册)
  • macOS 主机:删除了所有内核扩展。
  • macOS 主机:为具有 Apple 芯片 CPU 的系统提供开发者预览包。
  • Linux 访客:重新设计访客屏幕大小调整功能,添加了与一些访客桌面环境的基本集成
  • 设备:基于 DirectX 11(以及非 Windows 主机上的 DXVK)实现了新的 3D 支持
  • 设备:添加了虚拟 IOMMU 设备(Intel 和 AMD 变体)
  • 设备:添加了虚拟 TPM 1.2 和 2.0 设备
  • 设备:EHCI 和 XHCI USB 控制器设备现已作为开源基础包的一部分
  • EFI:增加了对安全启动的支持
  • 调试:添加了通过 GDB 对来宾调试的实验性支持,以及通过 KD/WinDbg 对来宾调试的高度实验性支持

更新公告:https://www.virtualbox.org/wiki/Changelog-7.0

分层缓存 (Tiered Cache)
启用后自动为源站就近分配最佳回源数据中心(Argo),
后续仅由该数据中心最终响应处理回源请求、静态资源缓存
在访客就近访问Cloudflare边缘数据中心拉取缓存无果时,将会通过Cloudflare私有线路连入之前分配数据中心拉取资源,减少不必要的回源请求,依托Cloudflare各地数据中心之间组建的高速低延迟、高可用互联网络,提高整体访问性能
*该功能已由专项付费服务转为面向所有用户免费可用(需前往缓存管理中手动开启)
*原有Argo付费用户获得额外优化

俄耳甫斯 (Orpheus)
Orpheus 通过实时查找、识别互联网上不可达的路由并引导网络流量绕行,以提高回源请求可达性
*表现为:更少522错误
*已内置为所有用户启用

自动化签名交换管理 Automatic Signed Exchange(SXGs)
一键为网站配置启用 SXG ,使得网站内容更易被Google搜索缓存并在特定时机预读,以提高页面加载速度,改善用户由搜索到最终访问网页的体验
*测试阶段,Pro以上及APO等付费用户可在Speed选项卡下自行申请候补试用

近实时的数据分析&日志 (Live-updating Analytics and Instant LogsIs)
数据分析选择最近30分钟,开启实时更新
即时日志在打开后实时推送(延迟≥2秒)最近访问日志
*实时数据分析&日志面向Pro及以上付费用户可用
*即时日志(Instant Logs)目前需单独申请候补试用

资源加载预提示 (Early Hints)
引入新的 HTTP 状态代码(103 Early Hints),它定义用户浏览器可在服务器还在准备响应数据时预加载那些资源,通过提前准备页面渲染所需资源,来加速页面载入
*预期面向所有用户免费开放,目前测试阶段需在Speed选项卡下自行申请候补试用
*使用时应注意配置好 Link 响应标头(若未配置则由机器学习推导适配)
*Chrome从v95开始实验性地支持Early Hints,其它浏览器厂商陆续支持中

机制
浏览器<-Accept->Cloudflare<-Vary:Accept->源站

工作细节
源站上,为图像文件拓展(目前支持: avif、bmp、gif、jpg、jpeg、jp2、jpg2、png、tif、tiff、webp )设置 Vary:Accept 响应头,申明让Cloudflare进行图像类型转换并缓存

Cloudflare上,目前通过 API 去指定那些文件拓展类型需要进行格式转换(Pro及以上用户可用)

在资源被访问时,根据访客浏览器所申明支持(Accept)的图像文件类型,返回最佳资源类型

API文档
Variants setting

Vary for Images: Serve the Correct Images to the Correct Browsers

近日网络安全威胁和漏洞信息共享平台发布漏洞预警,公布了微软Windows Print Spooler远程代码执行漏洞的风险公告,漏洞CVE编号:CVE-2021-34527。
该漏洞影响范围十分广泛,服务器操作平台Windows Server 2008 R2、Windows Server 2012 R2、Windows Server 2016、Windows Server 2019、Windows Server Version 2004和消费者操作系统平台Windows RT 8.1、Windows 7、Windows 8.1、Windows 10都受此次漏洞影响。
Print Spooler是Windows系统中用于管理打印相关事务的服务,黑客可通过Windows Print Spooler打印机服务执行该漏洞,如操作不当,黑客可利用该漏洞以系统权限运行任意代码,然后可以安装程序,查看、修改或删除数据,或者创建拥有完全用户权限的新账户。
目前微软尚未针对该漏洞发布补丁,网络安全威胁和漏洞信息共享平台给出了临时解决方法:禁用Windows Print Spooler打印机服务或通过组策略禁用入站远程打印。

Cloudflare即将弃用的部分HTTP Header

关于 __cfduid Cookie标识即将弃用

从2021年3月31日,在世界标准时间15:00至23:00之间尝试临时删除 cfduid cookie
从2021年5月10日开始,Cloudflare将永久停止在所有HTTP响应上添加 Set-Cookie 设置该HTTP Header标识
最后的 __cfduid cookie将在此之后30天过期

关于移除 cf-request-id 标识

2020年中,Cloudflare引入了一个实验性的HTTP标头cf-request-id。此标头存在于发送给源的请求中,并在响应时返回。经过仔细评估,Cloudflare决定删除cf-request-id标头

cf-request-id现正式进入弃用状态,Cloudflare计划将于2021年6月15日世界标准时(UTC 0):15:00~23:00间进行临时测试移除 cf-request-id标头,在此时间之后,它将还存在一段时间,直到2021年7月1日将其完全移除,在7月1日之后,标头将不再出现在请求和响应中
如果您需要请求的标识符,建议使用CF-RAY标头