sed -i_orig "s/data.status === 'Active'/true/g" /usr/share/pve-manager/js/pvemanagerlib.js
sed -i_orig "s/if (res === null || res === undefined || \!res || res/if(/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
sed -i_orig "s/.data.status.toLowerCase() !== 'active'/false/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
systemctl restart pveproxy

确认无误后,重新启动服务器

reboot

通过 Nginx 反向代理来加速 Google Fonts 文件的加载速度,实现更快的页面加载速度。

首先,你需要创建一个文件名为 google_fonts.conf 的配置文件(或者你可以将以下行添加到已有的 Nginx 配置文件中):

location /google-fonts/css/ {
	sub_filter 'fonts.gstatic.com' '$host/google-fonts';
	sub_filter_once off;
	sub_filter_types text/css;
	proxy_set_header Host fonts.googleapis.com;
	proxy_set_header Accept-Encoding '';
	proxy_redirect off;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Scheme $scheme;
	proxy_pass https://fonts.googleapis.com/css;
	
	proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie Vary;
	
	proxy_cache nginx-cache;
	proxy_cache_valid  500 502 503 504 404 10s;
	proxy_cache_valid  200 302 304 365d;
	proxy_cache_key $support_woff2$host$uri$is_args$args;
	add_header X-Proxy-Cache $upstream_cache_status;
	
	expires max;
}

location /google-fonts/css2/ {
	sub_filter 'fonts.gstatic.com' '$host/google-fonts';
	sub_filter_once off;
	sub_filter_types text/css;
	proxy_set_header Host fonts.googleapis.com;
	proxy_set_header Accept-Encoding '';
	proxy_redirect off;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Scheme $scheme;
	proxy_pass https://fonts.googleapis.com/css2;
	
	proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
	
	proxy_cache nginx-cache;
	proxy_cache_valid  500 502 503 504 404 10s;
	proxy_cache_valid  200 302 304 365d;
	proxy_cache_key $support_woff2$host$uri$is_args$args;
	add_header X-Proxy-Cache $upstream_cache_status;
	
	expires max;
}

location /google-fonts/icon/ {
	sub_filter 'fonts.gstatic.com' '$host/google-fonts';
	sub_filter_once off;
	sub_filter_types text/css;
	proxy_set_header Host fonts.googleapis.com;
	proxy_set_header Accept-Encoding '';
	proxy_redirect off;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Scheme $scheme;
	proxy_pass https://fonts.googleapis.com/icon;
	
	proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
	
	proxy_cache nginx-cache;
	proxy_cache_valid  500 502 503 504 404 10s;
	proxy_cache_valid  200 302 304 365d;
	proxy_cache_key $support_woff2$host$uri$is_args$args;
	add_header X-Proxy-Cache $upstream_cache_status;
	
	expires max;
}

location ~ /google-fonts/.+\.(woff2|woff|svg|ttf)$ {
	rewrite  /google-fonts/(.*) /$1 break;
	
	proxy_set_header Host fonts.gstatic.com;
	proxy_redirect off;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Scheme $scheme;
	proxy_pass https://fonts.gstatic.com;
	
	proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
	
	proxy_cache nginx-cache;
	proxy_cache_valid  500 502 503 504 404 10s;
	proxy_cache_valid  200 302 304 365d;
	proxy_cache_key $host$uri$is_args$args;
	add_header X-Proxy-Cache $upstream_cache_status;
	
	expires max;
}

这里“/google-fonts”是虚拟目录的名称,也可以使用任何其他名称,但必须与主站点 URL 路径相同。

然后,将以下行添加到 Nginx 主配置中,以从新配置的 google_fonts.conf 文件加载配置:

http {
	proxy_temp_path /path/to/temp;
	proxy_cache_path /path/to/cache levels=1:2 keys_zone=nginx-cache:256m max_size=5g inactive=365d;
	include /path/to/google_fonts.conf;
    # other directives
}

接下来,测试 Nginx 配置是否正确:

sudo nginx -t

如果没有错误,重新加载 Nginx 以使更改生效:

sudo service nginx reload

最后,该网站中的字体请求现在将从 googleapis.com 转到你的服务器,从而提高字体加载速度。

需要注意的是,此方法应该仅用于使用 Google Fonts 的网站,并需要遵守 Google 的服务条款。

在 Nginx 服务器配置中使用 if 和 else 可以根据不同的请求参数、请求头、请求方法等条件来做出不同的响应。你可以在 server 块中使用 if 和 else 语句,语法如下:

server {
    # Server configuration
    if ($condition) {
        # Condition is true, do something
    }
    else {
        # Condition is not true, do something else
    }
}

在 server 块中使用 if 和 else 与在 location 块中使用 if 和 else 的使用方法相同。需要注意的是,在 Nginx 中 if 语句执行指令时会有一些注意点,建议遵循以下规则:

1. 不要在一条规则中定义多个 if 语句。

2. 避免在 if 块条件中使用不严谨的匹配表达式。

3. 要么在 if 块中只执行内置或者受限制的指令,要么在 if 块之外执行指令。

4. 为了避免与其他指令的冲突,最好使用 Nginx 内置的指令或支持的模块。

需要注意的是,在 server 块中使用的 if 语句无法与一些指令一起使用,例如 rewrite、return 和 try_files 等指令不支持使用 if 语句。

如果你想判断 nginx 的请求 URL 是否包含指定的参数,可以使用以下步骤:

1. 使用 $request_uri 变量来获取请求 URL,例如:

location /example { if ($request_uri ~* "param=value") { return 200; } }

这将匹配所有包含 param=value 参数的 URL。 ~* 用于指定不区分大小写的匹配。如果需要区分大小写,则使用单个 ~。

2. 使用 $args 变量来获取请求参数,例如:

location /example { if ($args ~* "param=value") { return 200; } }

这将匹配所有包含名为 param 值为 value 的参数的 URL。

上述例子中的 location /example 可以替换为任何你需要匹配的路径,例如 /api/v1。请确保将上述代码插入到正确的 nginx 配置文件中(例如 /etc/nginx/nginx.conf)的正确位置(例如在 server 或 location 块中)。

Redis 在处理大数据时,需要根据具体情况进行调整,以下是一些在存取大数据时,可以优化 Redis 性能的一些方法:

1. 使用 Redis Pipeline

在处理大数据时,可以使用 Redis Pipeline 来提高 Redis 的性能。Pipeline 是 Redis 的一种批量操作机制,可以将多个命令一次性传输到 Redis 服务器,减少在网络传输上的延时,并在服务端执行这些命令,大幅减少了客户端等待并得到所有响应的时间。Pipeline 可以使用 Redis 的批量操作命令 MGET、HMGET 和 MSET 等。

2. 使用 Redis Cluster

在存储大数据时,可以考虑使用 Redis Cluster,可以将大数据分布式存储在多个节点上,提高 Redis 的容量和性能。

3. 选择合适的数据结构

在存储大数据时,需要选择合适的数据结构,如字符串、哈希表、列表和集合等。对于特大型数据,推荐使用字符串类型,使用 Redis 的批量操作命令或 Pipeline ,或使用 MGET 命令等。

4. 对数据进行切片

将数据切片,分成多份存储在多个节点上,可以提高 Redis 的处理速度。例如,可以使用 Redis 的 Hash 类型将数据存储在多个键值对中,再使用横向的 shard 切片,将数据分散到多个节点中。

5. 调整 Redis 配置

在存取大数据时,需要根据具体情况调整 Redis 的配置,如 maxmemory、timeout 等参数的设定等。

6. 使用 Redis 持久化

可以使用 Redis 的持久化功能将数据存储到磁盘中,可以确保数据不会因服务器故障或断电而丢失。有两种方式可以实现 Redis 持久化,即 RDB 持久化和 AOF 持久化。RDB 持久化可以将 Redis 的整个数据集保存到一个 RDB 文件中,而 AOF 持久化则可以将写操作日志记录到文件中。

以上是一些在存取大数据时,可以优化 Redis 性能的一些方法,需要根据具体情况进行选择并进行合理配置。

以下是所有可用的 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 ”即可完成配置。