Rootop 服务器运维与web架构

2021-01-05
发表者 Venus
xshell4或者xftp连接报 找不到匹配的outgoing encryption算法已关闭评论

xshell4或者xftp连接报 找不到匹配的outgoing encryption算法

我这里用的是xmanager4版本。

解决方法一般都是修改连接配置文件,把加密里面的算法勾上。这个百度出来的大都是这个方法。

另一种方法在 https://access.redhat.com/es/solutions/895853
注释掉ssh指定的加密算法

[root@centos ~]# cat /etc/ssh/sshd_config | grep Ciphers
# Ciphers and keying
Ciphers aes128-ctr,aes192-ctr,aes256-ctr

把上面指定的加密方式参数注释掉,重启ssh服务。

最靠谱的还是升级xshell,4版本挺旧了。

2020-12-03
发表者 Venus
yum仓库配置文件变量$releaseve $arch $basearch含义已关闭评论

yum仓库配置文件变量$releaseve $arch $basearch含义

官方文档:
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-yum#sec-Using_Yum_Variables

9.5.3. Using Yum Variables
You can use and reference the following built-in variables in yum commands and in all yum configuration files (that is, /etc/yum.conf and all .repo files in the /etc/yum.repos.d/ directory):

$releasever
You can use this variable to reference the release version of Red Hat Enterprise Linux.
Yum obtains the value of $releasever from the distroverpkg=value line in the /etc/yum.conf configuration file.
If there is no such line in /etc/yum.conf, then yum infers the correct value by deriving the version number from the redhat-releaseproduct package that provides the redhat-release file.
用 $releasever 变量可以获取rhel发行版。
yum从/etc/yum.conf配置文件中的distroverpkg参数指定的rpm包获取$releasever的值。
如果没有distroverpkg参数配置,那么yum会从 redhat-release 包提供的redhat-release文件推导出版本号。
上面是rhel的官方文档,如果是centos的话,那么就是 centos-release 这个包。

$arch
You can use this variable to refer to the system’s CPU architecture as returned when calling Python’s os.uname() function.
Valid values for $arch include: i586, i686 and x86_64.
获取cpu架构,包括i586、i686、x86_64

$basearch
You can use $basearch to reference the base architecture of the system.
For example, i686 and i586 machines both have a base architecture of i386, and AMD64 and Intel 64 machines have a base architecture of x86_64.
获取cpu架构组,比如 i386、x86_64

[root@MiWiFi-RA69-srv etc]# cat /etc/yum.conf 
略```
distroverpkg=centos-release

[root@MiWiFi-RA69-srv etc]# rpm -qi centos-release
Name        : centos-release
Version     : 7
Release     : 3.1611.el7.centos

版本号就是7
如:阿里云centos7.repo
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/

根据变量解析出来就是
http://mirrors.aliyun.com/centos/7/os/x86_64/
http://mirrors.aliyuncs.com/centos/7/os/x86_64/
http://mirrors.cloud.aliyuncs.com/centos/7/os/x86_64/

2020-11-24
发表者 Venus
python virtualenv虚拟环境已关闭评论

python virtualenv虚拟环境

virtualenv比较合适同一个python版本下,同软件包不同版本的环境独立。

# 通过pip安装功能
[root@MiWiFi-RA69-srv]# pip install virtualenv

# 创建一个文件夹,在此生成虚拟环境
[root@MiWiFi-RA69-srv]# mkdir new && cd new

# 创建
[root@MiWiFi-RA69-srv new]# virtualenv env
ImportError: No module named zipp 得到一个报错
[root@MiWiFi-RA69-srv new]# pip install zipp==1.2.0

# 重新创建
ImportError: No module named configparser 得到一个报错
[root@MiWiFi-RA69-srv new]# pip install configparser==3.5.0

[root@MiWiFi-RA69-srv new]# virtualenv env

# 创建一个不包含任何第三方包的独立环境 --no-site-packages
[root@MiWiFi-RA69-srv new]# virtualenv --no-site-packages venv

# 进入环境
[root@MiWiFi-RA69-srv new]# source env/bin/activate
# 离开环境
(env) [root@MiWiFi-RA69-srv new]# deactivate 

# 删除环境
[root@MiWiFi-RA69-srv new]# rm -rf env

如果需要其他python版本,则需要在系统中先安装目标版本,再通过-p参数指定创建环境。
virtualenv -p /usr/bin/python2.7 env

之前有写过conda实现多个py版本,它有个好处就是可以直接指定python版本,会自己下载,免去单独安装的步骤。

2020-11-24
发表者 Venus
Cannot assign requested address已关闭评论

Cannot assign requested address

代码连接数据库报错:

根据提示是说无法分配请求地址,这个问题随便一搜就知道是端口不足造成的。
查了下系统网络连接状态,发现是连接redis造成,没有使用redis连接池,导致大量time_wait连接状态没及时释放。再加上其他服务连接造成端口不足。

# 先通过修改内核参数解决,临时生效

sysctl -w net.ipv4.tcp_fin_timeout=30
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.ipv4.tcp_tw_recycle=1
# 增大可用源端口范围
sysctl -w net.ipv4.ip_local_port_range="10000 65000"

注意:
4.12内核版本开始移除了 tcp_tw_recycle 配置

2020-11-12
发表者 Venus
java.lang.OutOfMemoryError: unable to create new native thread已关闭评论

java.lang.OutOfMemoryError: unable to create new native thread

日志监控系统报警,java日志不停报错:

07:02:44.168 [http-nio-8080-exec-3] ERROR com.xxx.common.base.SLExceptionHandler - Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: unable to create new native thread

看提示是OutOfMemoryError发生了OOM,也就是内存溢出,无法创建新线程,但是通过zabbix监控这台机器内存还有1.7G左右,并没有用完。

想重启服务,发现ssh也无法连接了,提示 reset by peer,只好登陆控制台强制重启。
进系统后发现 /var/log/secure 日志

Nov 11 07:10:25 node1 sshd[1043]: error: fork: Cannot allocate memory

竟然也提示无法分配内存,搜索资料说跟最大进程数有关,但未优化的系统默认是1024,不应该产生这么多进程,而且进程数多了zabbix有报警。
还有一条错误是 /var/log/messages中:

Nov 11 07:24:45 node1 chronyd[566]: Fatal error : pthread_create() failed

pthread_create 是系统创建线程的方法,提示失败,那是不是线程数量超过系统限制才无法创建。但是系统已经重启,已经看不到当时的在运行的线程数。

# 查看系统限制最大进程数
[root@localhost ~]# cat /proc/sys/kernel/pid_max 
32768
# 查看系统限制最大线程数
[root@localhost ~]# cat /proc/sys/kernel/threads-max 
30101

可以看到最大线程数是30101。
想起来前阵子有个服务占内存高,不停的在增长也导致服务器挂过一次,后来加了内存监控报警,小于1G就报警,重启。这次还没小于1G就挂了。
就查此模块的线程数,发现每分钟都在增加。算了下24小时大约会生成4000+个线程。

所以线程数满了后,也错误的提示了内存分配的错误,导致排错方向错误。
开发修改代码后,线程数不再增长了。

注意:系统也会对某个用户进行最大运行进程限制(ulimit -u)