0%

一、Jenkins Rest API简单介绍
在githup上,jenkins-rest项目地址:链接地址,接口定义和接口测试代码都可以详细看到。 但在使用过程中遇到了问题让我纠结了很久。 看下使用REST API前置条件:
需要运行着的jenkins环境
需要一个管理员权限的账号
CSRF功能需要关闭掉,不然会影响POST接口的请求(我在这个上面纠结了很久,我使用的版本是Jenkins2.263.4,高于2.0版本的jenkins页面上已经不提供直接关闭CSRF的勾选按钮功能,网上搜索到的很多都是通过勾选按钮关闭CSRF功能,而新版本的JENKINS已经不支持这种方式—起初,我是不想关闭CSRF,但是解决不了API POST请求接口返回403forbiden问题,然后网上看到了一种,将获取到的crumb设置到header中,通过通过httpclient方式URL请求Jenkins API,这种方式我没能成功,最终放弃了,代码编写起来也很麻烦,跟API调用方法传入参数的方式比较起来的话) 4、插件的要求我感觉我没用到。

二、使用步骤
1.关闭CSRF保护
编辑jenkins配置文件

vim /etc/sysconfig/jenkins
AI写代码
java
运行
1
在默认配置文件JENKINS_JAVA_OPTIONS里面加入取消相关保护的参数配置,即可关闭CSRF,配置内容如下:

-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
AI写代码
java
运行
1
修改后如下:

重启jenkins即可生效

systemctl restart jenkins.service
AI写代码
java
运行
1
登录jenkins,Dashboard->Configure Global Security,跨站请求伪造保护会有提示,即可只修改已经生效了

2.引入jenkins-rest.jar包
我新建了个maven项目用来测试API,pom.xml引入了jenkins-rest包,由githup可知,最新的版本0.0.28,使用20-28版本会出现一个问题,启动api测试代码会报一个类方法未定义的错误,这个是因为com.google.guava包在jenkins-rest包里默认的版本不对,或者使用低版本的jenkins-rest包,但我对比了下看低版本提供的API方法还是少好几个的

log4j:WARN No such property [datePattern] in org.apache.log4j.RollingFileAppender.
Exception in thread “main” java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V
AI写代码
java
运行
1
2
pom.xml配置如下:

        com.cdancy
        jenkins-rest
        0.0.28
    

    
        com.google.guava
        guava
        28.1-jre

AI写代码
xml

1
2
3
4
5
6
7
8
9
10
11
3.创建客户端
githup上有示例代码,按照自己jenkins访问地址和账户密码修改下即可。

JenkinsClient client = JenkinsClient.builder()
.endPoint(“http://127.0.0.1:8080“) // Optional. Defaults to http://127.0.0.1:8080
.credentials(“admin:password”) // Optional.
.build();

SystemInfo systemInfo = client.api().systemApi().systemInfo();
assertTrue(systemInfo.jenkinsVersion().equals(“1.642.4”));
AI写代码
java
运行
1
2
3
4
5
6
7
由代码可以看出一共提供了6个API类,分别是

API类 说明
pluginManagerApi 插件API:提供插件操作接口,一共就俩方法,查看和安装插件
crumbIssuerApi 系统哈希值信息(用于防御CSRF攻击)
jobsAPi 任务(项目管理),提供任务的创建、修改、查询、删除等操作,主要使用接口
queueApi 任务队列相关
statisticsApi jenkins统计相关
systemApi jenkins系统信息,如版本

4.jobsApi-任务API
JobsApi jobApi=client.api().jobsApi();
AI写代码
java
运行
1
4.1 jobList-任务一览
/**
* 任务一览
* param 文件夹路径“”,取的是最外层的任务,若要查看任务文件夹中的任务,入参则为文件名名称
/
JobList jobList=jobApi.jobList(“”);
for(int i=0;i<jobList.jobs().size();i++){
log.info(jobList.jobs().get(i));
}
AI写代码
java
运行
1
2
3
4
5
6
7
8
4.2 jobInfo-具体任务详细信息
/
*
* 根据任务名称获取任务信息
* param 文件夹路径null,最外层任务 任务名称“test”
/
JobInfo jobInfo=jobApi.jobInfo(null,”test”);
log.info(“test任务详细信息”+jobInfo);
AI写代码
java
运行
1
2
3
4
5
6
4.3 buildInfo-任务构建的详细信息
/
*
* 根据任务名称和任务构建id,获取构建信息
* param 文件夹路径null 任务名称“test” 构建ID 3
/
jobApi.buildInfo(null,”test”,3);
log.info(“test任务第三次构建详细信息:”+jobApi);
AI写代码
java
运行
1
2
3
4
5
6
4.4 create-新建任务
File file=new File(“C:\Users\dwzq\Desktop\config.xml”);
StringBuilder xmlStr=new StringBuilder();
BufferedReader read=null;
read=new BufferedReader(new FileReader(file));
String tempStr;
while((tempStr=read.readLine())!=null){
xmlStr.append(tempStr);
}
read.close();
/
*
* 创建job任务
* param 文件夹路径null 新建任务名称“test2” 任务详细配置文件内容:xmlStr
*/
RequestStatus status=jobApi.create(null,”test2”,xmlStr.toString());
log.info(status);
AI写代码
java
运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
4.5 config-查看任务配置文件内容(两个入参)
/**
* 获取任务配置文件内容
* param 文件夹路径null 任务名称“test2”
/
String testConfig=jobApi.config(null,”test2”);
log.info(“testConfig:”+testConfig);
AI写代码
java
运行
1
2
3
4
5
6
4.6 config-更新任务配置文件内容(三个入参)
/
*
* 更新任务的配置文件
* param 文件夹路径null 任务名称“test2” 新的任务配置文件内容xmlStr.toString
/
boolean updateConfig=jobApi.config(null,”test2”,xmlStr.toString());
log.info(“updateConfig result:”+updateConfig);
AI写代码
java
运行
1
2
3
4
5
6
4.7 description-获取任务描述内容(两个入参)
/
*
获取任务描述
* param 文件夹路径null 任务名称“test2”
/
String description= jobApi.description(null,”test2”);
log.info(“description:”+description);
AI写代码
java
运行
1
2
3
4
5
6
4.8 description-获取任务描述内容(三个入参)
/

* 更新任务的描述
* param 文件夹路径null 任务名称“tes2” 新的任务描述
/
Boolean updateDescription=jobApi.description(null,”test2”,”this is update test job description”);
log.info(“updateDescription result:”+updateConfig);
AI写代码
java
运行
1
2
3
4
5
6
4.9 delete-删除任务
/
*
* 删除任务
* param 文件夹路径null 任务名称
/
RequestStatus deleteResult=jobApi.delete(null,”test2”);
log.info(“deleteResult:”+deleteResult);
AI写代码
java
运行
1
2
3
4
5
6
4.10 enable-启用任务
/
*
* 启用任务
* param 文件夹路径null 任务名称“tes2”
/
boolean enableResult=jobApi.enable(null,”test2”);
log.info(“enableResult:”+enableResult);
AI写代码
java
运行
1
2
3
4
5
6
4.11 disable-禁用任务
/
*
* 禁用任务
* param 文件夹路径null 任务名称“tes2”
*/
boolean disableResult=jobApi.disable(null,”test2”);
log.info(“disableResult:”+disableResult);
AI写代码
java
运行

4.12 build-构建任务
/**
* 任务构建
* param 文件夹路径null , 任务名“test”
/
IntegerResponse buildJob=jobApi.build(null,”test”);
log.info(“buildJob”+buildJob);
AI写代码
java
运行
1
2
3
4
5
6
4.13 buildWithParameters-带参数构建任务
/
*
* 带参数构建任务
* param 文件夹路径null , 任务名“test” 参数
*/
Map<String, List> param=new HashMap();
List list=new ArrayList();
list.add(“staging”);
param.put(“DEPLOY_ENV”,list);
param.put(“myparam”,list);
IntegerResponse buldParam=jobApi.buildWithParameters(null,”test”,param);
log.info(“buildParam:”+buldParam);
AI写代码
java
运行

1
2
3
4
5
6
7
8
9
10
11
4.14 lastBuildNumber-上次任务的构建序号
/**
上次构建的序号
* param 文件夹路径null , 任务名“pipeline-hello-word” 参数
/
Integer lastBuildNumber=jobApi.lastBuildNumber(null,”pipeline-hello-word”);
log.info(“lastBuildNumber:”+lastBuildNumber);
AI写代码
java
运行
1
2
3
4
5
6
4.15 lastBuildTimestamp-上次任务的构建时间戳
/

* 上次任务构建时间
* param 文件夹路径null , 任务名“test”
/
String lastBuildTimetamp=jobApi.lastBuildTimestamp(null,”test”);
log.info(“lastBuildTimestamp:”+lastBuildTimetamp);
AI写代码
java
运行
1
2
3
4
5
6
4.16 progressiveText-任务构建对应的控制台输出内容(3个入参)
/
*
* 获取任务构建对应的控制台输出
* param 文件夹路径null 任务名称“test” 0:控制台输出文本开始的位置
/
ProgressiveText progressiveText=jobApi.progressiveText(null,”test”,0);
log.info(“progressText:”+progressiveText);
AI写代码
java
运行
1
2
3
4
5
6
4.17 progressiveText-任务构建对应的控制台输出内容(3个入参)
/
*
* 获取任务某个构建次数控制台对应的输出
* param 文件夹路径null 任务名称“test” 构建index:16 0:控制台输出文本开始的位置
/
ProgressiveText progressiveText1=jobApi.progressiveText(null,”test”,16,0);
log.info(“progressText num=16:”+progressiveText1);
AI写代码
java
运行
1
2
3
4
5
6
4.18 rename-任务重命名
/
*
* 任务名称重命名
* param 文件夹路径null 任务名称“test” 任务新名词“test2New”
/
boolean renameResult=jobApi.rename(null,”test2”,”test2New”);
log.info(“renameResult:”+renameResult);
AI写代码
java
运行
1
2
3
4
5
6
4.19 workflow-任务某次构建的步骤信息
/
*
* 获取任务构建index对应的构建步骤内容
* param 文件夹路径null 任务名称”pipeline-hello-word” 构建index:17
*/
Workflow workFlow=jobApi.workflow(null,”pipeline-hello-word”,17);
log.info(“workFlow:”+workFlow);
AI写代码
java
运行
1
2
3
4
5
6
4.20 pipelineNode-获取pipelineNode信息
这个没和页面具体功能联系起来,不知道具体获取的什么信息

 /**
  * 获取pipelineNode信息
  * param 文件夹路径null  任务名称"pipeline-hello-word"    构建index:17  nodeId:1
  */
 PipelineNode pipelineNode=jobApi.pipelineNode(null,"pipeline-hello-word",17,1);
 log.info("pipeLineNodeInfo:"+pipelineNode);

AI写代码
java
运行
1
2
3
4
5
6
任务涉及到的接口是这20个,接口涉及到的数据结构的定义可以在githup domain查看

5.systemApi-系统环境API
SystemApi systemApi=client.api().systemApi();
AI写代码
java
运行
1
5.1 systemInfo-查看jenkins系统环境信息
/**
* 查看jenkins系统环境信息
/
SystemInfo systemInfo=systemApi.systemInfo();
log.info(“systemInfo:”+systemInfo);
AI写代码
java
运行
1
2
3
4
5
5.2 quietDown-准备关闭jenkins,对应Prepare for Shutdown功能
/
*
* 准备关闭jenkins,对应Prepare for Shutdown功能
/
RequestStatus quietDown=systemApi.quietDown();
log.info(“quietDown:”+quietDown);
AI写代码
java
运行
1
2
3
4
5
5.3 cancelQuietDown-取消准备关闭jenkins
/
*
* 取消准备关闭jenkins
/
RequestStatus cancleQuietDown= systemApi.cancelQuietDown();
log.info(“cancelQuietDown:”+cancleQuietDown);
AI写代码
java
运行
1
2
3
4
5
6.pluginManagerApi-插件API
PluginManagerApi pluginManagerApi=client.api().pluginManagerApi();
AI写代码
java
运行
1
6.1 plugins-查看所有插件信息
/
*
查看插件所有信息
param 不是很理解这两个参数的具体含义,第一个参数调整返回的插件信息不一样
/
Plugins plugins=pluginManagerApi.plugins(3,null);
for(int i=0;i<plugins.plugins().size();i++) {
log.info(plugins.plugins().get(i).longName()+”:” + plugins.plugins().get(i));
}
AI写代码
java
运行
1
2
3
4
5
6
7
8
6.2 installNecessaryPlugins-插件安装
/

* 安装插件
* param 插件ID@版本号
/
RequestStatus requestStatus=pluginManagerApi.installNecessaryPlugins(“artifactory@3.10.6“);
log.info(“artifactory:”+requestStatus);
AI写代码
java
运行
1
2
3
4
5
6
7.statisticsApi-统计信息API
/

* 我的系统返回值为空,所以不清楚具体统计的什么
/
StatisticsApi statisticsApi= client.api().statisticsApi();
OverallLoad overallLoad=statisticsApi.overallLoad();
log.info(“overallLoad:”+overallLoad);
AI写代码
java
运行
1
2
3
4
5
6
8.queueApi-任务队列API
/
*
* 三个接口,因为没数据,所以对应页面功能不是很理解
*/
QueueApi queueApi=client.api().queueApi();
List queueList=queueApi.queue();
RequestStatus cancelStatus=queueApi.cancel(1);
QueueItem queueItem=queueApi.queueItem(1);
AI写代码
java

如何进行架构设计,可以一起讨论,如何基于需求进行业务建模,如何进行业务流程设计,如何进行应用架构设计,如何进行技术架构设计,如何进行部署架构设计,如何应对高并发高流量高可用挑战!

阅读全文 »

系统配置MinIO对象存储集群

系统默认使用本地存储,含有第三方文件存储功能的版本可以配置接入使用MinIO对象存储,下面演示MinIO集群的配置方法,演示主机操作系统为CentOS 8.2,对象存储MinIO版本为2020-08-08T04:50:06Z。本次演示使用4台服务器。

实现规划

主机名称 IP地址 安装软件 开放端口 绑定域名
V1 ***.100.100.152(公网) 172.26.188.173(内网) MinIO Nginx 80 (公网开放) 9000 (内网开放) img1.diyhi.com
V2 ***.100.241.36(公网) 172.26.188.174(内网) MinIO Nginx 80 (公网开放) 9000 (内网开放) img2.diyhi.com
V3 ***.100.159.63(公网) 172.26.188.175(内网) MinIO Nginx 80 (公网开放) 9000 (内网开放) img3.diyhi.com
V4 ***.92.127.117(公网) 172.26.188.176(内网) MinIO Nginx 80 (公网开放) 9000 (内网开放) img4.diyhi.com
S1 ***.100.153.26(公网) 172.26.188.178(内网) JDK 1.8 Tomcat 8.5 MySQL 5.7 Nginx 80 bbs.diyhi.com

美女测试

img

主机配置:V1

安装配置MinIO

1、创建并进入安装目录

输入命令 mkdir /usr/local/minio
输入命令 cd /usr/local/minio

2、下载对应当前系统版本的安装包

输入命令 wget https://dl.min.io/server/minio/release/linux-amd64/minio

3、创建minio启动用户并授权

输入命令 getent group minio || groupadd -r minio
输入命令 getent passwd minio || useradd -r -d /opt -s /bin/nologin -g minio minio

4、minio文件赋予750权限

输入命令 chmod 750 /usr/local/minio/minio

5、创建存放数据目录

输入命令 mkdir /usr/local/minio/data

6、编辑minio配置文件

输入命令 vim /usr/local/minio/minio.conf

将下面的配置内容复制到minio.conf文件中。请按实际情况更改下面的参数,集群下所有节点的账号密码必须一致。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 指定数据存储目录(注意这个目录要存在)
MINIO_VOLUMES="http://172.26.188.173/usr/local/minio/data http://172.26.188.174/usr/local/minio/data http://172.26.188.175/usr/local/minio/data http://172.26.188.176/usr/local/minio/data"
#
#指定监听端口(也可以不监听具体ip,只写 :9000即可)
MINIO_OPTS="--address :9000"
#
#Access key,相当于账号
MINIO_ACCESS_KEY="test"
#
#Secret key,相当于密码
MINIO_SECRET_KEY="diEvRU6eQez123456Dkkpo4srS"
#
#区域值,这是完全自己写的,比如你愿意的话写“abcd”也行,但标准格式是“国家-区域-编号”,
#如“中国-华北-1号”就可写成“cn-north-1”,又比如“美国-西部-2号”可写成“us-west-1”
# #MINIO_REGION="cn-south-1"
#
#域名
# #MINIO_DOMAIN=s3.diyhi.com

7、更改文件、目录属主属组

输入命令 chown -R minio:minio /usr/local/minio

8、设置命令启动服务

输入命令 vim /usr/lib/systemd/system/minio.service

将下面的配置内容复制到minio.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
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/minio/minio

[Service]

User=minio
Group=minio

EnvironmentFile=/usr/local/minio/minio.conf
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"

ExecStart=/usr/local/minio/minio server $MINIO_OPTS $MINIO_VOLUMES

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

保存配置文件后执行systemctl daemon-reload命令刷新

输入命令 systemctl daemon-reload

使用配置好的系统服务管理MinIO
systemctl enable minio 配置开机启动
systemctl start minio 启动
systemctl stop minio 停止
systemctl restart minio 重启
systemctl disable minio 删除开机启动
systemctl daemon-reload 刷新

安装配置Nginx

1.下载并安装nginx

输入命令 yum install nginx

2.启动nginx

输入命令 systemctl start nginx

使用配置好的系统服务管理Nginx
systemctl enable nginx 配置开机启动
systemctl start nginx 启动nginx
systemctl stop nginx 停止nginx
systemctl restart nginx 重启nginx
systemctl disable nginx 删除开机启动
systemctl daemon-reload 刷新

3.配置nginx

默认的配置文件在 /etc/nginx 路径下,使用该配置已经可以正确地运行nginx;如需要自定义,修改其下的 nginx.conf 等文件即可

输入命令 vim /etc/nginx/conf.d/default.conf

配置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
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
# proxy_cache_path 缓存文件路径 需要手动建文件夹 mkdir /etc/nginx/cache
# levels 设置缓存文件目录层次;levels=1:2 表示两级目录
# keys_zone 设置缓存名字和共享内存大小
# inactive 在指定时间内没人访问则被删除 30m/分钟
# inactive 未被访问文件在缓存中保留时间,如果设为30m,则30分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件 30m/分钟 7d/7天
# max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。
proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=img_cache:10m inactive=1d max_size=50G;

server {
listen 80;
server_name _;
return 404;
}


#配置请求转发,将网页访问80端口转发到MinIO的9000端口
server{
listen 80;
server_name img1.diyhi.com;
location /{
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1:9000;
client_max_body_size 100M; #允许上传文件大小,默认是1M

}



location ~ /(file/topic|file/help)/.*\.(m3u8|ts|mp4|avi|mkv|wmv|wav|rm|rmvb|mp3|flac|ape|zip|rar|7z|txt|docx|doc|pptx|ppt|xlsx|xls)$ {
#只在非DELETE请求时处理
if ($request_method ~ ^(GET|POST|HEAD|OPTIONS|PUT|TRACE|CONNECT)$ ) {
#返回302,让下一步执行内部跳转
return 302;
error_page 302 = @process_secure_link;
}
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1:9000;

}

location @process_secure_link {
secure_link $arg_md5,$arg_expires;
#表示 MD5(密钥 + 不包含主机名和请求参数的剩余部分文件路径 + 过期时间) 1234567890123456是密钥,必须是16位字符并且和管理后台的'基本设置'中'文件防盗链密钥'一致
secure_link_md5 1234567890123456$uri$arg_expires;


#当匹配成功的时候 secure_link 是非空非0的

# 没有匹配到返回 ""
if ($secure_link = "") {
return 403;
}

# 没有匹配到返回0
if ($secure_link = "0") {
return 410;
}
#文件名重命名
if ($arg_filename != "") {
add_header Content-Disposition 'attachment; filename="$arg_filename"';
}


proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
#proxy_redirect off;
#MinIO
proxy_pass http://127.0.0.1:9000;
}




location ~ /(file/topic)/.*\.(jpg|jpeg|gif|png|bmp)$ {
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1:9000;
client_max_body_size 100M; #允许上传文件大小,默认是1M

#只在GET请求时处理图片
if ($request_method = GET) {
#返回302,让下一步执行内部跳转
return 302;
error_page 302 = @process_image_filter;
}
}


#Nginx 不支持在 if {} 这个 block 里面用 image_filter 函数,image_filter 的第一个参数 resize/crop 也不能用变量的方式传输

# ~ 为区分大小写匹配 ~* 为不区分大小写匹配
#location ~ .*.(gif|jpg|jpeg|png|bmp)$ {
#location ~ /(file/topic)/.*\.(jpg|jpeg|gif|png|bmp)$ {
location @process_image_filter {
proxy_pass http://127.0.0.1:9000;
#标记条件 nginx的配置中不支持if条件的逻辑与&amp;&amp; 逻辑或|| 运算 ,而且不支持if的嵌套语法
set $flag 0;
#将参数赋值给宽
set $width $arg_width;

#是否为原图
set $originalImage 0;

if ($width != ''){
set $flag "${flag}1";
}
#预设宽度为240或400,当输入其它宽度时默认改为240
if ($arg_width !~ ^(240|400)$){
set $flag "${flag}1";
}
#如果URL带宽度参数并且不属于预先指定尺寸,则默认显示宽240
if ($flag = "011"){
set $width '240';
}


#当请求的是原图时(即不带参数),则设置宽高维度为”-”
if ( $width = '' ) {
set $width '-';
}

#如果访问原图
if ( $width = '-' ) {
set $originalImage 1;
}

#原图不缓存
proxy_no_cache $originalImage;

#默认使用的key就是URL
proxy_cache_key $host$uri$width;


# 将缩略图缓存在服务,避免每次请求都重新生成
proxy_cache img_cache;
# 有效的文件,在服务器缓存 1 天
proxy_cache_valid 200 1d;
#默认值:proxy_cache_lock off;
#可配置段:http, server, location
#作用:默认不开启,开启的话则每次只能有一个请求更新相同的缓存,其他请求要么等待缓存&gt;有数据要么限时等待锁释放。通常在多个客户端请求缓存未命中时,只有第一个请求可以发向原服务器,其他请求要等待第一个响应返回或者超时后,使用缓存响应客户端。该参数可以合并回源请求,减轻峰值流量下的压力。
proxy_cache_lock on;
#默认值:proxy_cache_lock_timeout 5s;
#可配置段:http, server, location
#作用:等待缓存锁超时之后将直接请求后端,结果不会被缓存。
proxy_cache_lock_timeout 5s;
#当缓存过期后,如果开启了 proxy_cache_revalidate,则会发出一次 if-modified-since 或 if-none-match 条件请求,如果后端返回 304,则此时$upstream_cache_status 为 REVALIDATED,我们将得到两个好处,节省带宽和减少写磁盘的次数。
proxy_cache_revalidate on;

#标记缓存是否命中,在访问文件头Response Headers中查看
# MISS 未命中,请求被传送到后端
# HIT 缓存命中
# EXPIRED 缓存已经过期请求被传送到后端
# UPDATING 正在更新缓存,将使用旧的应答
# STALE 后端将得到过期的应答
add_header Nginx-Cache "$upstream_cache_status";


#按比例减少图像到指定大小,公减少一个可以另一个用"-"来表示,出错415,参数值可包含变量,可以与rotate一起使用,则两个一起生效。
image_filter resize $width -;
#设置读取图像缓冲的最大大小,超过则415错误。
image_filter_buffer 100M;
#设置变换的JPEG图像的期望质量。可接受的值是从1到100的范围内。较小的值通常意味着既降低图像质量,减少传输数据,推荐的最大值为95。参数值可以包含变量。
image_filter_jpeg_quality 90;
#定义是否应该透明转换的GIF图像或PNG图像与调色板中指定的颜色时,可以保留。透明度的损失将导致更好的图像质量。在PNG的Alpha通道总是保留透明度。
image_filter_transparency on;

}

}

配置完成保存。 调用nginx -t测试配置文件是否正确

7.日志

访问日志默认路径 /var/log/nginx/access.log
错误日志默认路径 /var/log/nginx/error.log

防火墙开放端口配置

仅允许内网IP访问指定端口

#(1)允许172.26.188.0 IP段访问9000端口
输入命令 firewall-cmd –permanent –add-rich-rule=’rule family=”ipv4” source address=”172.26.188.0/24” port protocol=”tcp” port=”9000” accept’
#(2)允许公网访问80端口
输入命令 firewall-cmd –permanent –zone=public –add-port=80/tcp
#(3)执行完命令要刷新才能生效
输入命令 firewall-cmd –reload
#(4)列出所有的开放端口
输入命令 firewall-cmd –list-all
列出所有的开放端口

移除策略

firewall-cmd –permanent –remove-rich-rule=’rule family=”ipv4” source address=”IP地址” port protocol=”tcp” port=”端口号” accept’
#例如移除9000端口策略
firewall-cmd –permanent –remove-rich-rule=’rule family=”ipv4” source address=”172.26.188.0/24” port protocol=”tcp” port=”9000” accept’
输入命令 firewall-cmd –reload 执行完命令要刷新才能生效

主机配置:V2

… …
… …
省略的教程和上面的主机V1配置相同
… …
… …

配置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
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
# proxy_cache_path 缓存文件路径 需要手动建文件夹 mkdir /etc/nginx/cache
# levels 设置缓存文件目录层次;levels=1:2 表示两级目录
# keys_zone 设置缓存名字和共享内存大小
# inactive 在指定时间内没人访问则被删除 30m/分钟
# inactive 未被访问文件在缓存中保留时间,如果设为30m,则30分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件 30m/分钟 7d/7天
# max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。
proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=img_cache:10m inactive=1d max_size=50G;

server {
listen 80;
server_name _;
return 404;
}


#配置请求转发,将网页访问80端口转发到MinIO的9000端口
server{
listen 80;
server_name img2.diyhi.com;
location /{
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1:9000;
client_max_body_size 100M; #允许上传文件大小,默认是1M

}

location ~ /(file/topic|file/help)/.*\.(m3u8|ts|mp4|avi|mkv|wmv|wav|rm|rmvb|mp3|flac|ape|zip|rar|7z|txt|docx|doc|pptx|ppt|xlsx|xls)$ {
#只在非DELETE请求时处理
if ($request_method ~ ^(GET|POST|HEAD|OPTIONS|PUT|TRACE|CONNECT)$ ) {
#返回302,让下一步执行内部跳转
return 302;
error_page 302 = @process_secure_link;
}
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1:9000;

}

location @process_secure_link {
secure_link $arg_md5,$arg_expires;
#表示 MD5(密钥 + 不包含主机名和请求参数的剩余部分文件路径 + 过期时间) 1234567890123456是密钥,必须是16位字符并且和管理后台的'基本设置'中'文件防盗链密钥'一致
secure_link_md5 1234567890123456$uri$arg_expires;


#当匹配成功的时候 secure_link 是非空非0的

# 没有匹配到返回 ""
if ($secure_link = "") {
return 403;
}

# 没有匹配到返回0
if ($secure_link = "0") {
return 410;
}
#文件名重命名
if ($arg_filename != "") {
add_header Content-Disposition 'attachment; filename="$arg_filename"';
}



proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
#proxy_redirect off;
#MinIO
proxy_pass http://127.0.0.1:9000;
}




location ~ /(file/topic)/.*\.(jpg|jpeg|gif|png|bmp)$ {
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1:9000;
client_max_body_size 100M; #允许上传文件大小,默认是1M

#只在GET请求时处理图片
if ($request_method = GET) {
#返回302,让下一步执行内部跳转
return 302;
error_page 302 = @process_image_filter;
}
}


#Nginx 不支持在 if {} 这个 block 里面用 image_filter 函数,image_filter 的第一个参数 resize/crop 也不能用变量的方式传输

# ~ 为区分大小写匹配 ~* 为不区分大小写匹配
#location ~ .*.(gif|jpg|jpeg|png|bmp)$ {
#location ~ /(file/topic)/.*\.(jpg|jpeg|gif|png|bmp)$ {
location @process_image_filter {
proxy_pass http://127.0.0.1:9000;
#标记条件 nginx的配置中不支持if条件的逻辑与&amp;&amp; 逻辑或|| 运算 ,而且不支持if的嵌套语法
set $flag 0;
#将参数赋值给宽
set $width $arg_width;

#是否为原图
set $originalImage 0;

if ($width != ''){
set $flag "${flag}1";
}
#预设宽度为240或400,当输入其它宽度时默认改为240
if ($arg_width !~ ^(240|400)$){
set $flag "${flag}1";
}
#如果URL带宽度参数并且不属于预先指定尺寸,则默认显示宽240
if ($flag = "011"){
set $width '240';
}


#当请求的是原图时(即不带参数),则设置宽高维度为”-”
if ( $width = '' ) {
set $width '-';
}

#如果访问原图
if ( $width = '-' ) {
set $originalImage 1;
}

#原图不缓存
proxy_no_cache $originalImage;

#默认使用的key就是URL
proxy_cache_key $host$uri$width;


# 将缩略图缓存在服务,避免每次请求都重新生成
proxy_cache img_cache;
# 有效的文件,在服务器缓存 1 天
proxy_cache_valid 200 1d;
#默认值:proxy_cache_lock off;
#可配置段:http, server, location
#作用:默认不开启,开启的话则每次只能有一个请求更新相同的缓存,其他请求要么等待缓存&gt;有数据要么限时等待锁释放。通常在多个客户端请求缓存未命中时,只有第一个请求可以发向原服务器,其他请求要等待第一个响应返回或者超时后,使用缓存响应客户端。该参数可以合并回源请求,减轻峰值流量下的压力。
proxy_cache_lock on;
#默认值:proxy_cache_lock_timeout 5s;
#可配置段:http, server, location
#作用:等待缓存锁超时之后将直接请求后端,结果不会被缓存。
proxy_cache_lock_timeout 5s;
#当缓存过期后,如果开启了 proxy_cache_revalidate,则会发出一次 if-modified-since 或 if-none-match 条件请求,如果后端返回 304,则此时$upstream_cache_status 为 REVALIDATED,我们将得到两个好处,节省带宽和减少写磁盘的次数。
proxy_cache_revalidate on;

#标记缓存是否命中,在访问文件头Response Headers中查看
# MISS 未命中,请求被传送到后端
# HIT 缓存命中
# EXPIRED 缓存已经过期请求被传送到后端
# UPDATING 正在更新缓存,将使用旧的应答
# STALE 后端将得到过期的应答
add_header Nginx-Cache "$upstream_cache_status";


#按比例减少图像到指定大小,公减少一个可以另一个用"-"来表示,出错415,参数值可包含变量,可以与rotate一起使用,则两个一起生效。
image_filter resize $width -;
#设置读取图像缓冲的最大大小,超过则415错误。
image_filter_buffer 100M;
#设置变换的JPEG图像的期望质量。可接受的值是从1到100的范围内。较小的值通常意味着既降低图像质量,减少传输数据,推荐的最大值为95。参数值可以包含变量。
image_filter_jpeg_quality 90;
#定义是否应该透明转换的GIF图像或PNG图像与调色板中指定的颜色时,可以保留。透明度的损失将导致更好的图像质量。在PNG的Alpha通道总是保留透明度。
image_filter_transparency on;

}

}

… …
… …
… …

主机配置:V3

… …
… …
省略的教程和上面的主机V1配置相同
… …
… …

配置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
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
# proxy_cache_path 缓存文件路径 需要手动建文件夹 mkdir /etc/nginx/cache
# levels 设置缓存文件目录层次;levels=1:2 表示两级目录
# keys_zone 设置缓存名字和共享内存大小
# inactive 在指定时间内没人访问则被删除 30m/分钟
# inactive 未被访问文件在缓存中保留时间,如果设为30m,则30分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件 30m/分钟 7d/7天
# max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。
proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=img_cache:10m inactive=1d max_size=50G;

server {
listen 80;
server_name _;
return 404;
}


#配置请求转发,将网页访问80端口转发到MinIO的9000端口
server{
listen 80;
server_name img3.diyhi.com;
location /{
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1:9000;
client_max_body_size 100M; #允许上传文件大小,默认是1M

}



location ~ /(file/topic|file/help)/.*\.(m3u8|ts|mp4|avi|mkv|wmv|wav|rm|rmvb|mp3|flac|ape|zip|rar|7z|txt|docx|doc|pptx|ppt|xlsx|xls)$ {
#只在非DELETE请求时处理
if ($request_method ~ ^(GET|POST|HEAD|OPTIONS|PUT|TRACE|CONNECT)$ ) {
#返回302,让下一步执行内部跳转
return 302;
error_page 302 = @process_secure_link;
}
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1:9000;

}

location @process_secure_link {
secure_link $arg_md5,$arg_expires;
#表示 MD5(密钥 + 不包含主机名和请求参数的剩余部分文件路径 + 过期时间) 1234567890123456是密钥,必须是16位字符并且和管理后台的'基本设置'中'文件防盗链密钥'一致
secure_link_md5 1234567890123456$uri$arg_expires;


#当匹配成功的时候 secure_link 是非空非0的

# 没有匹配到返回 ""
if ($secure_link = "") {
return 403;
}

# 没有匹配到返回0
if ($secure_link = "0") {
return 410;
}
#文件名重命名
if ($arg_filename != "") {
add_header Content-Disposition 'attachment; filename="$arg_filename"';
}


proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
#proxy_redirect off;
#MinIO
proxy_pass http://127.0.0.1:9000;
}




location ~ /(file/topic)/.*\.(jpg|jpeg|gif|png|bmp)$ {
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1:9000;
client_max_body_size 100M; #允许上传文件大小,默认是1M

#只在GET请求时处理图片
if ($request_method = GET) {
#返回302,让下一步执行内部跳转
return 302;
error_page 302 = @process_image_filter;
}
}


#Nginx 不支持在 if {} 这个 block 里面用 image_filter 函数,image_filter 的第一个参数 resize/crop 也不能用变量的方式传输

# ~ 为区分大小写匹配 ~* 为不区分大小写匹配
#location ~ .*.(gif|jpg|jpeg|png|bmp)$ {
#location ~ /(file/topic)/.*\.(jpg|jpeg|gif|png|bmp)$ {
location @process_image_filter {
proxy_pass http://127.0.0.1:9000;
#标记条件 nginx的配置中不支持if条件的逻辑与&amp;&amp; 逻辑或|| 运算 ,而且不支持if的嵌套语法
set $flag 0;
#将参数赋值给宽
set $width $arg_width;

#是否为原图
set $originalImage 0;

if ($width != ''){
set $flag "${flag}1";
}
#预设宽度为240或400,当输入其它宽度时默认改为240
if ($arg_width !~ ^(240|400)$){
set $flag "${flag}1";
}
#如果URL带宽度参数并且不属于预先指定尺寸,则默认显示宽240
if ($flag = "011"){
set $width '240';
}


#当请求的是原图时(即不带参数),则设置宽高维度为”-”
if ( $width = '' ) {
set $width '-';
}

#如果访问原图
if ( $width = '-' ) {
set $originalImage 1;
}

#原图不缓存
proxy_no_cache $originalImage;

#默认使用的key就是URL
proxy_cache_key $host$uri$width;


# 将缩略图缓存在服务,避免每次请求都重新生成
proxy_cache img_cache;
# 有效的文件,在服务器缓存 1 天
proxy_cache_valid 200 1d;
#默认值:proxy_cache_lock off;
#可配置段:http, server, location
#作用:默认不开启,开启的话则每次只能有一个请求更新相同的缓存,其他请求要么等待缓存&gt;有数据要么限时等待锁释放。通常在多个客户端请求缓存未命中时,只有第一个请求可以发向原服务器,其他请求要等待第一个响应返回或者超时后,使用缓存响应客户端。该参数可以合并回源请求,减轻峰值流量下的压力。
proxy_cache_lock on;
#默认值:proxy_cache_lock_timeout 5s;
#可配置段:http, server, location
#作用:等待缓存锁超时之后将直接请求后端,结果不会被缓存。
proxy_cache_lock_timeout 5s;
#当缓存过期后,如果开启了 proxy_cache_revalidate,则会发出一次 if-modified-since 或 if-none-match 条件请求,如果后端返回 304,则此时$upstream_cache_status 为 REVALIDATED,我们将得到两个好处,节省带宽和减少写磁盘的次数。
proxy_cache_revalidate on;

#标记缓存是否命中,在访问文件头Response Headers中查看
# MISS 未命中,请求被传送到后端
# HIT 缓存命中
# EXPIRED 缓存已经过期请求被传送到后端
# UPDATING 正在更新缓存,将使用旧的应答
# STALE 后端将得到过期的应答
add_header Nginx-Cache "$upstream_cache_status";


#按比例减少图像到指定大小,公减少一个可以另一个用"-"来表示,出错415,参数值可包含变量,可以与rotate一起使用,则两个一起生效。
image_filter resize $width -;
#设置读取图像缓冲的最大大小,超过则415错误。
image_filter_buffer 100M;
#设置变换的JPEG图像的期望质量。可接受的值是从1到100的范围内。较小的值通常意味着既降低图像质量,减少传输数据,推荐的最大值为95。参数值可以包含变量。
image_filter_jpeg_quality 90;
#定义是否应该透明转换的GIF图像或PNG图像与调色板中指定的颜色时,可以保留。透明度的损失将导致更好的图像质量。在PNG的Alpha通道总是保留透明度。
image_filter_transparency on;

}

}

… …
… …
… …

主机配置:V4

CMMI5的访谈记录,如何准备以及如何回答

阅读全文 »