shell读取yaml配置文件的值

目的:在代码提交自动打包时,先检测application.yml中spring.profiles.active的值是否为test(加载测试环境配置文件),如果不是则取消打包。

PS:
当然也可以在jar包启动时通过命令指定测试环境配置文件

--spring.profiles.active=test

会覆盖代码中的值,命令行优先级高于代码中配置。

# 首先pip安装py中的一个包
$ pip install shyaml

windows安装后是个exe程序
linux安装后是python脚本

# a.yaml 示例

fx:
  url: http://192.168.10.16:8080/

# 获取url值:

$ cat a.yml | shyaml.exe get-value fx.url
http://192.168.10.16:8080/

这样配合其他脚本可以实现某些操作。

nginx通过geoip2模块实现判断用户来源国家跳转中英站

ip数据库文件下载地址:https://dev.maxmind.com/geoip/geoip2/geolite2/

编译nginx添加第二代geoip2模块,第一代自带 的–with-http_geoip_module 生命周期算是尾声了。ip地址库都下载不到了。

# 下载独立的geoip2模块,官方nginx还未加入

git clone https://github.com/leev/ngx_http_geoip2_module

# 编译nginx加上geoip2

--add-module=../ngx_http_geoip2_module

报错:
./configure: error: the geoip2 module requires the maxminddb library.
解决:需要安装 libmaxminddb 库,这个是用来读取ip数据文件的。

下载 https://github.com/maxmind/libmaxminddb/releases/download/1.3.2/libmaxminddb-1.3.2.tar.gz
解压依次执行:

./configure
make
make install
echo /usr/local/lib  >> /etc/ld.so.conf.d/local.conf
ldconfig

即可。

重新编译nginx通过。

# 编辑nginx配置文件

http {
    # 只提取关键配置参数
    
    geoip2 /usr/local/GeoLite2-Country_20190507/GeoLite2-Country.mmdb {
        $geoip2_data_country_code default=CN country iso_code;
    }

    server {
        add_header "country" $geoip2_data_country_code; #添加个响应头,方便查。
        
        location / {
            if ($geoip2_data_country_code = CN) {
                root /mnt/cn;
            }
            
            if ($geoip2_data_country_code != CN) {
                root /mnt/other;
            }
        }
    }
}

访问测试,查看响应头中的country字段。

$geoip2_data_country_code 变量是自定义名称的变量,其值是在geoip2解析ip后生成。
default=CN country iso_code 这些参数实际是下面命令返回json的key,default是为了查不到相关key的值时,设置一个默认值。

[root@localhost]# mmdblookup --file GeoLite2-City.mmdb --ip x.x.x.x

apache上传大文件超时问题

apache服务器上传大文件超过21-22秒就提示503错误了。
开始怀疑是apache反向代理php-fpm的问题,找了几个参数也没解决。后来开启apache的debug模式才解决。

# 修改 httpd.conf 开启debug

LogLevel debug

重启apache。

找到error.log
# 看到这么一条日志

[Tue May 07 17:13:02.195708 2019] [reqtimeout:info] [pid 24671:tid 140592553060096] [client 192.168.1.147:11002] AH01382: Request body read timeout

判断是接收数据超时了。

官方文档:http://httpd.apache.org/docs/2.4/mod/mod_reqtimeout.html

# 修改http.conf 设置接收正文超时200秒

<IfModule reqtimeout_module>
    RequestReadTimeout body=200
</IfModule>

解决

关于php-fpm配置最大并发

# 子进程管理方式。 static 静态,dynamic 动态调整
pm = static

# 最大子进程
pm.max_children = 50
pm.start_servers = 5 # 只针对pm = dynamic时有效
pm.min_spare_servers = 5 # 只针对pm = dynamic时有效
pm.max_spare_servers = 35 # 只针对pm = dynamic时有效

如,当 pm = static ,pm.max_children = 50时,启动php-fpm。

[root@localhost php-fpm.d]# ps aux | grep php-fpm | grep -vE "master|grep" | wc -l
50

通过ps可以看到有50个php的子进程,也就意味着php一启动就创建50个进程(固定值)。

当 pm = dynamic 时,其它值不变。启动php

[root@localhost php-fpm.d]# ps aux | grep php-fpm | grep -vE "master|grep" | wc -l
5

通过ps可以看到有5个php的子进程,也就意味着php一启动就创建5个进程(pm.start_servers)。
随着请求访问而变化,但最高不超过pm.max_children的值。

配置linux尽可能使用物理内存

有台测试机zabbx最近一直报交换分区不足,查看内存cache用了近20G,想配置系统尽量使用物理内存。通过配置系统参数swappiness可以实现。

redhat性能调整参考:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/performance_tuning_guide/sect-red_hat_enterprise_linux-performance_tuning_guide-configuration_tools-configuring_system_memory_capacity

swappiness
The swappiness value, ranging from 0 to 100, controls the degree to which the system favors anonymous memory or the page cache. A high value improves file-system performance while aggressively swapping less active processes out of RAM. A low value avoids swapping processes out of memory, which usually decreases latency at the cost of I/O performance. The default value is 60.
简单意思就是swappiness值越小,则尽可能利用物理内存,值越大,则用交换分区。默认值60。
官方文档也没看到说默认值60是指已用还是剩余60%的内存。

官方有个警告提醒:
Setting swappiness==0 will very aggressively avoids swapping out, which increase the risk of OOM killing under strong memory and I/O pressure.
设置为0的话,则非常积极的使用物理内存,但容易出现OOM的风险。

个人理解设置为0,”关闭” 使用交换分区,设置为100,积极使用交换分区。

# 2种方法查看当前值

[root@hub ~]# cat /proc/sys/vm/swappiness
30

[root@hub ~]# sysctl -q vm.swappiness
vm.swappiness = 30

# 修改默认值:

[root@localhost ~]# vi /etc/sysctl.conf 追加一行
vm.swappiness = 10
保存退出,执行。
[root@localhost ~]# sysctl -p
[root@localhost ~]# sysctl -q vm.swappiness
vm.swappiness = 10

执行完交换分区使用率不会立即释放,可能会由系统自动调整。
建议重启下机器,或者在业务上线前进行配置。