出现报错首先更新acme程序,命令:

acme.sh --upgrade

如果更新到最新还是申请不了,查看以下解决方法:

出现 Sleeping for 10 seconds and retrying 循环提示:
删除.acme.sh/ca 目录

出现手动DNS申请证书,无法验证域名有效性
检查是否以前在这个服务器申请过证书,并且使用了指定的--server服务器,这次如果未指明--server就会原用上次保存过的,如果这个服务地址现在无法使用了,可能导致验证不成功问题
解决方法是删除.acme.sh/目录下 相关的域名证书申请目录,以及相关的服务器地址配置(不确定,如果有的话),再重新DNS下单申请试试

申请多域名证书报错:
如果使用 -d www.xx.com,www.xx.cn 的命令,--renew 时出现:

 'www.xx.com,www.xx.cn' is not an issued domain, skipping

解决方法是把域名拆开:

acme.sh --renew -d www.xx.com -d www.xx.cn  [...]

Snipaste 是一个简单但强大的贴图工具,同时也可以执行截屏、标注等功能。
https://docs.snipaste.com/zh-cn/key-bindings
截屏
开始截图
快捷键(默认为 F1)
鼠标左键 单击托盘图标
何谓一次 成功的截图
保存到剪贴板 (  / Ctrl + C / Enter / 鼠标左键双击 截屏区域)
保存到文件 (  / Ctrl + S)
保存到贴图 (  / Ctrl + T / 鼠标中键单击 截屏区域)
快捷保存 (Shift +  / Ctrl + Shift + S)
取消当前截图
任何时刻按 Esc
任何时刻点击工具条上的关闭按钮
非编辑状态下,按下鼠标右键
任何时刻有其他程序的窗口被激活
可在选项窗口关闭此行为
回放截图记录
进入截图后,按 , 或 .
只有 成功的截图 才会出现在截图记录中
截图记录的最大数量,可在选项窗口中设置
逐像素控制光标移动
W A S D
像素级控制截取区域
按住 鼠标左键 + W A S D(推荐,可实现移动、扩大、缩小区域)
移动区域: ↑ ← ↓ →
扩大区域:Ctrl + ↑ ← ↓ →
缩小区域:Shift + ↑ ← ↓ →
放大镜
放大镜会在合理的时机自动出现和隐藏,如果你需要它的时候它没在,请按 Alt 召唤它
取色
当放大镜可见的时候,按下 C 可复制该像素点的颜色值(RGB/Hex)。之后可以 F3 将它贴出,或者 Ctrl + V 贴到其他程序里
可按下 Shift 来切换颜色格式
标注
手动结束当前图案
单击 鼠标右键
如何重新编辑已经结束的图案
按 撤销 直到你需要编辑的图案已经消失,再按 重做
将来会支持直接的二次编辑
画板里没有我想要的颜色
请点击那个大的颜色按钮
调整画笔宽度
鼠标滚轮
1 2
切换直线/箭头
Tab
画单条直线/折线
选中折线工具后,在可标注区域内,拖拽鼠标左键是画单条直线,多次点按鼠标左键是画折线
调整文字大小
拖动文字框四角
旋转文字
拖动文字框上方的小圆点
将旋转过的文字重新变为水平的
按住 Shift 再拖动文字框四角
贴图
所谓贴图,是指将系统剪贴板中的内容转化成图片,然后作为窗口置顶显示。
所以,能否贴出来、贴出来的是什么,取决于系统剪贴板中的内容。
如何贴图
快捷键(默认 F3)
鼠标中键 单击托盘图标
截图时选择 贴到屏幕
什么时候可以贴图
剪贴板中复制有图像
剪贴板中复制有颜色信息
RGB:3 个 0~255 的整数或 3 个 0~1 的小数
HEX:以 # 开头的合理色值
剪贴板中有文字
纯文本
HTML 文本
剪贴板中有文件路径(指复制了文件)
文件是图片,会把图像贴出
图像贴出后再贴,会把文件路径当做文本贴出
文件不是图片,会把文件路径当做文本贴出
在选项对话框中可以选择不要将文件路径转化成图片
旋转贴图
1 2
水平/垂直翻转
3 4
缩放贴图
滑动滚轮

  • -
    拖动贴图窗口的边缘
    设置贴图透明度
    Ctrl + 滑动滚轮
    Ctrl + + -
    使贴图鼠标穿透
    前往 首选项 - 控制 - 全局快捷键 - 鼠标穿透开关 为其设置快捷键
    按键触发后,会切换光标所在位置的贴图的鼠标穿透状态
    如果没有贴图位于光标之下,则取消所有贴图的鼠标穿透状态
    重置贴图为 100% 大小 及 100% 不透明
    中键单击
    可自定义
    缩略图模式
    Shift + 左键双击
    可自定义
    关闭单张贴图
    Esc / 左键双击
    可自定义
    Ctrl + W
    被关闭的贴图,可再次被贴出,除非超过“可被恢复的已关闭贴图数”
    如何恢复:按下贴图键一次或多次
    “可被恢复的已关闭贴图数”可在选项对话框设置(默认设置/建议是 1)
    当你觉得自己可能不需要这张贴图了,关闭贴图操作是你的首选,因为它同时提供了一种后悔药,防止你刚把贴图关闭就后悔了,想找回来
    如果你并不希望这张贴图消失,而只是想暂时隐藏它,那么你不应该关闭它,而是使用“隐藏所有贴图”,或者把它移动到另一个贴图分组
    关闭 Snipaste 时,如果已关闭的贴图没有被显示出来,它们会被自动销毁(即使未达到最大计数)
    隐藏所有贴图
    快捷键(默认为 Shift + F3)
    再次按下快捷键将显示所有贴图
    注意,隐藏所有贴图与上面提到的关闭单张贴图是完全不同的行为,也就是说,隐藏所有贴图不会影响对已关闭贴图的计数
    被隐藏的贴图不会被自动销毁,即使关闭 Snipaste 时它们都是隐藏状态
    销毁贴图
    Shift + Esc / 在贴图窗口的右键菜单中选 销毁
    当你确认自己不可能再需要这张贴图,并且不希望这张贴图留下任何痕迹,才建议使用销毁
    被销毁的贴图,不会再通过贴图键被恢复出来
    可是再按贴图键,还是贴出来了?
    这是因为它还在你剪贴板里,Snipaste 是把它当做新的内容贴了出来
    如果希望销毁当前分组的所有贴图,关闭该贴图分组即可
    放大镜
    和截图时一样,按住 Alt 可唤出放大镜
    取色
    和截图时一样,放大镜可见时按 C 可复制当前像素点的颜色值

内置快捷键
注意:以下按键适用于 Windows 操作系统,对于 Mac 操作系统,需将 Ctrl 替换成 Cmd.

只对截图有效
按键 命令
Tab 切换检测窗口/检测界面元素
` 或 ! 显示/隐藏捕获的鼠标指针
Ctrl + A 设置截屏区域为全屏
R 将截屏区域设置为上一次成功截图时的区域
, 切换到上一次截屏记录
. 切换到下一次截屏记录
F5 刷新截图 [专业版]
Ctrl + ↑ ← ↓ → 将截屏区域相应边界扩大 1 像素
Shift + ↑ ← ↓ → 将截屏区域相应边界缩小 1 像素
Ctrl + T 直接将截图贴到屏幕
Enter 复制截图并退出截屏
Esc 中止截屏
鼠标右键单击 重新设置截屏区域/中止截屏
只对贴图有效
按键 命令
1 将贴图顺时针旋转 90 度
2 将贴图逆时针旋转 90 度
3 水平翻转贴图
4 垂直翻转贴图
5 切换灰度显示 [专业版]
6 切换反色显示 [专业版]
Esc 隐藏标注工具条或关闭贴图窗口
Shift + Esc 销毁贴图窗口
Ctrl + W 关闭贴图窗口
Ctrl + A 选中所有可见的贴图 [专业版]
Ctrl + Shift + C 复制纯文本(如果该贴图是由文本转换而来)
Ctrl + V 以剪贴板中的内容替换该贴图
Ctrl + Shift + P 打开首选项对话框
通用
按键 命令
Alt 显示放大镜
Shift 放大镜可见时,切换颜色格式
C 放大镜可见时,复制颜色值
W S A D 将鼠标指针移动 1 像素
↑ ← ↓ → 非编辑状态下, 将截屏区域/贴图窗口移动 1 像素
空格键 显示/隐藏标注工具条
Ctrl + Z 撤销上一次标注(可以再恢复)
Ctrl + Shift + Z 移除所有标注(无法再恢复)
Ctrl + C 复制图像
Ctrl + Y 恢复下一个标注
Ctrl + S 将图像保存为文件
Ctrl + Shift + S 保存图像到快捷保存目录
Ctrl + P 发送图像到打印机
鼠标右键单击 结束对当前标注的编辑
鼠标滚轮 或 1 2 或 [ ] 调整画笔粗细(编辑模式时)

命令行截图选项
Snipaste 支持使用命令行选项进行功能调用,但除了带 * 标记的选项(如 --config)外,其他选项只在 Snipaste 启动后才有效。
专业版支持将命令行参数与全局快捷键绑定,可以根据自己的需要将任意功能绑定到快捷键!
粗体字标出的命令也需要专业版
此文档的在线版可能超前于你所使用的软件版本,请以软件内置文档为准。
调用方法

snipaste.exe [OPTIONS]
示例:
复制全屏截图:

  • Windows 桌面版:X:/path/to/your/Snipaste.exe snip --full -o clipboard
  • 微软商店版:Snipaste snip --full -o clipboard
  • Mac 版:/Applications/Snipaste.app/Contents/MacOS/Snipaste snip --full -o clipboard
    截图命令
    snip 开始截屏
    snip --area X Y WIDTH HEIGHT 开始截屏,并把选区左上角设为 (X, Y),

                                宽度为 WIDTH,高度为 HEIGHT

    snip --size WIDTH HEIGHT 开始截屏,并把选区宽度设为 WIDTH,
    [--keep_aspect_ratio] 高度为 HEIGHT,选区中心为当前的光标位置,

                                加上 --keep_aspect_ratio 表示自动锁定长宽比

    snip --full 开始截屏,并把选区设定为全屏
    snip --last 开始截屏,并把选区设定为上一次成功截屏的区域
    snip --active-window 开始截屏,并把选区设定为当前活动窗口
    snip --custom 弹出自定义截屏对话框(可指定截图位置、大小、延迟时间)
    以上截图选项还可:
    结合 --delay TIME 指定延迟时间(单位为秒),如 snipaste.exe snip --delay 1.5 表示延迟 1.5 秒后开始截屏。
    结合 --shadow 获取带阴影截图;结合 --no-shadow 获取不带阴影截图。
    结合 --output 或 -o 指定截图的输出方式:
    -o pin 将截图贴到屏幕上
    -o clipboard 复制截图
    -o FILE_NAME 将截图保存到指定文件 FILE_NAME,支持使用变量

                               (如含有空格需用双引号括起)

    -o quick-save 将截图保存到快捷保存文件夹
    -o file-dialog 截图后弹出文件保存对话框
    -o printer 将截图发送到打印机
    -o no-auto-save 不触发自动保存
    -o silent 不弹气泡通知
    -o success 不将截图保存到任何地方,仅仅将其标记为成功

                               成功的截图会进入截图记录(可以被回放),
                               并且可以触发自动保存(需在选项中勾选自动保存)

    -o exec(COMMAND) 截屏成功后执行指定命令 COMMAND
    对于专业版,以上输出选项可使用 ; 进行组合,但输出顺序是预定义的,与命令中的书写顺序无关。
    输出顺序:FILE_NAME -> file-dialog -> printer -> quick-save -> clipboard -> pin -> success -> exec(COMMAND)
    如: snip -o file-dialog;clipboard 会在截屏选区确定后自动复制截图,并弹出文件保存对话框。
    贴图命令
    paste 将剪贴板内容转化为贴图贴出
    paste --clipboard 同 paste
    paste --plain TEXT 将纯文本 TEXT 贴出

                                (如含有空格需用双引号括起)

    paste --html TEXT 将 TEXT 视作 HTML 格式贴出

                                (如含有空格需用双引号括起)

    paste --files FILE1 FILE2 ... 将图像文件 FILE1, FILE2 等贴出
    paste --files FOLDER1 FILE1 将图像文件 FILE1, FILE2, FILE3 等贴出
    FILE2 FOLDER2 FILE3 ... 如果 FILE1 是个相对路径,那么它是相对于文件夹 FOLDER1 的,

                                同理 FILE3 是相对于文件夹 FOLDER2.
                                文件夹路径需要以 / 或 \ 结尾 

    以上贴图选项还可结合 --pos 指定贴图位置:
    --pos X Y 指定贴图左上角的屏幕位置
    其他命令
    show-images 显示所有贴图
    hide-images 隐藏所有贴图
    toggle-images 显示/隐藏所有贴图
    create-group [GROUPNAME] 创建名为 GROUPNAME 的贴图组

                                如未指定组名,则弹窗提示输入组名

    switch-groups 显示贴图组列表
    switch-group [GROUPNAME] 切换到名为 GROUPNAME 的贴图组

                                (如含有空格需用双引号括起)
                                如未指定组名,则切换到下一贴图组

    empty-group 清空当前组
    show-group-manager 打开"管理贴图组"窗口
    no-click-through 取消所有贴图的鼠标穿透模式
    toggle-click-through 切换贴图的鼠标穿透模式
    show-tray-menu 在当前鼠标位置下显示托盘菜单
    whiteboard 进入白板模式(注意:Esc 退出截图将被禁用;工具条会被自动隐藏,

                                如果需要它,可以通过空格键切换出来)

    --color [COLOR] 指定白板模式的填充颜色,[COLOR] 可以是常见颜色名如 black, white, red 或十六进制颜色值如 #001122
    --active-screen 仅在光标显示所在屏幕激活白板模式
    transparent-whiteboard 透明白板模式(屏幕内容不会冻住)
    external COMMAND 调用外部程序 COMMAND

                                如 external notepad c:/123.txt 将调用记事本打开文件 c:/123.txt

    pick-color 选取并复制屏幕某像素的颜色值
    barcode-scan 识别屏幕上的二维码/条形码并复制结果,如识别失败,将清空系统剪贴板
    barcode-decode FILE 识别指定图片上的二维码/条形码并复制结果,如识别失败,将清空系统剪贴板
    paste-as-image 尝试将剪贴板内容(如文字)转化成图像并执行发送 Ctrl-V

                                (仅 Windows)

    paste-as-plain-text 将剪贴板中的 HTML 内容转化成不带格式的纯文本并发送 Ctrl-V

                                (仅 Windows)

    switch-group-prev 切换到上一次激活的贴图组
    disable-hotkeys 禁用全局快捷键
    enable-hotkeys 启用全局快捷键
    toggle-hotkeys 禁用/启用全局快捷键
    disable-hot-corners 禁用触发角
    enable-hot-corners 启用触发角
    toggle-hot-corners 禁用/启用触发角
    clear-snip-history 清空截图记录
    open-preferences 打开首选项
    docs 打开帮助窗口
    exit 退出 Snipaste
    --config=/path/to/config.ini *指定配置文件路径 (支持绝对路径/相对路径)

                                (如路径含有空格需用双引号括起) 

    示例
    以下例子可直接填入专业版的 编辑命令 对话框中:

    如果使用快捷方式、命令行窗口或脚本等方式进行外部调用,需在每条命令前面加上可执行程序的名字或路径,参考调用方法。
    [静默] 表示该命令将在后台自动完成,不需要任何用户交互。
    snip -o clipboard
    截屏,在选区确定后自动将截图复制到剪贴板
    snip --last -o clipboard
    对上一次的截图区域进行截图并复制 [静默]
    snip --full -o clipboard
    复制全屏截图 [静默]
    snip --shadow --active-window -o clipboard
    对当前窗口进行截图,添加阴影后复制 [静默] [专业版]
    snip -o d:\123.png;exec(d:\ocr.exe d:\123.png)
    开始截屏,在选区确定后将截图保存为 d:\123.png,并执行命令 d:\ocr.exe d:\123.png(请将 d:\ocr.exe 替换成你自己的外部程序的路径) [专业版]
    snip -o "d:\temp\source.png";exec(cmd /c "d:\Tesseract-OCR\tesseract.exe" "d:\temp\source.png" "d:\temp\ocr_res" -c preserve_interword_spaces=1 --oem 1 --psm 1 -l eng+chi_sim && notepad "d:\temp\ocr_res.txt")
    开始截屏,在选区确定后用本地 tesseract 程序识别选区中的文字,识别成功后用记事本显示文字内容 [专业版]

宝塔(BT Panel)是一款流行的服务器管理面板,它提供了易于使用的界面来管理 Web 服务器和其他服务。宝塔面板通常会搭配 Nginx 或 Apache 作为 Web 服务器。

获取真实 IP 的配置
对于 Nginx 或 Apache 服务器,正确配置以获取真实的客户端 IP 地址通常是重要的,特别是在使用负载均衡器或 CDN 时。通常,宝塔面板提供的默认配置可能不包括 real_ip 模块的配置,或者你可能需要手动进行设置。

Nginx 中使用 real_ip 模块
如果你的宝塔面板使用的是 Nginx,你可以检查和配置 real_ip 模块来确保获取真实的客户端 IP 地址。以下是一些可能的配置步骤:

检查 Nginx 配置:

打开宝塔面板,进入 Nginx 配置文件编辑界面(通常在 /www/server/nginx/conf/nginx.conf 或者相应虚拟主机配置文件中)。
添加 real_ip 模块配置:

在 http 块中添加 real_ip 模块的相关配置。例如:

http {
    # 设置信任的代理 IP
    set_real_ip_from 192.168.1.0/24;  # 替换为你的代理 IP 范围
    set_real_ip_from 10.0.0.0/8;

    # 指定真实 IP 所在的请求头
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;

    # 其他配置...
}

保存配置并重启 Nginx:

保存配置文件,然后重启 Nginx 以使配置生效。

sh
service nginx restart

Apache 中获取真实 IP
如果宝塔面板使用的是 Apache,你可能需要配置 mod_remoteip 模块来处理真实 IP 地址的获取。以下是 Apache 的配置步骤:

启用 mod_remoteip 模块:

确保 mod_remoteip 模块已启用。通常,可以通过宝塔面板或直接在 Apache 的配置文件中启用。
配置 mod_remoteip:

编辑 Apache 的配置文件(例如 httpd.conf 或相应的虚拟主机配置文件),添加如下配置:

<IfModule mod_remoteip.c>
    RemoteIPHeader X-Forwarded-For
    RemoteIPTrustedProxy 192.168.1.0/24  # 替换为你的代理 IP 范围
    RemoteIPTrustedProxy 10.0.0.0/8
</IfModule>

保存配置并重启 Apache:

保存配置文件,然后重启 Apache 以使配置生效。

sh
service apache2 restart

总结
宝塔面板的默认配置可能不包含获取真实 IP 地址的详细配置,尤其是在使用代理服务器或负载均衡器的情况下。你可能需要手动添加 real_ip 模块(对于 Nginx)或 mod_remoteip 模块(对于 Apache)的配置,以确保准确地记录和处理客户端的真实 IP 地址。

user  www www;
worker_processes auto;
error_log  /www/wwwlogs/nginx_error.log  crit;
pid        /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;

events
    {
        use epoll;
        worker_connections 65535;
        multi_accept on;
    }

http
    {
        include       mime.types;

        include proxy.conf;
        # proxy.conf匹配如下:
proxy_temp_path /www/server/nginx/proxy_temp_dir;
proxy_cache_path /www/server/nginx/proxy_cache_dir levels=1:2 keys_zone=cache_one:20m inactive=1d max_size=5g;
client_body_buffer_size 25m;
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 60;
proxy_buffer_size 32k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_cache cache_one;

        default_type  application/octet-stream;

        server_names_hash_bucket_size 512;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 50m;

        sendfile   on;
        tcp_nopush on;
        keepalive_timeout 60;
        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 256k;
        fastcgi_intercept_errors on;

        gzip on;
        gzip_min_length 1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
        gzip_vary on;
        gzip_proxied   expired no-cache no-store private auth;
        gzip_disable   "MSIE [1-6]\.";
        # 限流匹配,注意使用IP限流时,要使用real_ip模块获取用户真实IP地址,以免CDN被整体限流
        limit_conn_zone $binary_remote_addr zone=perip:10m;
        limit_conn_zone $server_name zone=perserver:10m;
  
        server_tokens off;
        access_log off;

server
    {
...
# 限流匹配
    limit_conn perserver 300;
    limit_conn perip 25;
    limit_rate 512k;

    ssl_certificate    /www/fullchain.pem;
    ssl_certificate_key    /www/privkey.pem;
    ssl_protocols TLSv1.1 TLSv1.2;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
...
}
}

event段:
这段配置是用来优化 Nginx 的性能和并发处理能力的。它位于 events 块中,主要用于控制 Nginx 处理连接的方式。下面是各项配置的作用:

use epoll;: 指定 Nginx 使用 epoll 作为事件处理机制。这是一种高效的 I/O 多路复用技术,适用于 Linux 系统,可以处理大量的并发连接。相比于其他事件处理机制(如 select 和 poll),epoll 在处理大量并发连接时性能更好。

worker_connections 65535;: 设置每个 Nginx 工作进程可以同时处理的最大连接数。这个值决定了单个工作进程的最大并发连接数。设置为 65535 表示每个工作进程可以处理最多 65535 个连接。这对于高流量网站或需要处理大量并发请求的场景很有用。

multi_accept on;: 允许 Nginx 在每个事件循环中接受多个连接。默认情况下,Nginx 每次事件循环只接受一个新连接。启用 multi_accept 可以让 Nginx 更高效地处理新连接,尤其是在高并发的环境中,这有助于减少延迟和提高处理能力。

总的来说,这些设置旨在提高 Nginx 的并发处理能力和性能,特别是在高负载和高并发的环境中。

http 段:
这些配置项用于优化 Nginx 的性能,特别是在处理文件传输和保持长连接方面:

sendfile on;: 启用 sendfile 系统调用,允许 Nginx 直接在文件系统中将文件传输到网络套接字,而无需将数据从内核空间拷贝到用户空间。这可以提高文件传输的效率,减少 CPU 使用率。

tcp_nopush on;: 在使用 sendfile 时,启用 TCP_NOPUSH 标志,直到整个文件数据准备好再发送。这有助于减少小数据包的发送,优化大文件的传输性能。

keepalive_timeout 60;: 设置保持连接的超时时间为 60 秒。这意味着在客户端与服务器之间保持持久连接的时间。如果客户端在 60 秒内没有发送新请求,连接将被关闭。这有助于减少建立和拆除连接的开销,同时避免长时间保持闲置连接。

tcp_nodelay on;: 启用 TCP_NODELAY 标志,禁用 Nagle 算法。Nagle 算法会延迟小的数据包的发送以减少网络拥塞,但启用 TCP_NODELAY 可以确保数据包立即发送,从而减少延迟,适合需要快速响应的应用场景。

这些设置有助于提高文件传输的效率、减少延迟,并优化长期连接的性能。

真实IP获取:real_ip模块
https://blog.qqvbc.com/default/1101.html

nginx使用limit_req模块
nginx使用limit_req模块时,如果使用CDN的话,能按真实的用户IP来限流吗?如果使用的是CDN的IP,从而把CDN直接限流了,影响正常访问:

http_limit_req 模块文档:
https://nginx.org/en/docs/http/ngx_http_limit_req_module.html

limit_req 模块配置实例:

http {

        limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn_zone $server_name zone=perserver:10m;

server {
...
    limit_conn perserver 300;
    limit_conn perip 25;
    limit_rate 512k;

...
}

}

在使用 Nginx 的 limit_req 模块时,如果你使用了 CDN,默认情况下限流是基于 CDN 的 IP 地址的,而不是真实用户的 IP 地址。这是因为 CDN 会将请求转发到你的 Nginx 服务器时,源 IP 地址通常是 CDN 的 IP。

要按真实用户 IP 限流,你需要配置 Nginx 以正确识别用户的真实 IP 地址。通常,这可以通过设置 real_ip 模块来实现。你需要确保 Nginx 从 CDN 请求头(如 X-Forwarded-For 或 X-Real-IP)中提取真实用户 IP 地址,并将其用于限流。

http_realip 模块文档:
https://nginx.org/en/docs/http/ngx_http_realip_module.html
确保nginx有这个模块,查看命令(包含有 --with-http_realip_module 字样):

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.1.1g  21 Apr 2020
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/www/server/nginx --add-module=srclib/ngx_devel_kit --add-module=srclib/lua_nginx_module --add-module=srclib/ngx_cache_purge --add-module=srclib/nginx-sticky-module --with-openssl=srclib/openssl --with-pcre=srclib/pcre-8.43 --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-cc-opt=-Wno-error --with-http_dav_module --add-module=srclib/nginx-dav-ext-module

示例配置

set_real_ip_from  192.168.1.0/24;
set_real_ip_from  192.168.2.1;
set_real_ip_from  2001:0db8::/32;
real_ip_header    X-Forwarded-For;
real_ip_recursive on;

匹配项说明:

  • set_real_ip_from 指定了哪些 IP 地址可以作为信任的代理来源,通常可以设置为 CDN 提供的 IP 范围。 0.0.0.0/0; # 允许所有 IP 的 CDN 代理
  • real_ip_header 设置了使用哪个请求头来获取真实 IP 地址。
  • real_ip_recursive 使 Nginx 从请求头链中递归提取真实 IP 地址。

嵌入变量
$realip_remote_addr
保留原始客户端地址 (1.9.7)
$realip_remote_port
保留原始客户端端口 (1.11.0)

常见配置实例:

http {
    # 信任的代理 IP 范围
    set_real_ip_from 192.168.0.0/24;  # 负载均衡器或 CDN 的 IP 范围
    set_real_ip_from 10.0.0.0/8;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;

    server {
        location / {
            # 其他配置
        }
    }
}

当使用 real_ip 模块时,$remote_addr 变量将反映真实的客户端 IP 地址,而不是中间代理或负载均衡器的 IP 地址。这是因为 real_ip 模块会根据你配置的规则修改 $remote_addr 变量的值。

**如何工作**
没有代理的情况: $remote_addr 直接表示客户端的 IP 地址,无需 real_ip 模块的干预。

有代理或 CDN 的情况: 当你配置了 real_ip 模块并正确设置了信任的代理 IP 地址和请求头(如 X-Forwarded-For),Nginx 会从这些请求头中提取真实的客户端 IP 地址,并将其赋值给 $remote_addr。这使得 $remote_addr 始终反映真实的客户端 IP,而不是代理或负载均衡器的 IP。
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;

另一种得到真实IP的方法

  map $http_x_forwarded_for  $clientRealIp {
                ""      $remote_addr;
                ~^(?P<firstAddr>[0-9\.]+),?.*$  $firstAddr;
        }

$clientRealIp就得到了真实IP