零基础从头教学Linux(Day 45)

作者:小白银子日期:2025/10/4

OpenResty介绍与实战

一、概述

OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web应用、Web服务和动态网关。

简单地说 OpenResty 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。

从上面官网的描述信息中,可以看出OpenResty主要包含两方面的技术:

  • Nginx:一款轻量级、高性能、高并发的Web服务器。
  • Lua:一种轻量、小巧、可移植、快速的脚本语言;LuaJIT即时编译器会将频繁执行的Lua代码编译成本地机器码交给CPU直接执行,执行效率更高,OpenResty 会默认启用 LuaJIT

官方网站:http://openresty.org/

Github组织:https://github.com/openresty

nginx 与 lua 介绍与安装可以参考我以下几篇文章:

二、OpenResty 安装

1yum install pcre-devel openssl-devel gcc curl
2wget https://openresty.org/package/centos/openresty.repo
3sudo mv openresty.repo /etc/yum.repos.d/openresty.repo
45# update the yum index:
6sudo yum check-update
7yum -y install openresty

验证安装

1/usr/local/openresty/nginx/sbin/nginx -v

启动 OpenResty

1/usr/local/openresty/nginx/sbin/nginx

测试

1# 创建一个 NGINX 配置文件(例如 /usr/local/openresty/nginx/conf/nginx.conf)并添加一个包含 Lua 代码的 location 块:
2server {
3    listen 80;
4    server_name localhost;
56    location /test {
7        content_by_lua_block {
8            ngx.say("Hello, LuaJIT!")
9        }
10    }
11}

保存配置文件,然后重新加载 NGINX:

1# 先检查语法
2sudo /usr/local/openresty/nginx/sbin/nginx -t
3# 重新加载配置
4sudo /usr/local/openresty/nginx/sbin/nginx -s reload

访问 http://localhost/test 应该返回 "Hello, LuaJIT!"

三、OpenResty 的工作原理

OpenResty 是基于 Nginx 的高性能Web平台,所以其高效运行与 Nginx 密不可分。 Nginx 处理HTTP请求有11个执行阶段,我们可以从ngx_http_core_module.h 的源码中看到:

1typedef enum {
2    NGX_HTTP_POST_READ_PHASE = 0,
34    NGX_HTTP_SERVER_REWRITE_PHASE,
56    NGX_HTTP_FIND_CONFIG_PHASE,
7    NGX_HTTP_REWRITE_PHASE,
8    NGX_HTTP_POST_REWRITE_PHASE,
910    NGX_HTTP_PREACCESS_PHASE,
1112    NGX_HTTP_ACCESS_PHASE,
13    NGX_HTTP_POST_ACCESS_PHASE,
1415    NGX_HTTP_PRECONTENT_PHASE,
1617    NGX_HTTP_CONTENT_PHASE,
1819    NGX_HTTP_LOG_PHASE
20} ngx_http_phases;

巧合的是,OpenResty 也有 11*_by_lua 指令,它们和 NGINX11个执行阶段有很大的关联性。指令是使用Lua编写Nginx脚本的基本构建块,用于指定用户编写的Lua代码何时运行以及运行结果如何使用等。下图显示了不同指令的执行顺序,这张图可以帮助理清我们编写的脚本是按照怎样的逻辑运行的。

四、OpenResty 核心模块

OpenResty 是一个基于 NGINX 的全功能 Web 平台,它集成了许多模块和库,为 NGINX 增加了额外的功能和能力。以下是 OpenResty 的一些核心模块:

1)ngx_lua 模块

ngx_lua 模块是 OpenResty 的核心模块之一,提供了对 Lua 脚本的支持。它允许开发者在 NGINX 配置中嵌入Lua代码,实现高级的请求处理逻辑、动态内容生成、访问控制等功能。

ngx_lua 模块示例:

1server {
2    listen 80;
3    server_name example.com;
45    location /lua_example {
6        default_type 'text/plain';
7        content_by_lua_block {
8            ngx.say("Hello, ngx_lua!")
9        }
10    }
11}

在这个例子中,当访问 http://example.com/lua_example 时,将返回 "Hello, ngx_lua!"。这里使用了 ngx_lua 模块的 content_by_lua_block 指令,将 Lua 代码嵌入 NGINX 配置文件。

2)ngx_stream_lua 模块

ngx_stream_lua 模块 与 ngx_lua 类似,但专门用于处理 TCPUDP 流量。它允许开发者在 NGINX 配置中嵌入 Lua 代码以处理流量。

以下是一个简单的 ngx_stream_lua 模块的示例:

1stream {
2    server {
3        listen 12345;
45        content_by_lua_block {
6            local data, err = ngx.req.socket()
7            if not data then
8                ngx.log(ngx.ERR, "Failed to read request: ", err)
9                return
10            end
1112            ngx.say("Received data: ", data)
13        }
14    }
15}

在这个示例中:

  • 使用 content_by_lua_block 指令定义了一个 Lua 代码块,用于处理 TCP 流量。
  • 通过 ngx.req.socket() 获取连接的套接字,然后读取请求数据。
  • 输出接收到的数据。

此配置监听在端口 12345 上,当有 TCP 连接到达时,Lua 代码将读取并输出接收到的数据。

3)ngx_http_lua_module 模块

ngx_http_lua_module 模块是 ngx_lua 模块的一部分,为 NGINX 提供了强大的 HTTP 服务和 Lua 扩展。

以下是一个简单的 ngx_http_lua_module 模块的示例:

1server {
2    listen 80;
3    server_name example.com;
45    location /lua_example {
6        default_type 'text/plain';
7        content_by_lua_block {
8            ngx.say("Hello, ngx_http_lua!")
9        }
10    }
1112    location /lua_variable {
13        default_type 'text/plain';
14        set $my_variable "NGINX with Lua";
15        content_by_lua_block {
16            local my_variable = ngx.var.my_variable
17            ngx.say("Value of my_variable: ", my_variable)
18        }
19    }
20}

这个示例中:

  • /lua_example 路径下的请求将返回 "Hello, ngx_http_lua!"。这里使用了 content_by_lua_block 指令,将 Lua 代码嵌入 NGINX 配置文件,实现了简单的响应内容输出。
  • /lua_variable 路径下的请求将输出一个自定义变量的值。使用了 set 指令设置了一个名为 my_variable 的变量,然后在 Lua 代码块中通过 ngx.var 获取并输出了这个变量的值。

4)ngx_http_headers_more 模块

ngx_http_headers_more 模块提供了更多的操作 HTTP 头部的指令,使得在 NGINX 中更容易操作和修改 HTTP 头信息。

以下是一个简单的使用 ngx_http_headers_more 模块的示例:

1server {
2    listen 80;
3    server_name example.com;
45    location /add_custom_header {
6        more_set_headers "Custom-Header: OpenResty";
7        return 200 "Custom header added!";
8    }
910    location /remove_server_header {
11        more_clear_headers Server;
12        return 200 "Server header removed!";
13    }
14}

在这个示例中:

  • /add_custom_header 路径下的请求将返回 "Custom header added!",同时响应头中包含了一个自定义的头部 "Custom-Header: OpenResty"。这是通过 more_set_headers 指令添加的。
  • /remove_server_header 路径下的请求将返回 "Server header removed!",同时响应头中不再包含 "Server" 头部。这是通过 more_clear_headers 指令移除的默认的 "Server" 头部。

这些指令允许你更灵活地配置 NGINX 的响应头信息,添加或删除特定的头部字段。请注意,使用这些指令时应谨慎,确保符合安全性和隐私性的最佳实践。

5)ngx_http_echo 模块

ngx_http_echo 模块 提供了更丰富的内容输出和变量替换的功能。可以通过指定响应内容、设置 HTTP 状态码等,以及支持类似 PHP 的变量替换。

1server {
2    listen 80;
3    server_name example.com;
45    location /echo_example {
6        echo "Hello, ngx_http_echo!";
7    }
8}
9

在这个示例中:

  • /echo_example 路径下的请求将返回 "Hello, ngx_http_echo!"。这是通过 ngx_http_echo 模块的 echo 指令实现的。
  • ngx_http_echo 模块的 echo 指令允许你更方便地输出内容,支持类似 PHP 的变量替换等功能。你可以在 echo 指令中直接使用变量,也可以使用其他模块提供的一些特殊的变量。

6)ngx_http_lua_upstream 模块

ngx_http_lua_upstream 模块用于在 Lua 脚本中进行向上游服务器(后端服务器)的请求,并处理来自上游的响应。

以下是一个简单的示例,演示了如何使用 ngx_http_lua_upstream 模块向上游服务器发起请求,并处理来自上游服务器的响应:

1http {
2    upstream backend {
3        server backend1;
4        server backend2;
5    }
67    server {
8        listen 80;
9        server_name example.com;
1011        location /proxy_example {
12            content_by_lua_block {
13                -- 初始化 upstream 对象
14                local upstream = require "ngx.upstream"
15                local backend = upstream.backend
1617                -- 创建一个新的请求对象
18                local request = upstream.request()
1920                -- 设置请求的方法、URI和头部
21                request.method = ngx.HTTP_GET
22                request.uri = "/path/to/resource"
23                request.headers["Host"] = "backend.example.com"
2425                -- 发送请求到上游服务器
26                local status, headers, body = request.send(backend)
2728                -- 处理上游服务器的响应
29                if status == 200 then
30                    ngx.say("Response from backend: ", body)
31                else
32                    ngx.say("Error from backend. Status: ", status)
33                end
34            }
35        }
36    }
37}

在这个示例中:

  • 定义了一个名为 backend 的上游服务器块,包含两个后端服务器 backend1backend2
  • /proxy_example 路径下的请求中,通过 Lua 脚本使用 ngx_http_lua_upstream 模块创建了一个新的上游请求对象。
  • 设置了请求的方法、URI和头部信息。
  • 调用 request.send(backend) 发送请求到上游服务器。
  • 根据上游服务器的响应状态码,输出响应内容或显示错误信息。

请注意,实际使用时,你可能需要根据具体的业务需求和上游服务器的特性进行更复杂的 Lua 脚本编写。此示例仅为演示基本用法。

7)ngx_http_redis 模块

ngx_http_redis 模块提供了与 Redis 数据库的交互功能,允许 NGINX 通过 Lua 脚本与 Redis 通信。

以下是一个简单的示例,演示了如何使用 ngx_http_redis 模块与 Redis 交互:

1http {
2    server {
3        listen 80;
4        server_name example.com;
56        location /redis_example {
7            # 定义 Redis 服务器的地址和端口
8            set $redis_host "127.0.0.1";
9            set $redis_port 6379;
1011            # 使用 ngx_http_redis 模块向 Redis 发送 GET 请求
12            redis_pass $redis_host:$redis_port;
13            redis_query GET my_key;
1415            # 处理 Redis 的响应
16            content_by_lua_block {
17                local redis = require "ngx.redis"
18                local red = redis:new()
1920                red:set_timeout(1000)  -- 设置超时时间
2122                local ok, err = red:connect(ngx.var.redis_host, ngx.var.redis_port)
23                if not ok then
24                    ngx.say("Failed to connect to Redis: ", err)
25                    return
26                end
2728                local res, err = red:get("my_key")
29                if not res then
30                    ngx.say("Failed to get value from Redis: ", err)
31                    return
32                end
3334                ngx.say("Value from Redis: ", res)
3536                -- 释放连接
37                local ok, err = red:set_keepalive(10000, 100)
38                if not ok then
39                    ngx.say("Failed to set keepalive: ", err)
40                    return
41                end
42            }
43        }
44    }
45}

在这个示例中:

  • /redis_example 路径下的请求首先通过 redis_passredis_query 指令设置了 Redis 服务器的地址和端口,并发送了一个 GET 请求获取键为 "my_key" 的值。
  • Lua 脚本中,使用 ngx.redis 模块创建了一个 Redis 对象,连接到 Redis 服务器,并通过 get 方法获取了 "my_key" 的值。
  • 最后,输出从 Redis 获取的值。

请注意,实际使用时,你需要根据你的 Redis 服务器配置和业务需求进行适当的修改。此示例仅为演示基本用法。

8)ngx_http_proxy_connect_module 模块

ngx_http_proxy_connect_module 模块允许 NGINX 充当 CONNECT 代理,用于处理 TLS/SSL 连接的代理请求。

以下是一个简单的使用示例:

1http {
2    server {
3        listen 80;
4        server_name example.com;
56        location /proxy_connect_example {
7            proxy_pass http://backend;
8        }
9    }
1011    server {
12        listen 443 ssl;
13        server_name example.com;
1415        ssl_certificate /path/to/certificate.crt;
16        ssl_certificate_key /path/to/private_key.key;
1718        location /proxy_connect_example {
19            proxy_pass http://backend;
20        }
21    }
22}

在这个示例中:

  • 配置了两个 server 块,分别监听了 80 端口和 443 端口。第一个 server 块用于处理 HTTP 请求,第二个 server 块用于处理 HTTPS 请求。
  • 对于 /proxy_connect_example 路径,使用了 proxy_pass 指令,将请求代理到名为 backend 的上游服务器。
  • 对于 HTTPS 的情况,需要提供 SSL 证书和私钥的路径。实际上,这个配置使 NGINX 具有 CONNECT 代理的能力,可以处理 TLS/SSL 握手并将请求代理到上游服务器。

9)ngx_http_js_module 模块

ngx_http_js_module 模块提供了对 JavaScript 的支持,使得可以在 NGINX 中使用 JavaScript 来编写请求处理逻辑。

以下是一个简单的使用 ngx_http_js_module 模块的示例:

1http {
2    server {
3        listen 80;
4        server_name example.com;
56        location /js_example {
7            js_content main;
8        }
9    }
1011    js_include main;
1213    function main(r) {
14        r.return(200, "Hello, ngx_http_js_module!");
15    }
16}

在这个示例中:

  • 定义了一个监听 80 端口的 server 块。
  • /js_example 路径下的请求中,使用了 js_content 指令,将请求处理的逻辑指定为 JavaScript 脚本。
  • 使用 js_include 指令引入了一个名为 mainJavaScript 函数。
  • main 函数中使用了 r.return 方法返回了一个 HTTP 200 响应,并带有相应的消息。

请注意,使用 ngx_http_js_module 模块时,需要确保已经正确安装并启用了该模块。此示例只是一个基本的演示,实际使用时可能需要根据具体的业务需求编写更复杂的 JavaScript 脚本。

10)ngx_http_geoip2_module 模块

ngx_http_geoip2_module 模块用于通过 MaxMind GeoIP2 数据库来获取客户端的地理位置信息。

以下是一个简单的示例,演示了如何使用 ngx_http_geoip2_module 模块获取客户端的地理位置信息:

1http {
2    geoip2 /path/to/GeoIP2-City.mmdb {
3        $geoip2_city_country_iso_code country iso_code;
4        $geoip2_city_country country names en;
5        $geoip2_city_city city names en;
6        $geoip2_city_latitude latitude;
7        $geoip2_city_longitude longitude;
8    }
910    server {
11        listen 80;
12        server_name example.com;
1314        location /geoip_example {
15            default_type 'text/plain';
16            content_by_lua_block {
17                local country = ngx.var.geoip2_city_country
18                local city = ngx.var.geoip2_city_city
19                local latitude = ngx.var.geoip2_city_latitude
20                local longitude = ngx.var.geoip2_city_longitude
2122                ngx.say("Country: ", country)
23                ngx.say("City: ", city)
24                ngx.say("Latitude: ", latitude)
25                ngx.say("Longitude: ", longitude)
26            }
27        }
28    }
29}

ngx_http_geoip2_module 模块用于在 NGINX 中获取客户端的地理位置信息,基于 MaxMind 的 GeoIP2 数据库。以下是一个简单的示例,演示了如何使用 ngx_http_geoip2_module 模块获取客户端的地理位置信息:

1http {
2    geoip2 /path/to/GeoIP2-City.mmdb {
3        $geoip2_city_country_iso_code country iso_code;
4        $geoip2_city_country country names en;
5        $geoip2_city_city city names en;
6        $geoip2_city_latitude latitude;
7        $geoip2_city_longitude longitude;
8    }
910    server {
11        listen 80;
12        server_name example.com;
1314        location /geoip_example {
15            default_type 'text/plain';
16            content_by_lua_block {
17                local country = ngx.var.geoip2_city_country
18                local city = ngx.var.geoip2_city_city
19                local latitude = ngx.var.geoip2_city_latitude
20                local longitude = ngx.var.geoip2_city_longitude
2122                ngx.say("Country: ", country)
23                ngx.say("City: ", city)
24                ngx.say("Latitude: ", latitude)
25                ngx.say("Longitude: ", longitude)
26            }
27        }
28    }
29}

在这个示例中:

  • 使用 geoip2 指令配置了 GeoIP2 数据库的路径,并定义了一些变量用于存储地理位置信息,如国家 ISO 代码、国家名称、城市名称、纬度和经度。
  • /geoip_example 路径下的请求中,通过 Lua 脚本获取了客户端的地理位置信息,并输出了国家、城市、纬度和经度等信息。

请注意,在实际使用中,你需要确保已经获取并配置了正确的 GeoIP2 数据库文件路径。此示例只是一个基本的演示,实际场景中可能需要根据业务需求进一步处理和使用这些地理位置信息。

11)ngx_brotli 模块

ngx_brotli 模块用于支持 Brotli 压缩算法,提供更高效的内容压缩。

以下是一个简单的使用 ngx_brotli 模块的示例:

1http {
2    brotli on;
3    brotli_comp_level 6;
4    brotli_static on;
56    server {
7        listen 80;
8        server_name example.com;
910        location /brotli_example {
11            default_type 'text/plain';
12            content_by_lua_block {
13                ngx.say("Hello, ngx_brotli!");
14            }
15        }
16    }
17}
18

在这个示例中:

  • 使用 brotli 指令开启了 Brotli 压缩功能。
  • 使用 brotli_comp_level 指令设置了 Brotli 压缩级别。
  • 使用 brotli_static 指令开启了静态文件的 Brotli 压缩。
  • /brotli_example 路径下的请求中,返回了一个简单的文本内容 "Hello, ngx_brotli!"

请注意,在实际使用中,你需要确保已经安装了支持 Brotli 压缩的库,并且 NGINX 配置中启用了对应的模块。此示例只是一个基本的演示,实际配置中可能需要根据业务需求调整压缩级别等参数。

这些模块共同构成了 OpenResty 的核心,使得 NGINX 变得更加强大和灵活。使用这些模块,你可以实现更高级的请求处理、负载均衡、反向代理、动态内容生成等功能。详细信息和用法可以参考 OpenResty 官方文档:https://openresty.org/

五、OpenResty 示例讲解

OpenResty 是一个基于 NGINX 的全功能 Web 平台,集成了大量的第三方模块和库,其中最重要的是 ngx_lua 模块,它允许在 NGINX 配置中嵌入 Lua 脚本,实现高级的请求处理逻辑、动态内容生成、访问控制等功能。下面是一个简单的 OpenResty 示例:

1http {
2    server {
3        listen 80;
4        server_name example.com;
56        location /hello {
7            default_type 'text/plain';
8            content_by_lua_block {
9                ngx.say("Hello, OpenResty!")
10            }
11        }
12    }
13}

在这个示例中:

  • 配置了一个监听 80 端口的 server 块,处理 example.com 的请求。
  • 当访问路径 /hello 时,通过 content_by_lua_block 指令执行 Lua 代码,输出 "Hello, OpenResty!"

这只是一个最简单的演示,OpenResty 的强大之处在于它允许在 NGINX 配置中使用 Lua 脚本,从而实现更复杂的逻辑。以下是一个稍复杂的示例,演示了如何通过 OpenResty 实现简单的 API 访问控制:

1http {
2    lua_shared_dict my_limit 10m;
34    server {
5        listen 80;
6        server_name api.example.com;
78        location /api {
9            access_by_lua_block {
10                local limit = ngx.shared.my_limit
11                local key = ngx.var.remote_addr
12                local reqs, err = limit:get(key)
13                if reqs then
14                    if reqs > 10 then
15                        ngx.exit(ngx.HTTP_TOO_MANY_REQUESTS)
16                    else
17                        limit:incr(key, 1)
18                    end
19                else
20                    limit:set(key, 1, 60)
21                end
22            }
2324            default_type 'application/json';
25            content_by_lua_block {
26                ngx.say('{"message": "API response"}')
27            }
28        }
29    }
30}

在这个示例中:

  • 配置了一个共享内存字典 my_limit 用于存储请求计数。
  • 当访问路径 /api 时,通过 access_by_lua_block 指令执行 Lua 代码,实现了一个简单的请求频率限制,每个 IP 地址在 60 秒内最多允许 10 次请求。
  • 如果超过请求限制,将返回 HTTP 429 (TOO MANY REQUESTS) 状态码;否则,继续执行后续 Lua 代码返回 JSON 响应。

这只是 OpenResty 的一小部分功能展示,实际使用中可以结合更多的模块和功能,如 ngx_http_lua_upstream、ngx_http_headers_more、ngx_stream_lua 等,以实现更复杂的 Web 应用和服务。


零基础从头教学Linux(Day 45)》 是转载文章,点击查看原文


相关推荐


从汇编角度看C++优化:编译器真正做了什么
oioihoii2025/10/3

我们写的C++代码,对人类来说是清晰的逻辑表达,但对机器来说,只是一串抽象的字符。编译器,特别是像GCC、Clang这样的现代编译器,扮演着“翻译官”兼“优化大师”的角色。它们将高级代码转化为机器指令,并在此过程中,对代码进行脱胎换骨般的重塑,以求达到极致的性能。 今天,我们将深入汇编层面,揭开编译器优化的神秘面纱,看看我们的代码在编译器的“熔炉”中究竟经历了什么。 为什么选择汇编语言? 汇编是机器指令的人类可读形式,是连接高级语言与硬件执行的最直接桥梁。通过查看编译器生成的汇编代码,我们可以:


Manim实现渐变填充特效
databook2025/10/2

本文将介绍如何使用Manim框架实现动态渐变填充特效,通过自定义动画类来控制物体的颜色随时间平滑变化。 1. 实现原理 1.1. 自定义动画类设计 在Manim中,所有动画效果都是通过继承Animation基类并实现相应的方法来创建的。 我们设计了一个名为GradientFillAnimation的类,专门用于实现颜色渐变填充效果: class GradientFillAnimation(Animation): """动态渐变填充动画类""" def __init__(


15:00开始面试,15:06就出来了,问的问题有点变态。。。
测试界晓晓2025/10/2

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%,这下搞的饭都吃不起了。 还在有个朋友内推我去了一家互联网公司,兴冲冲见面试官,没想到一道题把我给问死了: 如果模块请求http改为了https,测试方案应该如何制定,修改? 感觉好简单的题,硬是没有答出来,早知道好好看看一大佬软件测试面试宝典了。 通过大数据总结发现,其实软件测试岗的面试都是差不多


分布式架构初识:为什么需要分布式
湮酒10/2/2025

分布式架构初识:从单体到分布式演进 本文系统介绍了从单体架构到分布式架构的演进过程。单体架构虽具有开发简单、部署方便等优点,但随着业务增长面临扩展性差、可靠性低等局限。通过电商秒杀、金融支付、弹性扩展三个典型场景,文章展示了分布式架构在高并发、高可用和弹性扩展方面的优势。分布式架构可通过水平拆分(分库分表)和服务化(微服务)两种基本形态实现,能有效解决性能瓶颈、单点故障等问题,满足现代互联网应用的高并发、高可用需求。


SpringSecurity自定义认证成功、失败、登出成功处理器
三口吃掉你9/30/2025

AuthenticationSuccessHandler的方法进行认证成功后的处理的。AuthenticationFailureHandler的方法进行认证失败后的处理的。实际上在UsernamePasswordAuthenticationFilter进行登录认证的时候,如果登录成功了是会调用。实际上在UsernamePasswordAuthenticationFilter进行登录认证的时候,如果认证失败了是会调用。我们也可以自己去自定义成功处理器进行成功后的相应处理。


【Linux操作系统】基础开发工具
ZLRRLZ9/30/2025

本文介绍了Linux开发中的常用工具链,包括软件包管理(yum/apt)、文本编辑器(Vim)、编译器(gcc/g++)、构建工具(make/Makefile)、进度条实现、版本控制(Git)和调试器(gdb/cgdb)。重点讲解了Vim的多模式编辑、gcc的编译流程与动静态链接区别、Makefile的自动化构建原理,以及Git的版本控制三板斧操作。这些工具构成了Linux环境下高效开发的完整工作流,帮助开发者完成从代码编写、编译构建到版本管理的全流程工作。


纯电汽车emc整改:设计缺陷到合规达标的系统方案|深圳南柯电子
深圳南柯电子2025/10/5

在新能源汽车产业迈入智能化、电动化深水区的当下,电磁兼容性(EMC)已成为决定产品安全与市场竞争力的核心指标。某头部车企曾因电机控制器辐射超标导致整车上市延迟,直接损失超3亿元;某新势力品牌因车载充电机传导骚扰超标引发用户投诉,召回成本高达1.2亿元。这些案例揭示了一个残酷现实:EMC整改不再是产品上市前的“补救措施”,而是贯穿研发、生产、运维全生命周期的系统工程。 一、纯电汽车emc整改的标准为纲:构建EMC合规的“法律底线” 纯电汽车EMC整改需严格遵循国内外双重标准体系。国内以GB/T


SpringBoot安全进阶:利用门限算法加固密钥与敏感配置
风象南2025/10/7

一、背景:单点密钥的隐患 在企业信息系统中,密钥是最核心的安全资产。无论是数据库加密、支付签名,还是用户隐私保护,背后都依赖一把"超级钥匙"。 然而,现实中我们常常遇到这些场景: 单点保管风险:某个核心密钥仅由一个运维人员或系统服务持有,一旦泄露或者丢失,整个系统可能崩盘。 操作合规问题:金融或政府系统中,法规往往要求多方共同参与,才能执行高风险操作。 分布式架构挑战:在云环境或多数据中心下,如何既能保证数据安全,又能防止任何一个节点"作恶"? 一句话总结: 👉 一个人掌握所有密钥 = 系统安


Rust语言简介
xqlily2025/10/8

Rust是一种现代的系统编程语言,由Mozilla基金会开发,并于2010年首次发布。它旨在解决传统语言(如C和C++)中的常见问题,如内存安全错误和并发性挑战,同时保持高性能。Rust强调安全性、速度和并发性,使其在系统开发、嵌入式系统和WebAssembly等领域广受欢迎。下面,我将从核心特点、优势和应用场景入手,逐步介绍Rust,并附上一个简单示例。 核心特点 内存安全:Rust通过独特的“所有权系统”避免空指针解引用、缓冲区溢出等常见错误。例如,编译器在编译时检查内存访问,确保


HTML 元素帮助手册
hubenchang05152025/10/9

#HTML 元素帮助手册 转载自 MDN #主根元素 元素描述<html>表示一个 HTML 文档的根(顶级元素),所以它也被称为根元素。所有其它元素必须是此元素的后代。 #文档元数据 元素描述<base>指定用于一个文档中包含的所有相对 URL 的根 URL。一份中只能有一个该元素。<head>包含文档相关的配置信息(元数据),包括文档的标题、脚本和样式表等。<link>指定当前文档与外部资源的关系。该元素最常用于链接 CSS,此外也可以被用来创建站点图标(比如“favicon”样式图标和

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0