1.编译安装–升级python3.11
- 背景:
- 目前各种Linux默认的python基本上都是python 3.x
- 现在用的是3.7,用ansible时有警告提示,漏洞等,所以要升级,目前升到3.11
- 之前旧版本linux(centos 7.x),python都是2.7
- 升级到更新的版本:
- python作为系统基础环境,依赖, 很多服务软件都需要使用,yum(dnf)/iotop/pip3/ansible都使用的是python
- 升级也需要慎重, 有很多软件依赖python
系统常见的依赖:
python
glibc
zlib
openssl #提供加密(openssh背后就是它)
gcc
1.1升级python3.11全流程
可以尝试升级python(所有节点)
#0.下载软件包(yum源没有-->编译安装)
#1.解压python3.11压缩包(xz和gz一样,压缩得更狠,压缩包更小)
tar xf Python-3.11.14.tar.xz
#2.进入此目录
cd Python-3.11.14
#3.安装依赖(也可以第一步就安装)
yum install -y gcc openssl-devel bzip2-devel libffi-devel zlib-devel
#4.编译安装-配置-备菜
./configure --enable-optimizations --with-ssl
#--enable-optimizations 自动进行优化(python配置)
#--with-ssl 支持ssl模块,功能(tls和ssl类似,都是加密)
#5.编译-生成二进制文件-炒菜
make -j `nproc`
#6.安装-创建目录(改权限),复制文件/依赖等操作-上菜
make install
#7.检查
python3 --version
#8.ans版本还是3.7--->当时用旧版本py安的-->再安装一遍即可
ansible --version
1.2管理端升级py后重新安装ansible
#1.升级pip
python3 -m pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple --upgrade pip
#2.pip源(加速pip下载软件)--写在了/root/.config/pip/pip.conf下
pip3 config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
#3.安装ans
pip3 install ansible
#4.再检查ans版本
#5.升级完之后管理端记得修改python3的位置
[root@m01 ~]# which python3
/usr/local/bin/python3
[root@m01 ~]# cat /etc/ansible/ansible.cfg
1.3批量执行的软件-pssh
#1.安装批量执行的软件pssh
yum install -y pssh
#2.软件包内容包含以下命令
pssh 是ssh并发执行的版本,批量连接多台机器并执行命令 类似ans的command/shell/script模块
pscp.pssh scp批量发送 类似ans的copy模块
prsync
#2.前提
1.先配置好密钥认证
2.创建好hosts文件 形式:用户名@ip
[root@m01 /server/ansible]# cat pssh-hosts
root@172.16.1.5
root@172.16.1.6
root@172.16.1.7
root@172.16.1.8
root@172.16.1.9
root@172.16.1.10
root@172.16.1.51
root@172.16.1.52
root@172.16.1.31
root@172.16.1.41
#root@10.0.0.199
#1.批量执行命令
pssh -P -h pssh-hosts hostname -I
pssh -P -h pssh-hosts ls /server/scripts/
-P显示命令的输出,简单命令可以使用,过于复杂不推荐,比如运行脚本等(输出太多)
#2.批量分发文件(管理端的位置-->被管理端的位置)
pscp.pssh -h pssh-hosts /root/Python-3.11.14.tar.xz ~ #分发tar包
pscp.pssh -h pssh-hosts /server/scripts/upgrade_python.sh /server/scripts/ #分发脚本
#3.批量升级python(慢)
pssh -t 0 -h pssh-hosts bash /server/scripts/upgrade_python.sh
-t指定超时时间,为0表示不过期,一直等待执行完成
#4.期间可以找个节点去观察
pstree -p 或ps -ef查看具体进度
#5.最后检查py版本
pssh -P -h pssh-hosts python3 --version
1.4升级py简易脚本
[root@m01 /server/ansible]# cat /server/scripts/upgrade_python.sh
#!/bin/bash
##############################################################
# File Name:/server/scripts/upgrade_python.sh
# Version:V1.0
# Author:cui
# Organization:www.typedance.com
# Desc:
##############################################################
#1.解压python3.11压缩包(先scp过来)
tar xf Python-3.11.14.tar.xz
#2.进入此目录
cd Python-3.11.14
#3.安装依赖
yum install -y gcc openssl-devel bzip2-devel libffi-devel zlib-devel
#4.编译安装-配置-备菜
./configure --enable-optimizations --with-ssl
#--enable-optimizations自动进行优化(python)
#--with-ssl支持ssl模块,功能。
#5.编译-生成二进制文件-炒菜
make -j `nproc`
#6.安装-创建目录,复制文件等操作-上菜
make install
2.内功心法: 网站集群演变
- 网站集群怎么来的?
- 演变: 先有一个起点(1台或少量几台机器),然后随着公司网站用户,访问数量的增加,进行不断改进。
- 预估: 预判网站集群1年-5年之后的情况。根据规模去反推集群该是啥样的
3.网站集群优化
- 目标:理解与记录, 主要面试,面试前记录一下
- Linux系统优化
- 服务优化: nginx,tomcat,mysql
- 系统安全优化(等保测评优化,系统安全加固)
3.1Linux系统优化
1)关闭SElinux
- 麒麟,ubt默认就是关闭的
- selinux增强型安全防护机制。未来都关闭就行
- CentOS 7.x 系列默认开启
2)Firewalld CentOS7 iptables(C6) 安全组(阿里云)
- 配置防火墙规则和安全组规则
3)添加普通用户并配置sudo权限
- 预防root密码忘记,切换到普通用户,间接修改root密码
- root禁止远程登陆(最后做,别把自己关外面)
4)hosts文件解析当前的主机名或自建DNS
- 不用记ip,记主机名即可。缺点:每台机器都得加hosts解析(保证
ping 主机名通) - 主机不多时,使用hosts解析
- 主机非常多搭建内部的DNS服务器(bind/dnsmasq),相当于自己搭建了223.5.5.5
- 公有云环境: 共有云内网DNS, 内网域名解析(Private Zone和自建DNS)
- k8s环境: 内置了CoreDNS
5)锁定关键文件 chattr lsattr 或AIDE监控扫描–安全优化
- 基于文件系统的权限(系统隐藏权限)
- chattr(修改) lsattr(查看)
- 给配置文件 +a 只能追加
- 给命令(系统中病毒,有些命令可能被感染) +i 不能修改
6)统一系统字符集:UTF-8
- 字符集默认都是UTF-8
- 语言:
- 英文环境 en_US.UTF-8(推荐)—>
localectl查看 - 中文环境 zh_CN.UTF-8
7)调整用户登录提示信息/etc/motd
- 用户登录系统后显示的
- 一般配置些系统固定不变的信息(核心数,内存总大小,主机名,ip)
8)清空/etc/issue /etc/issue.net
- 用户连接系统之前显示的
- /etc/issue.net是使用telnet连接系统时显示
9)配置/etc/profile.d/info.sh登录系统后显示系统基本信息(ip,主机名,网卡,硬盘,负载,登录用户数)
- /etc/profile.d/ 用户登录系统后就会运行目录下面以
.sh结尾的文件。可以把系统巡检脚本一部分核心内容写成脚本放在此处
3.2基础服务优化
1)ssh优化
- 解决远程连接慢(ip–别再–>域名)
- UseDNS no #UseDNS表示ip—反向解析—>域名
- GSSAPIAuthentication no #新版本openssh9.9中不用配置
- 安全:
- Port 52113
- PermitRootLogin no #是否准许root远程登录
- PasswordAuthentication yes #是否开启密码登录
- PubkeyAuthentication yes #是否开启密钥登录(万一密钥认证失效,备用还有密码认证)
- 配置内外网监听不同的端口
- ListenAddress 准许用户从哪个网卡连接 还可以同时指定端口
- 监听哪个网卡: ip是本地的ip 内网 公网ip
- ListenAddress 10.0.0.7:52113
- ListenAddress 172.16.1.7:22
2)yum源: 修改系统默认的yum源增加epel源
- 先确认服务器是否有公网
- 有公网: 配置yum源即可,麒麟/CentOS(epel源+默认源)
- 无公网: 搭建内网yum仓库,存放常用软件包与服务依赖(找1台有网机器–>开启yum的keepcache(缓存)功能—>安装公司用到的软件(软件包和依赖都有了))
vim /etc/yum.conf加入keepcache=1即可开启缓存find /var/cache/dnf/ -type f -name "*.rpm"把这些rpm包找个目录存起来,自建yum仓库
- 云服务器(是否有公网都没事):直接配置与使用云厂商的内网yum源(温馨提示:公有云购买后一般都配置好了内网yum源)
- debian/ubt系统源:
/etc/apt/sources.list - 物理机与虚拟机需要,公有云都配置好了
3)时间同步: 定时任务+ntpdate/chrony
- 时间不一致,未来有些服务(ceph分布式存储)用不了,直接启动失败
- 通过公网时间服务器同步时间。 ntpdate命令+定时任务
- 自建ntpd/chrony时间服务器,通过内网同步
- 时间同步服务:ntpd,chrony(默认) (
/etc/chrony.conf服务名chronyd)
4)调整文件描述符
- 文件描述符—-每个进程可以打开的文件数量
5)修改历史命令环境变量
| 环境变量 | 说明 |
| TMOUT | 超时时间60/300 自动注销 |
| HISTSIZE | 控制history命令记录条数 未来一般10条即可 |
| HISTFILESIZE | history文件记录条数 未来一般10条即可 |
| HISTCONTROL | 控制history是否记录 用过命令 |
| PROMPT_COMMAND | 下1个命令之前,会运行环境变量里面的命令 用户审计 |
3.3内核优化
- /etc/sysctl.conf 主配置文件 /etc/sysctl.d/xxx.conf子配置文件
- 生效:sysctl -p –>生效本质: 背后改的内核文件是/proc/sys/
.改为/ - 内核参数 存放/proc/sys/ net.ipv4.ip_forward == /proc/sys/net/ipv4/ip_forward
| 内核参数及含义 | 含义 | 默认 |
| net.ipv4.ip_forward = 1 | 是否开启内核转发(nat功能,iptables,docker) | 0 |
| net.ipv4.icmp_echo_ignore_all=1 | 是否准许被ping,是否禁ping | 0 |
| net.ipv4.tcp_tw_recycle=0 | 开启tcp回收功能,开启后nat网络环境中会导致异常 | 0 |
| net.ipv4.tcp_tw_reuse=1 | 开启tcp复用(重复利用),连接留着,给别人用 | 0 |
| vm.swappiness=0 | 设置 系统是否优先使用物理内存,数值越小,越优先使用物理内存。swap亲和性,数值大,优先使用swap,较少使用内存。 | 30(C7) |
1)time_wait过多
- 等待连接断开,一般等2msl(2×60s)
echo 'net.ipv4.tcp_tw_recycle=0' >>/etc/sysctl.conf #禁止改为1,nat环境中会有异常
echo 'net.ipv4.tcp_tw_reuse=1' >>/etc/sysctl.conf
- /proc/sys/net/ipv4/tcp_tw_reuse=1 开启tcp重复使用功能
2)java程序 故障 导致大量占用swap而不占用物理内存
- 物理内存空余,却开始占用swap(swap本质是硬盘的速度)
- 可能会导致oom(out of memory) 内存不足(JVM不足)
- 根治:java代码有问题
- vm.swappiness
- 控制系统是否优先使用swap,数字越大越优先使用swap 越小越优先使用物理内存
总结
- 编译安装升级python版本到3.11
- yum搞崩了,rpm安装
- 网站集群架构演变
- Linux优化(做好记录)
4.服务优化-Tomcat(java jvm)
- 性能优化:
- 线程数量
server.xml中, connector部分(找到8080)–>添加maxthread - jvm内存大小优化控制。…/tomcat/bin/catalina.sh中124行左右添加
JAVA_OPTS="-Xms700m -Xmx700m" - oom自动(导出)dump jmap导出jvm
- gc(垃圾回收)日志
- tomcat管理端功能:10.0.0.7:8080默认页面上面的按钮–生产环境要关闭!
- 在…/conf/tomcat-users.xml加入页面提示那3行即可。类似于:
- <role rolename=”manage-gui”/>
- <role rolename=”admin-gui”/>
- <user username=”tomcat” password=”lidao” roles=”manage-gui,admin-gui”/>
- 确保webapps下manage和host-manage目录都有
- 再改一下下面的配置文件
- 可以查看jvm最大可用内存,剩余多少..;用户连接;最大线程数;可部署war包等
4.1性能优化
1)io模型优化-server.xml
- 类似于nginx同步,异步模型
- 决定了tomcat如何处理数据
| io模型 | 说明 |
| BIO | Blocked IO,阻塞,同步模型(串行). tomcat7及之前版本默认是BIO |
| NIO(NIO1 NIO2) | New lO,非阻塞, 异步模型(并行). tomcat8开始默认就是nio. |
| APR | 应对高并发场景 |
- 使用默认的即可
- tomcat设置为nio2模型
- Connector port=”8080″
- protocal=”org.apache.coyote.http11.Http11Nio2Protocol”
- 看日志catalina.out(截图中http-ni2-8080 表示配置完成)
- 了解-设置apr模型
- 安装依赖: apr-devel tomcat-native
- protocal=”org.apache.coyote.http11.Http11AprProtocol”
2)tomcat java线程数
- tomcat主配置文件
server.xml中, connector部分(找到8080)
- 配置完重启tomcat生效
- ps -efL|grep java 查看线程
maxThreads="500" 最大的线程数量(1个/多个连接需要1个线程) 200-400之间,具体的数值需要进行压力测试和系统负载的具体情况
acceptCount="500" 当达到最大线程数量的时候,队列长度acceptCount一般与maxThreads一致
acceptorThreadCount="2" 请求分成几队伍进行,数值上与cpu核心总数一致或2倍 默认是1
minSpareThreads="10" 空闲时候最小的线程数量,不忙的时候,最少留几个服务员,值班的线程数量设置数值的建议,搭建好环境,部署应用,通过测试软件测试,监控状态
#测试软件: ab,压力测试工具loadrunner...,jmeter
3)DNS,压缩
#禁用DNS反向解析功能,加速访问 域名--->ip ip-->域名
enableLookups="false"
#类型与ngx,gzip压缩(推荐在ngx配置)
compression="on" 开启tomcat压缩功能,静态文本资源html,css,js
compressionMinSize="2048" 大于2048字节的文件才会被压缩
compressableMimeType="text/html,text/plain,text/css,application/javascript applicat
ion/json,application/x-font-ttf,application/x-font-otf"
4)小结
- io模型优化
- java线程数量
- 禁用DNS反向解析
4.2 JVM(java虚拟机)优化
- 适用于war/jar包
- ../tomcat/bin/catalina.sh文件中的内容
- 设置jvm内存大小
- 配置gc日志(垃圾回收)
- 配置自动dump功能
设置jvm初始内存大小,一般等于jvm最大内存大小(默认物理内存的1/4)
修改../tomcat/bin/catalina.sh文件,124行左右加入以下内容:-----会是java命令后面接的选项参数
JAVA_OPTS='-Xms1024m -Xmx1024m -Xloggc:/var/log/tomcat_gc.log'
-Xms (start jvm) jvm初始内存大小(一启动就分配到的内存)
-Xmx (max jvm) jvm最大内存
#方案1
一般-Xmx是-Xms的2倍
#方案2
-Xmx与-Xms一致,防止重复gc垃圾回收
# gc garbage collect 垃圾回收,定期清理,jvm内存不够或有异常时。
# -Xloggc:/var/log/tomcat_gc.log 垃圾回收的日志
-Xloggc:/var/log/tomcat_gc.log
-XX:+HeapDumpOnOutOfMemoryError #OOM故障; HeadDump自动导出
-XX:HeapDumpPath=/app/tools/tomcat/temp/oom.hprof
-XX:+HeapDumpOnOutOfMemoryError #开启导出jvm镜像功能,用于java/tomcat加载应用故障,内存不足oom (out of memory)
-XX:HeapDumpPath=/app/tools/tomcat/temp/oom.hprof #用于指定jvm内存镜像导出到哪里,指定目录
#catalina.sh 所有选项加在一起:
JAVA_OPTS='-Xms1024m -Xmx1024m -Xloggc:/var/log/tomcat_gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/tools/tomcat/temp/oom.hprof'
5.nginx优化
- 穷则战术穿插,富则火力覆盖
- 优化目标: 通过各种缓存减少用户直接的访问,用户访问缓存。缓存无处不在,加速读取。
- 边优化边测试(优化前……/优化后…….)
- 测试工具: ab(apache bench压力测试工具) 软件包:httpd-tools
- java环境: jmeter测试
- 专业测试(完全模拟用户请求流程,登录,下订单等): 书写测试脚本,自动化测试(ai+工具)
- loadrunner,python…
5.1安全优化
| 安全优化 | 具体操作 | 位置 |
| 隐藏nginx版本号 | server_tokens off; | http区域 |
| 修改用户 | user www; | 核心区域 |
| 优化nginx服务上传文件限制 | client_max_body_size 默认是1MBphp限制大小 /etc/php.inipost_max_sizeupload_max_filesize | http区域 |
| Nginx防爬虫优化 (bot/spider) | 希望搜索引擎,爬取我们的网站. 其他人写的爬虫,恶意收集信息. 1. 君子协议 robots.txt 协议,站点目录下.2. nginx if + ua头控制3. 加入登录验证机制. 访问频率限制. | if配置在server或location中 |
| 防盗链 | 某网站盗取其他网站的资源的链接放在自己网站中。 1. 通过 referer头控制与限制2. 加入登录验证机制. 访问频率限制 | |
| dos,ddos,cc | 1.控制访问频率(访问,处理) 2.CDN(流量,带宽预警) 3.DDOS高防ip(加钱) 尽全力防护 | 使用limit_req和limit_conn模块控制频率 |
#1.黑名单机制(server/location/http区域)
if ($http_user_agent ~* "python|curl|wget|xxxbot|xxxspider") {
return 403;
}
#2.白名单(误杀的风险,很难列全,容易误杀)
if ($http_user_agent !~* "baidu|google|chrome|edge|ios|android") {
return 403;
}
#UA也可以伪造
如果用户是直接访问 ok $http_referer空
用户通过baidu,google搜索到网站, $http_referer是baidu或google, ok
其他referer都拒绝
if ($http_referer !~* "baidu.com|google.com|^$") {
return 403;
}
分析访问日志,secure日志获取ip次数--awk,sort,uniq
交给防火墙,安全组拒绝,ngx屏蔽即可
ddos 4层tcp/udp
cc 7层应用层
预防方案:
1. CDN(请求都落在cdn上,流量得花钱)
2. nginx限流,限制访问频率,limit_req limit_conn
3. 终极方案:DDOS高防ip,成本高
limit_conn_module(connection) 连接频率限制(服务端)
limit_req_module(request) 请求频率限制(客户端)
http区域 {
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
#limit_conn_zone 创建木桶
#$binary_remote_addr 根据客户端ip进行限制 ipv4 4字节 ipv6 16字节
#zone=木桶名字:大小; 10m 10MB空间
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s; #1秒1个请求
server {
limit_conn conn_zone 10;
limit_req zone=req_zone burst=5; #并发5个 5个洞
location / {
root /app/nginx/html/;
index index.html;
}
}
}
5.2性能优化
| 性能优化 | 说明 | 应用 |
| expires | 浏览器缓存 | 缓存静态资源 |
| io模型 | 默认使用epoll(异步并行) | events区域 use epoll; |
| 修改工具人进程数量与进程处理连接数 | worker_processes auto;(cpu核心数有关,或可以设置为核心数2倍) | 核心区域 |
worker_connections 102400;修改系统限制:文件描述符 | events区域 | |
| 让每个工具人进程可以同时处理多个请求 | multi_accept on | events区域 |
| gzip压缩(gzip) | gzip on;对静态资源压缩,一般常用资源压缩 | http/server区域 |
| brotli压缩(br) 第三发插件 | 对静态资源压缩,针对https优化压缩效果 | http/server区域 |
| cpu亲和力 | 多核心系统中,尽可能把所有cpu核心都用上.worker_cpu_affinity auto | 核心区域 |
| 各种缓存 | xxxx_buffer xxxx_cache |
- buffer vs cache 共同点: 缓存存放数据
- cache 缓存 加速读取(放内存中供用户读取)
- buffer 缓冲 写入内容(先写到buffer中,过一段时间写入到磁盘)
#1.命令 临时 重新登录失效
ulimit -n 65535
#2.配置文件 永久 重新登录生效
cat >>/etc/security/limits.conf <<'EOF'
* soft nofile 65535
* hard nofile 65535
EOF
[root@web03 ~]# ulimit -n 65535
gzip on;
gzip_min_length 1k; #设置大于1KB才进行压缩(占用cpu资源)
gzip_buffers 4 16k; #设置压缩缓存 4个每个16k
#gzip_http_version 1.0;
gzip_comp_level 2; #压缩级别 数字越大 压缩率(占用空间)越小 占用CPU越多
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php ; #哪些类型的文件 需要进行压缩 这些类型需用mime type媒体类型.
#cat mime.types #媒体类型(http) == 文件类型,扩展名(linux)
#针对http2.0 google弄的nginx插件 第三方插件.
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css text/xml application/json
application/javascript application/rss+xml application/atom+xml image/svg+xml;
#F12-->content-encoding可查看
#作用: 用户向服务器请求资源-->服务器返回时压缩一下(节约带宽)
#开启 buffer功能(防止css等静态页面过大显示不出来)
proxy_buffering on;
#proxy_buffers 8 4k|8k ; 默认(8个小区域,4k或8k) 8*4k 32k 8*8k 64k
proxy_buffers 128 64k;
proxy_busy_buffers_size 128k; #系统繁忙的时候每个块128k
总结
- tomcat优化: 线程数,xmx,xms
- nginx: 性能,安全