网站集群架构演变

集群架构演变过程

阶段1:单服务器基础架构

image-20251117200045612

阶段2:单服务器+本地存储扩展

image-20251117200151747

阶段3:多服务器集群

image-20251117200421134

阶段4:集群缓存优化

image-20251117200625710

阶段5:数据库与存储瓶颈优化

image-20251117200748242

阶段6:web服务瓶颈优化

image-20251117200846304

阶段7:前后端集群

image-20251117200940374

阶段8:多区域集群(负载均衡瓶颈优化)

image-20251117201048238

阶段9:异地多活

image-20251117201234116

网站集群优化

  • 目标:理解与记录,主要面试,面试前记录
  • Linux系统优化
  • 服务优化:nginx,tomcat,mysql
  • 系统安全优化(等保测评优化,系统安全加固)

Linux系统优化

关闭selinux

SELinux 是 Linux 系统的强制访问控制系统(MAC),核心作用是通过 “最小权限分配” 和 “标签隔离机制” 限制进程、文件、端口的访问权限,即便 root 权限泄露或进程被劫持,也能阻止未授权操作,提升系统安全性。

  • 麒麟,ubt默认关闭
  • selinux增强型安全防火机制,一般来说都关闭
  • Centos 7.x,rocky系统默认开启

selinux工作模式(3种核心模式)

模式 作用说明
Enforcing(强制模式) 默认生效模式,严格执行所有策略规则,不符合规则的访问直接拒绝并记录日志。
Permissive(宽容模式) 不拒绝访问,但会记录所有违反策略的行为到日志(/var/log/audit/audit.log),适合调试。
Disabled(禁用模式) 完全关闭 SELinux,不进行任何访问控制,安全性大幅降低,不推荐生产环境使用。
# 查看当前模式(最常用)
getenforce #提示disabled就是永久关闭


#临时关闭
setenforce 0  #设置为宽容模式


#永久关闭
# 打开配置文件
vim /etc/selinux/config

# 修改 SELINUX 字段(三选一)
SELINUX=enforcing   # 强制模式(推荐)
SELINUX=permissive  # 宽容模式(调试用)
SELINUX=disabled    # 禁用模式(不推荐)

# 保存后重启系统生效
reboot

Firewalld Centos7 iptables(C6) 安全组(阿里云)

  • 配置防火墙规则和安全组规则

添加普通用户,配置sudo

#创建用户
useradd -m -s /bin/bash shf
#修改sudo配置文件
vim /etc/sudoers
#在以下行添加
root    ALL=(ALL)       ALL
shf ALL=(ALL)       NOPASSWD:ALL
#强制保存退出即可
echo Lidao666 |passwd --stdin  shf
  • ubt配置
#创建用户
useradd -m -s /bin/bash shf
#修改配置文件
vim /etc/sudoers
在开头加上
Defaults editor=/bin/vim
shf ALL=(ALL:ALL)       NOPASSWD:ALL
#强制保存退出即可
echo Lidao666 |passwd --stdin  shf


#禁用nono
cat >>~/.bashrc<<EOF
#在文件末尾添加以下内容
export EDITOR=vim
export VISUAL=vim
EOF

source ~/.bashrc

hosts文件解析当前的主机名或自建DNS

  • 主机不多使用hosts解析
  • 主机非常多搭建内部的DNS服务器(bind/dnsmasq)
  • 公有云环境:公有云内网DNS 内网域名解析(Private Zone和自建DNS)
  • k8s环境:内置了CoreDNS
[root@m01 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.7 web01
172.16.1.8 web02
172.16.1.9 web03
172.16.1.10 web04
172.16.1.31 nfs01
172.16.1.41 backup
172.16.1.51 db01
172.16.1.52 db02
172.16.1.61 m01

锁定关键文件chattr lsattr或aide监控扫描

aide工具安装,使用-CSDN博客

lsattr命令,查看扩展属性

lsattr 用于显示文件或目录的扩展属性,格式如下:

lsattr [选项] [文件/目录]
  • -d:仅查看目录本身的属性(不显示子文件)。
  • -R:递归查看目录及所有子内容的属性。
  • -a:显示隐藏文件(以 . 开头的文件)的属性。

示例

 chattr +a shf.txt
 #查看shf.txt隐藏权限
 lsattr shf.txt 
-----a-------------- shf.txt

chattr,修改扩展属性

chattr 用于设置或移除文件 / 目录的扩展属性,格式如下:

chattr [±=][属性] [文件/目录]
  • +:添加属性
  • -:移除属性
  • =:仅保留指定属性(移除其他所有扩展属性)

常用核心属性:

属性 作用(对文件) 作用(对目录)
i 不可修改:不能删除、修改、重命名,不能创建硬链接,不能追加内容(即使有 w 权限)。 不可修改:不能删除、重命名目录,不能在目录内创建 / 删除文件(但可修改已有文件内容,除非文件本身设了 i)。
a 仅追加:只能向文件追加内容(如日志),不能删除、修改原有内容,不能重命名。 仅追加:只能在目录内创建新文件,不能删除已有文件 / 目录,不能重命名。
e 文件使用 ext 系列文件系统的「扩展块」特性(默认自动开启,几乎所有文件都有,不能手动移除)。 同上(目录默认也有 e 属性)。
s 删除文件时,数据会被彻底清零(覆盖存储区块),无法通过恢复工具找回。 删除目录时,所有子文件数据会被彻底清零。
u 删除文件时,数据会被保留(可恢复),与 s 相反(实际中较少用,依赖文件系统支持)。 删除目录时,所有子文件数据会被保留。

示例:

#对shf.txt文件施加i属性(需要root权限)
chattr +i shf.txt
#查看扩展属性
lsattr shf.txt
----i--------------- shf.txt
#此时删除文件会报错
rm -f shf.txt
#不允许操作
rm: cannot remove 'shf.txt': Operation not permitted
#移除属性,恢复正常
chattr -i shf.txt

统一系统字符集:UTF-8

  • 默认都是UTF-8
  • 语言en_US(推荐)
  • 中文环境 zh_CN.UTF-8
#查看本地化变量(包含字符集)
locale

#查看系统支持的字符集
locale -a


#只查看默认字符集
echo $LANG
  • 系统默认字符集配置文件
#麒麟,红帽系统
cat /etc/locale.conf

#ubt系统
cat /etc/default/locale
  • 设置字符集
#临时设置
# 设置默认字符集为UTF-8(中文)
export LANG=zh_CN.UTF-8

# 设置为英文UTF-8(适合服务器默认)
export LANG=en_US.UTF-8


#永久设置
# 查看当前系统支持的字符集列表
localectl list-locales

# 设置默认字符集为zh_CN.UTF-8(永久生效)
sudo localectl set-locale LANG=zh_CN.UTF-8


# 编辑配置文件
sudo vim /etc/locale.conf

vim /etc/default/locale

# 添加/修改一行(设置为UTF-8中文)
LANG="zh_CN.UTF-8"

# 保存退出后,执行以下命令立即生效(无需重启)
source /etc/locale.conf

调整用户登录提示信息/etc/motd

  • 用户登录系统后显示的
  • 一般配置些系统固定不变的的信息(核心数,内存总大小,主机名,ip)

清空/etc/issue,/etc/issue.net

  • 用户连接系统之前显示
>/etc/issue

>/etc/issue.net 

配置/etc/profile.d/info.sh登录系统后显示系统基本信息(ip,主机名,网卡,硬盘,负载,登录用户数)

  • /etc/profile.d/ 登录系统后就会运行目录下面的以.sh结尾的文件

基础服务优化

ssh优化

解决远程连接慢:(ip–>域名)

#修改ssh服务端配置文件
#1.注释掉已有的配置
sed -i '/^GSSAPIAuthentication/s@^@#@g' /etc/ssh/sshd_config

#2.关闭对应功能
cat >>/etc/ssh/sshd_config<<EOF
UseDNS no         #禁用 DNS 查询
GSSAPIAuthentication no    #禁用 GSSAPI 认证
#关闭dns反向解析  ip-->域名
EOF

#3.重启sshd
systemctl restart sshd

#4.检查
egrep '^(GSSAPIAuthentication|UseDNS)' /etc/ssh/sshd_config

安全:

cat /etc/ssh/sshd_config


Port 52113  #设置端口  
PermitRootLogin no    #是否允许root远程登录
PasswordAuthentication yes    #是否开启密码登录
PubkeyAuthentication yes      #是否开启秘钥登录

配置内外网监听不同端口

cat /etc/ssh/sshd_config


#允许用户从哪个网卡连接,还可同时指定端口
ListenAddress  10.0.0.7:52113
ListenAddress   172.16.1.7:22

yum源:修改系统默认的yum源,增加epel源

  • 服务器是否有公网

  • 有公网:配置yum源即可。麒麟,centos(epel源+默认源)

  • 没有公网:搭建内网yum仓库,存放常用软件包与服务依赖(有网络+开启yum keepcache功能,安装)

#kylin,红帽
#编辑配置文件
vim /etc/yum.conf

#是否保留下载的软件包缓存,麒麟默认/var/cache/dnf/
keepcache=1
#软件包缓存和元数据的存储目录
cachedir=/var/cache/dnf/

  • 云服务器 (是否有公网都没事): 直接配置与使用云厂商的内网 yum 源.(温馨提示公有云购买后一般都配置好了内网 yum 源.)
  • 物理机与虚拟机需要
  • 公有云配置完成了
公网配置yum源
#麒麟
#增加epel源
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
#安装麒麟常用软件
yum install -y vim tree wget bash-completion lrzsz net-tools sysstat iotop iftop htop unzip nc nmap telnet bc psmisc httpd-tools bind-utils nethogs expect ntpdate


#centos系统
#配置base源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
#增加epel源
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
#安装常用工具
yum install -y vim tree wget bash-completion bash-completion-extras lrzsz net-tools sysstat iotop iftop htop unzip nc nmap telnet bc psmisc httpd-tools bind-utils nethogs expect ntpdate
yum install -y sl cowsay



#ubt系统
#方法1
sed -i_bak "s/cn.archive.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list
sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
#更新索引
apt update

#方法2
cp  /etc/apt/sources.list{,.bak}
cat  >/etc/apt/sources.list<<EOF

deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse

# deb https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
EOF
#更新索引
apt update


#安装常用软件
apt install -y tree vim   telnet  lrzsz   nmap  ncat  ntpdate network-manager unzip



#rocky
#安装 EPEL 源(额外开源软件)
yum install -y epel-release

# 更新系统(安全补丁和bug修复)
yum update -y

# 编辑 dnf 配置
vim /etc/dnf/dnf.conf
# 添加以下行:
fastestmirror=True  # 选择最快镜像
max_parallel_downloads=10  # 并行下载数
keepcache=True  # 保留下载的rpm包(下次安装无需重新下载)

# 清理无用缓存
dnf clean all

时间同步:定时任务+ntpdate/chrony

  • 通过公网时间服务器同步时间. ntpdate 命令 + 定时任务.
  • 自建 ntpd/chrony 时间服务器,通过内网同步.
  • 时间同步服务:ntpd,chrony (默认) (/etc/chrony.conf 服务 chronyd)
#kylin
cat >/var/spool/cron/root<<EOF
#1. sync time by lidao996 at 20230101
*/3 * * * * /sbin/ntpdate ntp.aliyun.com  >/dev/null  2>&1
EOF

#rocky
systemctl enable --now chronyd
echo 'server ntp.aliyun.com iburst' >>/etc/chrony.conf
systemctl restart chronyd

#ubuntu
cat >/var/spool/cron/crontabs/root<<EOF
#1. sync time by lidao996 at 20230101
*/3 * * * * /sbin/ntpdate ntp.aliyun.com  >/dev/null  2>&1
EOF




#设置时区
timedatectl set-timezone Asia/Shanghai


# 验证时间同步
chronyc sources

调整文件描述符

  • 文件描述符===每个进程可以打开的文件数量
#查看所有资源限制
ulimit -a

#临时设置,重新登录失效
ulimit -n 65535

#永久设置,重新登录生效 /etc/security/limits.conf
echo '* - nofile 65535' /etc/security/limits.conf 
#或写为两行:
* soft nofile 65535
* hard nofile 65535

#故障案例: 如果ulimit文件描述符设置过小,系统提示
Too many open files

[root@m01 ~]# -bash: /dev/null: Too many open files
-bash: redirection error: cannot duplicate fd: Too many open files
-bash: 2: Too many open files
-bash: /dev/null: Too many open files
-bash: redirection error: cannot duplicate fd: Too many open files
-bash: 2: Too many open files

修改历史命令环境变量

环境变量 说明
TMOUT 超时时间 60/300 自动注销
HISTSIZE 控制 history 记录条数 10 条
HISTFILESIZE history 文件记录条数 10 条
HISTCONTROL 控制 history 是否记录 用过命令
PROMPT_COMMAND 下 1 个命令之前 会运行 环境变量 里面的命令 用户审计
  • time out不进行任何操作,300秒自动退出用户
export TMOUT=300 
  • HIST history
export HISTFILE=1000  #当前会话中保存的历史命令
export HISYFILESEIZE=1000   # 历史文件(如 ~/.bash_history)中保存的最大命令条数

cat /root/.bash_history

#永久生效需写入到/etc/profile或~/.bashrc
  • 历史命令操作
history -c #清空当前会话的历史命令记录
history -w #将当前会话的历史命令强制写入历史文件(如~/.bash_history)
  • HISTCONTROL 环境变量
export HISTCONTROL=ignorespace
#以空格开头的命令,不会被 history 记录。增强系统安全性。

内核优化

  • /etc/sysctl.conf主配置文件 /etc/sysctl.c/xx.conf子配置文件

  • 生效:sysctl -p

  • 内核参数 存放/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)

内核转发

  • iptables nat功能
  • docker
ip_forward = 1

禁止ping

echo "net.ipv4.icmp_echo_ignore_all=1" >>/etc/sysctl.conf
sysctl -p

time_wait过多

time_wait是 TCP 连接关闭后的一种状态,若大量连接处于该状态会占用系统资源,导致性能下降。

echo 'net.ipv4.tcp_tw_recycle=0' >>/etc/sysctl.conf  # 禁止开启(NAT环境中会引发异常)
echo 'net.ipv4.tcp_tw_reuse=1' >>/etc/sysctl.conf   # 开启TCP连接重复使用功能

sysctl -p
  • tcp_tw_recycle:若开启(设为 1),在 NAT 网络环境下会因 IP 复用导致连接异常,因此必须设为 0。
  • tcp_tw_reuse:设为 1 后,允许重用处于 time_wait 状态的 TCP 连接,减少资源占用。

java程序异常占用swap内存问题

Java 程序(依赖 JVM)若出现故障,可能导致物理内存未充分利用,却大量占用 swap 分区,引发性能瓶颈(swap 是磁盘模拟内存,速度远低于物理内存)。

  • 核心原因:

    • JVM 内存管理异常,触发 “内存溢出(OOM, Out of Memory)”,迫使系统转向 swap 分区寻址。

    • 系统内核参数

      vm.swappiness
      

      控制 “物理内存 vs swap 分区” 的优先级:

      • 数值越大,系统越优先使用 swap;
      • 数值越小,系统越优先使用物理内存。

查看当前配置

cat /proc/sys/vm/swappiness 
#默认
30

若 Java 程序出现 “物理内存空余却狂用 swap” 的异常,可通过调小vm.swappiness(如设为 10 或 0),让系统优先使用物理内存,减少 swap 依赖。

服务优化

tomcat(java jvm)

性能优化

  • 线程数量 server.xml中 connector 8080部分添加 maxthread

  • jvm内存大小优化控制

  • oom自动dump jamp导出jvm

  • gc日志

io模型优化server.xml

  • 类似于 nginx 同步、异步模型。
  • 决定了 tomcat 如何处理数据。
IO 模型 说明
BIO Blocked IO, 阻塞,同步模型. tomcat7 及之前版本默认是 BIO
NIO (NIO1 NIO2) New IO, 非阻塞,异步模型. tomcat8 开始默认就是 nio.
APR 应对高并发场景

配置实例

/tomcat/conf/server.xml

vim /tomcat/conf/server.xml


<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" />

systemctl restart tomcat

#查看日志
/tomcat/logs/catalina.out

[root@web03 /app/tools/tomcat]# cat logs/catalina.out | grep http-nio2-8080

image-20251118155216702

扩展,设置apr模型

设置apr模型
安装依赖apr-devel tomcat-native

yum install -y apr apr-util tomcat-native


vim /tomcat/conf/server.xml
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" />


systemctl restart tomcat

[root@web03 /app/tools/tomcat/logs]# cat catalina.out | grep http-apr-8080

image-20251118160329481

tomcat管理端(生产环境禁用)

  • 测试环境可以开启
vim /app/tools/tomcat/conf/tomcat.users.xml

<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
        version="1.0">
   #在这下面添加下面这4行
  <role rolename="manager-gui"/>
  <role rolename="admin-gui"/>
  <user username="tomcat" password="Lidao666" roles="manager-gui,admin-gui"/>
  
  
[root@web03 ~]# ll /app/tools/tomcat/webapps/
总用量 4
drwxr-x--- 16 root root 4096 1118 09:11 docs
drwxr-x---  7 root root   99 1118 09:11 examples
drwxr-x---  6 root root   79 1118 09:11 host-manager
drwxr-x---  6 root root  114 1118 09:11 manager
drwxr-x---  3 root root  223 1118 09:11 ROOT

manager,host-manager目录要存在


systemctl restart tomcat

[root@web03 /app/tools/tomcat/webapps]# find manager/ host-manager/ -name "context.xml" | xargs grep 127
manager/META-INF/context.xml:         allow="127.0.0.0/8,::1/128" />
host-manager/META-INF/context.xml:         allow="127.0.0.0/8,::1/128" />

#将127.0.0.0改为0.0.0.0或服务器的ip网段
[root@web03 /app/tools/tomcat/webapps]# find manager/ host-manager/ -name "context.xml" | xargs sed -i  '/allow/s/127/10/g'




image-20251118151340811

image-20251118151410457

image-20251118152354046

image-20251118152420616

线程数量优化(⭐⭐⭐)

server.xml 8080部分

  • tomcat/conf/server.xml
[root@web03 ~]# ls /app/tools/tomcat/conf/server.xml 
/app/tools/tomcat/conf/server.xml

vim /app/tools/tomcat/conf/server.xml

<Connector port="8080" protocol="HTTP/1.1"
               maxThreads="500"    
               acceptCount="500"
               acceptorThreadCount="2"
               minSpareThreads="10"     
               connectionTimeout="20000"
               redirectPort="8443"
               maxParameterCount="1000"
               />
               
               
systemctl restart tomcat

#查看线程java
ps -efL | grep java
配置项 说明
maxThreads="500" 最大的线程数量 200-400 之间,具体的数值需要进行压力测试.
acceptCount="500" 当达到最大线程数量的时候,队列长度 acceptCount 一般与 maxThreads 一致
acceptorThreadCount="2" 请求分成几队伍进行,数值上与 cpu 核心总数一致或 2 倍默认是 1
minSpareThreads="10" 空闲时候最小的线程数量,不忙的时候,最少留几个服务员,值班的线程数量设置数值的建议,搭建好环境,部署应用,通过测试软件测试,监控状态.

DNS,压缩

  • /tomcat/conf/server.xml

需要修改 conf/server.xml 文件(位于 Tomcat 安装目录的conf文件夹下),具体在 <Connector> 标签中进行参数调整。

enableLookups="false"  #禁用 DNS 反向解析功能,加速访问(避免域名→IP、IP→域名的双向解析开销)


#资源压缩
compression="on" #开启 Tomcat 压缩功能,对静态文本资源(html、js、css 等)生效

compressionMinSize="2048" #仅对大于 2048 字节的文件进行压缩

#指定可压缩的 MIME 类型
compressableMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/x-font-ttf,application/x-font-otf"
  • 汇总

  • /tomcat/conf/server.xml

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
               enableLookups="false"
               compression="on"
               compressionMinSize="2048"       	             compressableMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/x-font-ttf,application/x-font-otf"
               maxThreads="500"    
               acceptCount="500"
               acceptorThreadCount="2"
               minSpareThreads="10"     
               connectionTimeout="20000"
               redirectPort="8443"
               maxParameterCount="1000"
               />

jvm内存大小优化(⭐⭐⭐)

/tomcat/bin/catalina.sh
  • 设置jvm内存大小

  • 配置gc日志(垃圾回收)

  • 配置自动dump功能

  • jvm最大内存大小(默认物理内存的1/4)

配置 JVM 内存大小

  1. 设置 jvm 初始内存大小一般等于 jvm 最大内存大小(默认物理内存的 1/4),需修改catalina.sh文件,配置如下:
JAVA_OPTS='-Xms1024m -Xmx1024m -Xloggc:/var/log/tomcat_gc.log'
  • -Xms:jvm 初始内存大小
  • -Xmx:jvm 最大内存
  • 方案 01:一般-Xmx-Xms的 2 倍。
  • 方案 02:-Xmx-Xms一致,防止重复 GC 垃圾回收。
  • GC(garbage collect):垃圾回收,定期清理 jvm 内存。
  • -Xloggc:/var/log/tomcat_gc.log:垃圾回收的日志

配置 GC 日志

-Xloggc:/var/log/tomcat_gc.log

配置自动 DUMP 功能(jvm 发生异常,自动导出 jvm 内存镜像)

-XX:+HeapDumpOnOutOfMemoryError  #OOM故障
-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 内存镜像导出路径。

  • 汇总:

/tomcat/bin/catalina.sh


JAVA_OPTS='-Xms1024m -Xmx1024m -Xloggc:/var/log/tomcat_gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/tools/tomcat/temp/oom.hprof'

image-20251118153916142

部署tomcat

[root@web03 ~]# ls /app/tools/tomcat/bin/catalina.sh 
/app/tools/tomcat/bin/catalina.sh

vim /app/tools/tomcat/bin/catalina.sh

# -----------------------------------------------------------------------------
JAVA_OPTS="-Xms1024m -Xmx1024m"  #添加这一行
# OS specific support.  $var _must_ be set to either true or false.
cygwin=false
darwin=false
os400=false
hpux=false


#重启服务
systemctl restart tomcat


ps -ef | grep java #找到java进程的pid

jmap -heap 1800    #java-1.8.0版本


jhsdb jmap --heap --pid 1800 #java-11版本命令


修改成功

image-20251118095941279

  • jar包设置内存大小

  • 没修改之前

[root@web03 /app/code/xzs/backend]# nohup java -Duser.timezone=Asia/Shanghai -Dspring.profiles.active=prod -jar xzs-3.9.0.jar &
[1] 2334
[root@web03 /app/code/xzs/backend]# nohup: 忽略输入并把输出追加到'nohup.out'

[root@web03 /app/code/xzs/backend]# ps -ef | grep java
root        2334    1100 99 10:14 pts/0    00:00:04 java -Duser.timezone=Asia/Shanghai -Dspring.profiles.active=prod -jar xzs-3.9.0.jar
root        2352    1100  0 10:14 pts/0    00:00:00 grep --color=auto java

image-20251118101456810

  • 修改之后
  • 在java -Xms1024m -Xmx1024m -Duser.timezone=Asia/Shanghai -Dspring.profiles.active=prod -jar xzs-3.9.0.jar
[root@web03 /app/code/xzs/backend]# nohup java -Xms1024m -Xmx1024m  -Duser.timezone=Asia/Shanghai -Dspring.profiles.active=prod -jar xzs-3.9.0.jar &
[1] 2419
[root@web03 /app/code/xzs/backend]# nohup: 忽略输入并把输出追加到'nohup.out'

[root@web03 /app/code/xzs/backend]# 
[root@web03 /app/code/xzs/backend]# ps -ef | grep java
root        2419    1100 99 10:16 pts/0    00:00:05 java -Xms1024m -Xmx1024m -Duser.timezone=Asia/Shanghai -Dspring.profiles.active=prod -jar xzs-3.9.0.jar
root        2439    1100  0 10:16 pts/0    00:00:00 grep --color=auto java

image-20251118101755204

测试优化

ab -n 90000 -c 10 http://10.0.0.9:8080/
#10并发,90000请求

This is ApacheBench, Version 2.3 <$Revision: 1874286 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 10.0.0.9 (be patient)
Completed 9000 requests
Completed 18000 requests
Completed 27000 requests
Completed 36000 requests
Completed 45000 requests
Completed 54000 requests
Completed 63000 requests
Completed 72000 requests
Completed 81000 requests
Completed 90000 requests
Finished 90000 requests


Server Software:        
Server Hostname:        10.0.0.9
Server Port:            8080

Document Path:          /
Document Length:        11212 bytes

Concurrency Level:      10
Time taken for tests:   23.302 seconds
Complete requests:      90000
Failed requests:        0
Total transferred:      1021230000 bytes
HTML transferred:       1009080000 bytes
Requests per second:    3862.38 [#/sec] (mean) #吞吐量
Time per request:       2.589 [ms] (mean)      #平均响应时间
Time per request:       0.259 [ms] (mean, across all concurrent requests)     #并发响应时间
Transfer rate:          42799.24 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       1
Processing:     1    2   1.2      2     308
Waiting:        0    0   1.2      0     294
Total:          1    3   1.2      3     308

Percentage of the requests served within a certain time (ms)
  50%      3
  66%      3
  75%      3
  80%      3
  90%      3   #90%请求在3秒完成
  95%      3
  98%      3
  99%      4
 100%    308 (longest request)

nginx优化

  • 根据具体环境配置,最好的是增加服务器,增加配置

  • 优化目标:通过各种缓存减少用户直接的访问,用户访问缓存,缓存无处不在,加速读取

  • 边优化边测试

    • 优化前
    • 优化后
测试工具:
ab(Apache Bench):Apache 官方的压力测试工具,所属软件包为 httpd-tools。

jmeter:基于 Java 环境的测试工具,适用于性能测试等场景。


专业级 / 自动化测试工具:可用于书写测试脚本、实现自动化测试(可结合 AI 工具),例如 LoadRunner、Python 等。


ab -n 90000 -c 10 http://10.0.0.7/

安全

安全优化 具体操作 位置
隐藏 nginx 版本号 server_tokens off; http
修改用户 user www; 核心区域
优化 nginx 服务上传文件限制 client_max_body_size 默认是 1MB;php 限制大小/etc/php.inipost_max_sizeupload_max_filesize http
Nginx 防爬虫优化 (bot/spider) 希望搜索引擎爬取我们的网站,其他人写的爬虫恶意收集信息。1. 君子协议robots.txt 协议站点目录下。2. ngx if + ua 头控制3. 加入登录验证机制、访问频率限制。 if 配置在 server 或 location 中.
防盗链 某网站盗取其他网站的资源的链接。1. 通过 referer 控制与限制2. 加入登录验证机制、访问频率限制。
dos,ddos,cc 1. 控制访问频率 (访问,处理)2.CDN (流量,带宽预警)3.DDOS 高防 ip (加钱) 尽全力防护. 使用 limit_req 和 limit_conn 模块控制频率
  • 爬虫

  • 在server块或location中

# 黑名单机制
if ($http_user_agent ~* "python|curl|wget|scrapy|spider|crawler|bot360|sogouwebspider|youdaobot|xxxbot|xxspider") {
    return 403;
}

# 白名单 误杀的风险 很难列全,容易误杀.
if ($http_user_agent !~* "baidu|google|bing|yahoo|sogou|sougou|360se|chrome|edge|firefox|safari|ios|android|opera") {
    return 403;
}
  • 防盗链
访问场景 $http_referer 状态 处理结果
用户直接访问网站 为空 允许访问
用户通过百度、谷歌搜索访问 包含 baidu.comgoogle.com 允许访问
其他来源(如未知网站、恶意爬虫) 既非空、也不包含百度 / 谷歌域名 拒绝访问(返回 403)

if ( $http_referer !~* "baidu.com|google.com|^$" ) { 
    return 403;
}
  • dos拒绝式服务攻击,单个ip不断访问与攻击
分析访问日志,secure日志获取ip次数
交给防火墙,安全组拒绝即可
  • ddos,cc分布式拒绝服务攻击,1000w人每个发送200请求
ddos 4层
cc   7层

预防方案
1.CDM
2.ngx限流,限制访问频率,limit_req  limit_conn

终极方案:DDOS高防ip 成本高
  • limit_req和limit_conn
# http区域:定义连接和请求频率限制的共享内存区域
# limit_conn_zone:用于限制并发连接数,$binary_remote_addr表示以客户端IP为标识
# zone=conn_zone:10m:命名共享内存区域为conn_zone,大小10MB
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;

# limit_req_zone:用于限制请求频率,rate=1r/s表示单IP每秒最多1个请求
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;

server {
    # 应用连接限制:单IP最多10个并发连接
    limit_conn conn_zone 10;

    # 应用请求频率限制:burst=5表示允许5个突发请求(超出rate的部分)
    limit_req zone=req_zone burst=5;

    location / {
        root /app/nginx/html/;  # 网站根目录
        index index.html;       # 默认首页
    }
}
http {
    limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
    limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;

       
}

server {
    limit_conn conn_zone 10;
   limit_req zone=req_zone burst=5;
}

systemctl reload nginx

性能

性能优化 说明 应用
expires 浏览器缓存 缓存静态资源.
io 模型 使用 epoll(异步) events 区域 use epoll;
修改工具人进程数量与进程处理连接数 worker_processes auto; 核心区域
让每个工具人进程可以同时处理多个请求 worker_connections 102400;修改系统限制:文件描述符multi_accept on events 区域
gzip 压缩 (gzip) 对静态资源压缩,一般常用资源压缩 http/server
brotli 压缩 (br) 第三发插件 对静态资源压缩,针对 https 优化压缩效果 http/server
cpu 用于设置工作进程与 CPU 核心绑定 多核心系统中,尽可能把所有 cpu 核心都用上worker_cpu_affinity auto 核心区域
各种缓存 xxx_bufferxxx_cache
  • buffer vs cache 共同点 缓存存放
  • cache 缓存 加速读
  • buffer 缓冲 写入内容

浏览器缓存

server区域

expires 1d;#1天
expires 1h;#1小时
IO 模型 说明
BIO Blocked IO, 阻塞,同步模型. tomcat7 及之前版本默认是 BIO
NIO (NIO1 NIO2) New IO, 非阻塞,异步模型. tomcat8 开始默认就是 nio.
APR 应对高并发场景

修改系统的文件描述(进程可以打开的文件数)

ulimit -n 65535  #临时配置

#永久设置,重新登录生效 /etc/security/limits.conf
echo '* - nofile 65535' /etc/security/limits.conf 
  • gzip,brotli具体使用
# Gzip 压缩配置
gzip on;
gzip_min_length 1k;      # 设置大于1k才进行压缩
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类型


# Brotli 压缩配置(Google 开发的 Nginx 第三方插件)
brotli on;
brotli_comp_level 6;     # Brotli 压缩级别
brotli_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
  • proxy_cache为例
# http 区域配置缓存路径
#/dev/shm/
proxy_cache_path /dev/shm/ngx_cache/ levels=1:2 keys_zone=oldboy_lidao:10m;

# http/server/location 区域配置缓存规则
proxy_pass  http://blog_pools;
proxy_cache oldboy_lidao;  # 指定缓存区域名称
proxy_cache_valid 200 302 1h;  # 状态码200、302的响应缓存1小时
proxy_cache_valid 301 1d;      # 状态码301的响应缓存1天
proxy_cache_valid any 1m;      # 其他状态码的响应缓存1分钟


#nginx将有3个进程
master 进程管理进程
worker 工具人进程
cache 缓存进程
  • proxy_buffer
# proxy_buffer 配置(代理缓冲)
proxy_buffering on;  # 开启缓冲功能
#proxy_buffers 8 4k |8k ; 默认8*4k 32k   8*8 64k
proxy_buffers 128 64k ;  # 缓冲内存块配置(128个,每个64k)
proxy_busy_buffers_size 128k;  # 繁忙时缓冲大小
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐