分类 linux 下的文章

因为阿里云和腾讯云调整了免费SSL证书政策从1年有效期改成90日。寻找替代方案,看到cloudflare提供15年的证书,但条件是要使用它们家的DNS/CDN服务。验证是在dns过程中接管的。

跟着别人分享的教程一步步操作下来,证书是申请好配置到位了。同时也出现了标题的问题。请求PHP的响应正确,但如果是静态资源 例如加载 js html css png之类浏览器就会报错 301 提示重定向次数过多。

网上搜了一圈基本在说的是 http强制绑定https,当用户访问http时自动重定向到https的情况,设置在nginx conf 的http的 server{} 部分。这显然和我的项目情况不同,我只配置了443 ssl服务。我并不需要约束http。也没有往nginx的方向去想。

以为是cloudflare这种形式的ssl的问题,一直在CF的设置上去研究。

最后实在被搞烦了...决定弃坑,部署个脚本在服务端每90日自动续签ssl。

发现还是一样的问题,php正常打开,html 提示重定向次数过多

脑子被轰了...回头检查 nginx 的 vhost 配置文件。在 443 server{} 的最底部发现这段东西


location / {
    return 301 https://$host$request_uri;
}

WTF?

搞什么飞机... 为什么lnmp会生成这样奇怪的配置。已经是443了还自己跳转给自己

注释之后...问题消除

还是不打算写具体的配置实现。懂的人给思路已经够了,不能助长抄作业。

备忘笔记补充一些安全事项。搭建反代之后发现不请自来了不少 扫描的爬虫,这些可能仅仅是无目的地试探系统漏洞的机器人。
产生日志如下

192.241.236.34 - - [06/Jun/2023:22:16:47 +0800] "GET /owa/auth/logon.aspx?url=https%3a%2f%2f1%2fecp%2f HTTP/1.1" 404 142 "-" "Mozilla/5.0 zgrab/0.x" "-"
138.68.249.116 - - [06/Jun/2023:22:27:38 +0800] "SSTP_DUPLEX_POST /sra_{BA195980-CD49-458b-9E23-C84EE0ADCD75}/ HTTP/1.1" 400 150 "-" "-" "-"
15.204.173.67 - - [06/Jun/2023:22:28:18 +0800] "GET / HTTP/1.1" 403 146 "-" "python-requests/2.25.1" "-"
162.243.128.23 - - [06/Jun/2023:22:32:48 +0800] "GET / HTTP/1.1" 403 146 "-" "Mozilla/5.0 zgrab/0.x" "-"

原本这也没什么,反正这台中继服务器上没有任何数据和有价值的东西。就算被黑了也没有损失。
唯一需要担心的是目前所有请求无差别甩给openAI的 API。
万一被这些爬虫乱搞或者无差别DDos的话,openAI溯源把这个机器IP给拉黑就不好了。

为了避免这种结果的发生,有必要对这些异常的请求全部进行拦截。
拦截的方法也很简单直接,GPT的API要求通过 HEADER Authorization 里附带 key。那么识别有效请求就从这里入手
增加一个访问规则在 vhost 对应 .conf 的 location /{} 里的最前面

上文略

location / {
    if ($http_authorization !~ "^Bearer ") {
        return 403; # 拒绝访问
    }

    # 其他配置
    {略}    
}

下文略

配置完 运行校验

lnmp nginx configtest

Test nginx configure files... nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

检查配置,没问题,重启服务(reload也可以)

lnmp nginx restart

跟踪日志效果如下,不是GPT的请求已经全部拦截了。

113.10.20.171 - - [06/Jun/2023:22:33:23 +0800] "GET / HTTP/2.0" 403 548 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"
113.10.20.171 - - [06/Jun/2023:22:33:24 +0800] "GET /favicon.ico HTTP/2.0" 403 548 "https://gpt.XXX.XXX/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"

完美!收工!

给客户搞了一台工控机,要求安全稳定还得不能沾任何盗版。 因业务需求比较单一就给灌了ubuntu 22
没想到试用了一下还挺顺手的,和win11的使用体验差距不大。

如果以后是纯工作用的机器。
单纯的 office全套加VSC之类敲代码 再配浏览器和媒体播放器,
不玩游戏不装steam 也不涉及网银就能满足需要的话。

搞这么一台似乎也不错。

真的觉得不错。
emmm~ 也可能是我错觉,当年我摸 mac mini 也有过这样的错觉,最后还是吃灰

OpenAI提供了billing相关的接口,用api key 查询账号的用量和额度。但统计数据是针对账号而不是key的,因此当一个账号有多个keys 的情况下无法分辨每个key用量的多少。这是定论,也是openai论坛呼声很高的一个需求。

How to track API usage and cost by API key?

既然有需求在,那么来解决一下。说下我的思路

我需要把API分开给不同的应用或者分享给不同的人,我需要知道他们分别的使用情况,有没有被滥用或闲置。

思路

  1. 搭建 Nginx反代,让所有的API请求经过这台代理。
  2. 通过 Nginx的访问日志捕获所有的请求,包括 key信息
  3. 对日志进行分析统计,统计key的请求数量和发送的信息量

额外地,还需要工具对apikey批量查询用量,这里用别人现成的

https://github.com/ClarenceDan/openai-billing

已知缺点和风险

  1. 需要在可控条件下才具备统计意义,如果APIKey被拿去在其他地方部署不经过代理,请求记录无法被捕获。
  2. 安全风险,key信息保存在日志和数据库中时,有泄露的风险。
  3. 用量计量不精准, 只能大概统计到使用频率。只有 用户->GPT单向请求(用户输入的信息量),但AI返回的信息量长度没有记录。

具体实现:

(还没写)

流水账,以下步骤均在 chatGPT指导下完成

  • 修改 nginx.conf 的 log_format 添加 header http authorization 信息
  • 启用 logrotate 服务对日志文件定期进行分卷(不然日志太大很难进行分析)
  • python脚本对分卷归档的日志文件做扫描分析,统计用量写入mysql
  • cronjob 定时执行python脚本(在logrorate 每次执行后)