配置

创建目录:

1
2
3
4
5
6
7
8
mkdir -p /opt/mysql8/conf
mkdir -p /opt/mysql8/db
mkdir -p /opt/mysql8/binlogs

# 授权
chmod 777 /opt/mysql8/conf
chmod 777 /opt/mysql8/db
chmod 777 /opt/mysql8/binlogs

目录结构如下:

1
2
3
4
5
├── conf
│ └── my.cnf # MySQL配置文件
├── db # 数据库数据文件目录
├── mysql-docker-compose.yml # docker-compose.yml文件
└── binlogs # 日志存放目录
阅读全文 »

MobaXterm 是一款非常好用的远程工具,也可以说是很多朋友的远程操作必备的终极工具箱,它的优点就是拥有多合一网络应用程序,其中有远程网络工具SSH,X11,RDP,VNC,FTP、MOSH以及Unix命令bash,ls,cat,sed,grep,awk,rsync,而且在软件包管理器中还可以下载并使用更多的Unix工具。当然了该软件采用了X11服务器,能够让显示器使用SSH进行安全传输,不仅可以简化还可以保护您的工作。

Snipaste_2023-04-07_15-34-01.png

软件介绍

MobaXterm是一款豪华、全功能的终端软件。它不仅可以像PuTTY一样通过SSH连接Raspberry Pi等开源硬件,并且还能:

  • 支持各种连接 SSH,X11,RDP,VNC,MOSH,FTP,串口,X server等功能
  • 支持 Unix 命令(bash,ls,cat,sed,grep,awk,rsync,…)
  • 连接 SSH 终端后支持 SFTP 传输文件
  • 各种丰富的插件(git/dig/aria2…)
  • 可运行 Windows 或软件
阅读全文 »

Dism++

Dism++ 是一款 Windows 系统管理优化工具,它解决了我们安装、维护系统的一大痛点问题——自定义设置和优化。相当于一个 “一站式” 管理优化工具集。

Dism++可以说是一个Dism的GUI版,但是Dism++并不依赖Dism相关组件。直接使用更加底层的CBS内核,因此无需任何Dism组件即可兼容所有高低版本系统,甚至是Vista!那么什么是CBS?CBS全称是Component Based Servicing Reference,是微软自己内部使用的组件管理API,微软自家的Dism,Windows Update也主要依靠CBS实现的。目前该软件兼容 Windows Vista/7/8/8.1/10。

Dism++的六大特点

  • 1、支持更新文件的清理,安装更新不再纠结硬盘容量;
  • 2、支持压缩系统,不精简系统也能节省最高达33%的空间;
  • 3、完整支持ESD,玩家再也不用担心ESD转ISO了;
  • 4、支持自主选择Windows Update,安心更新;
  • 5、支持系统恢复,系统热备份、热还原无需PE;
  • 6、真正的绿色软件,无广告、无后门,安心用。

它把用户使用、调整频率较高的选项集合到一起,让我们可以使用它快速地完成电脑的自定义设置和优化,而不需要一层层地打开在不同位置的设置选项逐个调整,极大地方便了我们的操作。

官网 https://dism.cf/
下载 https://github.com/Chuyu-Team/Dism-Multi-language/releases
截图:

Snipaste_2023-04-07_13-21-12.png

参考:

https://bbs.pceva.com.cn/thread-127496-1-1.html

介绍

DASH是 Dynamic Adaptive Streaming over HTTP 的简称,是一种自适应码率流媒体技术。

MPEG-DASH 是一种基于HTTP的流媒体传输协议,负责将视频从HTTP服务器传输给终端用户。在 MPEG-DASH 中,一个视频被分割成许多切片,这一信息被一个MPD记录。该MPD首先被传输给播放器,播放器基于当前网络条件和缓冲情况,基于MPD信息来请求合适码率&分辨率的视频切片。

ABR是 Adaptive Bit-Rate streaming 的简称,是指为确保视频在互联网上的流畅传输,而根据带宽条件自适应地调节视频码率和质量的过程。

使用ABR技术后,视频被转码为多种分辨率和码率的组合,这种组合被称为 rendition,这些 rendition 的集合形成了码率阶梯(Bitrate Ladder)。

MPEG-DASH 支持TS和 MP4 / ISO BMFF媒体段。HLS只支持 MPEG-2 TS。DASH媒体段通常比HLS短,2至4秒比较常见。DASH不需要特定的编解码器。视频可以使用H264编码,也可以用其他编码,VP9和H265也是比较受欢迎的编码。

下面就是一个码率阶梯:

1080p 5.0 mbps2.   720p 4.0 mbps3.   640p 3.2 mbps4.   480p 2.0 mbps5.   270p 1 mbps

MPEG-DASH 工作流程

f03f0511baeb020d9b4bb9364bf8ce76.png

  • 一组电影的编码(或码率-分辨率组合, 即 rendition)由 MPEG-DASH 打包服务或软件去打包,打包的过程是将每个 rendition 分割成指定时间的小片或小块(例如,2秒或4秒长)。
  • 打包器还将其如何分割视频以及视频的交付顺序记录在一个称为MPD或清单(manifest)的文本文件中。
  • 打包过的视频和清单被存储在源站服务器,并等待被分发给播放器(通常使用CDN)。
    在另一端,有一个兼容了 MPEG-DASH 的播放器,其中内置了ABR引擎。
  • 当用户按下播放键,应用程序或者视频播放器请求视频的MPD文件,在收到MPD后,播放器对其进行解析然后理解如何播放视频。
  • 播放器开始按照预定义顺序请求视频切片,解码它们并将视频显示给用户。
  • 播放器持续监测带宽条件。根据可用带宽,播放器选择 MPEG-DASH MPD 中描述的码率之一,并请求CDN从该变体(Variant)中发送下一个视频块。

整个过程会一直持续,直到视频播放结束(电影结束或者用户停止观看)。

阅读全文 »

HLS简介

HLS 全称是 HTTP Live Streaming,是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议。是苹果公司QuickTime X和iPhone软件系统的一部分。 它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。目前HLS协议被广泛的应用于视频点播和直播领域。

在 HTML5 页面上使用 HLS 非常简单:

直接:

1
<video src="example.m3u8" controls></video>

或者:

1
2
3
<video controls>
<source src="example.m3u8"></source>
</video>
阅读全文 »

(未验证)草稿状态。

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
version: "3.1"

services:
nginx:
image: nginx:1.22.0
container_name: nginx
restart: unless-stopped
networks:
- net0
volumes:
- /opt/nginx/www:/var/www
- /opt/nginx/logs:/var/log/nginx
- /opt/nginx:/etc/nginx
ports:
- 31000:443
environment:
- NGINX_PORT=80
- TZ=Asia/Shanghai
privileged: true
networks:
net0:
driver: bridge
ipam:
driver: default
config:
- subnet: 10.10.12.0/24
gateway: 10.10.12.1

networks:
default:
external:
name: docker_compose_net
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
version: "3"

networks:
default:
external:
name: docker_compose_net

services:
minio:
restart: unless-stopped
image: minio/minio
container_name: minio
ports:
- "9100:9000" # api 端口
- "9190:9090" # 控制台端口
networks:
- net0
volumes:
- /opt/minio/data:/data
privileged: true
environment:
MINIO_ACCESS_KEY: admin #管理后台用户名
MINIO_SECRET_KEY: admin123 #管理后台密码,最小8个字符
command: server --console-address ':9090' /data #指定容器中的目录 /data

配置文件:

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
user                 nginx;
pid /var/run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 65535;

# Enables the use of JIT for regular expressions to speed-up their processing.
pcre_jit on;

events {
multi_accept on;
worker_connections 65535;
}

http {
charset utf-8;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
types_hash_max_size 2048;
types_hash_bucket_size 64;
client_max_body_size 16M;

# MIME
include mime.types;
default_type application/octet-stream;

# Enables or disables the use of underscores in client request header fields.
# When the use of underscores is disabled, request header fields whose names contain underscores are marked as invalid and become subject to the ignore_invalid_headers directive.
# underscores_in_headers off;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

map $time_iso8601 $logdate {
'~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;
default 'date-not-found';
}

access_log logs/access-$logdate.log main;
open_log_file_cache max=10;

#access_log logs/access.log main;

# Log in JSON Format
# log_format nginxlog_json escape=json '{ "timestamp": "$time_iso8601", '
# '"remote_addr": "$remote_addr", '
# '"body_bytes_sent": $body_bytes_sent, '
# '"request_time": $request_time, '
# '"response_status": $status, '
# '"request": "$request", '
# '"request_method": "$request_method", '
# '"host": "$host",'
# '"upstream_addr": "$upstream_addr",'
# '"http_x_forwarded_for": "$http_x_forwarded_for",'
# '"http_referrer": "$http_referer", '
# '"http_user_agent": "$http_user_agent", '
# '"http_version": "$server_protocol", '
# '"nginx_access": true }';
# access_log /dev/stdout nginxlog_json;

# See Move default writable paths to a dedicated directory (#119)
# https://github.com/openresty/docker-openresty/issues/119
client_body_temp_path /var/run/openresty/nginx-client-body;
proxy_temp_path /var/run/openresty/nginx-proxy;
fastcgi_temp_path /var/run/openresty/nginx-fastcgi;
uwsgi_temp_path /var/run/openresty/nginx-uwsgi;
scgi_temp_path /var/run/openresty/nginx-scgi;

# Logging
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;

# SSL
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;

# Diffie-Hellman parameter for DHE ciphersuites
ssl_dhparam /etc/nginx/dhparam.pem;

# Mozilla Intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

# OCSP Stapling
# ssl_stapling on;
# ssl_stapling_verify on;
resolver 1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s;
resolver_timeout 2s;

# Connection header for WebSocket reverse proxy
map $http_upgrade $connection_upgrade {
default upgrade;
"" close;
}

map $remote_addr $proxy_forwarded_elem {

# IPv4 addresses can be sent as-is
~^[0-9.]+$ "for=$remote_addr";

# IPv6 addresses need to be bracketed and quoted
~^[0-9A-Fa-f:.]+$ "for=\"[$remote_addr]\"";

# Unix domain socket names cannot be represented in RFC 7239 syntax
default "for=unknown";
}

map $http_forwarded $proxy_add_forwarded {

# If the incoming Forwarded header is syntactically valid, append to it
"~^(,[ \\t]*)*([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?(;([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?)*([ \\t]*,([ \\t]*([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?(;([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?)*)?)*$" "$http_forwarded, $proxy_forwarded_elem";

# Otherwise, replace it
default "$proxy_forwarded_elem";
}

# Load configs
include /etc/nginx/conf.d/*.conf;

# Don't reveal OpenResty version to clients.
server_tokens off;
}

简介

  地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

  地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。

ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。

阅读全文 »

  ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

  ICMP使用IP的基本支持,就像它是一个更高级别的协议,但是,ICMP实际上是IP的一个组成部分,必须由每个IP模块实现。

简介

  ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义。它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。

  ICMP 是 TCP/IP 模型中网络层的重要成员,与 IP 协议、ARP 协议、RARP 协议及 IGMP 协议共同构成 TCP/IP 模型中的网络层。ping 和 tracert是两个常用网络管理命令,ping 用来测试网络可达性,tracert 用来显示到达目的主机的路径。ping和 tracert 都利用 ICMP 协议来实现网络功能,它们是把网络协议应用到日常网络管理的典型实例。
  从技术角度来说,ICMP就是一个“错误侦测与回报机制”,其目的就是让我们能够检测网路的连线状况﹐也能确保连线的准确性。当路由器在处理一个数据包的过程中发生了意外,可以通过ICMP向数据包的源端报告有关事件。

  其功能主要有:侦测远端主机是否存在,建立及维护路由资料,重导资料传送路径(ICMP重定向),资料流量控制。ICMP在沟通之中,主要是透过不同的类别(Type)与代码(Code) 让机器来识别不同的连线状况。

  ICMP 是个非常有用的协议﹐尤其是当我们要对网路连接状况进行判断的时候。

阅读全文 »

网络命令

1
2
3
4
ipconfig /flushdns
ipconfig /displaydns
ipconfig /release
ipconfig /renew

netsh winsock reset 命令和作用是重置 Winsock 目录。如果电脑的Winsock协议配置有问题,则会导致网络连接出现问题,就需要使用 netsh winsock reset命令来重置Winsock目录以恢复网络。
该命令可以重新初始化网络环境,以解决由于软件冲突、病毒等原因造成的参数错误问题。

  • 1 清除ARP缓存,输入命令 arp -d *代替执行。
  • 2 清除NETBT,输入命令nbtstat -R代替执行。
  • 3 清除DNS缓存,输入命令ipconfig/flushdns代替执行。

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
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
using System;
using System.Web;
using System.Xml;
using System.Collections;
using System.Net;
using System.Text;
using System.IO;
using System.Xml.Serialization;

/// <summary>
/// 利用WebRequest/WebResponse进行WebService调用的类
/// </summary>
public class WebServiceHelper
{
//<webServices>
// <protocols>
// <add name="HttpGet"/>
// <add name="HttpPost"/>
// </protocols>
//</webServices>
private static Hashtable _xmlNamespaces = new Hashtable();//缓存xmlNamespace,避免重复调用GetNamespace

/// <summary>
/// 需要WebService支持Post调用
/// </summary>
public static XmlDocument QueryPostWebService(String URL, String MethodName, Hashtable Pars)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
SetWebRequest(request);
byte[] data = EncodePars(Pars);
WriteRequestData(request, data);
return ReadXmlResponse(request.GetResponse());
}

/// <summary>
/// 需要WebService支持Get调用
/// </summary>
public static XmlDocument QueryGetWebService(String URL, String MethodName, Hashtable Pars)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName + "?" + ParsToString(Pars));
request.Method = "GET";
request.ContentType = "application/x-www-form-urlencoded";
SetWebRequest(request);
return ReadXmlResponse(request.GetResponse());
}


/// <summary>
/// 通用WebService调用(Soap),参数Pars为String类型的参数名、参数值
/// </summary>
public static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars)
{
if (_xmlNamespaces.ContainsKey(URL))
{
return QuerySoapWebService(URL, MethodName, Pars, _xmlNamespaces[URL].ToString());
}
else
{
return QuerySoapWebService(URL, MethodName, Pars, GetNamespace(URL));
}
}

/// <summary>
/// 通用WebService调用(Soap)
/// </summary>
/// <param name="URL"></param>
/// <param name="MethodName"></param>
/// <param name="Pars"></param>
/// <param name="XmlNs"></param>
/// <returns></returns>
private static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars, string XmlNs)
{
_xmlNamespaces[URL] = XmlNs;//加入缓存,提高效率
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
request.Method = "POST";
request.ContentType = "text/xml; charset=utf-8";
request.Headers.Add("SOAPAction", "\"" + XmlNs + (XmlNs.EndsWith("/") ? "" : "/") + MethodName + "\"");
SetWebRequest(request);
byte[] data = EncodeParsToSoap(Pars, XmlNs, MethodName);
WriteRequestData(request, data);
XmlDocument doc = new XmlDocument(), doc2 = new XmlDocument();
doc = ReadXmlResponse(request.GetResponse());
XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
mgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
String RetXml = doc.SelectSingleNode("//soap:Body/*/*", mgr).InnerXml;
doc2.LoadXml("<root>" + RetXml + "</root>");
AddDelaration(doc2);
return doc2;
}

/// <summary>
/// 通过WebService的WSDL获取XML名称空间
/// </summary>
/// <param name="URL"></param>
/// <returns></returns>
private static string GetNamespace(String URL)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL + "?WSDL");
SetWebRequest(request);
WebResponse response = request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
XmlDocument doc = new XmlDocument();
doc.LoadXml(sr.ReadToEnd());
sr.Close();
return doc.SelectSingleNode("//@targetNamespace").Value;
}

/// <summary>
/// 动态生成SOP请求报文内容
/// </summary>
/// <param name="Pars"></param>
/// <param name="XmlNs"></param>
/// <param name="MethodName"></param>
/// <returns></returns>
private static byte[] EncodeParsToSoap(Hashtable Pars, String XmlNs, String MethodName)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"></soap:Envelope>");
AddDelaration(doc);
XmlElement soapBody = doc.CreateElement("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
XmlElement soapMethod = doc.CreateElement(MethodName);
soapMethod.SetAttribute("xmlns", XmlNs);
foreach (string k in Pars.Keys)
{
XmlElement soapPar = doc.CreateElement(k);
soapPar.InnerXml = ObjectToSoapXml(Pars[k]);
soapMethod.AppendChild(soapPar);
}
soapBody.AppendChild(soapMethod);
doc.DocumentElement.AppendChild(soapBody);
return Encoding.UTF8.GetBytes(doc.OuterXml);
}

/// <summary>
/// 将对象转换成XML节点格式
/// </summary>
/// <param name="o"></param>
/// <returns></returns>
private static string ObjectToSoapXml(object o)
{
XmlSerializer mySerializer = new XmlSerializer(o.GetType());
MemoryStream ms = new MemoryStream();
mySerializer.Serialize(ms, o);
XmlDocument doc = new XmlDocument();
doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray()));
if (doc.DocumentElement != null)
{
return doc.DocumentElement.InnerXml;
}
else
{
return o.ToString();
}
}

/// <summary>
/// 设置WEB请求
/// </summary>
/// <param name="request"></param>
private static void SetWebRequest(HttpWebRequest request)
{
request.Credentials = CredentialCache.DefaultCredentials;
request.Timeout = 10000;
}

/// <summary>
/// 设置请求数据
/// </summary>
/// <param name="request"></param>
/// <param name="data"></param>
private static void WriteRequestData(HttpWebRequest request, byte[] data)
{
request.ContentLength = data.Length;
Stream writer = request.GetRequestStream();
writer.Write(data, 0, data.Length);
writer.Close();
}

/// <summary>
/// 获取字符串的UTF8码字符串
/// </summary>
/// <param name="Pars"></param>
/// <returns></returns>
private static byte[] EncodePars(Hashtable Pars)
{
return Encoding.UTF8.GetBytes(ParsToString(Pars));
}

/// <summary>
/// 将Hashtable转换成WEB请求键值对字符串
/// </summary>
/// <param name="Pars"></param>
/// <returns></returns>
private static String ParsToString(Hashtable Pars)
{
StringBuilder sb = new StringBuilder();
foreach (string k in Pars.Keys)
{
if (sb.Length > 0)
{
sb.Append("&");
}
sb.Append(HttpUtility.UrlEncode(k) + "=" + HttpUtility.UrlEncode(Pars[k].ToString()));
}
return sb.ToString();
}

/// <summary>
/// 获取Webservice响应报文XML
/// </summary>
/// <param name="response"></param>
/// <returns></returns>
private static XmlDocument ReadXmlResponse(WebResponse response)
{
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
String retXml = sr.ReadToEnd();
sr.Close();
XmlDocument doc = new XmlDocument();
doc.LoadXml(retXml);
return doc;
}

/// <summary>
/// 设置XML文档版本声明
/// </summary>
/// <param name="doc"></param>
private static void AddDelaration(XmlDocument doc)
{
XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null);
doc.InsertBefore(decl, doc.DocumentElement);
}
}

调用:

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
[System.Runtime.Serialization.CollectionDataContractAttribute(Name = "ArrayOfAnyType", Namespace = "http://www.startest.com/webservices/", ItemName = "anyType")]
[System.SerializableAttribute()]
public class AnyType : System.Collections.Generic.List<object>
{
}

namespace ConsoleApp6
{
internal class Program
{
static void Main(string[] args)
{
var url = "http://10.10.102.106/test/Services/Generic.asmx";

AnyType anytype = new AnyType();
anytype.Add("10000");
anytype.Add("陈护佑");
anytype.Add("2023-01-01");
anytype.Add("2023-01-17");

Hashtable ht = new Hashtable();
ht.Add("actionID", "GetInfo");
ht.Add("UserName", "test1");
ht.Add("Password", "test1");
ht.Add("parameters", anytype);

var result = WebServiceHelper.QuerySoapWebService(url, "RunActionDirect", ht);
}
}
}

参考:

C# 通过Get、Post、Soap调用WebService的方法

nginx.conf 配置:

1
2
3
4
5
6
7
8
9
10
11
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

map $time_iso8601 $logdate {
'~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;
default 'date-not-found';
}

access_log logs/access-$logdate.log main;
open_log_file_cache max=10;

参考:

简单搞定Nginx日志分割

简介

  • prometheus:负责收集和存储时间序列数据
  • alertmanager: 警告信息通知
  • node-exporter:负责暴露主机 metrics 数据给 prometheus
  • cadvisor: 收集docker容器信息
  • grafana:负责展示数据

Docker-Compose安装Prometheus

docker-compose.yml 配置:

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
version: '3.7'

networks:
default:
external:
name: docker_compose_net

services:
prometheus:
image: prom/prometheus
container_name: prometheus
hostname: prometheus
restart: unless-stopped
volumes:
- /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- /opt/prometheus/node_down.yml:/etc/prometheus/node_down.yml
ports:
- "9990:9090"
environment:
- TZ=Asia/Shanghai # 时区配置亚洲上海

alertmanager:
image: prom/alertmanager
container_name: alertmanager
hostname: alertmanager
restart: unless-stopped
volumes:
- /opt/prometheus/alertmanager.yml:/etc/alertmanager/alertmanager.yml
- /opt/prometheus/alert-template/:/alertmanager/template/
ports:
- "9993:9093"
environment:
- TZ=Asia/Shanghai # 时区配置亚洲上海
阅读全文 »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 新建用户
useradd lims

# 给用户设置密码
passwd lims

# 设置相应的文件夹的用户名和用户组
chown -R lims:lims /opt/nginx/www

# 给文件夹赋权
chmod -R 777 /opt/nginx/www

# 查看目录的所属者和操作权限
ls -la /opt/nginx/www

# 到 sudoers 文件中增加新的用户,否则无法使用 sudo 命令
vim /etc/sudoers ====> 增加一行与 ROOT 相同的配置,然后输入 wq! 强制退出