Justin's Blog


  • Home

  • Archives

  • Tags

国内部署jenkins

Posted on 2023-12-03

下载/安装

这里我们使用的是离线包方式安装 https://www.cnblogs.com/xuwujing/p/15725595.html。

官网镜像地址: https://mirrors.jenkins.io/
下载地址: https://jenkins.io/download/
华为镜像地址: https://mirrors.huaweicloud.com/home

直接下载war包,并安装好jdk之后,输入:nohup java -jar jenkins.war –httpPort=8888 &

部署过程碰见问题,卡住在安装路径

upload successful

关闭jenkins服务, 并且修改服务

1
vim ~/.jenkins/hudson.model.UpdateCenter.xml

修改之前就不截图了。

修改之后是这个:

upload successful

重新启动服务器。 进入服务,等待一会

即可进入这个页面

upload successful

部署过程碰见问题,插件安装失败

#本机安装了Jenkins,但是安装插件时一直失败。更改 升级站点也不生效,究其原因是因为default.json中 插件下载地址还https://updates.jenkins.io,升级站点设置未生效。

#需要操作两个步骤 #1.进入 Manage Jenkins -》 Manage Plugin - > Advanced

最下面有 Update Site 设置为 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

致谢

摘抄 from 》 https://www.cnblogs.com/xuwujing/p/15725595.html
from 》 https://blog.csdn.net/qq_42767455/article/details/129204070
from 》 https://www.cnblogs.com/emma1325/p/15684769.html

Pychrom对接流云GPT代理

Posted on 2023-08-20 | In python

Python对接流云GPT代理

注册账号

upload successful

upload successful

查看余额

登录账号

upload successful

upload successful

代码Demo

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
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


import requests
import json

class ChatGPT:
DEFAULT_API_HOST = "https://liuyuncopilot.com/gateway/outer/"

def __init__(self, apiKey=None, token=None, apiHost=None, userId=None, timeout=30000):
self.apiKey = apiKey
self.token = token
self.apiHost = apiHost or self.DEFAULT_API_HOST
self.userId = userId
self.timeout = timeout

def chat_completion(self, chat_completion_data):
headers = {
'Content-Type': 'application/json'
}

data = {
'chatCompletionReq': chat_completion_data,
'personInfo': {
'userId': self.userId,
'token': self.token
}
}

response = requests.post(f"{self.apiHost}v1/chat/withoutStream", headers=headers, json=data, timeout=self.timeout)

if response.status_code != 200:
raise Exception(f"API call failed with error: {response.text}")

return response.json()

def chat(self, message):
messages = [{"role": "system", "content": message}]
chat_completion_data = {"messages": messages}
response = self.chat_completion(chat_completion_data)
return response.get("choices", [{}])[0].get("message", {}).get("content", "")


if __name__ == '__main__':
# listener = ConsoleStreamListener()

system_message = {"role": "system", "content": "你是一个大诗人,超级会写诗歌"}
message = {"role": "user", "content": "写一篇文章,不少于7000字,题目是:火锅!"}

chat_completion_data = {
"messages": [system_message, message],
"model": "gpt-3.5-turbo-16k"
}
# 替换成你的token
token ="sdf"
# 替换成你的userId
userId="cacd14c0f8aa11edaa9db83902c0"
chat_gpt = ChatGPT(apiKey="YOUR_API_KEY", token=token, userId=userId)

result = chat_gpt.chat_completion(chat_completion_data)
print(result)

# Here, I'm assuming that ConsoleStreamListener is another class or a module
# that you might define in your Python environment to handle the streaming operations.

upload successful

Java代码如何对接流云GPT代理

Posted on 2023-08-09 | In AD

对接流云GPT代理

如何对接流云代理平台呢? https://liuyuncopilot.com/

使用教程

1. 先导入jar包

先导入jar包, jar包地址: 蓝奏云 https://wwva.lanzouq.com/iz5pj14t3qla

2. 先上测试代码

upload successful

下面是Test代码。

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
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
67
68

package cn.minfengyu;


import com.plexpt.chatgpt.ChatGPT;
import com.plexpt.chatgpt.ChatGPTStream;
import com.plexpt.chatgpt.entity.chat.ChatCompletion;
import com.plexpt.chatgpt.entity.chat.Message;
import com.plexpt.chatgpt.listener.ConsoleStreamListener;

import java.util.Arrays;
import java.util.concurrent.CountDownLatch;

public class Test2 {
public static void main(String[] args) {
steream();
}


private static void steream() {
ConsoleStreamListener listener = new ConsoleStreamListener();

//指定角色
Message systemMessage = Message.of("你是一个大诗人,超级会写诗歌");
//指定消息
Message message = Message.of("写一篇文章,不少于7000字,题目是:火锅!");

//1. 构建消息模块
ChatCompletion chatCompletion = ChatCompletion.builder()
//插入消息
.messages(Arrays.asList(systemMessage,message))
//选择你需要聊天的模型
.model(ChatCompletion.Model.GPT_4.getName())
.build();

//2. 创建请求模块.
ChatGPTStream chatGPTStream=ChatGPTStream.builder()
//请求的超时时间:
.timeout(600)
//你的userID
.userId("sdf")
//你的 token
.token("sdf")
.build()
.init();

//如果你不需要流式输出,可以直接在这里接受到所有的消息
listener.setOnComplate((s)->{
System.out.println("消息完成之后会输出"+s);
});
//如果你需要流式输出,可以直接在这接收到每一次流式输出的消息。不需要的话,可以直接注释掉。
listener.setOnMessage((sdf)->{
System.out.println("收到消息时候会输出: "+sdf);
});


//3. 开始调用接口
chatGPTStream.streamChatCompletion(chatCompletion, listener);

//卡住测试
CountDownLatch countDownLatch = new CountDownLatch(1);
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

3. 效果图

upload successful

upload successful

注意事项

IDEA项目如何引入外部jar包

  1. 先在resouces 目录下新建一个lib目录

  2. 将jar包复制进去

  3. 右击jar包点击Add As Librare

upload successful

  1. 点击ok即可,出来下拉框即说明导入成功

upload successful

upload successful

maven项目如何打包外部jar包

除了 systemPath 保持一致,其他的全部乱填都可以

upload successful

1
2
3
4
5
6
7
8

<dependency>
<groupId>cn.wechat</groupId>
<artifactId>alipay-sdk</artifactId>
<version>20170829142630</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/chatgpt.jar</systemPath>
</dependency>

本地环境redis或者jedis频繁断开连接,timeout

Posted on 2023-07-18 | In redis

问题,Redis连接超时

记录些问题,这是之前碰见的bug,但是具有参考性,百度无法搜到。故此记录。

Redis 配置如下:

upload successful

redis,刚起动正常,但是不久之后,就直接报错,断开链接,报错如下。有时甚至无法启动。一开始以为是mac的兼容的问题,导致redis启动存在问题,但是在redis的仓库github上没有相关的关于redis兼容的issue推测是其他原因导致的,报错内容如下:

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
36
37
38
39
40
41
42
43
44
Caused by: org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:271)
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:454)
at org.springframework.data.redis.core.RedisConnectionUtils.fetchConnection(RedisConnectionUtils.java:193)
at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:144)
at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:105)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:393)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:373)
at org.springframework.data.redis.core.RedisTemplate.doWithKeys(RedisTemplate.java:785)
at org.springframework.data.redis.core.RedisTemplate.delete(RedisTemplate.java:588)
at cn.minfengyu.utils.RedisUtil.delete(RedisUtil.java:68)
at cn.minfengyu.system.config.AppStartupRunner.putRight(AppStartupRunner.java:38)
at cn.minfengyu.system.config.AppStartupRunner.run(AppStartupRunner.java:27)
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:760)
... 5 common frames omitted
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
at redis.clients.jedis.util.RedisInputStream.ensureFill(RedisInputStream.java:208)
at redis.clients.jedis.util.RedisInputStream.readByte(RedisInputStream.java:46)
at redis.clients.jedis.Protocol.process(Protocol.java:126)
at redis.clients.jedis.Protocol.read(Protocol.java:192)
at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:316)
at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:243)
at redis.clients.jedis.Connection.auth(Connection.java:372)
at redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:345)
at redis.clients.jedis.Connection.<init>(Connection.java:53)
at redis.clients.jedis.Jedis.<init>(Jedis.java:214)
at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:181)
at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:571)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:298)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:223)
at redis.clients.jedis.util.Pool.getResource(Pool.java:34)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:373)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:17)
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:262)
... 17 common frames omitted
Caused by: java.net.SocketTimeoutException: Read timed out
at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
at java.base/java.io.InputStream.read(InputStream.java:218)
at redis.clients.jedis.util.RedisInputStream.ensureFill(RedisInputStream.java:202)
... 34 common frames omitted

解决办法:

查了许久,发现是Redis连接用的是localhost域名,使用的是域名解析,而我开起了clash For windows客户端,导致域名解析匹配规则交给远端DNS服务器去解析了,远端DNS无法解析localhost域名导致连接失败的:

upload successful);

1. 修改localhost=》 127.0.0.1

upload successful

2. 关闭Clash for windows 客户端

3. 添加clash规则直接将localhost解析为127.0.01.

如何分析mac崩溃日志

Posted on 2023-07-18 | In MAC

Q1: M1 MAC又死机了什么鬼

众所周知周知,盗版软件是会导致mac死机的原因之一,尤其是M系列的芯片,本人在开始这便文章之前,希望各位小伙伴引我为鉴,远离盗版,拥抱正版软件。

由于各个盗版软件没有及时更新,导致系统总是因为盗版软件的原因陷入死机状态,那么如何排查出是哪个盗版软件导致系统陷入死机的呢?

具体情况: 系统死机(一开始是非常卡顿,如果不重启,过了大概几十分钟就死机),但是内存压力和CPU压力并不高,具体的图片如下,鼠标一直在转圈圈,无论点哪里都在转圈圈,但是鼠标可以移动:

upload successful

mac压力情况:

upload successful

upload successful

排查步骤

ps: 崩溃系统是 M1 系统是 Ventura 13.4.1

  1. 官网关于系统日志的说明;
    百度之后根据官网的步骤查看日志,发现并没有啥用,完全看不出来。

  2. 进入 /var/log/DiagnosticMessages 目录,找到你死机那个点的日期日志我的是07-18:

upload successful

左键双击这个日志,找到出错的时间点,在周围查最近一条的卡顿日志,大致的卡顿日志,主要如下:

upload successful

1
2
3
4
5
6
7
com.apple.message.domain: com.apple.crashreporter.writereport.hang #注意关注   
com.apple.message.signature: RAR Extractor - Unarchiver Pro
com.apple.message.signature2: com.ABabe.rarextractorstar ||| 6.3.7 (31) ((null))
com.apple.message.signature3: hang
com.apple.message.result: noop
com.apple.message.summarize: YES
SenderMachUUID: 83644D4E-7B94-31B8-BAE7-D19E2BE52233

com.apple.crashreporter.writereport.hang

“RAR Extractor - Unarchiver Pro”这个应用在运行过程中出现了挂起(hang)的问题。”Hang”通常指的是应用程序在运行过程中停止响应,通常是由于程序中的一些错误或系统资源的问题导致的。

我们可以发现从这里开始,再往下看日志,基本都是com.apple.crashreporter.writereport.hang 的日志,所以可以大概得出结论,这个盗版的软件就是导致系统崩溃的罪魁祸首,正版的就不会有这个问题了。

upload successful

接下来直接强制重启把这个软件卸载就可以了。

A1: 拒绝盗版,拥抱正版

fail2ban

Posted on 2023-07-17 | In fail2ban , 安全

fail2ban

upload successful

Fail2ban 是一款开源的、用于防止网络服务被暴力破解的软件。它可以监控系统日志文件,并寻找有恶意行为的迹象,比如太多的密码失败尝试、寻找系统漏洞等。一旦检测到这样的行为,Fail2ban 就会自动更新防火墙规则以阻止恶意 IP 地址的进一步访问,从而增加了服务器的安全性。

Fail2ban 的主要特性包括:

  1. 客户端/服务器架构:Fail2ban 有一个服务器和多个客户端。服务器负责监控日志文件和执行动作,客户端则负责向服务器发送命令。

  2. 多日志文件支持:Fail2ban 可以同时监控多个日志文件。

  3. 可配置的检测和封禁策略:Fail2ban 允许用户自定义规则,以匹配日志文件中的特定模式,并定义在检测到这些模式后应该执行的动作。

  4. 支持多种防火墙:Fail2ban 支持多种防火墙,包括 iptables、ipfw、pf 等。

  5. 邮件通知:Fail2ban 可以配置为在封禁 IP 或解封 IP 时发送邮件通知。

  6. 可扩展性:Fail2ban 允许用户编写自己的过滤器和动作,从而可以适应各种特定的需求。

Fail2ban 是一种有效的防止暴力破解的工具,它可以保护 SSH、FTP、SMTP、Apache 等多种服务。通过自动封禁恶意 IP,Fail2ban 可以显著提高服务器的安全性。

fail2ban的部署

摘抄自 其他博文

首先检查Firewalld是否启用

1
2
3
4
5
6
7
8
9
10
#如果您已经安装iptables建议先关闭
service iptables stop
#查看Firewalld状态
firewall-cmd --state
#启动firewalld
systemctl start firewalld
#设置开机启动
systemctl enable firewalld.service
#更新完配置记得重启
systemctl restart fail2ban

启用Firewalld后会禁止所有端口连接,因此请务必放行常用的端口,以免被阻挡在外,以下是放行SSH端口(22)示例,供参考:

1
2
3
4
5
6
#放行22端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
#重载配置
firewall-cmd --reload
#查看已放行端口
firewall-cmd --zone=public --list-ports
1
2
3
4
5
#CentOS内置源并未包含fail2ban,需要先安装epel源
yum -y install epel-release
#安装fial2ban
yum -y install fail2ban
安装成功后fail2ban配置文件位于/etc/fail2ban,其中jail.conf为主配置文件,相关的匹配规则位于filter.d目录,其它目录/文件一般很少用到,如果需要详细了解可自行搜索。

fail2ban中常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#启动
systemctl start fail2ban
#停止
systemctl stop fail2ban
#开机启动
systemctl enable fail2ban
#查看被ban IP,其中sshd为名称,比如上面的[wordpress]
fail2ban-client status sshd
#删除被ban IP
fail2ban-client set sshd delignoreip 192.168.111.111
#查看日志
tail /var/log/fail2ban.log
# 重启fail2ban使配置文件其生效-修改配置文件的时候记得重启
systemctl restart fail2ban

配置规则

新建jail.local来覆盖fail2ban的一些默认规则:

1
2
3
4
5
6
7
8
9
10
11
#新建配置
vi /etc/fail2ban/jail.local
#默认配置
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 86400
findtime = 600
maxretry = 5
#这里banaction必须用firewallcmd-ipset,这是fiewalll支持的关键,如果是用Iptables请不要这样填写
banaction = firewallcmd-ipset
action = %(action_mwl)s

ignoreip:IP白名单,白名单中的IP不会屏蔽,可填写多个以(,)分隔

bantime:屏蔽时间,单位为秒(s)

findtime:时间范围

maxretry:最大次数

banaction:屏蔽IP所使用的方法,上面使用firewalld屏蔽端口

防止SSH爆破

如果您还在使用默认SSH端口(22),可能每天都会被扫描,强烈建议先参考《Linux服务器之登录安全》加强服务器防护,或者可以使用fail2ban将恶意IP屏蔽。

继续修改jail.local这个配置文件,在后面追加如下内容:

1
2
3
4
5
6
[sshd]
enabled = true
filter = sshd
port = 22
action = %(action_mwl)s
logpath = /var/log/secure

[sshd]:名称,可以随便填写

filter:规则名称,必须填写位于filter.d目录里面的规则,sshd是fail2ban内置规则

port:对应的端口

action:采取的行动

logpath:需要监视的日志路径

到这一步,我们jail.local的规则看起来可能像下面这样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 86400
findtime = 600
maxretry = 5
banaction = firewallcmd-ipset
action = %(action_mwl)s
[sshd]
enabled = true
filter = sshd
port = 22
action = %(action_mwl)s
logpath = /var/log/secure

上面的配置意思是如果同一个IP,在10分钟内,如果连续超过5次错误,则使用Firewalld将他IP ban了。输入systemctl start fail2ban启动fail2ban来试试效果。

使用另一台服务器不断尝试连接SSH,并且不断的将密码输入错误,你会发现连续超过5次后直接连不上,说明IP被ban了,可以输入:fail2ban-client status sshd查看被ban的IP,如下截图。

upload successful

防止CC攻击

这里仅以Nginx为例,使用fail2ban来监视nginx日志,匹配短时间内频繁请求的IP,并使用firewalld将其IP屏蔽,达到CC防护的作用。

1
2
3
4
5
6
#需要先新建一个nginx日志匹配规则
vi /etc/fail2ban/filter.d/nginx-cc.conf
#填写如下内容
[Definition]
failregex = <HOST> -.*- .*HTTP/1.* .* .*$
ignoreregex =

继续修改jail.local追加如下内容:

1
2
3
4
5
6
7
8
9
[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /usr/local/nginx/logs/access.log #替换为nginx的日志地址

上面的配置意思是如果在60s内,同一IP达到20次请求,则将其IP ban 1小时,上面只是为了测试,请根据自己的实际情况修改。logpath为nginx日志路径。

防止Wordpress爆破

如果您经常分析日志会发现有大量机器人在扫描wordpress登录页面wp-login.php,虽然对方可能没成功,但是为了避免万一还是将他IP干掉为好。

需要先新建一个nginx日志匹配规则

vi /etc/fail2ban/filter.d/wordpress.conf

1
2
3
4
#填写如下内容
[Definition]
failregex = ^<HOST> -.* /wp-login.php.* HTTP/1\.."
ignoreregex =

继续修改jail.local追加如下内容:

1
2
3
4
5
6
7
8
9
[wordpress]
enabled = true
port = http,https
filter = wordpress
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /usr/local/nginx/logs/access.log #替换为nginx日志地址

当然,别忘记输入systemctl restart fail2ban重启fail2ban使其生效。

安全那些事

Posted on 2023-07-17 | In diary , 安全

Q1: 网站无法访问,疑似被爬虫打垮了。

Tips: 轻量级 2核4G 服务器。

今天本想访问下自己的网站,给他添加些新功能,结果发现,网站无法访问了。

upload successful

傻了!!啥问题,服务器崩了??

登录服务器,查看pm2 前端日志,没有问题,一切正常,服务也是在运行状态。

upload successful

惊了,查看nginx日志,果然发现问题了,居然有请求访问不存在的路径,我顿时就明白了,感情是安全实习生把我的服务器当靶场训练了,并且试图进入我的php数据库管理员和solr后管界面,但是可惜的是我的服务器只是简单的项目,并没有后管也没有使用这么复杂的技术,但是这么些请求就把我网站打垮了,不可思议。

upload successful

无论如何,要先控制他们的访问才是王道。这时候,我们就要推出一款比较优秀的防止爆破攻击的工具fail2ban了

A1: 重启前端服务,重启nginx,开启fail2ban

fail2ban

Fail2ban 是一款开源的、用于防止网络服务被暴力破解的软件。它可以监控系统日志文件,并寻找有恶意行为的迹象,比如太多的密码失败尝试、寻找系统漏洞等。一旦检测到这样的行为,Fail2ban 就会自动更新防火墙规则以阻止恶意 IP 地址的进一步访问,从而增加了服务器的安全性。它可以保护 SSH、FTP、SMTP、Apache 等多种服务。通过自动封禁恶意 IP,Fail2ban 可以显著提高服务器的安全性。

fail2ban 防止SSH口令爆破攻击

upload successful

fail2ban的安装,可以参考我的其他博文。

这次我们安装好之后,过了一会再查看日志,我们发现不止cc攻击还有,居然还有ssh口令爆破攻击,可以看见fail2ban可以帮我们屏蔽大部分ssh爆破攻击了,不愧是你:

ssh防止爆破配置

vim /etc/fail2ban/jail.local

添加一下内容

1
2
3
4
5
6
[sshd]
enabled = true
filter = sshd
port = 22
action = %(action_mwl)s #
logpath = /var/log/secure

重启fail2ban:

1
systemctl restart fail2ban

等待一会发现ssh爆破攻击日志

1
tail /var/log/fail2ban.log

upload successful

查看ssh禁用ip列表

1
fail2ban-client status sshd

upload successful

fail2ban防止cc攻击

要配置Fail2ban以在60秒内出现10次404或者400的错误时禁止IP,需要在Fail2ban的配置文件中创建一个新的过滤器和一个新的监视动作。以下是一个基本的步骤:

  1. 创建一个新的过滤器。在/etc/fail2ban/filter.d目录下创建一个新的文件,例如nginx-404.conf,并添加以下内容:
1
2
3
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD).*" (400|404) .*
ignoreregex =

这个正则表达式将匹配任何返回404或者400的状态码的GET|POST|HEAD请求。

  1. 在/etc/fail2ban/jail.local文件中创建一个新的监视动作。添加以下内容:
1
2
3
4
5
6
7
8
[nginx-404]
enabled = true
filter = nginx-404
action = iptables[name=HTTP, port=http, protocol=tcp]
logpath = /var/log/nginx/*access.log
maxretry = 10
findtime = 60
bantime = 600

logpath = /var/log/nginx/*access.log 用于匹配所有的nginx的配置文件。

这个配置将监视Nginx的访问日志,并在60秒内发现10次匹配的行为时,将IP地址添加到iptables的HTTP链中,禁止其访问10分钟。

  1. 保存你的更改并重启Fail2ban服务以应用新的配置:
1
sudo systemctl restart fail2ban

请注意,你可能需要根据你的系统和Nginx配置进行一些调整。例如,你可能需要更改logpath以匹配你的Nginx访问日志的实际位置。

Why HTTPS

Posted on 2023-07-14

为什么需要给网站加上HTTPS

HTTPS(Hypertext Transfer Protocol Secure ):超文本传输安全协议

给网站加上 HTTPS有以下几个主要的原因:

  1. 数据安全:HTTPS 使用 SSL/TLS 协议对数据进行加密,可以保护数据在传输过程中的安全,防止数据被窃取或篡改。这对于处理敏感信息(如信用卡信息、用户密码等)的网站来说尤其重要。

  2. 身份验证:HTTPS 协议需要网站使用一个经过认证的 SSL 证书。这个证书可以证明网站的身份,防止用户被钓鱼网站欺骗。

  3. SEO 优化:搜索引擎(如 Google)倾向于将使用 HTTPS 的网站排在更高的位置,因此使用 HTTPS 可以提高网站的 SEO 排名。

  4. 提高用户信任:现代浏览器会在地址栏显示使用 HTTPS 的网站的安全状态,这可以提高用户对网站的信任度。

  5. 满足某些功能的要求:某些 Web 功能(如 HTTP/2、Service Workers 等)需要网站使用 HTTPS。

因此,无论是出于安全考虑,还是出于提高用户体验和搜索排名的考虑,给网站加上 HTTPS 都是非常推荐的做法。

为什么HTTPS会比HTTP要安全

HTTP不安全的原因:

明文传输:HTTP协议中的数据是以明文形式传输的,这意味着如果有人能够截获这些数据(例如,通过网络嗅探或中间人攻击),他们就能直接读取和理解这些数据。这可能包括敏感信息,如密码、信用卡号等。

无身份验证:HTTP协议不提供服务端或客户端的身份验证。这意味着用户可能会与假冒的服务器进行通信,或者服务器可能会接收到假冒的客户端的数据。

HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)都是用于传输网页和其他数据的协议。它们的主要区别在于HTTPS使用了SSL/TLS协议来提供数据的加密和身份验证,而HTTP没有。

尤其在中间人攻击中,HTTP的脆弱性远比HTTPS拉垮。

为什么HTTPS安全

为了去了解为什么HTTPS相比HTTP安全,我们先来了解HTTPS的部署过程。

1. SSL证书的申请

我们先去找到全球上权威的CA(证书颁发机构),我们拿到我们的域名,去他那里申请一个SSL证书。

具体步骤如下:

SSL证书的申请过程需要提供一些关于你和你的网站的信息。具体需要的信息可能会根据证书颁发机构(CA)和证书类型的不同而不同,但通常会包括以下内容:

  1. 公钥:你需要生成一对公钥和私钥,并将公钥提交给CA。私钥需要你自己安全地存储,不能泄露给任何人。

  2. 域名:你需要提供你想要为其获取SSL证书的域名。CA会验证你对这个域名的所有权。

  3. 公司信息:如果你申请的是组织验证(OV)或扩展验证(EV)证书,你需要提供你的公司的详细信息,包括公司名称、地址、电话等。CA会验证这些信息的准确性。

  4. 联系信息:你需要提供一个联系人的信息,包括姓名、电子邮件、电话等。这个联系人应该能够回答CA关于证书申请的问题。

  5. 证书签名请求(CSR):CSR是一个包含了你的公钥和一些标识信息(如域名、组织名称等)的文件,你需要生成一个CSR并提交给CA。

以上是申请SSL证书通常需要的信息。在你提交这些信息后,CA会进行验证。如果验证成功,CA会签发一个SSL证书给你。这个证书包含了你的公钥和一些标识信息,以及CA的数字签名。你可以将这个证书安装到你的服务器上,以启用HTTPS。

2. 将SSL证书部署到服务器上

部署成功之后,我们就可以开启HTTPS协议了。 之后每次通信,都建立在HTTPS协议之上。

3. 安全的传输内容。

需要了解为什么内容安全,我们需要了解下握手的步骤,

upload successful

以下是详细步骤:

  1. 发起请求:客户端(例如,浏览器)向服务器发起HTTPS请求。

  2. 开始握手:客户端发送一个”Client Hello”消息给服务器,这个消息包含了客户端支持的SSL/TLS版本,加密套件列表(包含各种加密算法和哈希函数),以及一个随机生成的客户端随机数。

  3. 服务器响应:服务器回复一个”Server Hello”消息,选择一个客户端和服务器都支持的加密套件,以及一个随机生成的服务器随机数。服务器还会发送其SSL证书,该证书包含服务器的公钥。

  4. 验证证书:客户端接收到服务器的SSL证书后,会验证证书的有效性。这包括检查证书是否由受信任的证书颁发机构(CA)签发,证书是否在有效期内,以及证书的主题是否匹配服务器的地址。

  5. 生成预主密钥:如果证书有效,客户端会生成一个新的随机数,称为“预主密钥”。然后,客户端使用服务器的公钥对预主密钥进行加密,生成一个“Client Key Exchange”消息,并将其发送给服务器。

  6. 解密预主密钥:服务器接收到“Client Key Exchange”消息后,使用其私钥解密消息,得到预主密钥。

  7. 生成会话密钥:然后,客户端和服务器都使用客户端随机数,服务器随机数,和预主密钥来生成同样的会话密钥。这个会话密钥用于接下来的数据加密和解密。

  8. 加密通信:之后的所有通信都使用这个会话密钥进行加密和解密。因为只有客户端和服务器知道会话密钥,所以即使数据在传输过程中被拦截,攻击者也无法解密数据。并且SSL还提供了消息完整性检查的功能。每个消息都会附带一个由消息内容计算出的摘要(通过一个叫做 HMAC 的算法)。接收方可以通过这个摘要检查消息在传输过程中是否被篡改。

这就是HTTPS的加密和解密过程。需要注意的是,这个过程中的关键部分是使用服务器的公钥对预主密钥进行加密,这样只有服务器才能解密并得到预主密钥。这就保证了通信的安全性。

CA证书的验证

为什么要讲这个,因为从上图中我们可以看见服务器和客户端只有两个人在进行通信,那么客户端怎么会知道CA证书的合法性呢?这个就是为什么要求CA机构是世界级权威机构了。

我们来看客户端是如何验证CA证书的合法性:

在HTTPS握手过程中,客户端如何知道验证服务器的证书颁发机构(CA)是合法的,主要依赖于客户端(通常是浏览器)内置的受信任的根证书列表。

以下是详细步骤:

  1. 当客户端(例如,浏览器)接收到服务器的SSL/TLS证书时,证书中会包含签发该证书的证书颁发机构(CA)的信息。

  2. 客户端会在其内置的受信任的根证书列表中查找这个CA的根证书。这个列表包含了许多公认的、受信任的CA的根证书,例如VeriSign,DigiCert,Let’s Encrypt等。

  3. 如果客户端在其受信任的根证书列表中找到了对应的CA根证书,那么客户端就会认为这个CA是合法的。然后,客户端会使用这个根证书的公钥来验证服务器证书的数字签名。

  4. 如果数字签名验证通过,那么客户端就会认为服务器的证书是有效的,然后继续SSL/TLS握手过程。如果数字签名验证失败,或者客户端在其受信任的根证书列表中找不到对应的CA根证书,那么客户端就会认为服务器的证书是无效的,然后中断SSL/TLS握手过程,并通常会显示一个警告给用户。

需要注意的是,这个过程依赖于客户端的受信任的根证书列表,这个列表是由客户端(通常是浏览器厂商)维护的,并且会随着软件更新而更新。

NGINX部署SSL证书

Posted on 2023-07-13 | In diary

NGINX部署SSL证书

首先去申请SSL证书

例如免费的网站:

https://freessl.cn/

upload successful

upload successful

upload successful

以阿里云为例子:

upload successful

upload successful

upload successful

upload successful

upload successful

如果报错如下图请等待几分钟再点击验证:

upload successful

成功之后,点击下载:

upload successful

upload successful

解压下载之后的文件只有两个文件:

upload successful

还有一个步骤,需要复制证书内容,保存为 public.cert文件,全复制,有空格换行也不用管直接复制保存。

upload successful

现在我们就有三个文件了,我们只需要上传最后两个到服务器:

upload successful

upload successful

按照图片配置nginx 配置证书路径:

upload successful

具体配置如下:

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
36
37
38
39
server {
listen 80;
server_name 127.0.0.1 baidu.cn;# 换成你的域名
return 308 https://$host$request_uri;


access_log /www/wwwlogs/80_access.log;
error_log /www/wwwlogs/80_error.log;
}

server {
listen 443 ssl;

server_name 127.0.0.1 baidu.cn; # 换成你的域名

ssl_certificate /root/sslcert/public.cert; # 这里路径替换为你的证书文件路径
ssl_certificate_key /root/sslcert/private.key; # 这里路径替换为你的私钥文件路径


location / {
proxy_pass http://127.0.0.1:3000; #指定服务器的IP地址或域名:端口号;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache off;
proxy_cache_bypass $http_cache_control;
proxy_no_cache $http_cache_control;
}

location /gateway {
proxy_pass http://124.222.211.193:8087/gateway; #指定服务器的IP地址或域名:端口号;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 添加其他需要转发的请求头
}
access_log /www/wwwlogs/443_access.log;
error_log /www/wwwlogs/443_error.log;
}

接下来再重启nginx或者重载nginx配置。

再次访问我们的网站,发现ok了:

upload successful

Hard Work

Posted on 2023-07-12 | In 我的技术日志

Q1. 被告知,ChatGPT机器人回复Error,但是key池已经有了200key在轮训,昨日猜想是key太少了导致的轮训失败,昨日已经重新上线了,昨日断定不成立。

A1: 先问了一个简单问题,机器人回答很快, 再问了一个复杂问题,复现Error,

先上猜想架构图:

upload successful

应该是超时时间设置的较短,机器人设置的不是流式回答,ChatGPT官方回复的太慢了,导致超时了,调试,调试,确实如此,okhttp的读取流的超时时间设置为了30s,但是进行问题复问花了2分钟才回复。确定是超时问题。修改okhttp的读取超时时间。问题解决

upload successful

Q2. 今天VPN挂掉了,惊慌,ChatGPT没了,我=废物。

A2: wtf, 用了3个月都没问题, 咋突然挂了,重启x-ui没用!!! vpn服务器可以被ping通,但是无法使用,还是重新部署x-ui吧,换了个Vless协议,失败☹️,再次尝试,查看主板日志。好吧原来是ssl证书找不到,奇怪,我没有动过啊。再次部署,成功。

Q1+Q2搞了一下午😣。

Q3. prompts管理查询后段没有写.

WTF, 先撸一把原神吧!!!

Q4. Emergency 机器人报错—-无解的超时

???这个问题难道不是和第一个问题重复了吗?其实并没有。 两个是不同的问题,晚上上线的时候发现的,众所周知,每个python后段代码部署都有个环境变量文件 .env,由于.env有标志机器人的唯一性的字段,所以,各个机器人部署的时候.env 中有的环境需要单独进行部署。

起因: 在Q1中,就已经解决了,超时报错,但是在部署上服务器的时候,机器人再次超时报错,怀疑人生中…….

upload successful

处理经过: 我们已经在Q1中解决了超时的问题,为啥还会有问题呢,从架构图中不难看出,我首先想到的是: python代码到java代理的请求超时了。之前上线的时候没有处理这个问题是因为已经百度过了,连接时间只要低于21s,python代码的超时时间就由服务器来决定了,永远就不会超时了。我怀疑起了之前这句话的真确性。于是乎,timeout给上再次上线:

upload successful

还是Error,看服务端,在没有超过超时时间120s的时候,python代码就已经获取了Error,问题是服务端并没有返回结果?他是怎么自己中断的,我python代码的超时时间明明设置了600s啊。 失败,再次添加日志。再次上线,修改如下:

upload successful

upload successful

发现所有就算设置了600s的超时时间python代码还是在60s的时候自动断开连接。多次请求报错error

upload successful

upload successful

怀疑人生了。 问chatGPT:

upload successful

upload successful

upload successful

看不懂,难道是路由器设置的超时时间???阿里云这么坑爹吗?好吧没辙了。问大佬超时时间总是卡死在60s什么原因?:

upload successful

恍然大悟!!

修改前:

upload successful

修改后:

upload successful

解决。 完美收官!!修改最后的架构图

upload successful

总结,好吧,其实一开始gpt就给出答案了,服务端限制了超时,但问题是我上午已经解决了服务端的问题啊,完全没有想到nginx的问题,可以看出来太粗心了🥹。

12<i class="fa fa-angle-right"></i>
Justin Min

Justin Min

11 posts
9 categories
12 tags
GitHub
© 2023 Justin Min
Powered by Hexo
Theme - NexT.Muse