mysql数据库优化

一、调优思路
1.硬件调优
2. 数据库设计和规划
3.数据的应用—-怎么取数据、sql语句的优化
4. 磁盘IO优化
5.操作系统的优化—内核、tcp连接数
6.mysql服务优化—内存的使用、磁盘的使用
7. my.cnf 内参数的优化
8. 分库分表思路和劣势

二、硬件优化
CPU—64位、高主频、高缓存、高并行处理能力
内存—大内存、主频高、尽量不要使用swap分区
硬盘—15000转,raid磁盘阵列
网络—标配的千兆网卡,10G网卡,bond,尽可能的和web服务在同一局域网内,尽量避免诸如防火墙策略等不必要的开销

三、数据库设计与规划
1. 纵向拆解:专机专用,使用单独的服务器来跑mysql
2. 横向拆解:主从同步、负载均衡、高可用性的集群

四、查询优化
1. 建表时结构要合理,每个表不宜过大;在任何情况下都应该使用最精确的类型
2. 索引,建立合适的索引
3. 查询时尽量减少逻辑运算(与或非、运算、大于小于谋值)
4. 减少不当的查询语句,如select*from等操作
5. 减少事务包的大小
6. 将多个小的查询适当合并成一个大的查询,减少每次建立/关闭查询时的开销
7. 将某些过于复杂的查询拆解成多个小查询
8. 建立和优化存储过程来代替大量的外部程序交互

五、磁盘IO规划
1.raid技术: raid5或raid10
2.使用固态盘SSD,如果是机械盘至少15000转
3.swap分区使用raid0或者ssd
4.磁盘分区:将数据库目录放到一个分区上或一个磁盘上的物理分区。存储数据的硬盘或分区和系统所在的硬盘分开

六、操作系统层面优化
1.网卡boonding技术,提供网卡的负载均衡和高可用
2.设置tcp连接数量限制,优化系统打开文件的最大限制
3.使用64位操作系统
4.禁用不必要启动的服务
5.文件系统调优,给数据仓库一个单独的文件系统,推荐使用xfs
6.可以考虑在挂载分区的时启动noatime选项,不记录访问时间
7.最小安装原则:
1) 安装系统最小化
2)开启程序服务最小化的原则
3)操作最小化原则,select字段名
4)登录最小化原则
5)权限最小化,权限回收

七、数据库服务优化
1.保持每个表不要太大,可以对大表做横切和纵切
2.存储引擎选择:
myisam 引擎,表级锁,表级锁开销小,影响范围大,适合读多写少的表,不支持事务。 表锁定不存在死锁 (也有例外)
innodb 引擎,行级锁,锁定行的开销要比锁定全表要大。影响范围小,适合写操作比较频繁的数据表。行级锁可能存在死锁。
3.开启死锁的日志: vim /etc/my.cnf加入下面2行
innodb_print_all_deadlocks = 1
innodb_sort_buffer_size = 16M #排序缓冲
4. 查看数据库服务状态,登录mysql数据库:
show variables like “%locks%”; # 查看整体配置
show warnings; # 查看最近一个sql语句产生的警告
show processlist ; # 显示mysql系统中正在运行的所有线程
5.启动mysql慢查询—-分析sql语句,找到影响效率的sql,编辑配置文件: vim /etc/my.cnf
slow_query_log = 1 #开启慢查询日志
slow-query-log-file=/var/lib/mysql/slow.log #这个路径对 MySQL 用户具有可写权限
long_query_time = 5 # 查询超过 5 秒钟的语句记录下来
log-queries-not-using-indexes = 1 #没有使用索引的查询
6. 对查询进行缓存
query_cache_size = 32M 至少4M,后期可以扩展
验证,登录数据库查询: show status like ‘qcache%’;
7.限制mysql的资源设置
max_connections = 500 # 数据库最大连接数
wait_timeout = 10 # mysql终止等待时间
max_connect_errors = 100 # 如果一个主机在连接到服务器有问题,重试很多次没放弃,那么主机就会被锁定,直到执行FLUSH HOSTS
8.关键字缓冲区,需要编辑配置文件
key_buffer_size = 512M 指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度
#只跑一个 MySQL 服务。结合所有缓存,MySQL 整体使用的缓存可以使用物理内存的 80%

八、分库分表
1. 基本思想之什么是分库分表?
从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上
2. 基本思想之为什么要分库分表?
数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地数据操作增、删、改、查的开销也会越来越大;另外,
一台服务器的资源(CPU、磁盘、内存、IO 等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
3 分库分表的实施策略。
如果你的单机性能很低了,那可以尝试分库。分库,业务透明,在物理实现上分成多个服务器,不同的分库在不同服务器上。分区可以把表分到不同的硬盘上,但不能分配到不同服务器上。一台机器的性能
是有限制的,用分库可以解决单台服务器性能不够,或者成本过高问题。
4. 实现方式: mycat,代码实现

linux系统调优相关工具

一、服务器问题排查思路
1. 系统的运行状况: CPU — 内存 — 磁盘读写 — 网络 — 应用层

二、 查看CPU负载工具
1. 使用uptime查看系统负载情况
12:38:33 up 50days , 3 users, load average: 0.06, 0.60, 0.48
12:38:33 当前时间
up 50days 系统运行时间 ,说明此服务器连续运行 50 天了
3 user 当前登录用户数
load average:0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。 三个数值分别为 1 分钟、5分钟、15 分钟前到现在的平均值。
2. 使用top命令,按大写P可以按cpu使用率来排序显示,按1查看CPU核数
服务器调优和问题排查 - 图1
3. ps -aux —sort -pcpu | more 安装实际使用cpu从大到小排序
注意: pcpu可以显示进程的绝对路径,方便使用
4. 查看CPU信息: cat /proc/cpuinfo
5. 使用mpstat来查看cpu情况,需要yum安装sysstat
注: mpstat -P ALL 可以查看所有CPU运行状态
注: mpstat -P ALL 1 70 一秒钟刷新一次 连续刷新 70 次
服务器调优和问题排查 - 图2
usr:用户空间 CPU 使用占比。
nice:低优先级进程使用 CPU 占比。nice 值大于 0。
sys:内核空间 CPU 使用占比。
iowait:CPU 等待 IO 占比。
irq:CPU 处理硬中断占比。
soft:CPU 处理软中断占比。
idle:CPU 空闲时间占比。

三、查看内存运行状态相关工具
1. free -m查看内存使用情况
注: 在 centos7 系统中 available 这一列是真正可用内存。
2. 查看内存情况: cat /proc/meminfo
3. 使用top,然后按下大写的M,使用内存排序
4. 按照使用的内存,从大到小排序: ps -aux —sort -rss | more

四、查看IO运行状态工具
1. 查看ext4文件系统块大小: tune2fs -l /dev/sda1 | grep size
2. 查看xfs文件系统块大小: xfs_growfs -l /dev/sda1 | grep size
3. 使用iostat命令查看io是否存在瓶颈,需要yum按照sysstat
-d 仅显示磁盘统计信息。
-k 以K为单位显示每秒的磁盘请求数,默认单位块。
-p device | ALL 用于显示块设备及系统分区的统计信息。
服务器调优和问题排查 - 图3
kB_read/s 每秒从磁盘读入的数据量,单位为K.
kB_wrtn/s 每秒向磁盘写入的数据量,单位为K.
kB_read 读入的数据总量,单位为K.
kB_wrtn 写入的数据总量,单位为K.
4. 使用iotop查看哪个经常读写最多,需要按照iotop命令
-o, -only 只显示在读写硬盘的程序
-d SEC, -delay=SEC 设定显示时间间隔。 刷新时间

五、查看网络运行状态相关工具
1. 使用nload命令查看,需要安装epel源,在安装nload,监控总体使用情况
2. 使用nethogs命令查看,需要yum安装命令,查看使用网络带宽最高的进程

六、查看系统总体运行情况
1. 使用vmstat查看内存和系统整体运行状态
服务器调优和问题排查 - 图4
r 运行状态的进程个数 。展示了正在执行和等待 cpu 资源的任务个数。当这个值超过了 cpu 个数,就会出现 cpu 瓶颈。
b 不可中断睡眠 正在进行 i/o 等待--阻塞状态的进程个数 进程读取外设上的数据,等待时
free 剩余内存,单位是 KB
buffers #内存从磁盘读出的内容
cached #内存需要写入磁盘的内容
si swap 换入到内存
so 内存换出到 swap 换出的越多,内存越不够用
bi 从硬盘往内存读。 单位是块。 把磁盘中的数据读入内存
bo 从内存拿出到硬盘 (周期性的有值) 写到硬盘#判断是读多还是写多,是否有 i/o 瓶颈
in 系统的中断次数,cpu 调度的次数多
cs 每秒的上下文切换速度
CPU 上下文切换--程序在运行的时候,CPU 对每个程序切换的过程
2. 使用sar命令记录系统一段时间的运行状态,需要安装sysstat
-n:网络接口的情况。
-u:CPU 利用率
-d:硬盘使用报告。
-o 文件名:打印到屏幕并将采样结果以二进制形式存入当前目录下的文件中。
-f 文件名:查看之前保存的二进制文件
例子: sar -u 2 5 -o cpu.sar 每2秒种获取一次,总共5次,并将获取到CPU信息保存到指定文件
例子: sar -n DEV -f /var/log/sa/sa01 查看sar自动生成日志中网络接口流量情况
例子:sar -f cpu.sar sar文件不能用cat只能用sar查看
在显示内容包括:
%usr:CPU 处在用户模式下的时间百分比。
%sys:CPU 处在系统模式下的时间百分比。
%wio:CPU 等待输入输出完成时间的百分比。
%idle:CPU 空闲时间百分比。

CPU-IO-网络-内核参数的调优

一、cpu资源调配
1.调整nice值改变进程优先级
在 LINUX 系统中,Nice 值的范围从-20 到+19(不同系统的值范围是不一样的),正值表示低优先级,负值表示高优先级,值为零则表示不会调整该进程的优先级。
nice -n 优先级 命令 # 执行这个命令的后产生的进程,改变优先级
renice -n 优先级 PID # 改变现有进程的PID
2. 设置CPU亲和力
taskset 作用:在多核的情况下,可以认为指定一个进程在哪颗 CPU 上执行程序,减少进程在不同CPU 之前切换的开销
命令安装: yum -y install util-linux
taskset -cp CPU 命令或进程
-p, —pid 在已经存在的 pid 上操作 -c, —cpu-list 以列表格式显示和指定 CPU
taskset -c 0 命令 # 执行命令产生的进程只在CPU0上执行
taskset -c 0 -p PID # 指定正在运行的进程只在CPU0上执行
taskset -cp PID # 查询指定进程可以使用几个CPU核心处理
3. 使用vmstat命令找出系统中存在的瓶颈

二、有关磁盘IO调优
1. ulimit资源限制
ulimit -n # 查看一个进程可以打开的文件数
ulimit -n 数值 # 临时修改,但是不用重启系统
ulimit -u 数值 # 临时修改一个用户能打开的最大文件数
限制进程资源配置文件: /etc/security/limits.conf
永久修改一个进程可以打开的最大文件数: vim /etc/security/limits.conf # soft只是个警告,hard才是真正的阈值。该方法需要reboot重启系统才生效
soft nofile 1024000
hard nofile 1024000
限制用户资源配置文件: /etc/security/limits.d/20-nproc.conf # 需要重启
soft nproc 65535
hard nproc 65535
ulimit -a 查看系统所有限制
core file size (blocks, -c) 0 # kdump 转储功能打开后产生的 core file 大小限制
data seg size (kbytes, -d) # unlimited 数据段大小限制
file size (blocks, -f) # unlimited 文件大小限制
open files (-n) 1024 # 打开的文件个数限制
pipe size (512 bytes, -p) 8 # 管道大小的限制
POSIX message queues (bytes, -q) 819200 # 消息队列大小
stack size (kbytes, -s) 10240 # 栈大小
cpu time (seconds, -t) unlimited # CPU 时间使用限制
max user processes (-u) 27955 # 最大的用户进程数限制
virtual memory (kbytes, -v) unlimited # 虚拟内存限制
2. 测试硬盘读速度
hdparm -t —direct /dev/sda # 测试硬盘读速度,需要yum安装
-t # 不使用预先的数据缓冲, 标示了 Linux 下没有任何文件系统开销时磁盘可以支持多快的连续数据读取.
—direct # 直接绕过缓存进行统计数据
3.测试磁盘的写速度
dd if=/dev/zero of=/test.dbf bs=1M count=2000 oflag=direct,nonblock
注:oflag=direct,nonblock 中的 direct 表示读写数据采用直接 IO 方式;nonblock 表示读写数据采用非阻塞 IO 方式,这样绕开缓存,测试的更准确。

三、网络相关调优,负载均衡bonding技术
1. 备份网卡配置: mkdir /opt/netbackup && mv /etc/sysconfig/network-scripts/ifcfg-ens* /opt/netbackup/
2. 使用nmcli生成bond0配置文件: nmcli connection add type bond ifname bond0 con-name bond0 miimon 100 mode active-backup primary ens33 ip4 192.168.1.200/24
参数说明:
add type bond ifname bond0 #添加一个类型为 bond,网卡名为 bond0 的设备
con-name bond0 miimon 100 #配置 name 为 bond0 的链路监控的频率为 100 毫秒。
mode active-backup #指定 bond0 模式为 active-backup(主动备份)
primary ens33 #指定主网卡为 ens33
ip4 192.168.1.63/24 #指定 IP 地址为 192.168.1.63/24
3. 编辑配置文件并加入网关和DNS: vim /etc/sysconfig/network-scripts/ifcfg-bond0
4. 绑定网卡到bond0: nmcli connection add type bond-slave ifname ens33 master bond0
5. 重启网卡配置: service network restart
6. 查看已经激活的网络接口: nmcli connection show —active
7. 查看bond0状态: cat /proc/net/bonding/bond0
8. 多网卡的7种常见bond模式:
balance-rr (0) –轮询模式,负载均衡(bond 默认的模式)
active-backup (1) –主备模式(常用)
balance-xor (2)
broadcast (3)
802.3ad (4) –聚合模式
balance-tlb (5)
balance-alb (6)
9. 网卡宕掉后,重启网卡,需要重启network服务

四、系统内核调优
1.防SYN洪水攻击(慎用,现在最好的防止方式使用硬件防火墙,该方法可能会影响到正常业务)
修改配置文件: vim /etc/sysctl.conf
net.ipv4.tcp_synack_retries = 0
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_max_syn_backlog = 20480
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 10
fs.file-max = 819200
net.core.somaxconn = 65535
net.core.rmem_max = 1024123000
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 165536
net.ipv4.ip_local_port_range = 10000 65535
参数解释:
net.ipv4.tcp_synack_retries = 0 # 表示回应第二个握手包后,如果收不到第三次握手包,不进行重试,加快回收
net.ipv4.tcp_syn_retries = 1 # 默认是5,当没有收到服务器端的SYN+ACK包时,客户端重发SYN握手包的次数
net.ipv4.tcp_max_syn_backlog = 20480 # 增加SYN队列长度到2048
fs.file-max = 819200 # 系统允许的文件句柄的最大数目,因为连接需要占用文件句柄
net.core.somaxconn = 65535 # 用来应对突发的大并发connect请求
net.core.rmem_max = 1024123000 # 最大的TCP数据接收缓冲字节数
net.core.wmem_max = 16777216 # 最大的TCP数据发送缓冲字节数
net.core.netdev_max_backlog = 165536 # 网络设备接收数据包的速率比内核处理包的速率快时,允许送到队列的数据包的最大数目
net.ipv4.ip_local_port_range = 10000 65535 # 本机主动连接其他机器时的端口分配范围
次要辅助参数: (注意,以下参数面对外网时,不要打开。因为副作用很明显)
net.ipv4.tcp_syncookies = 1 # 当出现半连接队列溢出时,向对方发送syncookies,调大半连接队列后没必要
net.ipv4.tcp_tw_reuse = 1 # TIME_WAIT状态的链接重用功能
net.ipv4.tcp_timestamps = 1 # 时间戳选项,和前面的tcp_tw_reuse参数配合
net.ipv4.tcp_tw_recycle = 1 # TIME_WAIT状态的链接回收功能

nmap和nc扫描工具

  1. 安装nmap命令: yum -y install nmap
    2. 扫描端口
    使用方法: nmap 参数 IP
    默认只能扫描常规端口,如果扫描非常规端口,需要指定端口范围扫描
    参数说明:
    -v 详细信息
    -p 指定
    -O 查询操作系统
    -sS 使用半连接方式查询
    —randomize_hosts 随机扫描
    —scan-delay 延时扫描,单位默认是秒
    3. 使用curl -I ip 查看指定服务器的web服务

Apache调优

整体调优思路:
1. 隐藏apache的版本信息 2. 设置错误页面 3. 开启压缩 4. 开启缓存 5. 开启长连接 6. 调整apache三种运行模式
7. 使用rewrite模块重写连接和防盗链 8. 禁止浏览目录 9. 禁止查看指定格式文件 10. 使用CDN做加速
一、隐藏apache的版本信息
查看网站版本信息: curl -I 网址
1. 编译时可修改的文件参数
vim 解压路径/include/ap_release.h
40 #define AP_SERVER_BASEVENDOR “Apache Software Foundation” # 服务的供应商名
41 #define AP_SERVER_BASEPROJECT “Apache HTTP Server” # 服务的项目名称
42 #define AP_SERVER_BASEPRODUCT “Apache” # 服务的产品名
44 #define AP_SERVER_MAJORVERSION_NUMBER 2 # 主要版本号
45 #define AP_SERVER_MINORVERSION_NUMBER 4 # 小版本号
46 #define AP_SERVER_PATCHLEVEL_NUMBER 37 # 补丁级别
47 #define AP_SERVER_DEVBUILD_BOOLEAN 0
上面参数末尾自行修改即可,这个可以修改apache的服务名,以及版本
2. 再此隐藏系统类型和模块的版本号
vim 安装路径/conf/httpd.conf
取消 #Include conf/extra/httpd-default.conf 注释
vim 安装路径/conf/extra/httpd-default.conf
修改ServerTokens Full 为 ServerTokens Prod 不显示服务器的操作系统类型
修改 ServerSignature On 为 ServerSignature Off 不显示web服务器版本号和版本

二、修改apache的默认用户
1. 提高安全性,即使apache服务被攻破,客户拿到apache普通用户也不会对系统和其他应用造成破坏
创建apache用户: useradd -M -s /sbin/nologin apache
编辑配置文件: vim 安装目录/conf/httpd.conf
改User daemon 为 User apache
改 Group daemon 为 Group apache

三、修改目录权限
1. 在网站架构中,我们应该把资源文件的权限合理配置好,不能给777
修改权限: chown apache:apache -R 安装目录/
2. 日志目录修改为root,以免apache被攻破,黑客查看日志,由于日志由apache主进程进行操作,而apache由root用户启动,所以不影响日志输出
修改权限: chown root:root 安装目录/log

四、使用Cronolog分割apache日志
1. 下载安装cronllog:
yum -y install epel-release
yum -y install cronolog -y
2. 配置apache使用cronolog:
vim 安装目录/conf/httpd.conf
改 CustomLog “logs/accesslog” common 为 CustomLog “|/usr/sbin/cronolog 安装目录/logs/access%Y%m%d.log” combined
改 ErrorLog “logs/errorlog” 为 ErrorLog “|/usr/sbin/cronolog 安装目录/logs/error%Y%m%d.log”
注: |/usr/local/sbin/cronolog /app/logs /accesswww %Y%m%d%H.log 按小时轮询

五、设置错误页面
1. 设置错误页面:
方法一: vim 安装目录/conf/httpd.conf
在虚拟目录下:
ErrorDocument 404 /404.html
echo go to 404 > 安装目录/htdocs/404.html
2. 跳转错误页面:
ErrorDocument 404 http://www.xuegod.cn

六、启用压缩模块mod_deflate
1.检查压缩模块是否安装: 安装目录/bin/apachectl -M | grep deflate
2.安装方法一: 编译时跟上—enable-deflate即可安装
3.安装方法二: DSO方式安装
安装目录/bin/apxs -c -i -a 编译安装目录/modules/filters/mod_deflate.c
-c 此选项表明需要执行编译操作。
-i 此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的 modules 目录。
-a 此选项自动增加一个 LoadModule 行到 httpd.conf 文件中,以激活此模块,或者,如果此行已经存在,则启用之。
在配置文件加入环境: vim /usr/local/apache2.4-xuegod/conf/httpd.conf
在 LoadModule deflate_module modules/mod_deflate.so 上面一行插入 LoadFile /usr/lib64/libz.so
验证: 安装目录/bin/apachectl -M | grep deflate
4. 编辑配置文件: vim 安装目录/conf/httpd.conf
在170 之后插入,如果是虚拟主机,在虚拟目录中添加即可

DeflateCompressionLevel 9 # 压缩等级
SetOutputFilter DEFLATE # 启动压缩功能
DeflateFilterNote Input instream # 声明流入的byte流量
DeflateFilterNote Output outstream # 声明输出的byte流量
DeflateFilterNote Ratio ratio # 声明压缩的百分比
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript # 仅压缩特定的文件

注意: AddOutputFilterByTypeDEFLATE 后跟的所有的压缩文件类型,后期可以参照选择
text/plain text/html text/php text/xml text/css text/javascript application/xhtml+xml application/xml application/rss+xml application/atom_xml
application/x-javascript application/x-httpd-php image/svg+xml image/gif image/png image/jpe image/swf image/jpeg image/bmp

七、设置网页缓存时间mod_expires
1. 检测方法: 安装目录/bin/apachectl -M | grep expires
2. 安装方法一: 编译时安装,加入—enable-expires即可
3. 安装方法二: DSO方式安装
安装目录/bin/apxs -c -i -a 编译安装目录/modules/filters/ mod_expires.so
4. 配置参数: vim 安装目录/conf/httpd.conf
3种用法: 全局,目录和虚拟主机

ExpiresActive on
ExpiresDefault “access plus 12 month”
ExpiresByType text/html “access plus 12 months”
ExpiresByType text/css “access plus 12 months”
ExpiresByType image/gif “access plus 12 months”
ExpiresByType image/jpeg “access plus 12 months”
ExpiresByType image/jpg “access plus 12 months”
ExpiresByType image/png “access plus 12 months”
EXpiresByType application/x-shockwave-flash “access plus 12 months”
EXpiresByType application/x-javascript “access plus 12 months”
ExpiresByType video/x-flv “access plus 12 months”

注:解决被缓存文件及时更新的方法:对缓存的对象改名

八、开启长连接
1. 配置方法: vim 安装目录/conf/httpd.conf
改 511 #Include conf/extra/httpd-default.conf 为 511 Include conf/extra/httpd-default.conf 取消注释
2. 修改配置: vim 安装目录/conf/extra/httpd-default.conf
改 16 KeepAlive Off 为 KeepAlive On
改 29 KeepAliveTimeout 5 为 KeepAliveTimeout 30
MaxKeepAliveRequests 100 # 默认100,一个建立好的长连接,允许发送的请求个数
Timeout 60 # 用于设置apache等待一下三种事件的时间长度: 1.接受一个get请求耗费的时间 2. post或put请求,接受两个tcp包之间的时间 3.应答时tcp包传输中两个ACK包之间的时间
3. MaxKeepAliveRequests使用举例:
用户需要间隔时间不大于 KeepAliveTimeout 的时间内,连续请求 10 个文件,那么这个参数就应该设置成 10,如果用户在连续时间里不断请求访问,则这个数值得设置得更多。否则就重新
建立连接下载。一旦用户连续进行了 10 个请求后,并且这个用户肯定在完成这些请求后的 5 秒内不会再请求,甚至要在之后的很长时间后请求,那么这个 KeepAliveTimeout 时间就可以设置得很短,以便尽
早断开这种用户,把资源让个其他用户。
4. 总结: 1、如果内存和 CPU 都足够,开启和关闭 KeepAlive 对性能影响不大。 2、如果考虑服务器压力,如果同一个客户端对服务器会经常访问,建议开启 KeepAlive。

九、apache三种工作模式详解
1. prefork是基于多进程的模式
优点: 因为每个进程使用独立的内存空间,所以比较安全。一个进程坏了,不会影响其他进程
缺点:占用的内存较大
2. worker工作模式详解
优点: 可以处理海量请求,而系统资源的开销小,原因是一个进程中包括多个线程。多个线程之间可以共享内存,所以占用的内存资源比较少
缺点: 不太安全。如果一个线程坏了。 整个进程都要坏了。另外存在 keep-alive 长连接占用资源时间过长。
3. event 工作模式详解
在2.4版本中才可以稳定运行。这是 Apache 最新的工作模式,它和 worker 模式很像,不同的是在于它解决了 keep-alive 长连接的时候占用线程资源被浪费的问题,在
event 工作模式中,会有一些专门的线程用来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。
4. 安装方法: 使用—with-mpm=prefork|worker|event 来指定编译为那一种 MPM。也可以编译为三种都支持:—enable-mpms-shared=all,这样在编译的时候
会在 modules 目录下自动编译出三个 MPM 文件的 so,然后通过修改 httpd.conf 配置文件更改MPM
5. 查看apache运行模式:
方法一: 安装目录/bin/httpd -l
方法二: httpd -V
6总结: 生产环境下对于要求更高伸缩性的站点可以选择使用 worker 或 event 模式; 需要可靠性或者与旧软件兼容的站点可以使用 prefork 模式。现在网站使用 worker 模式比较多。worker 也比较
成熟。event 模式从 Apache2.4 版本才开始有。

十、对prefork模式性能调优
1. 修改配置文件: vim 安装目录/conf/httpd.conf
改 #Include conf/extra/httpd-mpm.conf 为 Include conf/extra/httpd-mpm.conf
2. 主要参数配置: vim 安装目录/ conf/extra/httpd-mpm.conf
28
29 StartServers 5 # 启动 Apache 时创建的服务进程数量
30 MinSpareServers 5 # 最小空闲进程数 ,,是最大并发的11分之一
31 MaxSpareServers 11 # 最大空闲进程数
32 MaxRequestWorkers 250 # 最大并发进程数。
33 MaxConnectionsPerChild 0 # 最大连接数限制。如果设置为 0,表示没有限制。

十一、对worker、event模式性能优化
1. 编辑配置: vim 安装目录/conf/extra/httpd-mpm.conf
常用配置:
44
45 StartServers 3 #最初建立的子进程,设置通cpu核心数一样,或者是核心数的两倍
46 MinSpareThreads 75 #基于整个服务器监视的最小空闲线程数,如果空闲的线程小于设定值,Apache 会自动建立线程,如果服务器负载大的话,可以考虑加大此参考值 ,应该设置为最小并发量的3倍
47 MaxSpareThreads 250 #基于整个服务器监视的最大空闲线程数,如果空闲的线程大于设定值,Apache 会自动 kill 掉多余的线程,如果服务器负载大的话,可以考虑加大此参考值,配置为最大并发量的一半
48 ThreadsPerChild 25 #表示每个进程包含的线程数,如果是并发量比较大,可以考虑加大这个值。此参数在 worker 模式中,是影响最大的参数。用最大并发数除以startservers
49 MaxRequestWorkers 400 #所有线程数量的最大值,通常表示了一个 web 服务可以同时处理的请求数。必须是 ThreadsPerChild 的整数倍,最大并发量
50 MaxConnectionsPerChild 0 #每个子进程可以处理的最大请求数。达到该数目后,进程将死掉。如果设置为 0,表示没有限制
51

2. 配置参数:
一台服务器,16 核心 CPU,64G内存。 Apache 最大可以设置多少个 work 进程配置
44
45 StartServers 1124
46 MinSpareThreads 750
47 MaxSpareThreads 2500
48 ThreadsPerChild 250
49 MaxRequestWorkers 25000
50 MaxConnectionsPerChild 25000
51

一台服务器 cpu 是 8 核心,物理是内存 32G ,想达到 2000 并发的 apache,worker模式的配置参数如下:

StartServers 16
MinSpareThreads 75
MaxSpareThreads 1250
ThreadsPerChild 125
MaxRequestWorkers 2000
MaxConnectionsPerChild 12500

3. event模式调优
61
62 StartServers 31) R=code 强制外部重定向
63 MinSpareThreads 75
64 MaxSpareThreads 250
65 ThreadsPerChild 25
66 MaxRequestWorkers 400
67 MaxConnectionsPerChild 0
68

event 模式调优和 worker 模式一样的,不同的是在于它解决了 keep-alive 长连接的时候占用线程资源被浪费的问题。所以理伦上 event 模式比 worker 模式好。

十二、apche的rewrite规则使用
1. 安装方法:
编译安装检查: 安装目录/bin/apachectl -M | grep rewrite
DSO方式检查: 安装目录/bin/apachectl -M | grep expires
方法一: 是编译 Apache 的时候就直接 安装 rewrite 模块 —enable-rewrite
方法二:编译 Apache 时以 DSO 模式安装 Apache,然后再利用源码和 apxs 来安装 rewrite 模块。
安装目录/bin/apxs -c -i -a 源码目录/modules/mappers/mod_rewrite.c
启动模块: vim 安装目录/conf/httpd.conf
改 116 #LoadModule rewrite_module modules/mod_rewrite.so 取消注释
2. mod_rewrite规则重写说明
1) R=code 强制外部重定向。强制在替代字符串加上 http://thishost[:thisport]/前缀重定向到外部的 URL.如果 code 不指定,将用缺省的 302 HTTP 状态码。
2) F(force URL to be forbidden)禁用 URL,返回 403HTTP 状态码。
3) G(force URL to be gone) 强制 URL 为 GONE,返回 411HTTP 状态码。
4) P(force proxy) 强制使用代理转发。
5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
6) N(next round) 重新从第一条规则开始运行重写过程。
7) C(chained with next rule) 与下一条规则关联。
如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。
8) T=MIME-type(force MIME type) 强制 MIME 类型。
9) NS (used only if no internal sub-request) 只用于不是内部子请求。
11) NC(no case) 不区分大小写
11) QSA(query string append) 追加请求字符串。
12) NE(no URI escaping of output) 不在输出转义特殊字符。
13) PT(pass through to next handler) 传递给下一个处理。
14) S=num(skip next rule(s)) 跳过 num 条规则。
11) E=VAR:VAL(set environment variable) 设置环境变量。
3. 配置使用方法:
vim /usr/local/apache2.4-xuegod/conf/httpd.conf在 LoadModule rewrite_module modules/mod_rewrite.so 之后插入
RewriteEngine on #打开 rewirte 功能。
RewriteCond %{HTTP_HOST} !^www.xuegod.cn [NC]
RewriteCond %{HTTP_HOST} !^192.168.1.63 [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.) http://www.xuegod.cn/ [L]
4. 防盗链的配置
vim /usr/local/apache2.4-xuegod/conf/httpd.conf 删除之前的配置

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://sunsky.pw/.
$ [NC]
RewriteCond %{HTTP_REFERER} !^http://sunsky.pw$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.sunsky.pw/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.sunsky.pw$ [NC]
RewriteRule .*.(gif|jpg|swf)$ http://www.sunsky.pw [R,NC]

十三、禁止浏览目录和php文件被解析-使用CDN做网站加速
1.禁止浏览目录:
vim /usr/local/apache2.4-xuegod/conf/httpd.conf
改 Options Indexes FollowSymLinks 为 Options FollowSymLinks
2. 在对应的虚拟目录加入以下内容:

Order allow,deny
Deny from all

Nginx调优

调优思路: 隐藏版本号—修改用户—cpu亲和力—处理事件模块—最大连接数—缓存—高效传输—压缩—防盗链
一、隐藏nginx版本号
1. 修改nginx软件标识和版本号: vim 源码/src/core/nginx.h
改:#define NGINX_VERSION “1.18.0” 中的版本号,随便改成其他的
改: #define NGINX_VER “nginx/“ 后面的软件名改成随意其他的
2. 修改http头信息中的connection字段,防止回显nginx表示: vim 源码/src/http/ngx_http_header_filter_module.c
改 static u_char ngx_http_server_string[] = “Server: nginx” CRLF 中nginx改为其他的任意
3. 修改404报错显示的时候,不回显标识和版本号: vim 源码/src/http/ngx_http_special_response.c
改 “


nginx
“ CRLF 中nginx为其他任意
4. 隐藏nginx的版本号: vim 安装/conf/nginx.conf
在 default_type application/octet-stream; 下面加入 server_tokens off;

二、修改运行用户-设置nginx的cpu亲和力
1. 修改运行用户: vim 安装/conf/nginx.conf
改 #user nobody; 为 2 user nginx;
2. 设置nginx运行进程个数 : vim 安装/conf/nginx.conf
改 worker_processes 1; 为 worker_processes 4; # 一般等于cpu核心数或两倍
3. 设置cpu亲和力
查看进程: pstree -p | grep nginx
查看进程可以在哪些cpu核心上运行: taskset -cp 34975
设置亲和力: vim 安装/conf/nginx.conf # 如果4核心4线程的cpu
在 worker_processes 4; 下面添加 worker_cpu_affinity 0001 0010 0100 1000;
例: 如果是8核心,就是: worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

三、优化Nginx事件处理模型,和开启最大连接数
1. 修改nginx最多可以打开文件数: vim 安装/conf/nginx.comf
在 worker_cpu_affinity 0001 0010 0100 1000; 下面插入内容 worker_rlimit_nofile 65535;
注: 进程最大可打开文件数受限于操作系统,可通过 ulimit -n 命令查询, 临时配置: ulimit -SHn 65535
2. Nginx事件处理模型
在 events标签中添加 use epoll;
模型对比:
select,poll,epoll 都是 nginx 下的 IO 多路复用的机制。I/O 多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
epoll 优势:效率提升,Epoll 最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll 的效率就会远远高于 select 和 poll。 Epoll 使用了“共享内存”,更省内存,效率更高。
3. 单个进程允许客户端最大并发连接数: vim 安装/conf/nginx.conf
改 worker_connections 1024; 为 worker_connections 65535;

四、ServerName 和 location 匹配
1. servername匹配:vim 安装/conf/nginx.conf
找到http标签中的server标签,改 server_name localhost; 为 server_name 域名;
2. ServerName 配置虚拟主机: vim 安装/conf/nginx.conf
server { # 标签
listen 80; # 监听端口
server_name xuegod63.com; # 域名servername
location / {
root html/xuegod63.com/; # 网站目录
index index.html index.htm; # 首页指定
}
}
3. ServerName匹配方式:
(1)、精确匹配:www.aa.com
(2)、左侧通配符匹配:.aa.com
(3)、右侧通配符匹配:www.

(4)、正则表达式:~ ^..aa.com$
(5)、default_server
(5)、服务 IP 地址
4. location 匹配基础和匹配规则:
= 严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。
~ 为区分大小写匹配(用于正则表达式)
!~ 为区分大小写不匹配
~
为不区分大小写匹配(可用正则表达式)
!~ 为不区分大小写不匹配
^~ 如果把这个前缀用于一个常规字符串,那么告诉 nginx 如果路径匹配,则不测试剩下的正则表达式。通常用于,以什么字符串开头的查询。
\ 转义。
配置任意个任意字符。
$ 以什么结尾。
举例: 客户请求static目录中的资源则拒绝访问
location ^~ /static/ {
deny all;
}
举例: 匹配任何以gif、jpg 、png 、js、css 结尾的请求全部拒绝
location ~* .(gif|jpg|png|js|css)$ {
deny all;
}

五、Nginx缓存调优—开启网络高效传输—gzip压缩网页调优
1. 配置php缓存Fastcgi : vim 安装/conf/nginx.conf
在http标签中添加如下: 推荐在sendfile配置上方
fastcgi_connect_timeout 300; #指定链接到后端 FastCGI 的超时时间
fastcgi_send_timeout 300; # Nginx 允许 FastCGI 服务器返回数据的超时时间,即在规定时间内后端服务器必须传完所有的数据,否则 Nginx 将断开这个连接
fastcgi_read_timeout 300; # Nginx 从 FastCGI 服务器读取响应信息的超时时间,表示连接建立成功后,Nginx 等待后端服务器的响应时间
fastcgi_buffers 4 64k; # 指定缓冲区的数量和大小,
fastcgi_busy_buffers_size 128k;
fastcgi_temp_path /var/run/nginx-tmp-cache; # 指定临时目录设置 301 状态的 URL 缓存 1 天
fastcgi_temp_file_write_size 128k;
fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g; # 定义缓存的路径、大小、缓存时间。
在server字段中locattion标签添加fastcgi缓存配置:
include fastcgi.conf; # 引用 fastcgi 默认配置文件
fastcgi_cache ngx_fcgi_cache; #指定缓存名称,由 http 字段中 fastcgi_cache_path
fastcgi_cache_valid 200 302 1h; # 设置 200、302 状态的 URL 缓存 1 小时
fastcgi_cache_valid 301 1d; # 设置 301 状态的 URL 缓存 1 天
fastcgi_cache_valid any 1m; # 将其他应答缓存为 1 分钟
fastcgi_cache_min_uses 1; # 设置请求 1 次就会被缓存
fastcgi_cache_use_stale error timeout invalid_header http_500; # 设置 500 状态码不进行缓存
fastcgi_cache_key http://$host$request_uri; ; # 该指令用来设置 Web 缓存的 Key 值
将缓存文件挂载至内存: vim /etc/fstab
tmpfs /var/run/nginx-cache tmpfs defaults,size=512M 0 0
2. 开启高效传输方式: vim 安装/conf/nginx.conf
sendfile on; 开启高效文件传输模式
tcp_nopush on; 必须在 sendfile 开启模式才有效,防止网络阻塞,积极的减少网络报文段的数量
3. gzip压缩网页调优: vim 安装/conf/nginx.conf
gzip on; #开启压缩功能。
gzip_min_length 1k; #设置允许压缩的页面最小字节数
gzip_http_version 1.1; #用于设置识别 HTTP 协议版本,默认是 1.1
gzip_comp_level 6; #压缩比例[1-9] 级别越高,压的越小,越浪费 CPU 计算资源。
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; #用来指定压缩的资源类型
gzip_vary on; #vary header 支持
4. expries缓存优化
例子: 匹配文件名进行缓存
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 365d;
}
例子: 匹配目录进行缓存
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d;
}

六、日志切割优化
1. 使用脚本的方式来进行日志切割
2. 日志记录: vim 安装/conf/nginx.conf
举例: js、jpg、jpeg、JPG、JPEG、css、bmp、gif、GIF 为结尾的不进行记录
location ~ .*.(js|jpg|jpeg|JPG|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
3. 日志格式优化: vim 安装/conf/nginx.conf
以下取消注释:
#log_format main ‘$remote_addr - $remote_user [$time_local] “$request” ‘
# ‘$status $body_bytes_sent “$http_referer” ‘
# ‘“$http_user_agent” “$http_x_forwarded_for”‘;
#access_log logs/access.log main;
各字段含义如下
$remote_addr 与$http_x_forwarded_for 用以记录客户端的 ip 地址;
$remote_user :用来记录客户端用户名称;
$time_local : 用来记录访问时间与时区;
$request : 用来记录请求的 url 与 http 协议;
$status : 用来记录请求状态,功是 200;
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer :用来记录从哪个页面链接访问过来的;
$http_user_agent :记录客户端浏览器的相关信息;

六、禁止使用ip访问和301优化—防盗链
1. 禁止使用ip,403反馈消息 : vim 安装/conf/nginx.conf
server{
listen 80 default;
servername ;
return 403;
}
2. 301跳转方法,隐藏www : : vim 安装/conf/nginx.conf
server {
listen 80;
server_name xuegod63.com www.xuegod63.com;
if ($host = ‘xuegod63.com’ ) {
rewrite ^/(.)$ http://www.xuegod63.com/$1 permanent;
}
}
3. 防盗链
解决方法:
水印,品牌宣传,你的带宽,服务器足够
防火墙,直接控制,前提是你知道 IP 来源
防盗链策略
配置防盗链: vim 安装/conf/nginx.conf
location ~
.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers none blocked *.xuegod63.com xuegod63.com;
if ($invalid_referer) {
return 404;
}
}
参数详解:
valid_referers 设置访问白名单该指令后面可以接 none blocked serevr_names string 或者是正则表达式
none : 允许没有 http_refer 的请求访问资源;
blocked : 允许不是 http://开头的,不带协议的请求访问资源;
server_names : 只允许指定 ip/域名来的请求访问资源(白名单);
4. 防止DDOS攻击,同时限制用户占用服务器资源: vim 安装/conf/nginx.conf
http字段中匹配: limit_conn_zone $binary_remote_addr zone=addr:10m;
server 的 location 字段配置,添加到 php 解析中即可: limit_conn addr 1;

网络问题排查思路

  1. 网络排错基本思路:
    1) 物理层、查看网线是否连接正常
    2)检查ip,子网掩码,网关配置,尝试ping网关
    3)检查DNS配置
    4)检查防火墙的规则
    5)检查是否有人冒充网关进行ARP欺骗
    6)查看网络内核参数

  2. 使用arping命令测试网关
    arping -l 网卡设备 网关

  3. 修改内核参数
    这个台被黑的系统,所有网络参数都正常,就是上不了网。可以使用: cat /proc/sys/net/ipv4/ip_default_ttl 默认参数是64
    思路,ping不通域名,可以ping一下网关和公网ip地址
    服务器调优和问题排查 - 图5
    服务器调优和问题排查 - 图6
    TTL : 数据报的生存周期。默认linux操作系统值:64. 每经过一个路器节点,TTL值减1。TTL值为0时,说明目标地址不可达并返回:Time to live exceeded。TTL的作用是防止数据包,无限制在公网中转发。
    # TTL生存时间超时,说明TTL有问题。

  4. 使用tcpdump抓包分析网络环境
    常用参数:
    -i 指定网卡接口
    -n 不解析ip地址为域名
    -v 显示包中详细信息
    -t 指定协议类型
    -h 指定主机地址

CA证书相关

证书申请过程: 生成请求文件—CA确认申请者的身份真实性—CA使用跟证书的私钥加密请求文件生成证书—把证书传给申请者
一、搭建CA认证中心
1. 查看是否安装openssl : rpm -qa | grep openssl
2. 修改配置: vim /etc/pki/tls/openssl.cnf
改 basicConstraints=CA:FALSE 为 basicConstraints=CA:TRUE
3. 生成新的证书: /etc/pki/tls/misc/CA -newca
服务器调优和问题排查 - 图7
服务器调优和问题排查 - 图8
4. 查看生成的CA跟证书: cat /etc/pki/CA/cacert.pem
5. 查看跟证书的私钥: cat /etc/pki/CA/private/cakey.pem

二、在apache上搭建https
1. 新一台服务器安装http: yum -y install httpd
2. 指定servername : vim /etc/httpd/conf/httpd.conf
3. 启动: systemctl start httpd
4. 生成一个私钥: openssl genrsa -des3 -out /etc/httpd/conf.d/server.key
5. 使用私钥生成证书: openssl req -new -key /etc/httpd/conf.d/server.key -out ./server.csr
服务器调优和问题排查 - 图9
6. 将证书请求文件发给CA : scp ./server.csr 192.168.1.63:/tmp/
服务器调优和问题排查 - 图10
服务器调优和问题排查 - 图11
7. 回到CA服务器,用CA签名: opensll ca -keyfile 私钥 -cert 公钥 -in 请求文件 -out 证书保存路径
8. 将签名证书返回给http: scp ./server.crt 192.168.1.85:/tmp/
9. web服务安装ssl模块: yum install mod_ssl -y
10. 拷贝证书到目录: cp /tmp/server.crt /etc/httpd/conf.d/
11. 查看私钥路径: ll /etc/httpd/conf.d/server.key
12. 修改配置文件: vim /etc/httpd/conf.d/ssl.conf
改 SSLCertificateFile /etc/pki/tls/certs/localhost.crt 路径为证书路径
改 SSLCertificateKeyFile /etc/pki/tls/private/localhost.key 路径为私钥路径
13. 重启httpd: systemctl restart httpd
14. 验证是否成功: netstat -anutp |grep 443

三、nginx自签证书
1. 前面私钥,请求文件,证书生成方法参考httpd
2. 安装nginx: yum -y install nginx
3. 启动nginx: systemctl start nginx
3. 配置nginx实现https: vim /etc/nginx/conf.d/default.conf
server {
listen 443 ssl;
keepalive_timeout 70;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
ssl_certificate 公钥路径 ;
ssl_certificate_key 证书路径 ;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
}
4. 检测是否成功: nginx -t
5. 重载nginx: nginx -s load
6. 验证: ss -anutp | grep 443