Rootop 服务器运维与web架构

2020-07-14
发表者 Venus
sed 修改分隔符已关闭评论

sed 修改分隔符

字符串 a/b/c/def
比如要替换字符串 a/b/c 为aaa

# 未加转义符

[root@localhost ~]# sed -i 's/a/b/c/aaa/g' test.txt
sed: -e expression #1, char 7: unknown option to `s'

不加转义则报错

# 加转义

[root@localhost ~]# sed -i 's/a\/b\/c/aaa/g' test.txt
[root@localhost ~]# cat test.txt
aaa/def

# 加转义符不美观,可以换个分隔符来实现

[root@localhost ~]# cat test.txt
a/b/c/def
[root@localhost ~]# sed -i 's#a/b/c#aaa#g' test.txt
[root@localhost ~]# cat test.txt
aaa/def

2020-07-13
发表者 Venus
nginx set $flag “${flag}1″含义已关闭评论

nginx set $flag “${flag}1″含义

在用set实现多条件判断时,遇到个赋值的疑问。

location /
{
	set $flag "0";
	
	if ($http_user_agent !~* "MetaSr")
	{
		set $flag "${flag}1";
	}

	if ($uri !~* "/api/login")
	{
		set $flag "${flag}2";
	}
	
	if ($flag = "01")
	{
		rewrite ^(.*)$ http://www.a.com/$1;
	}
	
	if ($flag = "02")
	{
		rewrite ^(.*)$ http://www.b.com/$2;
	}
}

set $flag “${flag}1”; 本以为这个${flag}是个什么数据类型,去nginx官网也没找到,最后看人家写的判断后发现,就是个普通的字符串拼接。

2020-07-13
发表者 Venus
nginx接收客户端请求后直接返回json字符串已关闭评论

nginx接收客户端请求后直接返回json字符串

应用需要停机更新,app就不能用,想给app打开后提示一个正在更新的提醒,后端需要改代码,打包发布,流程略长,不如直接在nginx返回开发部门指定格式的json串省事。

# 实现如下:

location /api
{
	default_type application/json;
	add_header Content-Type application/json;
	return 200 '{"code":"000","result":"coming soon"}';
}

这样开发省事,运维也省事。

2020-07-06
发表者 Venus
nginx rtmp模块生成hls文件已关闭评论

nginx rtmp模块生成hls文件

rtmp配置

rtmp
{
	server
	{
		listen 1935;
	
		application app1
		{
			live on;
			#record all;
			#record_path /tmp/rec;
		
			hls on; #开启hls转换
			hls_path /tmp/hls; #hls保存目录
			hls_fragment 10s; #10秒一个ts文件
			hls_playlist_length 10m; #文件索引m3u8记录时长,可以是s秒,m分。

			access_log logs/rtmp-access.log combined;
		}
	}
}

在listen监听在非1935端口时,通过obs studio往nginx中推流(rtmp://192.168.1.142/app1),指定了”串流秘钥”后会提示错误,不指定的话,生成的ts文件没有包含串流秘钥的字符串做为文件名的前缀。
后来换回默认的1935端口后才可以。

2020-06-28
发表者 Venus
InnoDB: Error: log file /usr/local/mysql/data/ib_logfile0 is of different size 0 134217728 bytes已关闭评论

InnoDB: Error: log file /usr/local/mysql/data/ib_logfile0 is of different size 0 134217728 bytes

200622 15:20:32 [Note] Plugin 'FEDERATED' is disabled.
200622 15:20:32 InnoDB: The InnoDB memory heap is disabled
200622 15:20:32 InnoDB: Mutexes and rw_locks use GCC atomic builtins
200622 15:20:32 InnoDB: Compressed tables use zlib 1.2.11
200622 15:20:32 InnoDB: Using Linux native AIO
200622 15:20:32 InnoDB: Initializing buffer pool, size = 256.0M
200622 15:20:32 InnoDB: Completed initialization of buffer pool
InnoDB: Error: log file /usr/local/mysql/data/ib_logfile0 is of different size 0 134217728 bytes
InnoDB: than specified in the .cnf file 0 67108864 bytes!
200622 15:20:32 [ERROR] Plugin 'InnoDB' init function returned error.
200622 15:20:32 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
200622 15:20:32 [ERROR] Unknown/unsupported storage engine: InnoDB
200622 15:20:32 [ERROR] Aborting

提示说ib_logfile0文件的大小与 .cnf配置文件中的配置 67108864 大小不一致,导致启动失败。

解决方法:
1、可以修改mysql配置文件中 innodb_log_file_size 的值为 134217728/1024/1024 = 128 Mb,再测试启动mysql,如果不行继续下面方法2。
2、删除或备份mysql数据目录下的 ib_logfile 开头的文件,再启动mysql。

mysql> show variables like '%innodb_log%';
+-----------------------------+----------+
| Variable_name               | Value    |
+-----------------------------+----------+
| innodb_log_buffer_size      | 16777216 |
| innodb_log_checksums        | ON       |
| innodb_log_compressed_pages | ON       |
| innodb_log_file_size        | 50331648 |
| innodb_log_files_in_group   | 2        |
| innodb_log_group_home_dir   | ./       |
| innodb_log_write_ahead_size | 8192     |
+-----------------------------+----------+
7 rows in set (0.00 sec)

# innodb_log_files_in_group 参数控制redo log文件个数,ib_logfile[0-1]
# innodb_log_file_size 控制redo log文件大小

# 解释
ib_logfile用于事务日志,也叫redo log,有了它,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失。
还有一个日志叫undo log,
它有两个作用:
1、提供事务回滚
2、多个行版本控制(MVCC)(事务隔离级别里有这个概念)
在数据更新时,不仅写redo log,也写对应的undo log,如果因为某些原因导致事务失败,可以通过undo log回滚。