神经蛙 http://hexo.sjava.cn/img/pic.png 分享科技与生活 2024-08-12T10:28:48.000Z http://hexo.sjava.cn/ 神经蛙 Hexo CentOS安装Nginx及其使用攻略 http://hexo.sjava.cn/posts/2.html 2024-08-12T10:28:48.000Z 2024-08-12T10:28:48.000Z Linux中nginx的安装

首先是系统环境:CentOS7,Nginx版本:1.62(如需其他版本自行到官网下载)

我安装参考的是菜鸟教程的安装方式,附链接:Nginx安装配置

下面是安装教程:

Nginx 安装

一、安装编译工具及库文件

1
yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel

二、首先要安装 PCRE

PCRE 作用是让 Nginx 支持 Rewrite 功能。

  1. 下载 PCRE 安装包,下载地址: http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
    1
    2
    [root@bogon src]# cd /usr/local/src/
    [root@bogon src]# wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
    image-1647245456603
  2. 解压安装包:
    1
    [root@bogon src]# tar zxvf pcre-8.35.tar.gz
  3. 进入安装包目录
    1
    [root@bogon src]# cd pcre-8.35
  4. 编译安装
    1
    2
    [root@bogon pcre-8.35]# ./configure
    [root@bogon pcre-8.35]# make && make install
  5. 查看pcre版本
    1
    [root@bogon pcre-8.35]# pcre-config --version
    image-1647245517484

    安装 Nginx

  6. 下载 Nginx,下载地址:https://nginx.org/en/download.html
    1
    2
    [root@bogon src]# cd /usr/local/src/
    [root@bogon src]# wget http://nginx.org/download/nginx-1.6.2.tar.gz
    image-1647245537740
  7. 解压安装包
    1
    [root@bogon src]# tar zxvf nginx-1.6.2.tar.gz
  8. 进入安装包目录
    1
    [root@bogon src]# cd nginx-1.6.2
  9. 编译安装
    1
    2
    3
    [root@bogon nginx-1.6.2]# ./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
    [root@bogon nginx-1.6.2]# make
    [root@bogon nginx-1.6.2]# make install
  10. 查看nginx版本
    1
    [root@bogon nginx-1.6.2]# /usr/local/webserver/nginx/sbin/nginx -v
    image-1647245608098
    到此,nginx安装完成。

Nginx 配置

  1. 创建 Nginx 运行使用的用户 www:
    1
    2
    [root@bogon conf]# /usr/sbin/groupadd www 
    [root@bogon conf]# /usr/sbin/useradd -g www www
  2. 配置nginx.conf ,将/usr/local/webserver/nginx/conf/nginx.conf替换为以下内容
    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
    69
    70
    71
    72
    73
    74
    75
    76
    [root@bogon conf]#  cat /usr/local/webserver/nginx/conf/nginx.conf

    user www www;
    worker_processes 2; #设置值和CPU核心数一致
    error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日志位置和日志级别
    pid /usr/local/webserver/nginx/nginx.pid;
    #Specifies the value for maximum file descriptors that can be opened by this process.
    worker_rlimit_nofile 65535;
    events
    {
    use epoll;
    worker_connections 65535;
    }
    http
    {
    include 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';

    #charset gb2312;

    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 8m;

    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 128k;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript text/css application/xml;
    gzip_vary on;

    #limit_zone crawler $binary_remote_addr 10m;
    #下面是server虚拟主机的配置
    server
    {
    listen 80;#监听端口
    server_name localhost;#域名
    index index.html index.htm index.php;
    root /usr/local/webserver/nginx/html;#站点目录
    location ~ .*\.(php|php5)?$
    {
    #fastcgi_pass unix:/tmp/php-cgi.sock;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi.conf;
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$
    {
    expires 30d;
    # access_log off;
    }
    location ~ .*\.(js|css)?$
    {
    expires 15d;
    # access_log off;
    }
    access_log off;
    }

    }
  3. 检查配置文件nginx.conf的正确性命令:
    1
    [root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx -t
    image-1647245666324

启动 Nginx

  1. Nginx 启动命令如下:
    1
    [root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx
    image-1647245699680

访问站点

  1. 从浏览器访问我们配置的站点ip:
    image-1647245716561

Linux中Nginx常用命令

1
2
3
4
5
6
7
8
9
10
11
查询Nginx端口号
ps -ef|grep nginx
从容停止nginx
kill - QUIT nginx 主进程号
停止Nginx的所有进程
pkill -9 nginx

/usr/local/webserver/nginx/sbin/nginx -s reload # 重新载入配置文件
/usr/local/webserver/nginx/sbin/nginx -s reopen # 重启 Nginx
/usr/local/webserver/nginx/sbin/nginx -s stop # 停止 Nginx
/usr/local/webserver/nginx/sbin/nginx #启动Nginx

Linux中nginx配置多个访问渠道

实用场景:两个Tomcat,通过域名Https访问

配置server针对性进行修改即可,下面代码中已有注释,不理解可以评论留言,看到会及时回复的

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
 server {
listen 443 ssl; #这个地方监听443 ssl不写可能会报错
server_name xxx.com; #这里填写自己的域名信息
ssl_certificate /usr/local/webserver/nginx/xxx.com.pem; # 指定证书的位置,绝对路径
ssl_certificate_key /usr/local/webserver/nginx/xxx.com.key; # 绝对路径,同上

ssl_session_timeout 5m;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
ssl_verify_client off;
# ssl_session_timeout 5m;
# ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
# ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
# ssl_prefer_server_ciphers on;

location /wss {
proxy_redirect off;
proxy_pass http://127.0.0.1:8888;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
proxy_read_timeout 60000s;
}
#下面的配置大同小异,基本就是制定项目的访问路径,照猫画虎即可。
location /mblog{
proxy_set_header Host $host;
proxy_pass http://127.0.0.1/mblog/;
client_max_body_size 200m;
proxy_set_header X-Forwarded-Proto $scheme;
#root html; #站点目录,绝对路径
# index index.html index.htm;
}
location /ry {
proxy_set_header Host $host;
proxy_pass http://127.0.0.1/ry;
client_max_body_size 200m;
proxy_set_header X-Forwarded-Proto $scheme;
#root html; #站点目录,绝对路径
# index index.html index.htm;
}


location /jeesite{
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080/jeesite/;
client_max_body_size 200m;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect http:// $scheme://;
}

#charset koi8-r;

#access_log logs/host.access.log main;


#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}

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
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
server {
listen 80;
server_name xxx.xx xxx1.xx;
charset utf-8;
if ($host = 'xxx.xx')
{
rewrite ^/(.*) https://xxx.xx/$1 permanent;
}
if ($host = 'xxx1.xx')
{
rewrite ^/(.*) https://xxx1.xx/$1 permanent;
}
return 301 https://$host$request_uri;

location / {
root html;
index index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

}
server {
listen 443 ssl;
server_name xxx1.xx;
ssl_certificate xxx; # 指定证书的位置,绝对路径
ssl_certificate_key xxx; # 绝对路径,同上

ssl_session_timeout 5m;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
ssl_verify_client off;
# ssl_session_timeout 5m;
# ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
# ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
# ssl_prefer_server_ciphers on;
location / {
#gzip_static on; # 静态压缩
add_header Cache-Control public,max-age=60,s-maxage=60; # 配置缓存
proxy_pass http://127.0.0.1:xxxx/;
proxy_set_header HOST $host;
client_max_body_size 200m;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location /upload/ {
access_log off;
# 域名白名单,去掉则阻止所有非本站请求
valid_referers none blocked server_names *.bbchin.com 127.0.0.1 localhost ~\.google\. ~\.baidu\. ~\.qq\.;
if ($invalid_referer) {
rewrite ^/ https://cdn.jsdelivr.net/gh/qinhua/cdn_assets/img/robber.jpg;
}
proxy_pass http://127.0.0.1:xxxx;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

}

server {
listen 443 ssl;
server_name xxx.xx;
ssl_certificate xxx; # 指定证书的位置,绝对路径
ssl_certificate_key xxx; # 绝对路径,同上

ssl_session_timeout 5m;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
ssl_verify_client off;
# ssl_session_timeout 5m;
# ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
# ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
# ssl_prefer_server_ciphers on;
location / {
#gzip_static on; # 静态压缩
add_header Cache-Control public,max-age=60,s-maxage=60; # 配置缓存
proxy_pass http://127.0.0.1:xxxx/;
proxy_set_header HOST $host;
client_max_body_size 200m;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /upload/ {
access_log off;
# 域名白名单,去掉则阻止所有非本站请求
valid_referers none blocked server_names *.bbchin.com 127.0.0.1 localhost ~\.google\. ~\.baidu\. ~\.qq\.;
if ($invalid_referer) {
rewrite ^/ https://cdn.jsdelivr.net/gh/qinhua/cdn_assets/img/robber.jpg;
}
proxy_pass http://127.0.0.1:xxxx;
}
}

Nginx中Https不跳转Http解决方法

在代理中配置如下指令

1
proxy_redirect http:// $scheme://;

以上指令会将后端响应header location内容中的http:替换成用户端协议https:。 NGINX访问https跳转到http的解决了~

]]>
<h2 id="Linux中nginx的安装"><a href="#Linux中nginx的安装" class="headerlink" title="Linux中nginx的安装"></a>Linux中nginx的安装</h2><p>首先是系统环境:CentOS7,Nginx版
CentOS安装记录之固定IP http://hexo.sjava.cn/posts/1.html 2024-07-18T13:50:48.000Z 2024-07-18T13:50:48.000Z 干货分享

安装完自己的CentOS系统之后,解决连接网络IP频繁变化的问题,在CentOS中设置固定的WiFi IP地址,通常需要编辑网络接口配置文件。以下是一个基于命令行的快速指南:(有线网络和这个操作也大差不差)

  1. 找到你的WiFi网络接口名称。
    1
    nmcli d
  2. 编辑对应的网络配置文件。假设你的WiFi接口名称是wlp3s0,运行:
    1
    sudo vi /etc/sysconfig/network-scripts/ifcfg-wlp3s0
  3. 修改或添加以下内容:
    1
    2
    3
    4
    5
    6
    7
    BOOTPROTO=static
    ONBOOT=yes
    IPADDR=你的固定IP地址
    NETMASK=你的子网掩码
    GATEWAY=你的默认网关
    DNS1=首选DNS服务器
    DNS2=备用DNS服务器
  4. 重启网络服务:
    1
    sudo systemctl restart network

    确保替换你的固定IP地址、你的子网掩码、你的默认网关、首选DNS服务器和备用DNS服务器为实际值。
    以下是一个配置文件的示例:

1
2
3
4
5
6
7
8
9
DEVICE=wlp3s0
TYPE=Wireless
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=8.8.4.4

保存文件并重启网络服务后,你的CentOS系统应该会使用新设置的静态IP地址连接到WiFi。

]]>
<h1 id="干货分享"><a href="#干货分享" class="headerlink" title="干货分享"></a>干货分享</h1><blockquote> <p>安装完自己的CentOS系统之后,解决连接网络IP频繁变化的问题,在CentOS中设置固定的WiF
CentOS安装记录之无线网卡 http://hexo.sjava.cn/posts/12318.html 2024-07-12T10:28:48.000Z 2024-07-12T10:28:48.000Z 干货分享

问题描述:自己刷了CentOS系统之后,重启之后无法自动连接WIFI,(PS:如果自己没有此项需求可以直接划走了~)所以需要做一个重启自动连接WIFI的功能,记录如下:

知道自己连接的WIFI名称以及WIFI密码

例如:
WIFI名称:Xiaomi_303
WIFI密码:303303303

要求自身CentOS有以下命令符号功能,没有的及时下载好。

1
2
3
4
5
yum
nmcli
vi/vim
NetworkManage

在CentOS上自动连接WiFi通常涉及使用nmcli(NetworkManager的命令行界面)或者编辑WPA配置文件。以下是使用nmcli的方法:

  1. 确定你的无线设备名称:
    1
    nmcli device

image.png

  1. 连接到WiFi网络,你需要知道网络的SSID(服务集标识符)和密码:
    1
    nmcli device wifi connect <SSID> password <password>

为了使连接在启动时自动完成,你可以创建一个systemd服务。

  1. 创建一个新的systemd服务文件:
1
sudo vim /etc/systemd/system/wifi-connect.service
  1. 添加以下内容到服务文件中:
1
2
3
4
5
6
7
8
9
10
[Unit]
Description=Connect to WiFi
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/nmcli device wifi connect <SSID> password <password>

[Install]
WantedBy=multi-user.target

替换为你的WiFi网络的实际名称和密码。

  1. 重新加载systemd以读取新的服务文件:
1
sudo systemctl daemon-reload
  1. 启用服务,使其在启动时运行:
1
sudo systemctl enable wifi-connect.service

现在,每次启动时,CentOS将会自动连接到指定的WiFi网络。请确保你的WiFi网络不会改变SSID或者密码,否则你需要编辑服务文件并重新启动服务。

]]>
<h1 id="干货分享"><a href="#干货分享" class="headerlink" title="干货分享"></a>干货分享</h1><blockquote> <p>问题描述:自己刷了CentOS系统之后,重启之后无法自动连接WIFI,(PS:如果自己没有此项需求
QQ 2023年度报告来了,看看谁最关心你 http://hexo.sjava.cn/posts/13763.html 2023-12-25T23:38:30.000Z 2023-12-25T23:38:26.000Z QQ 2023年度报告来了,看看谁最关心你
还有一周多时间就要告别2023年,迎来2024年了,各大互联网厂商最近在自家App中推出了年度总结、年度报告等,方便用户回顾一年使用App的情况。

日前,腾讯QQ正式上线2023年度报告,大家可在手机QQ中搜索“年度报告”

在报告中,用户能看到自己QQ的注册天数、今年共登录多少天、聊天最晚的时间、与多少好友聊过天,最爱用的表情、年度三大热聊好友,以及2023年新增好友数等信息。

你也快去看看自己的年度报告吧!~

]]>
<p>QQ 2023年度报告来了,看看谁最关心你<br>还有一周多时间就要告别2023年,迎来2024年了,各大互联网厂商最近在自家App中推出了年度总结、年度报告等,方便用户回顾一年使用App的情况。</p> <p>日前,腾讯QQ正式上线2023年度报告,大家可在手机QQ中搜索
Intellij IDEA激活码,IDEA稳定专属激活码 http://hexo.sjava.cn/posts/52072.html 2023-12-02T21:50:28.000Z 2023-12-02T21:50:32.000Z Intellij IDEA正版专属激活码领取(永久更新)

本教程最新更新时间: 2023年11月26日

下面激活码直接复制粘贴到activation code即可激活软件,如果是新的版本,换新激活码的时候code with me也要激活一次

下面是网页提供的正版激活,会给大家一直更新的,直接复制粘贴到activation code即可激活

更换新激活码的时候如果还显示suspended,用新激活码再激活一次即可

激活后如果显示key is invalid,这是因为你破解过软件的原因,请按如下操作
打开软件,help edit VM options ,删掉最下面一行的javaagent,重启软件即可
(如果是较新的版本Intellij IDEA和Code with me都要激活一次)

I2A0QUY8VU-eyJsaWNlbnNlSWQiOiJJMkEwUVVZOFZVIiwibGljZW5zZWVOYW1lIjoiVU5JVkVSU0lEQURFIEVTVEFEVUFMIERFIENBTVBJTkFTIiwiYXNzaWduZWVOYW1lIjoiVGFvYmFv77yaSkVU5YWo5a625qG25r+AIOa0u+W3peS9nOWupCAgcmVuIHpodW4gZGlhbiBtaW5n77yBIiwiYXNzaWduZWVFbWFpbCI6IlJvYmJ5X1dlbmlnZXJAb3V0bG9vay5jb20iLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiJGb3IgZWR1Y2F0aW9uYWwgdXNlIG9ubHkiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IkRQTiIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiREIiLCJwYWlkVXBUbyI6IjIwMjQtMTAtMTQiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlBTIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJJSSIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNDIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IkdPIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJETSIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNGIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IkRTIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJQQyIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUkMiLCJwYWlkVXBUbyI6IjIwMjQtMTAtMTQiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IkNMIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJXUyIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUkQiLCJwYWlkVXBUbyI6IjIwMjQtMTAtMTQiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJTMCIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUk0iLCJwYWlkVXBUbyI6IjIwMjQtMTAtMTQiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJTViIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJEQyIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNVIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJEUCIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQREIiLCJwYWlkVXBUbyI6IjIwMjQtMTAtMTQiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUFNJIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBDV01QIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlJTIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOnRydWV9XSwibWV0YWRhdGEiOiIwMTIwMjMxMDE4TFBBQTAwMjAwOSIsImhhc2giOiI1MDY4MjM4OC8yNDQxMzAzMDotMjMxNDI0MDkzIiwiZ3JhY2VQZXJpb2REYXlzIjo3LCJhdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlLCJpc0F1dG9Qcm9sb25nYXRlZCI6ZmFsc2V9-TVABo8WPqQXMBwop9hR4Jao5zPeU6ZWd/B4k0rUtT8YptqYZ0qcyA1w928ovkigORlHy4uIHKc75EmfkDc7V8jLUEyysKr3XGrJe/0ghkGtqTUaZ47SWiqm6TCR21PG2CtfByT0jZjw6AspsWqwyGmFeZAKfXkuAzmJ6psJOeZvaFn4qzzkjzCDdOGOdUXPEPdkG1t4a+rxgt4Ly06yEcpFpy87mx5SO/F9sus2/ZHnVCISqRQBil8hvYsQKP9TScHjyGe6I9KhRofs2SuUHe3+Wh5cSTQH4wy6mJZP+7ImX76BnOqjPWOh4sJwUJ+I+IfjOV4iG5bu25YNV9DF2eA==-MIIETDCCAjSgAwIBAgIBDzANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTIyMTAxMDE2MDU0NFoXDTI0MTAxMTE2MDU0NFowHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyMjEwMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC/W3uCpU5M2y48rUR/3fFR6y4xj1nOm3rIuGp2brELVGzdgK2BezjnDXpAxVDw5657hBkAUMoyByiDs2MgmVi9IcqdAwpk988/Daaajq9xuU1of59jH9eQ9c3BmsEtdA4boN3VpenYKATwmpKYkJKVc07ZKoXL6kSyZuF7Jq7HoQZcclChbF75QJPGbri3cw9vDk/e46kuzfwpGftvl6+vKibpInO6Dv0ocwImDbOutyZC7E+BwpEm1TJZW4XovMBegHhWC04cJvpH1u98xoR94ichw0jKhdppywARe43rGU96163RckIuFmFDQKZV9SMUrwpQFu4Z2D5yTNqnlLRfAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQU5FZqQ4gnVc+inIeZF+o3ID+VhcEwSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBANLG1anEKid4W87vQkqWaQTkRtFKJ2GFtBeMhvLhIyM6Cg3FdQnMZr0qr9mlV0w289pf/+M14J7S7SgsfwxMJvFbw9gZlwHvhBl24N349GuthshGO9P9eKmNPgyTJzTtw6FedXrrHV99nC7spaY84e+DqfHGYOzMJDrg8xHDYLLHk5Q2z5TlrztXMbtLhjPKrc2+ZajFFshgE5eowfkutSYxeX8uA5czFNT1ZxmDwX1KIelbqhh6XkMQFJui8v8Eo396/sN3RAQSfvBd7Syhch2vlaMP4FAB11AlMKO2x/1hoKiHBU3oU3OKRTfoUTfy1uH3T+t03k1Qkr0dqgHLxiv6QU5WrarR9tx/dapqbsSmrYapmJ7S5+ghc4FTWxXJB1cjJRh3X+gwJIHjOVW+5ZVqXTG2s2Jwi2daDt6XYeigxgL2SlQpeL5kvXNCcuSJurJVcRZFYUkzVv85XfDauqGxYqaehPcK2TzmcXOUWPfxQxLJd2TrqSiO+mseqqkNTb3ZDiYS/ZqdQoGYIUwJqXo+EDgqlmuWUhkWwCkyo4rtTZeAj+nP00v3n8JmXtO30Fip+lxpfsVR3tO1hk4Vi2kmVjXyRkW2G7D7WAVt+91ahFoSeRWlKyb4KcvGvwUaa43fWLem2hyI4di2pZdr3fcYJ3xvL5ejL3m14bKsfoOv

N5ZD3FF9AY-eyJsaWNlbnNlSWQiOiJONVpEM0ZGOUFZIiwibGljZW5zZWVOYW1lIjoiSmV0QnJhaW4gQ29kZSIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IkRQTiIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJEQiIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJQUyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJJSSIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJSU0MiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTA1IiwicGFpZFVwVG8iOiIyMDI0LTAzLTA0In0seyJjb2RlIjoiR08iLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTA1IiwicGFpZFVwVG8iOiIyMDI0LTAzLTA0In0seyJjb2RlIjoiRE0iLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTA1IiwicGFpZFVwVG8iOiIyMDI0LTAzLTA0In0seyJjb2RlIjoiUlNGIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IkRTIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IlBDIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IlJDIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IkNMIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IldTIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IlJEIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IlJTMCIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJSTSIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJBQyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMTItMzEiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJSU1YiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTA1IiwicGFpZFVwVG8iOiIyMDI0LTAzLTA0In0seyJjb2RlIjoiREMiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTA1IiwicGFpZFVwVG8iOiIyMDI0LTAzLTA0In0seyJjb2RlIjoiUlNVIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IkRQIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IlBEQiIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJQV1MiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTEyLTMxIiwicGFpZFVwVG8iOiIyMDI0LTAzLTA0In0seyJjb2RlIjoiUFNJIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0xMi0zMSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IlBQUyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJQQ1dNUCIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IlBHTyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJQUEMiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTA1IiwicGFpZFVwVG8iOiIyMDI0LTAzLTA0In0seyJjb2RlIjoiUFJCIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IlBTVyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMTItMzEiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJSUyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifV0sImhhc2giOiI0MzU2MTExOS8wOi0xMDcyMjgwMjg0IiwiZ3JhY2VQZXJpb2REYXlzIjo3LCJhdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlLCJpc0F1dG9Qcm9sb25nYXRlZCI6ZmFsc2V9-cfV+swGZjRdoCV47ddNRcv0m6p10Kc1Qg487903TUcjT6b7chh2byiKPWJ9cqhD5C/voMsuarPV4GdQ3qIfNQov79mImkvajQD1jBCJL7ISDlvUsHZeMGkLL90g0nW2Xeov3NcUj2wgiO9GydcHPLzuvakze0ZNQ6d1181iNwghxgM4CdbPoW4r0RFEn+op1ISdnJNCATGRcp3lfSoOP/Mye1wbJm3r8WGlU2Trs5cHK+Nu3/SzHdO8WzZp7GjW2aTqTJSh4OKmHm1dA9ZULTRatWjLJY3i3lEzqECyNBm7Lty9o4i4uhRBhj583kMyOAzIEDyFUdVC9CWPHxu0lJA==-MIIETDCCAjSgAwIBAgIBDzANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTIyMTAxMDE2MDU0NFoXDTI0MTAxMTE2MDU0NFowHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyMjEwMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC/W3uCpU5M2y48rUR/3fFR6y4xj1nOm3rIuGp2brELVGzdgK2BezjnDXpAxVDw5657hBkAUMoyByiDs2MgmVi9IcqdAwpk988/Daaajq9xuU1of59jH9eQ9c3BmsEtdA4boN3VpenYKATwmpKYkJKVc07ZKoXL6kSyZuF7Jq7HoQZcclChbF75QJPGbri3cw9vDk/e46kuzfwpGftvl6+vKibpInO6Dv0ocwImDbOutyZC7E+BwpEm1TJZW4XovMBegHhWC04cJvpH1u98xoR94ichw0jKhdppywARe43rGU96163RckIuFmFDQKZV9SMUrwpQFu4Z2D5yTNqnlLRfAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQU5FZqQ4gnVc+inIeZF+o3ID+VhcEwSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBANLG1anEKid4W87vQkqWaQTkRtFKJ2GFtBeMhvLhIyM6Cg3FdQnMZr0qr9mlV0w289pf/+M14J7S7SgsfwxMJvFbw9gZlwHvhBl24N349GuthshGO9P9eKmNPgyTJzTtw6FedXrrHV99nC7spaY84e+DqfHGYOzMJDrg8xHDYLLHk5Q2z5TlrztXMbtLhjPKrc2+ZajFFshgE5eowfkutSYxeX8uA5czFNT1ZxmDwX1KIelbqhh6XkMQFJui8v8Eo396/sN3RAQSfvBd7Syhch2vlaMP4FAB11AlMKO2x/1hoKiHBU3oU3OKRTfoUTfy1uH3T+t03k1Qkr0dqgHLxiv6QU5WrarR9tx/dapqbsSmrYapmJ7S5+ghc4FTWxXJB1cjJRh3X+gwJIHjOVW+5ZVqXTG2s2Jwi2daDt6XYeigxgL2SlQpeL5kvXNCcuSJurJVcRZFYUkzVv85XfDauqGxYqaehPcK2TzmcXOUWPfxQxLJd2TrqSiO+mseqqkNTb3ZDiYS/ZqdQoGYIUwJqXo+EDgqlmuWUhkWwCkyo4rtTZeAj+nP00v3n8JmXtO30Fip+lxpfsVR3tO1hk4Vi2kmVjXyRkW2G7D7WAVt+91ahFoSeRWlKyb4KcvGvwUaa43fWLem2hyI4di2pZdr3fcYJ3xvL5ejL3m14bKsfoOv

]]>
<h1 id="Intellij-IDEA正版专属激活码领取(永久更新)"><a href="#Intellij-IDEA正版专属激活码领取(永久更新)" class="headerlink" title="Intellij IDEA正版专属激活码领取(永久更新)"></a>In
宝塔面板开心破解版分享 http://hexo.sjava.cn/posts/42005.html 2023-11-11T16:50:37.000Z 2023-11-11T16:50:37.000Z 感谢大家使用该脚本,本脚本未加密,有没有后门大家自己看就知道了,仅仅将官方的脚本本地化了,未经任何修改,请放心使用!

本次脚本支持:Centos 7、Debian、Ubuntu、Fedora!

已安装(开心版):请在面板上点击 “更新” 或者 “修复” 升级到最新版

注意事项

问:为什么企业版没永久?
答:因为官方就没有永久呀,只有专业版有!
注意:每次更新 企业版授权 以更新日期为准保持 一年授权 (例如:2021.11.30 日更新 授权到期时间 2021.11.30 不要在有人问一年后到期了怎么办 每次更新 会以更新日期为准 保持一年授权)

注意:如果你是影视站用户,我不建议你使用本面板,众所周知,大部分的影视程序都是有广告 js,后门等,有些用户会认为是本面板导致,甚至有人抹黑本面板,所以建议你使用官方版,或者使用本面板之前先百度/Google 下影视站后门问题!!!

更新日志

2023-10-08

【增加】[首页-安全风险]增加检测报告
【增加】[网站-PHP项目]增加Nginx/Apache运行状态展示
【增加】[网站-Java/node/go/python/其他]项目端口新增检测验证和放行端口功能
【增加】[数据库-MySQL]增加MySQL运行状态展示
【增加】[日志-面板日志]增加面板IP操作统计功能
【增加】[计划任务]支持除MySQL外其它类型数据库备份
【增加】[计划任务]计划任务列表增加置顶功能
【增加】[计划任务]支持批量备份网站/数据库备份
【增加】[面板设置-临时访问授权]增加删除过期授权的功能
【增加】[软件商店-MySQL]新增二进制日志模块
【修复】[网站-Java项目/Node项目]在添加域名时出现检查错误的问题
【修复】[网站-Python项目]模块管理中安装模块报错的问题
【修复】[网站-Python项目]申请测试证书报错的问题
【修复】[数据库-PgSQL]修改远程服务器密码时未验证密码的正确性
【修复】[文件]点击分页报404错误
【修复】[软件商店-Apache]的keepalive参数不能修改问题
【修复】修复因gevent库无法使用导致面板无法访问的问题
【调整】新装宝塔面板系统防火墙规则列表添加默认规则
【调整】处理SSL为空时宝塔面板无法启动的问题
【调整】[文件]上传文件文件名长度调整为256个字节
【调整】[网站]备份时自动备份与手动备份保存路径一致
【优化】[数据库-MySQL]加载缓慢
【优化】[面板设置-告警通知]整合
【其他】修复已知Bug

2023-08-23

【增加】[首页-状态]增加告警设置功能
【增加】[首页-安全风险]增加系统漏洞扫描功能(暂不支持Debian系统)
【增加】[网站-php项目]新增批量设置伪静态功能
【增加】[网站-python项目]部署ssl功能
【增加】[计划任务]执行周期在十分钟以内,增加flock锁
【修复】[网站-node项目]开启外网映射报错的问题
【修复】[网站-Java项目]自定义日志路径不生效问题
【修复】[网站-python项目]管理建立uwsgi服务的项目时,未同步配置内容的问题
【修复】[文件]面板未删除超过15天的备份数据
【修复】[文件]部分情况下上传文件会报错
【修复】[文件]部分情况下解压压缩文件目录结构不正确
【修复】[文件]双击”计算“按钮,会自动进入文件夹
【修复】[文件]软链接的目标文件删除后,删除链接接不成功
【修复】[计划任务]自动备份不备份软链接的源文件的问题
【修复】[软件商店]因index.json文件异常导致软件商店点击已安装报错的问题
【调整】[首页-安全风险]移除SSH密码失效检查
【调整】[面板设置]设置临时授权添加删除过期授权的功能
【优化】[网站-php项目] 流量限制的限制方案显示
【其他】修复已知Bug

2025-09-29

【其他】更新安装命令

已安装宝塔官网(免费版):直接执行下面的 “Linux 面板 8.0.3 升级命令”

安装命令如下

1
2
3
4
5
Linux面板 8.0.3 升级企业版命令 1(7.9.10 官方版 / 7.9.8 开心版 可以执行这个升级到 8.0.3 开心版):
curl https://io.bt.sy/install/update_panel.sh|bash
Linux面板 8.0.3 升级企业版命令 2(7.9.10 官方版 / 7.9.8 开心版 可以执行这个升级到 8.0.3 开心版):
curl http://io.bt.sy/install/update6.sh|bash
二选一即可

更新安装命令

1
2
3
4
5
Linux面板 9.3.0 升级企业版命令 1(9.3.0 官方版 / 9.2.0 开心版 可以执行这个升级到 9.3.0 开心版):
curl https://io.bt.sy/install/update_panel.sh|bash
讲解:升级企业版命令 1 与 升级企业版命令 2 二选一 都可以升级最新版!
Linux面板 9.3.0 升级企业版命令 2(9.3.0 官方版 / 9.2.0 开心版 可以执行这个升级到 9.3.0 开心版):
curl http://io.bt.sy/install/update6.sh|bash

一键将非官方版本还原到官方最新版:

如果不想再用开心版了,就可以用下面的命令一键还原到官方的最新版本

1
curl http://download.bt.cn/install/update6.sh|bash

本站只做分享哈,不是作者。感谢您的来访,获取更多精彩文章请收藏本站。

]]>
<h2 id="感谢大家使用该脚本,本脚本未加密,有没有后门大家自己看就知道了,仅仅将官方的脚本本地化了,未经任何修改,请放心使用!"><a href="#感谢大家使用该脚本,本脚本未加密,有没有后门大家自己看就知道了,仅仅将官方的脚本本地化了,未经任何修改,请放心使用!" cl
可免费试用的ChatGPT方式分享 http://hexo.sjava.cn/posts/13113.html 2023-11-08T22:53:38.000Z 2023-11-08T22:53:43.000Z 基于此文章的第二个项目实现免费GPT的使用

免费试用教程(在搭建好ChatGPT-NEXT-Web的基础上)

能够正常访问的必要条件

  1. 设置3.5
  2. 设置Key:OPENAI_API_KEY:API key 点此获取,免费key,约60次/小时
  3. 设置访问地址:OPENAI_API_BASE_URL:https://api.chatanywhere.com.cn (国内选用这个)

在ChatGPT-NEXT-Web设置之后就可以正常访问了

image-1698992411778

对你有帮助的话记得分享给你的小伙伴哦~

]]>
<h1 id="基于此文章的第二个项目实现免费GPT的使用"><a href="#基于此文章的第二个项目实现免费GPT的使用" class="headerlink" title="基于此文章的第二个项目实现免费GPT的使用"></a>基于此文章的第二个项目实现免费GPT的使用</
阿里云服务器学生合集,赶快看过来!!! http://hexo.sjava.cn/posts/31839.html 2023-10-31T22:12:22.000Z 2023-11-20T02:01:28.000Z

本人只是对近期活动做了归纳总结方便小伙伴们按需购买,并无其他目的,请悉知。

阿里云一年一度11.11优惠

点击文字进行跳转:新老用户99买2C2G服务器地址,续费同价,最多可以买4年!

阿里云学生优惠合集

需要先认证学生

白嫖7个月服务器!!!用力戳这里!!! ::(花心)

操作步骤按照下面的图示链接走就可以了

  • 首先认证成功领取1个月服务器
    lp1b65we.png
  • 完成两个任务后领取6个月免费续约资格,直接0元续费即可获得一共7个月的服务器
    lp1b9ddz.png
    完成任务的同时还可以获得阿里云的证书一份,虽然本身没啥用,哈哈哈~
    lp1bcbxz.png

新人/老人均可99元续费同价2C2G3M服务器优惠 请用力戳这里!!! ::(哈哈)

99元续费同价2C2G3M活动规则,点击此处展开查看明细

活动时间
2023年10月31日0点0分0秒至2026年3月31日23点59分59秒;

活动对象
满足以下全部条件的阿里云用户:
1、阿里云注册会员用户;
2、完成阿里云企业认证或个人认证用户;
3、符合活动规则的新老用户,均可参与。

低价权益参与规则
1、活动范围:
购买指定配置“e实例2核2G 3M固定带宽 40G ESSD entry 系统盘”可享受包1年99元,活动地域包含北京,杭州,上海,张家口,呼和浩特,深圳,成都,河源,乌兰察布,广州。
2、活动说明:
同一用户,同一个时间内,只可保有一个参与“低价长效”优惠实例,到期后在活动时间范围内可持续以低价续费保有,另购使用官网价。本次优惠不可与优惠券叠加使用。

购买场景
1、新购场景:
在符合参与规则的情况下,直接低价购买指定配置产品,有效期1年。若无法购买,请确认是否存在同人或其他实例已占用等情况。
2、续费场景:
在活动时间内,指定配置每年最多可以以优惠价格续费1次,1次1年,直到活动时间结束持续享受续费优惠。
备注:若续费其他实例时使用了低价权益,原低价产品实例将无法再享受低价权益。
3、退订场景:
支持五天无理由退款,退款后保留“低价长效”优惠资格,在活动时间范围内可再次使用低价购买活动配置;
4、变配场景:
变配至“低价长效优惠”指定配置时当前付费周期不享受低价权益,续费时可享受包1年99元优惠;“低价长效优惠”指定配置发生变配/升级/降配操作后,变配需按照官网价补差价,请仔细阅读变配页面引导及相关资费说明,但仍占用权益资格直到该实例释放,购买相同规格产品不能再享受低价,同时续费时也不再享受包1年99元优惠;
5、如用户账号有欠费,需先补足欠费再进行购买。
6、低价权益产品仅供账号本人使用,不允许过户转让。
7、如在参与“低价长效”优惠过程中,使用其他收费产品/功能,则需按照产品/功能标准资费支付超额产生的费用。
8、其他规则:
阿里云有权根据业务需求,随时调整提供给用户低价购买的产品范围、产品数量、产品配置、购买规则等,用户应以购买时相关页面的展示内容为准,但不影响用户在活动规则调整前已经获得的权益。
禁止使用产品来挖掘货币,如您使用产品来挖掘货币,可能会被收取费用及取消权益资格。
为保证活动的公平公正,如用户在活动中存在隐瞒、虚构、作弊、欺诈或通过其他非正常手段规避活动规则、获取不当利益的行为,例如:作弊领取、恶意套现、网络攻击、虚假交易等,阿里云有权收回相关权益、取消用户的活动参与资格,撤销违规交易,必要时追究违规用户的法律责任。

相关名词及解释
1、“阿里云官网”,是指包含域名为 https://www.aliyun.com/ 的网站以及阿里云客户端,如APP,但阿里云国际站,包括alibabacloud.com以及所有下属页面和jp.aliyun.com以及所有下属页面除外。
2、“同一用户”,是指根据不同阿里云账号在注册、登录、使用中的关联信息,阿里云判断其实际为同一用户。关联信息举例:同一手机号、同一邮箱、同一证件等。
3、“同人账号”,是指同一用户拥有多个阿里云账号的,各个账号之间互为同人账号。
4、“新用户”,是指在阿里云官网没有收费云产品购买记录的阿里云会员用户。新用户在进行首次云产品购买行为时,也被称为“首购用户”。
5、“老用户”,是指在阿里云官网已有收费云产品购买记录的阿里云会员用户。
6、“云产品”,是指阿里云官网售卖的中国大陆节点的产品和服务,但不包括域名、虚拟主机、云市场产品、专有云产品,云通信产品。
7、“指定云产品”,是指某场具体活动页面列举的活动云产品。
8、活动中涉及“打折”、“折扣”、“×折”或“省××元”,是指将本活动期间的某款产品的活动价格,与无任何活动期间的相同产品的日常最小单位售价(例如:月价),按相同购买时长进行比较后,所获得的比较结果。
9、活动涉及的“划线价”、“日常价”,通常是指该产品曾经展示过的销售价,并非原价,仅供参考。具体活动页面单独对“划线价”、“日常价”进行说明的,以其表述为准。
10、除非有相反证据证明外,用户参与活动所获得的全部权益和相应责任,均归属于参与活动的该阿里云账号所对应的实名认证主体。
11、活动中的“天”、“日”、“工作日”等均指该日的0点至24点(北京时间)。
12、阿里云可以根据活动的实际情况对活动规则进行变动或调整,相关变动或调整将公布在活动页面上,并于公布时即时生效;但不影响用户在活动规则调整前已经获得的权益。您购买阿里云单项产品时,亦应遵守该产品法律服务协议。
13、活动页面提到的“核” ,均指vcpu。

新人1元注册域名 请猛戳这里

lp1d8dpd.png

更多活动请登录阿里云官网查看哈~

]]>
<div class="tip success"><p>本人只是对近期活动做了归纳总结方便小伙伴们按需购买,并无其他目的,请悉知。</p> </div> <h1 id="阿里云一年一度11-11优惠"><a href="#阿里云一年一度11-11优惠" class="header
宝塔Nginx免费防火墙拦截发布的文章的解决办法 http://hexo.sjava.cn/posts/41556.html 2023-09-27T20:31:01.000Z 2023-09-27T20:31:01.000Z 虽然很多大佬对于宝塔面板里的Nginx免费防火墙表示不屑,我承认它确实有些拉跨(但是毕竟免费的,也不好意思提什么要求),但是对于一名个人站长来说,买专业的防火墙不是很划算,这款免费网络防火墙最合适不过了,有一定的安全防护效果,也可以通过自定义让它好用。

描述问题

博主经常发的文章里都带有代码,开启了Nginx免费防火墙之后,发现被拦截了导致发布不出去。

您的请求带有不合法参数,已被网站管理员设置拦截!
可能原因:
您提交的内容包含危险的攻击请求

1

分析问题

查看Nginx防火墙后台看到如下信息
2

解决问题

  1. 如上图中有url加白,顾名思义就是把当前请求的URL加白名单,跳过这些校验。此方法可以解决本次提交保存不了的问题。
  2. 参考下图中的开关,针对性的把其中的校验关掉即可。
    3
]]>
<p>虽然很多大佬对于宝塔面板里的Nginx免费防火墙表示不屑,我承认它确实有些拉跨(但是毕竟免费的,也不好意思提什么要求),但是对于一名个人站长来说,买专业的防火墙不是很划算,这款免费网络防火墙最合适不过了,有一定的安全防护效果,也可以通过自定义让它好用。</p> <h2 id
SpringBoot项目集成QuartzJob任务 http://hexo.sjava.cn/posts/36354.html 2023-09-17T02:02:46.000Z 2023-09-17T02:02:50.000Z 场景描述

在项目的实际场景中,我们经常会遇到一些任务需要每天、每周、或者固定时间去执行,所以在项目中加入Quartz框架,来更好的对这些事情做管理,只需要配置任务对应的CORN表达式,添加到任务里面即可让他自动化的实现对任务的管理。

集成教程

1. 项目POM文件中引入依赖

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

2. 在项目application.properties中新增如下配置

注意:
1、如果需要quartz 第一次运行时自动生成 quartz 所需的表那么 quartzJob? 后面的配置为 :allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
待第一次运行后可以再根据自己的需要修改
2、配置文件中的 initialize-schema: always 配置的 always 属性意思是,每次初始化都会重新生成表(执行一次删除,执行一次创建),生成后,可以修改为 never
只有以上两个条件同时配置满足,才能使quartz 在第一次运行时,自动生成所需的表

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

# quartz定时任务,采用数据库方式 如果需要quartz 第一次运行时自动生成 quartz 所需的表那么 quartzJob? 后面的配置为 :allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
spring.quartz.job-store-type=jdbc
# ?配置文件中的 initialize-schema: always 配置的 always 属性意思是,每次初始化都会重新生成表(执行一次删除,执行一次创建),生成后,可以修改为 never
spring.quartz.jdbc.initialize-schema=never


# 时任务启动开关,true-开 false-关
spring.quartz.auto-startup=true
#??1???????
spring.quartz.startup-delay=1s

spring.quartz.overwrite-existing-jobs=true
# Quartz Scheduler Properties
spring.quartz.properties.org.quartz.scheduler.instanceName = MyScheduler
spring.quartz.properties.org.quartz.scheduler.instanceId = AUTO

spring.quartz.properties.org.quartz.jobStore.class = org.springframework.scheduling.quartz.LocalDataSourceJobStore
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# ??????
spring.quartz.properties.org.quartz.jobStore.tablePrefix = QRTZ_
spring.quartz.properties.org.quartz.jobStore.isClustered = true
spring.quartz.properties.org.quartz.jobStore.misfireThreshold = 12000
spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval = 15000

# ????????
spring.quartz.properties.org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
spring.quartz.properties.org.quartz.threadPool.threadCount = 1
spring.quartz.properties.org.quartz.threadPool.threadPriority = 5
spring.quartz.properties.org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

上面配置好之后,启动项目会直接在对应链接的数据库下生成11张默认的表,均是以QRTZ开头,如下图

数据表图

3. 在生成的表上我们还需要新增一张自己添加任务的配置表,具体如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE `sys_quartz_job` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`create_by` varchar(32) DEFAULT NULL COMMENT '创建人',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`del_flag` int(11) DEFAULT NULL COMMENT '删除状态',
`update_by` varchar(32) DEFAULT NULL COMMENT '修改人',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`job_class_name` varchar(255) DEFAULT NULL COMMENT '任务类名',
`cron_expression` varchar(255) DEFAULT NULL COMMENT 'cron表达式',
`parameter` varchar(255) DEFAULT NULL COMMENT '参数',
`meeting_record_id` int(11) DEFAULT NULL COMMENT '会议室记录id',
`description` varchar(255) DEFAULT NULL COMMENT '描述',
`status` int(11) DEFAULT NULL COMMENT '状态 0正常 -1停止',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

4. 添加代码,补充Quartz的功能

此处功能是可以实现对定时任务的管理,比如添加、删除、重新配置、立即执行定时任务等。

Controller类

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
// Controller类

/**
* @Description: 定时任务
*/
@RestController
@RequestMapping("/sys/quartzJob")
@Slf4j
@Api(tags = "定时任务接口")
public class QuartzJobController {
@Autowired
private QuartzJobService quartzJobService;
@Autowired
private Scheduler scheduler;

/**
* 分页列表查询
*
* @param quartzJob
* @param page
* @param pageSize
* @return
*/
@ApiOperation(value = "分页列表查询", notes = "分页列表查询")
@RequestMapping(value = "/list", method = RequestMethod.GET)
public ApiResult queryPageList(QuartzJob quartzJob, @RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "pageSize", defaultValue = "20") int pageSize) {
Page<QuartzJob> list = quartzJobService.selectList(quartzJob,page,pageSize);
ApiResult apiResult = new ApiResult();
if (CollectionUtils.isNotEmpty(list.getItems())){
apiResult.setData(list);
}
return ApiResult.ok("list",list);

}

/**
* 添加定时任务
*
* @param quartzJob
* @return
*/
//@RequiresRoles("admin")
@ApiOperation(value = "添加定时任务", notes = "添加定时任务")
@RequestMapping(value = "/add", method = RequestMethod.POST)
public ApiResult add(@RequestBody QuartzJob quartzJob) {
boolean b = quartzJobService.saveAndScheduleJob(quartzJob);
if (b == true) {
return ApiResult.ok("add");
}
return ApiResult.fail("add","添加定时任务失败");
}

/**
* 更新定时任务
*
* @param quartzJob
* @return
*/
//@RequiresRoles("admin")
@ApiOperation(value = "更新定时任务", notes = "更新定时任务")
@RequestMapping(value = "/edit", method ={RequestMethod.PUT, RequestMethod.POST})
public ApiResult eidt(@RequestBody QuartzJob quartzJob) {
try {
quartzJobService.editAndScheduleJob(quartzJob);
} catch (SchedulerException e) {
log.error(e.getMessage(),e);
return ApiResult.fail("edit","更新定时任务失败!");
}
return ApiResult.ok("edit");
}

/**
* 通过id删除
*
* @param id
* @return
*/
@ApiOperation(value = "通过id删除", notes = "通过id删除")
@RequestMapping(value = "/delete", method = RequestMethod.DELETE)
public ApiResult delete(@RequestParam(name = "id", required = true) String id) {
QuartzJob quartzJob = quartzJobService.getById(Long.valueOf(id));
if (quartzJob == null) {
return ApiResult.fail("delete","未找到对应实体");
}
quartzJobService.deleteAndStopJob(Long.valueOf(id));
return ApiResult.ok("delete");

}

/**
* 批量删除
*
* @param ids
* @return
*/
@ApiOperation(value = "批量删除", notes = "批量删除")
@RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE)
public ApiResult deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
if (ids == null || "".equals(ids.trim())) {
return ApiResult.fail("deleteBatch","参数不识别!");
}
for (String id : Arrays.asList(ids.split(","))) {
QuartzJob job = quartzJobService.getById(Long.valueOf(id));
quartzJobService.deleteAndStopJob(Long.valueOf(id));
}
return ApiResult.ok("deleteBatch");
}

/**
* 暂停定时任务
*
* @param id
* @return
*/
@GetMapping(value = "/pause")
@ApiOperation(value = "停止定时任务")
public ApiResult pauseJob(@RequestParam(name = "id") String id) {
QuartzJob job = quartzJobService.getById(Long.valueOf(id));
if (job == null) {
return ApiResult.fail("pause","定时任务不存在!");
}
quartzJobService.pause(job);
return ApiResult.ok("pause");
}

/**
* 启动定时任务
*
* @param id
* @return
*/
@GetMapping(value = "/resume")
@ApiOperation(value = "启动定时任务")
public ApiResult resumeJob(@RequestParam(name = "id") String id) {
QuartzJob job = quartzJobService.getById(Long.valueOf(id));
if (job == null) {
return ApiResult.fail("resume","定时任务不存在!");
}
quartzJobService.resumeJob(job);
//scheduler.resumeJob(JobKey.jobKey(job.getJobClassName().trim()));
return ApiResult.ok("resume");
}

/**
* 通过id查询
*
* @param id
* @return
*/
@ApiOperation(value = "通过id查询", notes = "通过id查询")
@RequestMapping(value = "/queryById", method = RequestMethod.GET)
public ApiResult queryById(@RequestParam(name = "id", required = true) String id) {
QuartzJob quartzJob = quartzJobService.getById(Long.valueOf(id));
ApiResult apiResult = new ApiResult();
apiResult.setData(quartzJob);
return apiResult;
}

/**
* 立即执行
* @param id
* @return
*/
@ApiOperation(value = "立即执行", notes = "立即执行")
@GetMapping("/execute")
public ApiResult execute(@RequestParam(name = "id", required = true) String id) {
QuartzJob quartzJob = quartzJobService.getById(Long.valueOf(id));
if (quartzJob == null) {
return ApiResult.fail("execute","未找到对应实体");
}
try {
quartzJobService.execute(quartzJob);
} catch (Exception e) {
//e.printStackTrace();
log.info("定时任务 立即执行失败>>"+e.getMessage());
return ApiResult.fail("execute","执行失败!");
}
return ApiResult.ok("execute");
}

}


Service类

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
@Service
@Slf4j
public class QuartzJobService{

@Resource
private QuartzJobMapper quartzJobMapper;
@Autowired
private Scheduler scheduler;

/**
* 立即执行的任务分组
*/
private static final String JOB_TEST_GROUP = "test_group";

public Page<QuartzJob> selectList(QuartzJob quartzJob, int page, int pageSize) {
Page<QuartzJob> pageQuartzJobVo = Page.create(page, pageSize);
Example example = new Example(QuartzJob.class);
Example.Criteria criteria = example.createCriteria();
if (!StringUtils.isEmpty(quartzJob.getJobClassName())) {
criteria.andLike("jobClassName","%"+ quartzJob.getJobClassName() +"%");
}
if (!StringUtils.isEmpty(quartzJob.getCronExpression())) {
criteria.andEqualTo("cronExpression", quartzJob.getCronExpression());
}
if (!StringUtils.isEmpty(quartzJob.getDescription())) {
criteria.andLike("", "%"+quartzJob.getDescription() +"%");
}
// 查询未删除的定时列表
criteria.andEqualTo("delFlag",CommonConstant.DEL_FLAG_0.getCode());
List<QuartzJob> quartzJobs = quartzJobMapper.selectByExample(example);
pageQuartzJobVo.setItems(quartzJobs);
pageQuartzJobVo.setTotalCount(quartzJobs.size());
return pageQuartzJobVo;
}

public boolean saveAndScheduleJob(QuartzJob quartzJob) {
// DB设置修改
quartzJob.setDelFlag(CommonConstant.DEL_FLAG_0.getCode());
boolean success = this.save(quartzJob);
if (success) {
if (CommonConstant.STATUS_NORMAL.getCode().equals(quartzJob.getStatus())) {
// 定时器添加
this.schedulerAdd(String.valueOf(quartzJob.getId()), quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter());
}
}
return success;
}

private boolean save(QuartzJob quartzJob) {
if (StringUtils.isEmpty(quartzJob.getCreateBy())){
quartzJob.setCreateBy("admin");
}
if (StringUtils.isEmpty(quartzJob.getCreateTime())){
quartzJob.setCreateTime(new Date());
}
int i = quartzJobMapper.insertSelective(quartzJob);
if (i == 1){
return true;
}
return false;
}

public void editAndScheduleJob(QuartzJob quartzJob) throws SchedulerException {
if (CommonConstant.STATUS_NORMAL.equals(quartzJob.getStatus())) {
schedulerDelete(quartzJob.getId());
schedulerAdd(String.valueOf(quartzJob.getId()), quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter());
}else{
scheduler.pauseJob(JobKey.jobKey(String.valueOf(quartzJob.getId())));
}
this.updateById(quartzJob);
}

private void updateById(QuartzJob quartzJob) {
QuartzJob q = new QuartzJob();
q.setId(quartzJob.getId());
if (!StringUtils.isEmpty(quartzJob.getCronExpression())){
q.setCronExpression(quartzJob.getCronExpression());
}
if (!StringUtils.isEmpty(quartzJob.getJobClassName())){
q.setJobClassName(quartzJob.getJobClassName());
}
if (!StringUtils.isEmpty(quartzJob.getDescription())){
q.setDescription(quartzJob.getDescription());
}
if (!StringUtils.isEmpty(quartzJob.getDelFlag())){
q.setDelFlag(quartzJob.getDelFlag());
}
if (!StringUtils.isEmpty(quartzJob.getStatus())){
q.setStatus(quartzJob.getStatus());
}
if (!StringUtils.isEmpty(quartzJob.getParameter())){
q.setParameter(quartzJob.getParameter());
}
q.setUpdateBy("admin");
q.setUpdateTime(new Date());
quartzJobMapper.updateByPrimaryKeySelective(q);
}

/**
* 添加定时任务
*
* @param jobClassName
* @param cronExpression
* @param parameter
*/
private void schedulerAdd(String id, String jobClassName, String cronExpression, String parameter) {
try {
// 启动调度器
scheduler.start();

// 构建job信息
JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass()).withIdentity(id).usingJobData("parameter", parameter).build();

// 表达式调度构建器(即任务执行的时间)
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);

// 按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(id).withSchedule(scheduleBuilder).build();

scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
throw new BusinessException("创建定时任务失败" + e);
} catch (RuntimeException e) {
throw new BusinessException(e.getMessage() + e);
}catch (Exception e) {
throw new BusinessException("后台找不到该类名:" + jobClassName + e);
}
}

/**
* (删除&停止)删除定时任务
*/
public boolean deleteAndStopJob(Long id) {
schedulerDelete(id);
QuartzJob quartzJob = new QuartzJob();
quartzJob.setId(id);
quartzJob.setDelFlag(CommonConstant.DEL_FLAG_1.getCode());
quartzJob.setStatus(CommonConstant.STATUS_UNNORMAL.getCode());
int i = quartzJobMapper.updateByPrimaryKeySelective(quartzJob);
if (i == 1){
return true;
}
return false;
}


/**
* 删除定时任务
*
* @param id
*/
private void schedulerDelete(Long id) {
try {
scheduler.pauseTrigger(TriggerKey.triggerKey(String.valueOf(id)));
scheduler.unscheduleJob(TriggerKey.triggerKey(String.valueOf(id)));
scheduler.deleteJob(JobKey.jobKey(String.valueOf(id)));
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new BusinessException("删除定时任务失败");
}
}

private static Job getClass(String classname) throws Exception {
Class<?> class1 = Class.forName(classname);
return (Job) class1.newInstance();
}


public QuartzJob getById(Long id) {
QuartzJob quartzJob = new QuartzJob();
quartzJob.setId(id);
quartzJob.setStatus(CommonConstant.STATUS_NORMAL.getCode());
QuartzJob quartzJob1 = quartzJobMapper.selectOne(quartzJob);
return quartzJob1;
}


public void pause(QuartzJob quartzJob){
schedulerDelete(quartzJob.getId());
quartzJob.setStatus(CommonConstant.STATUS_UNNORMAL.getCode());
this.updateById(quartzJob);
}

public void resumeJob(QuartzJob quartzJob) {
schedulerDelete(quartzJob.getId());
schedulerAdd(String.valueOf(quartzJob.getId()), quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter());
quartzJob.setStatus(CommonConstant.STATUS_NORMAL.getCode());
this.updateById(quartzJob);
}

public void execute(QuartzJob quartzJob) throws Exception {
String jobName = quartzJob.getJobClassName().trim();
Date startDate = new Date();
String ymd = DateUtils.format(startDate,"yyyymmddhhmmss");
String identity = jobName + ymd;
//3秒后执行 只执行一次
// update-begin--author:sunjianlei ---- date:20210511--- for:定时任务立即执行,延迟3秒改成0.1秒-------
startDate.setTime(startDate.getTime() + 100L);
// update-end--author:sunjianlei ---- date:20210511--- for:定时任务立即执行,延迟3秒改成0.1秒-------
// 定义一个Trigger
SimpleTrigger trigger = (SimpleTrigger)TriggerBuilder.newTrigger()
.withIdentity(identity, JOB_TEST_GROUP)
.startAt(startDate)
.build();
// 构建job信息
JobDetail jobDetail = JobBuilder.newJob(getClass(jobName).getClass()).withIdentity(identity).usingJobData("parameter", quartzJob.getParameter()).build();
// 将trigger和 jobDetail 加入这个调度
scheduler.scheduleJob(jobDetail, trigger);
// 启动scheduler
scheduler.start();
}
}


Mapper类

1
2
3
4
5
6
7
8
9
10
11
12

public interface QuartzJobMapper extends Mapper<QuartzJob> {

/**
* 根据jobClassName查询
* @param jobClassName 任务类名
* @return
*/
public List<QuartzJob> findByJobClassName(@Param("jobClassName") String jobClassName);
}


实体类

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
69
70
71
72
73
74
75

@Data
@Table(name = "sys_quartz_job")
public class QuartzJob implements Serializable {
/**
* id
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

/**
* 创建人
*/
@Column(name = "create_by")
private String createBy;

/**
* 创建时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Column(name = "create_time")
private Date createTime;

/**
* 删除状态
*/
@Column(name = "del_flag")
private Integer delFlag;

/**
* 修改人
*/
@Column(name = "update_by")
private String updateBy;

/**
* 修改时间
*/
@Column(name = "update_time")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;

/**
* 任务类名
*/
@Column(name = "job_class_name")
private String jobClassName;

/**
* cron表达式
*/
@Column(name = "cron_expression")
private String cronExpression;

/**
* 参数
*/
private String parameter;


/**
* 描述
*/
private String description;

/**
* 状态 0正常 -1停止
*/
private Integer status;
}


5. 简单的Job任务类,这个根据自己的实际需求进行更改

根据实际开发的需要,选择适合自己的任务类搭配即可实现自己想要的效果

任务类一

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

/**
* @Description: 同步定时任务测试
*
* 此处的同步是指 当定时任务的执行时间大于任务的时间间隔时
* 会等待第一个任务执行完成才会走第二个任务
*/
@PersistJobDataAfterExecution // 持久化JobDataMap里的数据,使下一个定时任务还能获取到这些值
@DisallowConcurrentExecution // 禁止并发多任务执行,所以永远只有一个任务在执行中
@Slf4j
public class Test1Job implements Job {

@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
log.info(" --- 同步任务调度开始 --- " + " Job Execution key:"+jobExecutionContext.getJobDetail().getKey());
try {
//此处模拟任务执行时间 5秒 任务表达式配置为每秒执行一次:0/1 * * * * ? *
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//测试发现 每5秒执行一次
log.info(" --- 执行完毕,时间:"+new Date()+"---" + " 线程名"+ Thread.currentThread().getName() );
}
}


任务类二

1
2
3
4
5
6
7
8
9
10
11

@Slf4j
public class Test2Job implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
log.info(" Job Execution key:"+jobExecutionContext.getJobDetail().getKey());
log.info(String.format(" rih-health-center 普通定时任务 Test2Job ! 时间:" + new Date()));
}
}


任务类三

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

@Slf4j
public class Test3Job implements Job {

/**
* 若参数变量名修改 QuartzJobController中也需对应修改
*/
private String parameter;

public void setParameter(String parameter) {
this.parameter = parameter;
}
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

log.info(" Job Execution key:"+jobExecutionContext.getJobDetail().getKey());
log.info( String.format("welcome %s! 带参数定时任务 Test3Job ! 时间:" + new Date(), this.parameter));
}
}


至此,Quartz Job集成完成

]]>
<h1 id="场景描述"><a href="#场景描述" class="headerlink" title="场景描述"></a>场景描述</h1><p>在项目的实际场景中,我们经常会遇到一些任务需要每天、每周、或者固定时间去执行,所以在项目中加入Quartz框架,来更好的对这
Maven加载本地Jar包的实操记录 http://hexo.sjava.cn/posts/60353.html 2023-09-07T23:02:41.000Z 2023-09-17T02:21:25.000Z 场景溯源

本人在开发一个SpringBoot框架的项目,其中用到一个第三方的jar包,需要在本地进行导入。

踩坑小计

方式一:直接把jar包放入resource目录下新建的一个libs目录下(不推荐)

这种方式在本地怎么用怎么好使,但是你打成jar包方式的话,springboot默认打jar包的时候是不会把resource目录下添加的jar包给打进去的,所以就会出现本地OK,打的项目包缺不能正常运行的情况

解决办法

  1. 打包的方式改成war包
  2. 加什么配置使得maven package的时候把libs的jar包也一并打出来。

    (这种方法我没有深究,有兴趣可以自行探索,在这里我提供一下ChatGPT的解决方法并未验证,请自行考量。)

  • 将 JAR 包放置在 src/main/resources/lib 目录下:
    首先,确保您的本地 JAR 包位于项目的 src/main/resources/lib 目录下。如果目录不存在,请手动创建它。
  • 在 pom.xml 文件中配置 Maven 插件以包括资源文件:
    在项目的 pom.xml 文件中,添加以下配置以确保 Maven 在打包应用程序时包括 resource/lib 目录下的资源文件。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <build>
    <resources>
    <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
    <includes>
    <include>lib/**</include>
    </includes>
    </resource>
    </resources>
    </build>

    这个配置将 src/main/resources 目录下的所有文件(包括 lib 子目录)包括在 Maven 构建中,并在打包时将它们复制到 JAR 文件中。
  • 清理和构建项目:
    执行以下 Maven 命令以清理和构建项目,并确保资源文件被正确打包:
    1
    mvn clean package 
    这将触发 Maven 构建过程,并在构建目录中创建包含 resource/lib 目录内容的 JAR 文件。
  • 验证 JAR 文件内容:
    检查生成的 JAR 文件,确保 resource/lib 目录下的本地 JAR 包已包含在 JAR 文件中。您可以使用压缩工具或命令行工具查看 JAR 文件的内容。

方式二:把jar包导入到本地仓库再直接引入(推荐)

解决办法

如果你当前使用的是Windows系统电脑,下面是实际的解决步骤:

  1. 使用WIN+R建,弹出运行窗口
  2. 输入cmd,然后在黑窗口进入需要导入项目的jar包所在位置
  3. 执行命令先把jar包导入到自己本地的maven仓库中,下面命令不能直接在-Dfile后面引入jar包的绝对路径,会报错,别问我是怎么知道的~
    1
    2
    3

    mvn install:install-file -Dfile=xxx.jar -DgroupId=com.example -DartifactId=xxx -Dversion=1.0.0 -Dpackaging=jar

  4. 通过如下命令在pom文件中正常引入即可
    1
    2
    3
    4
    5
    6
    7
    8
    <dependencies>
    <!-- 其他依赖项 -->
    <dependency>
    <groupId>com.example</groupId>
    <artifactId>xxx(此处是上面jar包的名字)</artifactId>
    <version>1.0.0</version>
    </dependency>
    </dependencies>
  5. 引入成功后执行以下命令就OK了
    1
    mvn clean package 
]]>
<h1 id="场景溯源"><a href="#场景溯源" class="headerlink" title="场景溯源"></a>场景溯源</h1><div class="note blue anzhiyufont anzhiyu-icon-bullhorn simple"><
MySQL主从复制学习小记 http://hexo.sjava.cn/posts/35005.html 2023-08-30T10:09:40.000Z 2023-08-30T11:00:45.000Z MySQL主从复制原理

Mysql主从复制原理

基于二进制文件实现

Mysql的复制类型

  1. 基于语句的复制(TSATEMENT,Mysql的默认类型)
  2. 基于行的复制(ROW)
  3. 混合类型的复制(MIXED)

Mysql主从复制的工作过程

  1. Master节点将数据的改变记录成二进制日志(bin log),当Master上的数据发生改变时,则将其改变写入二进制日志中
  2. slave节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/O线程请求 Master的二进制事件
  3. 同时Master节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至slave节点本地的中继日志(Relay log)中,slave节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,即解析成 sql 语句逐一执行,使得其数据和 Master节点的保持一致,最后I/O线程和SQL线程将进入睡眠状态,等待下一次被唤醒

复制的用途

  1. 实时灾备,用于故障切换
  2. 可创建读写分离,提供更好的查询服务
  3. 把备份等操作都放在从服务器上进行,减少对业务的影响

复制存在的问题

  1. 主库宕机后,数据可能丢失
  2. 从库只有一个sql Thread,主库写压力大时,复制很可能延时
  3. 一主多从,从机不宜过多,主服务器需要同时向多台服务器中写入数据,压力会很大,这个时候推荐使用集群技,这个我之后会试做,在此不做描述

复制的原理

MySQL 主从复制(replication)是一个异步的复制过程。从一个实例(Master)复制到另一个实例(Slave),整个过程需要由 Master 上的 IO 进程 和 Slave 上的 Sql 进程 与 IO 进程 共同完成。
首先 Master 端必须打开 binary log(bin-log),因为整个复制过程实际上就是 Slave 端从 Master 端获取相应的二进制日志,然后在本地完全顺序的执行日志中所记录的各种操作。
原理图如下:
image

主从复制过程:

  1. Slave 端的 IO 进程连接上 Master,向 Master 请求指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
  2. Master 接收到来自 Slave 的 IO 进程的请求后,负责复制的 IO 进程根据 Slave 的请求信息,读取相应日志内容,返回给 Slave 的IO进程,并将本次请求读取的 bin-log 文件名及位置一起返回给 Slave 端;
  3. Slave 端的 IO 进程接收到信息后,将接收到的日志内容依次添加到 Slave 端的 relay-log(中继日志) 文件的最末端,并将读取到的 Master 端的 bin-log 的文件名和位置记录到 master-info 文件中,以便在下一次读取的时候能够清楚的告诉 Master :”我需要从某个 bin-log 的哪个位置开始往后的日志内容,请发给我”;
  4. Slave 端的 Sql 进程检测到 relay-log (中继日志)中新增加了内容后,会马上解析 relay-log 的内容成为在 Master 端真实执行时候的那些可执行的内容,并在本地执行。

过程产生三个线程(thread):

两个 IO线程:主库会创建一个线程,用来发送 binlog 内容到从库;从库I/O线程读取主库的 binlog 输出线程发送的更新并拷贝这些更新到本地文件,其中包括 relay-log(中继日志) 文件
一个 SQL线程:SQL负责将中继日志应用到 slave 数据库中,完成 AB (主从)复制数据同步。

主从复制的方式:

  1. 同步复制:
    Master 服务器操作完成,当操作作为事件写入二进制日志,传递给 slave,存放到中继日志中,然后在本地执行完操作,即反馈同步成功
  2. 半同步复制:
    主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。
    该功能不是 mysql 官方提供的,是5.5版本时由 google 研发半同步补丁后支持,需要 semi 插件
  3. 异步复制:
    主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理

MySQL主从复制实践

在主服务器上进行设置:

编辑主服务器的 MySQL 配置文件my.cnf,一般位于 /etc/mysql/my.cnf/etc/my.cnf

  1. my.cnf中,找到 [mysqld] 部分,并添加以下配置:

    1
    2
    3
    server-id = 1  # 主服务器设为1,从服务器可以设为不同的ID
    log_bin = /var/log/mysql/mysql-bin.log # 启用二进制日志
    binlog_do_db = your_database_name # 可选,指定需要复制的数据库
  2. 保存配置文件后,重启 MySQL 使配置生效:

    1
    sudo systemctl restart mysql
  3. 创建用于复制的用户,并授予适当的权限。登录到 MySQL:

    1
    mysql -u root -p
  4. 然后在 MySQL 提示符下执行以下命令:

    1
    2
    3
    CREATE USER 'replication_user'@'%' IDENTIFIED BY 'password';
    GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
    FLUSH PRIVILEGES;
  5. 获取主服务器当前的二进制日志位置。在 MySQL 提示符下执行以下命令:

    1
    SHOW MASTER STATUS;

    记下输出结果中的 FilePosition值,将在配置从服务器时用到。

在从服务器上进行设置:

编辑从服务器的 MySQL 配置文件 my.cnf,同样位于 /etc/mysql/my.cnf/etc/my.cnf

  1. my.cnf 中,找到 [mysqld] 部分,并添加以下配置:

    1
    server-id = 2  # 从服务器设为不同的ID
  2. 停止从服务器的 MySQL 进程:

    1
    sudo systemctl stop mysql
  3. 清空从服务器的数据,这将删除现有的数据库数据:

    1
    sudo rm -rf /var/lib/mysql/*
  4. 在从服务器上配置连接到主服务器。在 MySQL 提示符下执行以下命令,将其中的参数替换为实际值:

    1
    2
    3
    4
    5
    6
    7

    CHANGE MASTER TO
    MASTER_HOST = 'master_server_ip',
    MASTER_USER = 'replication_user',
    MASTER_PASSWORD = 'password',
    MASTER_LOG_FILE = 'mysql-bin.XXXXXX', -- 使用主服务器上 SHOW MASTER STATUS 得到的值
    MASTER_LOG_POS = log_position; -- 使用主服务器上 SHOW MASTER STATUS 得到的值
  5. 启动从服务器的 MySQL 进程:

    1
    sudo systemctl start mysql
  6. 在从服务器上运行以下命令开始主从复制:

    1
    2
    START SLAVE;  -- 开启复制
    STOP SLAVE; -- 关闭复制
  7. 可以使用以下命令来检查主从复制状态:

    1
    2
    -- 确保 "Slave_IO_Running" 和 "Slave_SQL_Running" 都显示为 "Yes",表示复制正在正常运行。
    SHOW SLAVE STATUS;

在执行上述步骤时,请确保主服务器和从服务器之间的网络通信正常,防火墙允许数据库端口的通信,并在配置过程中使用正确的主机名、IP 地址和密码。如果遇到问题,可以查看 MySQL 日志以找出问题的根本原因。

]]>
<h1 id="MySQL主从复制原理"><a href="#MySQL主从复制原理" class="headerlink" title="MySQL主从复制原理"></a>MySQL主从复制原理</h1><h2 id="Mysql主从复制原理"><a href="#Mysql主