本文详细介绍了 Nginx 的目录结构、常用命令、日志管理,并结合实战场景讲解了静态资源代理、负载均衡、缓存配置、高可用集群搭建以及 SSL 证书自动化工具 acme.sh 的使用。
1. 简介
nginx 概述
nginx 是一个开源且高性能,可靠的 HTTP 中间件,代理服务
HTTP 服务: httpd, IIS, GWS, NGINX 等
安装
安装最新稳定版 http://nginx.org/en/linux_packages.html
eg: debian
$ apt install curl gnupg2 ca-certificates lsb-release
$ echo deb http://nginx.org/packages/debian/ lsb_release -cs nginx | tee /etc/apt/sources.list.d/nginx.list
$ wget http://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key
$ apt update && apt install nginx -y
主要功能
nginx 专为性能优化而开发。主要功能
- 正向代理
- 反向代理
- 负载均衡
- 动静分离
配置文件
配置文件分为三块:
- 全局块 : 主要是设置一些影响 Nginx 服务器 整体运行的配置指令
events块 : 影响 Nginx 服务器与用户的网络连接HTTP块 : 诸如反向代理和均衡负载都在此配置
1 | ## 全局块 |
2. nginx文件目录详解
rpm -qi 包名 : 查看一个包的详细信息
rpm -qf 文件名 : 查看一个文件是由哪个包安装的
rpm -ql 包名 : 查看一个包安装了哪些文件
rpm -qa : 查看系统中安装了哪些包
查看 nginx 安装的文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35[root@instance-2 ~]# rpm -ql nginx
/etc/logrotate.d/nginx # 配置文件 日志轮转
/etc/nginx # 目录 nginx 主要文件
/etc/nginx/nginx.conf # 配置文件 nginx 主要文件
/etc/nginx/conf.d # 目录 nginx 主要文件
/etc/nginx/conf.d/default.conf # 配置文件 nginx 主要文件
/etc/nginx/fastcgi_params # 配置文件 cgi fastcgi 配置等
/etc/nginx/scgi_params # 配置文件 cgi fastcgi 配置等
/etc/nginx/uwsgi_params # 配置文件 cgi fastcgi 配置等
/etc/nginx/koi-utf # 配置文件 编码转换映射转化文件
/etc/nginx/koi-win # 配置文件 编码转换映射转化文件
/etc/nginx/win-utf # 配置文件 编码转换映射转化文件
/etc/nginx/mime.types # 配置文件 设置 http 协议的 Content-Type 与扩展名对应关系
/etc/sysconfig/nginx # 配置文件 用于配置出系统守护进程管理器的管理方式
/etc/sysconfig/nginx-debug # 配置文件 用于配置出系统守护进程管理器的管理方式
/usr/lib/systemd/system/nginx-debug.service # 配置文件 用于配置出系统守护进程管理器的管理方式
/usr/lib/systemd/system/nginx.service # 配置文件 用于配置出系统守护进程管理器的管理方式
/usr/sbin/nginx # 命令 Nginx 服务的管理启动终端命令
/usr/sbin/nginx-debug # 命令 Nginx 服务的管理启动终端命令
/etc/nginx/modules # 目录 Nginx 模块目录
/usr/lib64/nginx/modules # 目录 Nginx 模块目录
/usr/share/doc/nginx-1.18.0 # 目录 Nginx的手册和帮助文件
/usr/share/doc/nginx-1.18.0/COPYRIGHT # 文件 Nginx的手册和帮助文件
/usr/share/man/man8/nginx.8.gz # 文件 Nginx的手册和帮助文件
/var/cache/nginx # 目录 Nginx 的缓存目录
/var/log/nginx # 目录 Nginx 的日志目录
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
3. nginx常用命令
1 |
|
4. nginx日志文件
title: nginx日志文件
date: 2021-02-10 12:05:28
tags:
categories: nginx
查看配置文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27[root@instance-2 nginx]# cat /etc/nginx/nginx.conf
user root;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # 日志格式,变量可以自定义,或内置变量等
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 120;
client_max_body_size 20m;
#gzip on;
server {
listen 80;
server_name tj.imwl.cf;
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
}
日志文件,查看格式
1 | 203.189.141.176 - - [20/Feb/2021:19:19:02 +0800] "GET / HTTP/1.1" 200 55123 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/601.7.7 (KHTML, like Gecko) Version/9.1.2 Safari/601.7.7" "-" |
5. nginx模块
模块分类
- 官方模块
- 第三方模块
所编译的模块
–with 后面主要是 所开启的模块1
2
3
4
5
6[root@instance-2 ~]# nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
–with-http_stub_status_module
Nginx 的客户端状态
示例
1 | root@R7000:/etc/nginx/conf.d# cat test.conf |
–with-http_random_index_module
目录中选择一个作为随机主页
1 | root@R7000:/etc/nginx/conf.d# cat test.conf |
–with-http_sub_module
HTTP 内容替换
1 | location / { |
连接请求限制
连接限制
limit_conn_zone key zone=name:size
limit_conn_zone number
请求限制
limit_req_zone zone=name:size rate=rate
limit_req_zone=name [burst=number][nodelay]
1 | limit_conn_zone $binary_remote_addr zone=conn_zone:1m; |
访问控制
基于 ip
http_access_module
局限性: 可能获取不到用户的真实 ip
x_forwarded_for=IP1,IP2…. 一般 IP1 为用户 IP ,但可能被篡改
使用 geo 模块 ,或者 通过 HTTP 自定义变量传递
1 | location ~ ^/admin.html { |
基于用户的信任登录
http_auth_basic_module
局限性: 用户信息依赖文件,效率低下
使用 LUA
利用 nginx-auth-ldap 模块
6. nginx静态资源
静态资源
非服务器动态生成的文件
- 浏览器渲染 : html, css, js
- 图片 : jpg, png, gif
- 视频 : flv, mpeg
- 文件 : txt, 任意下载文件
配置语法
sendflie on
tcp_nopush on # 开启 sendflie on 可以提高网络包的传输效率
tcp_nodelay on # keep-alive 提高网络包的传输实时性
gzip on
gzip_comp_level 2
gzip_http_version 1.1; #压缩版本
http_gzip_static_module # 预读 gzip 功能
http_gunzip_module # 应用支持 gunzip 的压缩方式
expires time # 缓存过期时间
add_header name value [always] Access-Control-Origin # 跨域访问
1 | location ~ .*\.(htm|html)$ { |
简单防盗链
区别非正常用户的请求
http_refer
1 | location ~ .*\.(jpg|gif|png)$ { |
7. 正向代理
节点 192.168.43.101(安装nginx 1.16.1)
节点 192.168.43.102 测试 正向代理1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29[root@k8s01 conf.d]# cat forward-proxy.conf # 查看 正向代理的配置文件
server {
resolver 114.114.114.114; #指定DNS服务器IP地址
listen 80;
location / {
proxy_pass http://$http_host$request_uri; #设定代理服务器的协议和地址
proxy_set_header HOST $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_next_upstream error timeout invalid_header http_502;
}
}
server {
resolver 114.114.114.114; #指定DNS服务器IP地址
listen 443;
location / {
proxy_pass https://$host$request_uri; #设定代理服务器的协议和地址
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_next_upstream error timeout invalid_header http_502;
}
}
[root@k8s01 conf.d]# nginx -s reload
192.168.43.102 测试
1 | [root@k8s02 ~]# curl -I --proxy 192.168.43.101:80 www.baidu.com # 测试 http |
8. 域名绑定
1 |
|
9. 端口绑定
localhost:8088 : nginx默认页面
localhost:8089 : master文件夹下路径
1 | ##user nobody; |
10. nginx-url匹配规则
1 | location [=|~|~*|^~|@] /uri/ { |
= : 表示精确匹配后面的 url
~ : 表示正则匹配,但是区分大小写
~* : 正则匹配,不区分大小写
^~ : 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
@ : @ 定义一个命名的 location,使用在内部定向时,例如 error_page
示例
1 | upstream api_server { |
默认访问 / 会重定向到 /my-module , 然后直接返回 /data/my-module/dist 下的 html 等静态文件
补 rewrite
last : 表示 rewrite, 浏览器地址栏不变
break : 本条规则匹配完成后,终止匹配,不再匹配后面的规则,浏览器地址栏不变
redirect : 返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址
permanent : 返回 301 永久重定向,浏览器地址会显示跳转后的 URL 地址
使用 alias 指令必须用 last 标记;使用proxy_pass指令时,需要使用break标记。last标记在本条rewrite规则执行完毕后,会对其所在server{……}标签重新发起请求,而break` 标记则在本条规则匹配完成后,终止匹配。
1 | if( !-e $request_filename ) |
11. nginx作为缓存服务
服务端缓存: 放在 redis 等
代理缓存: nginx 等中间件
客户端 : 浏览器缓存等
proxy_cache
proxy_cache zone off
proxy_cache_vaild [code …] time
proxy_cache_key string
location ~ .*.(html|htm)$ {
expires 12h; #缓存12小时
}
1 | http { |
清理指定缓存
- rm -rf 缓存目录内容
- 第三方扩展模块 ngx_cache_purge
大文件分片请求
1 | slice size; |
每个请求收到的数据会形成一个独立文件,一个请求断了,求它请求不受影响
当文件很大或者 slice 很小时,可能会导致文件描述符耗尽 等情况
12. nginx负载均衡常见问题
- 客户端 IP 地址获取问题
- 域名携带问题
- 负载均衡导致 session 丢失问题
- 动态负载均衡问题
- 真实的 Realserver 状态检测
负载均衡的方式
rr轮询weight代表权,权越高优先级越高。fair按后端服务器的响应时间来分配请求,相应时间短的优先分配。ip_hash每个请求按照访问 ip 的 hash 结果分配
后端服务器 在负载均衡调度中的状态
down : 不参与负载均衡
backup : 预留的备份服务器
max_fails : 允许请求失败的次数
fail_timeout : max_fails 后,服务暂停的时间
max_conns : 限制最大的接收的连接数
客户端 IP 地址获取问题
第一种方式的解决办法是在 Nginx 负载均衡的基础上添加了一个转发到后端的标准 head 信息,把用户的 IP 信息通过 X-Forwarded-For 方式传递过去
第二种方式是就是添加一个 X-Real 的自定义头,自定义头我们可以随意的命名,一般情况下命名为 X-Real_IP,把用户的真实四层 IPc地址赋值给它
域名携带问题
1 | http { |
通过 proxy_set_header 配置方式加入 Host 头部字段,如果用户的请求携带了域名,就把这个域名的 head 头以标准的 HTTP 方式将头信息传递到后端,然后让后端获取 Host 头信息
负载均衡导致 session 丢失问题
- Session 保持 : ip_hash、URL_hash 来解决
- Session 复制 : 让 Session 之间可以以传播的方式进行复制,每个 App 上都会有同样的 Session 信息,不至于因为轮询导致丢失会话失效
- Session 共享 : Session 信息不放在本地,通过应用程序把 Session 信息放入共享的 K/V 存储中,这样就不会产生 Session 丢失情况了
使用 ip_hash
1 | http { |
使用 url_hash
1 | http { |
真实的 Realserver 状态检测
这个第三方模块 nginx_upstream_check_module
1 | check interval=3000 rise=2 fall=5 timeout=1000 type=http; //定义检查间隔、周期、时间 |
通过这样的配置,我们定义了检测间隔、周期和超时时间;定义了一个连接发送的请求数;然后是定义健康检查方式,比如检查 head 头的请求信息;最后判断后端返回状态码,如果是非 200 或 300 的话,就认为后台服务不健康,需要把这个问题服务除掉,避免用户请求到问题节点
动态负载均衡问题
可以使用第三方工具
13. nginx高可用
高可用方案
- LVS : 4 层负载均衡,性能强的,对内存和
cpu资源消耗比较低, 不支持正则静态分离,大型网站配置复杂 - nginx : 7 层负载均衡, 适用面小,负载均衡可能会遇到 session 等问题,不支持通过 ur l来检测
- haproxy : 4+7层,负载均衡策略非常多,能很好地弥补 nginx 的缺点
在 Nginx 1.9.0 版本后,Nginx 便可以通过配置 –with-stream 模块的方式,来实现基于四层的反向代理
基于TCP的四层负载均衡配置文件不能配置 http 层
eg: k8s 主节点 10.0.0.101,10.0.0.102,10.0.0.103.端口均为 6443
访问任一节点 nginx:6443 则负载均衡到任一节点1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23user root;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
events {
worker_connections 3000;
}
stream {
upstream backend {
server 10.0.0.101:6443 max_fails=2 fail_timeout=3s;
server 10.0.0.102:6443 max_fails=2 fail_timeout=3s;
server 10.0.0.103:6443 max_fails=2 fail_timeout=3s;
}
server {
listen 127.0.0.1:6443 so_keepalive=on; # 开启 TCP 存活探测
# proxy_connect_timeout 10s; # 端口保持时间
proxy_connect_timeout 1s;
proxy_pass backend;
}
}
Keepalived 软件起初是专为 LVS 负载均衡软件设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP 功能。因此, Keepalived 除了能够管理 LVS 软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL 等)的高可用解决方案软件
准备工作
示例:
- 多台
Nginx服务器 : smtp_server 192.168.43.101(主)smtp_server 192.168.43.102(备) - 安装
Keepalived: yum install -y Keepalived ,配置文件 默认 /etc/keepalived/keepalived.conf - 虚拟
ip: 192.168.43.100
主备模式
192.168.43.101 上修改 keepalived.conf
1 | ! Configuration File for keepalived |
192.168.43.102 上修改 keepalived.conf
1 | ! Configuration File for keepalived |
所有主机执行1
2systemctl start keepalived
systemctl enable keepalived
双主模式
再配置一段新的 vrrp_instance(实例)规则,主 上面加配置一个 从 的实例规则,从 上面加配置一个 主 的实例规则
192.168.43.101 上修改 keepalived.conf1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37! Configuration File for keepalived
global_defs {
router_id k8s
}
vrrp_instance VI_1 {
state MASTER # 主节点
interface ens33 # 当前用的 ens33 网卡
virtual_router_id 51
priority 100 # 优先级配置
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress { # VIP
192.168.43.100
}
}
vrrp_instance VI_2 {
state BACKUP # 备节点
interface ens33 # 当前用的 ens33 网卡
virtual_router_id 51
priority 100 # 优先级配置
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress { # VIP
192.168.43.100
}
}
192.168.43.102 上修改 keepalived.conf
1 | ! Configuration File for keepalived |
所有主机执行
1 | systemctl restart keepalived |
14. nginx优化
nginx 优化
- 基础配置优化
- 缓存配置优化
基础配置优化
CPU亲和性优化 : 每一个Nginx的worker线程都能固定到具体的CPU核心上Nginx模型优化 :kernel 2.6后使用epoll, 单个线程的最大连接数worker_connections配置的更合理一点Nginx传输方式优化 : 零拷贝,HTTP配置模块中添加一个sendfile on,实现静态文件的内核态到用户态的零拷贝Nginx文件压缩优化 :gzip on负责打开后端的压缩功能
nginx master 进程主要用来管理 worker 进程,包含:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker 进程。
缓存配置优化
- 浏览器缓存优化
- 代理缓存优化
HTTPS SSL缓存优化KV服务缓存优化等
浏览器缓存
浏览器缓存通常是缓存到客户端(如:浏览器、客户端 app )
可以把静态元素,比如用户请求的图片、CSS 、JS 等元素缓存到客户端。这种缓存可以通过 Nginx 配置中的 expires 配置项进行设置,expires 后面可以加具体的时间,也可以加对应的特定意义的数值,比如 -1 表示永久缓存,max 设置最大周期缓存(默认缓存周期为 10 年),需要做具体的时间的设置可以写入具体的时间周期,比如一个小时或是一天
HTTPS 配置优化
在 Nginx 中配置 ssl_session_cache
配置中分配 Nginx 在处理 SSL 会话所需要开辟的共享内存的空间为 10 MB,第二个参数就是设置 SSL SessionKey 的超时时间,这里设置的为 10 分钟,也就是每隔 10 分钟需要重新再进行一次建联,这是一个在服务端的超时时间。
打开文件缓存
open_file_cache 具体的设置策略,max 表示最大能够缓存的文件个数,inactive 表示最少的用户使用次数。我们结合看一下,这个表示在 20 秒内最小需要使用两次。如果没有使用的话,就会把元数据删掉,也这就是一个淘汰元数据的策略。
open_file_cache_valid 是设置主动更新和检查的时间,表示每隔 30 秒检查缓存文件的元信息有没有对应的更新,如果有更新就需要去做对应的更新,它是一个更新的策略
代理缓存优化
1 | proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60mlocation / { |
通过 Nginx 作代理,可以支持实现动静态的分离,静态元素直接交给 Nginx 来处理,再把后端动态数据适当作缓存。通常做这种代理+缓存的架构,是能有效的提高整体网站的访问并发性能。
缓存使用注意问题
对于缓存的整体使用,之前说的缓存越多越好,越靠前越好,命中率越高越好
- 文件更新策略问题
- 缓存命中率失败给后端造成的瞬间压力
- 多节点缓存一致性
15. acme使用
申请通配符
可以不需要 ip 服务器,只用证明 域名是你的。
https://github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_cf 这些提供商可以自动添加记录,不在这些运营商的需要手动添加 txt 记录
当前使用通用的方式,手动添加记录。可以添加多个, -d *.grafana.eu.org -d grafana.eu.org1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66[office-k8s-01][email protected]:~# acme.sh --issue --dns -d *.grafana.eu.org
[Wed Jul 2 17:03:47 CST 2025] It seems that you are using dns manual mode. Read this link first: https://github.com/acmesh-official/acme.sh/wiki/dns-manual-mode
[office-k8s-01][email protected]:~# acme.sh --issue --dns -d *.grafana.eu.org --yes-I-know-dns-manual-mode-enough-go-ahead-please
[Wed Jul 2 17:04:59 CST 2025] Using CA: https://acme.zerossl.com/v2/DV90
[Wed Jul 2 17:04:59 CST 2025] Creating domain key
[Wed Jul 2 17:04:59 CST 2025] The domain key is here: /root/.acme.sh/*.grafana.eu.org_ecc/*.grafana.eu.org.key
[Wed Jul 2 17:04:59 CST 2025] Single domain='*.grafana.eu.org'
[Wed Jul 2 17:07:15 CST 2025] Getting webroot for domain='*.grafana.eu.org'
[Wed Jul 2 17:07:15 CST 2025] Add the following TXT record:
[Wed Jul 2 17:07:15 CST 2025] Domain: '_acme-challenge.grafana.eu.org'
[Wed Jul 2 17:07:15 CST 2025] TXT value: 'u4aSBaAlbetG1Wkr_PNffvGgxj6vHZujFNyLyFeVMC0'
[Wed Jul 2 17:07:15 CST 2025] Please make sure to prepend '_acme-challenge.' to your domain
[Wed Jul 2 17:07:15 CST 2025] so that the resulting subdomain is: _acme-challenge.grafana.eu.org
[Wed Jul 2 17:07:15 CST 2025] Please add the TXT records to the domains, and re-run with --renew.
[Wed Jul 2 17:07:15 CST 2025] Please add '--debug' or '--log' to see more information.
[Wed Jul 2 17:07:15 CST 2025] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh
### 手动添加 _acme-challenge.grafana.eu.org TXT u4aSBaAlbetG1Wkr_PNffvGgxj6vHZujFNyLyFeVMC0
[office-k8s-01][email protected]:~# acme.sh --issue --dns -d *.grafana.eu.org --yes-I-know-dns-manual-mode-enough-go-ahead-please --renew
[Wed Jul 2 17:09:12 CST 2025] The domain '*.grafana.eu.org' seems to already have an ECC cert, let's use it.
[Wed Jul 2 17:09:12 CST 2025] Renewing: '*.grafana.eu.org'
[Wed Jul 2 17:09:12 CST 2025] Renewing using Le_API=https://acme.zerossl.com/v2/DV90
[Wed Jul 2 17:09:15 CST 2025] Using CA: https://acme.zerossl.com/v2/DV90
[Wed Jul 2 17:09:15 CST 2025] Single domain='*.grafana.eu.org'
[Wed Jul 2 17:09:15 CST 2025] Verifying: *.grafana.eu.org
[Wed Jul 2 17:09:50 CST 2025] Processing. The CA is processing your order, please wait. (1/30)
[Wed Jul 2 17:10:21 CST 2025] Success
[Wed Jul 2 17:10:21 CST 2025] Verification finished, beginning signing.
[Wed Jul 2 17:10:21 CST 2025] Let's finalize the order.
[Wed Jul 2 17:10:21 CST 2025] Le_OrderFinalize='https://acme.zerossl.com/v2/DV90/order/JoDGS0BAiPIBTdNwRu5oNA/finalize'
[Wed Jul 2 17:10:55 CST 2025] Order status is 'processing', let's sleep and retry.
[Wed Jul 2 17:10:55 CST 2025] Sleeping for 15 seconds then retrying
[Wed Jul 2 17:11:11 CST 2025] Polling order status: https://acme.zerossl.com/v2/DV90/order/JoDGS0BAiPIBTdNwRu5oNA
[Wed Jul 2 17:11:14 CST 2025] Downloading cert.
[Wed Jul 2 17:11:14 CST 2025] Le_LinkCert='https://acme.zerossl.com/v2/DV90/cert/XUI_bZ_CfvW42--xLMj_ZA'
[Wed Jul 2 17:11:15 CST 2025] Cert success.
-----BEGIN CERTIFICATE-----
MIIECTCCA4+gAwIBAgIRAIfRQ6hPRFKW6tFOW1q96hwwCgYIKoZIzj0EAwMwSzEL
MAkGA1UEBhMCQVQxEDAOBgNVBAoTB1plcm9TU0wxKjAoBgNVBAMTIVplcm9TU0wg
RUNDIERvbWFpbiBTZWN1cmUgU2l0ZSBDQTAeFw0yNTA3MDIwMDAwMDBaFw0yNTA5
MzAyMzU5NTlaMB4xHDAaBgNVBAMMEyouZG9rcGxveS5ob255LmxvdmUwWTATBgcq
hkjOPQIBBggqhkjOPQMBBwNCAAT0F8Z5AEOIWX67yb/l3qGj6ngiu+RUg8dzeke/
Zq4+367XS0bvDf4hvFkCDj+hwkxjaf6vmOeeQVU4MbZJmhq2o4ICfzCCAnswHwYD
VR0jBBgwFoAUD2vmS845R672fpAeefAwkZLIX6MwHQYDVR0OBBYEFEcm3Rj4kxRu
Lj5cfEZXtoqSoImCMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0GA1Ud
JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBJBgNVHSAEQjBAMDQGCysGAQQBsjEB
AgJOMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeB
DAECATCBiAYIKwYBBQUHAQEEfDB6MEsGCCsGAQUFBzAChj9odHRwOi8vemVyb3Nz
bC5jcnQuc2VjdGlnby5jb20vWmVyb1NTTEVDQ0RvbWFpblNlY3VyZVNpdGVDQS5j
cnQwKwYIKwYBBQUHMAGGH2h0dHA6Ly96ZXJvc3NsLm9jc3Auc2VjdGlnby5jb20w
ggEEBgorBgEEAdZ5AgQCBIH1BIHyAPAAdgDd3Mo0ldfhFgXnlTL6x5/4PRxQ39sA
OhQSdgosrLvIKgAAAZfKZ12zAAAEAwBHMEUCIQDdy145LFaIJPu7+GAw5CDH17Qj
0LspxH2Is7nzJ23/EgIga0ICn4NvC+1zn+4CuYUwhgjLoSH4m38VpJeY+So4HJ0A
dgAN4fIwK9MNwUBiEgnqVS78R3R8sdfpMO8OQh60fk6qNAAAAZfKZ12JAAAEAwBH
MEUCIQC6cx5ub4tepIZtpCoZ8srAwdviK9hS5bIRHABf3tx7swIgSZFJx/+SXMuR
24mtUIjGNAw04viIJsjyC4Utr0hIq5UwHgYDVR0RBBcwFYITKi5kb2twbG95Lmhv
bnkubG92ZTAKBggqhkjOPQQDAwNoADBlAjBeqUcSFagFKtxmKnhiw1zJMUIh5RIj
t6CftSj9bvcxv8W8p8posPEsVv++PnZVEhMCMQCfecDMrxKZPgBajDc8TKVgjGNR
1K5f6KEC5udPC264J4cm0JXROAXsxqPIbj9r/Y0=
-----END CERTIFICATE-----
[Wed Jul 2 17:11:15 CST 2025] Your cert is in: /root/.acme.sh/*.grafana.eu.org_ecc/*.grafana.eu.org.cer
[Wed Jul 2 17:11:15 CST 2025] Your cert key is in: /root/.acme.sh/*.grafana.eu.org_ecc/*.grafana.eu.org.key
[Wed Jul 2 17:11:15 CST 2025] The intermediate CA cert is in: /root/.acme.sh/*.grafana.eu.org_ecc/ca.cer
[Wed Jul 2 17:11:15 CST 2025] And the full-chain cert is in: /root/.acme.sh/*.grafana.eu.org_ecc/fullchain.cer
证书详情1
2
3
41. 证书内容(单证书) /root/.acme.sh/*.grafana.eu.org_ecc/*.grafana.eu.org.cer 仅包含你域名的证书(无 CA)
2. 证书私钥 /root/.acme.sh/*.grafana.eu.org_ecc/*.grafana.eu.org.key 证书对应的私钥,部署时用于服务器握手
3. 中间证书(CA) /root/.acme.sh/*.grafana.eu.org_ecc/ca.cer Let’s Encrypt 的中间证书
4. 完整链证书(fullchai) /root/.acme.sh/*.grafana.eu.org_ecc/fullchain.cer
一般使用 2 和 4
更新(测试手动dns解析可能无效。需要删除文件然后重新走上面的 申请通配符 的流程)
1 | [office-k8s-01][email protected]:~# /root/.acme.sh/acme.sh --renew -d "*.grafana.eu.org" --force --home "/root/.acme.sh" --yes-I-know-dns-manual-mode-enough-go-ahead-please |
更新 txt 记录
1 | [office-k8s-01][email protected]:~# nslookup -q=TXT _acme-challenge.grafana.eu.org |
然后重新执行
1 | [office-k8s-01][email protected]:~# /root/.acme.sh/acme.sh --renew -d "*.grafana.eu.org" --force --home "/root/.acme.sh" --yes-I-know-dns-manual-mode-enough-go-ahead-please |
和 nginx 搭配使用
1 | acme.sh --install-cert -d test.com --ecc \ |
nginx 的配置
1 | server { |