1、Linux 运维工程师工作手册释放内存:syncecho 3 /proc/sys/vm/drop_cachesLinux 查看 Dell 服务器型号命令:dmidecode | grep “Product Name“查看系统负载:cat /proc/loadavg0.0 0.00 0.00 1/283 10904意思是:前三个是系统负载,1/283 中,1 代表此时运行队伍中的进程个数,而 283 是代表此时的进程总数10904 到此为止,最后创建的一个进程 ID。系统装好后,要做的事如下:关闭防火墙 Selinux:vim /etc/selinux/config把 SELINUX=enfor
2、cing 改成 SELINUX=disabled更改主机名:vim /etc/sysconfig/network修改主机名,不要用 localhost添加 hosts 主机记录vim /etc/hosts 中,在 127.0.0.1 后面,添加自己的主机名创建 0-9 a-z 目录for i in seq 0 9 az;do mkdir -p $i;done:测试硬盘性能工具:iozone监视服务器每少上下文切换数次工具:Nmon(很不错的性能监视工具)#占用内存大小前 10 的进程ps -eo comm,size -sort -size | head -10 #占用 cpu 使用前 10 的
3、进程ps -eo comm,pcpu -sort -pcpu | head -10 一、Apache 服务优化: 21.配置 cronolog 进行日志轮询 22.错误页面优雅显示 23.mod_deflate 文件压缩功能 34.mod_expires 缓存功能 45.更改 apache 的默认用户 56.worker 模式,提升并发数(可以达到 2000-5000) 57.屏蔽 apache 版本等敏感信息 68.apache 目录文件权限设置(root,目录 755,文件 644) 69.开启 httpd-mpm.conf 增加连接数 610. apache 防盗链功能 811.禁止目录
4、 Index 812. 禁止用户覆盖( 重载) 813.关闭 CGI 914.避免使用 .htaccess 文件(分布式配置文件) 915. apache 的安全模块 916.正确途径取得源代码,勤打 apache 补丁 1017.apache 日志授予 root 700 权限 1018.系统内核参数优化 1019.禁止 PHP 解析指定站点的目录 1020.使用 tmpfs 文件系统替代频繁访问的目录 1121 尽可能减少 HTTP 请求数 1122 使用 CDN 做网站加速 12查看你的服务器网络连接状态netstat -n | awk /tcp/ +S$NF END for(a in S
5、) print a, SaCLOSED:无连接是活动的或正在进行 LISTEN:服务器在等待进入呼叫 SYN_RECV:一个连接请求已经到达,等待确认 SYN_SENT:应用已经开始,打开一个连接 ESTABLISHED:正常数据传输状态 FIN_WAIT1:应用说它已经完成 FIN_WAIT2:另一边已同意释放 ITMED_WAIT:等待所有分组死掉 CLOSING:两边同时尝试关闭 TIME_WAIT:另一边已初始化一个释放 LAST_ACK:等待所有分组死掉 ESTABLISHED 的值其实也是当前的并发数,这个可重点关注下;另外,可关注下TIMEWAIT 这项的数值。Linux 下高并
6、发的 Squid 服务器,TCP TIME_WAIT 套接字数量经常达到两、三万,服务器很容易被拖死。通过修改 Linux 内核参数,可以减少Squid 服务器的 TIME_WAIT 套接字数量。#查看系统本地可用端口极限值cat /proc/sys/net/ipv4/ip_local_port_range寻找恶意 IP 并用 iptables 禁止掉netstat -an| grep :80 | grep -v 127.0.0.1 |awk print $5 | sort|awk -F: print $1,$4 | uniq -c | awk $1 50 print $1,$24.5 备份单
7、个数据库mysqldump -u 用户 p密码 -default-character-set=latin1 数据库名 备份文件名(数据库默认编码是 latin1)普通备份:mysqldump -uroot -poldboy123 oldboy /server/bak/oldboy.sql压缩备份:mysqldump -uroot -poldboy123 oldboy |gzip /server/bak/oldboy.sql.gz设置字符集备份:mysqldump -uroot -poldboy123 oldboy -default-character-set=gbk |gzip /server
8、/bak/oldboy.sql.gz执行结果:rootoldboy # mkdir /server/bak -prootoldboy # mysqldump -uroot -poldboy123 oldboy /server/babackup/ bak/ rootoldboy # mysqldump -uroot -poldboy123 oldboy /server/bak/oldboy.sqlrootoldboy # mysqldump -uroot -poldboy123 oldboy |gzip /server/bak/oldboy.sql.gzrootoldboy # ls -l /s
9、erver/bak/total 8-rw-r-r- 1 root root 1991 Apr 9 00:51 oldboy.sql-rw-r-r- 1 root root 801 Apr 9 00:51 oldboy.sql.gz4.6 mysqldump 在做啥?mysqldump 实际上就是把数据从 mysql 库里以逻辑的 sql 语句的形式导出。备份的数据过滤掉注释:rootoldboy # egrep -v “*|-|$“ /server/bak/oldboy.sqlDROP TABLE IF EXISTS test;CREATE TABLE test (id int(4) NOT
10、NULL AUTO_INCREMENT,name char(20) NOT NULL,PRIMARY KEY (id) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=gbk;LOCK TABLES test WRITE;INSERT INTO test VALUES (1,zhaoyue),(2,jesse),(4,elain),(5,wodi),(6,yingsui),(7,zhangyang),(8,zaixiangpan),(9,?),(10,鑰佺敺瀛?),(11,鎴?); /server/bak/oldboy-gbk.sqlrootol
11、dboy # egrep -v “*|-|$“ /server/bak/oldboy-gbk.sqlDROP TABLE IF EXISTS test;CREATE TABLE test (id int(4) NOT NULL AUTO_INCREMENT,name char(20) NOT NULL,PRIMARY KEY (id) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=gbk;LOCK TABLES test WRITE;INSERT INTO test VALUES (1,zhaoyue),(2,jesse),(4,elain),
12、(5,wodi),(6,yingsui),(7,zhangyang),(8,zaixiangpan),(9,?),(10,老男孩),(11, 我); /server/bak/oldboy-gbk-muli.sql提示:-B 参数是关键,表示接多个库。(生产环境常用)-B, -databases To dump several databases. Note the difference in usage;In this case no tables are given. All name arguments areregarded as databasenames. USE db_name;
13、will beincluded in the output.参数说明:该参数用于导出若干个数据库,在备份结果中会加入 USE db_name 和CREATE DATABASE db_name;-B 后的参数都将被作为数据库名。该参数比较常用。当-B 后的数据库列全时 同 -A参数。请看-A 的说明。4.8 备份单个表mysqldump -u 用户名 -p 数据库名 表名 备份的文件名mysqldump -u root -p oldboy test oldboy_oldboy.sql执行结果:rootoldboy # mysqldump -uroot -poldboy123 oldboy tes
14、t -default-character-set=gbk /server/bak/oldboy-gbk-single.sql提示:无-B 参数,库 oldboy 后面就是 test 表了。4.9 备份多个表rootoldboy # mysqldump -uroot -poldboy123 oldboy test ett -default-character-set=gbk /server/bak/oldboy-gbk-muti-tables.sqlrootoldboy # egrep -v “*|-|$“ /server/bak/oldboy-gbk-muti-tables.sqlDROP T
15、ABLE IF EXISTS test;CREATE TABLE test (id int(4) NOT NULL AUTO_INCREMENT,name char(20) NOT NULL,PRIMARY KEY (id) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=gbk;LOCK TABLES test WRITE;INSERT INTO test VALUES (1,zhaoyue),(2,jesse),(4,elain),(5,wodi),(6,yingsui),(7,zhangyang),(8,zaixiangpan),(9,?)
16、,(10,老男孩),(11,我);UNLOCK TABLES;DROP TABLE IF EXISTS ett;CREATE TABLE ett (id int(11) DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=gbk;LOCK TABLES ett WRITE;UNLOCK TABLES;4.10 备份数据库结构( 不包含数据)mysqldump -uroot -d -poldboy oldboy oldboy oldboy_oldboy.sql-d 只备份表结构rootoldboy # mysqldump -uroot -poldboy123
17、-d oldboy /tmp/desc.sql rootoldboy # egrep -v “*|-|$“ /tmp/desc.sql DROP TABLE IF EXISTS ett;CREATE TABLE ett (id int(11) DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=gbk;DROP TABLE IF EXISTS test;CREATE TABLE test (id int(4) NOT NULL AUTO_INCREMENT,name char(20) NOT NULL,PRIMARY KEY (id) ENGINE=MyIS
18、AM AUTO_INCREMENT=12 DEFAULT CHARSET=gbk;更多用法可以 执行 mysqldump help 查询。有关 mysql 和 mysqldump 同学们要详细总结。5 恢复数据库5.1 source 命令恢复进入 mysql 数据库控制台,mysql -u root -pmysqluse 数据库然后使用 source 命令,后面参数为脚本文件(如这里用到的.sql)mysqlsource oldboy_db.sql #这个文件是系统路径。rootoldboy bak# mysql -uroot -poldboy123Welcome to the MySQL m
19、onitor. Commands end with ; or g.skip.Type help; or h for help. Type c to clear the current input statement.mysql use oldboyDatabase changedmysql show tables;+-+| Tables_in_oldboy |+-+| ett | test |+-+2 rows in set (0.00 sec)mysql drop tables test;Query OK, 0 rows affected (0.01 sec)mysql system ls
20、.oldboy-gbk-muli.sql oldboy-gbk-single.sql oldboy.sqloldboy-gbk-muti-tables.sql oldboy-gbk.sql oldboy.sql.gzmysql source ./oldboy.sql select * from test;+-+-+| id | name |+-+-+| 1 | zhaoyue | 2 | jesse | 4 | elain | 5 | wodi | 6 | yingsui | 7 | zhangyang | 8 | zaixiangpan | 9 | ? | 10 | ? | set name
21、s gbk;Query OK, 0 rows affected (0.00 sec)mysql select * from test;+-+-+| id | name |+-+-+| 1 | zhaoyue | 2 | jesse | 4 | elain | 5 | wodi | 6 | yingsui | 7 | zhangyang | 8 | zaixiangpan | 9 | ? | 10 | 老男孩 | system mysql -uroot -poldboy123 oldboy select * from test;+-+-+| id | name |+-+-+| 1 | zhaoy
22、ue | 2 | jesse | 4 | elain | 5 | wodi | 6 | yingsui | 7 | zhangyang | 8 | zaixiangpan | 9 | ? | 10 | 老男孩 |/data/backup/$(date +%F).tar.gz特别提示:有关 MyISAM 和 InnoDB 引擎的差别和在工作中如何选择,在前面的文章已经详细讲解过了,这里就不在讲了。2.1.1.2 InnoDB 引擎备份InnoDB 引擎为行锁,因此,备份时可以不对数据库加锁的操作,可以加选项-single-transaction 进行备份:mysqldump -A -F -B -
23、single-transaction |gzip /data/backup/$(date +%F).tar.gz特别注意:1)-single-transaction 仅适用于 InnoDB 引擎。生产环境 mysqldump 备份命令mysqldump u root p S /data/3306/mysql.sock default-character-set=gbk single-transaction F B oldboy|gzip /server/backup/mysql_$(date +%F).sql.gz:注-F:刷新 bin-log 参数,数据库备份完以后,会刷新 bin-log增
24、量备份:更新 bin-log:mysqladmin uroot p S /data/3306/mysql.sock flush-logs如生成 mysql-bin.000004 文件把生成的最新 mysql-bin.000004 文件,CP 到/var/backup/把二进制的日志生成 sql 语句:mysqlbinlog mysql-bin.000004bin04.sql如果有多个库,我们应该用-d 来指定恢复单个库mysqlbinlog mysql-bin.000004 d oldboy binlog.sql (当然对于库也要分库备,否则恢复还是麻烦)还原数据:先还原全备,再还原增备先还原
25、全备:mysql u root p show variables likemax_connections;+-+-+| Variable_name | Value |+-+-+| max_connections | 151 |+-+-+1 row in set (0.00 sec)服务器响应的最大连接数:152mysql show global status like Max_used_connections;+-+-+| Variable_name | Value |+-+-+| Max_used_connections | 152 |+-+-+1 row in set (0.00 sec)
26、查看服务器 key_buffer_size 数值:402653184mysql show variables like key_buffer_size;+-+-+| Variable_name | Value |+-+-+| key_buffer_size | 402653184 |+-+-+1 row in set (0.00 sec)查看服务器现在使用的 key_buffer_size 使用情况:key_read_requests: 879600044key-reads: 830525mysql show global status like key_read%;+-+-+| Variab
27、le_name | Value |+-+-+| Key_read_requests | 879600044 | Key_reads | 830525 |+-+-+2 rows in set (0.00 sec)计算索引未命中的概率:key_cache_miss_rate = key_reads / key_read_requests * 100%达到 0.1%以下(即每 1000 个请求有一个直接读硬盘)以下都很好,如果key_cache_miss_rae 在 0.01%以下的话,则说明 key_buffer_size 分配得过多,可以适当减少。Key_blocks_unused 表示未使用的
28、缓存簇数,Key_blocks_used 表示曾经用到的最大的 blocks 数,比如这台服务器,所有的缓存都用到了,要么增加 key_buffer_size,要么就是过度索引,把缓存占满了。比较理想的设置是:key_blocks_used / ( key_blocks_unused + key_blocks_used ) * 100 % = 80%mysql show global status like key_blocks_u%;+-+-+| Variable_name | Value |+-+-+| Key_blocks_unused | 317003 | Key_blocks_use
29、d | 6439 |+-+-+2 rows in set (0.00 sec)临时表:当执行语句时,关于已经被创造了的隐含临时表的数量,我们可以用如下命令查询其具体情况:mysql show global status like created_tmp%;+-+-+| Variable_name | Value |+-+-+| Created_tmp_disk_tables | 343326 | Created_tmp_files | 172 | Created_tmp_tables | 675795 |+-+-+3 rows in set (0.00 sec)每次创建临时表时,created
30、_tmp_tables 都会增加,如果是在磁盘上创建临时表,created_tmp_disk_tables 也会增加。created_tem_files 表示 MYSQL 服务创建的临时文件数,比较理想的配置是:Created_Tmp_disk_tables / Created_tmp_tables * 100% show variables where Variable_name in (tmp_table_size,max_heap_table_size);+-+-+| Variable_name | Value |+-+-+| max_heap_table_size | 16777216
31、 | tmp_table_size | 16777216 |+-+-+2 rows in set (0.00 sec)只有 16M 以下的临时表才能全部放在内存中,超过的就会用到硬盘临时表。打开表的情况Open_tables 表示打开表的数量,Opend_tables 表示打开过的表数量,我们可以用如下命令查看其具体情况:mysql show global status like open%tables%;+-+-+| Variable_name | Value |+-+-+| Open_tables | 512 | Opened_tables | 234200 |+-+-+2 rows in
32、 set (0.00 sec)如果 Opened_tables 数量过大,说明配置中 tables_caceh(MYSQL 5.1.3 之后这个值叫做 table_open_cache)的值可能太小。我们查询一下服务器 table_cache 值:mysql show variables like table_open_cache; +-+-+| Variable_name | Value |+-+-+| table_open_cache | 614 |+-+-+1 row in set (0.00 sec)比较合适的值为:Open_tables / Opened_tables * 100%
33、= 85%Open_tables / table_open_cache * 100% show global status like Thread%;+-+-+| Variable_name | Value |+-+-+| Threads_cached | 7 | Threads_connected | 2 | Threads_created | 2124 | Threads_running | 2 |+-+-+4 rows in set (0.00 sec)如果发现 Threads_created 的值过大的话,表明 MYSQL 服务器一直在创建线程,这也是比较耗费资源的,可以适当增大配置文
34、件中的 thread_cache_size 的值。查询服务器thread_cahce_size 配置,如下所示:mysql show variables like thread_cache_size;+-+-+| Variable_name | Value |+-+-+| thread_cache_size | 8 |+-+-+1 row in set (0.00 sec)查询缓存它涉及的主要有两个参数,query_cache_size 是设置 MYSQL 的 Query_Cache 大小,query_cache_size 是设置使用查询缓存的类型,我们可以用如下命令查看其具体情况:mysql
35、 show global status like qcache%;+-+-+| Variable_name | Value |+-+-+| Qcache_free_blocks | 130 | Qcache_free_memory | 31557680 | Qcache_hits | 15838885 | Qcache_inserts | 2391041 | Qcache_lowmem_prunes | 0 | Qcache_not_cached | 671718 | Qcache_queries_in_cache | 676 | Qcache_total_blocks | 1798 |+-+
36、-+8 rows in set (0.00 sec)我们再查询一下服务器上关于 query-cache 的配置命令如下:mysql show variables like query_cache%;+-+-+| Variable_name | Value |+-+-+| query_cache_limit | 1048576 | query_cache_min_res_unit | 4096 | query_cache_size | 33554432 | query_cache_type | ON | query_cache_wlock_invalidate | OFF |+-+-+5 row
37、s in set (0.00 sec)排序使用情况它表示系统中对数据进行排序时所使用的 Buffer,我们可以用如下命令查看:mysql show global status like sort%;+-+-+| Variable_name | Value |+-+-+| Sort_merge_passes | 84 | Sort_range | 393425 | Sort_rows | 751581502 | Sort_scan | 324383 |+-+-+4 rows in set (0.00 sec)Sort_merge_passes 包括如下步骤:MYSQL 首先会尝试在内存中做排序,
38、使用的内存大小由系统变量 sort_buffer_size 来决定,如果它不够大则把所有的记录都读到内存中,而 MYSQl 则会把每次在内存中排序的结果存到临时文件中,等 MYSQL 找到所有记录之后,再把临时文件中的记录做一次排序。这次再排序就会增加 sort_merge_passes。实际上,MYSQL 会用另一个临时文件来存储再次排序的结果,所以我们通常会看到sort_merge_passes 增加的数值是建临时文件数的两倍。因为用到了临时文件,所以速度可能会比较慢,增大 sort_buffer_size 会减少 sort_merge_passes 和创建临时文件的次数,但盲目地增加 s
39、ort_buffer_size 并不一定能提高速度。文件打开数(open_files)我们在处理 MYSQL 故障时,发现当 open_files 大于 open_files_limit 值时,MYSQL数据库就会发生卡住的现象,导致 APACHE 服务器打不开相应页面。这个问题大家在工作中应注意,我们可以用如下命令查看其具体情况:mysql show global status like open_files;+-+-+| Variable_name | Value |+-+-+| Open_files | 901 |+-+-+1 row in set (0.00 sec)mysql sho
40、w variables likeopen_files_limit;+-+-+| Variable_name | Value |+-+-+| open_files_limit | 1185 |+-+-+1 row in set (0.00 sec)比较适合的设置是:open_files / open_files_limit * 100% Memcached 之类的第三方软件,以便适应更大访问量的要求。跟踪进程:找其中一个 CPU 100% 的 php-cgi 进程的 PID,用以下命令跟踪一下:strace -p 10747如果屏幕显示:select(7, 6, 6, , 15, 0) = 1
41、(out 6, left 15, 0)poll(fd=6, events=POLLIN, 1, 0) = 0 (Timeout)select(7, 6, 6, , 15, 0) = 1 (out 6, left 15, 0)poll(fd=6, events=POLLIN, 1, 0) = 0 (Timeout)select(7, 6, 6, , 15, 0) = 1 (out 6, left 15, 0)poll(fd=6, events=POLLIN, 1, 0) = 0 (Timeout)select(7, 6, 6, , 15, 0) = 1 (out 6, left 15, 0)poll(fd=6, events=POLLIN, 1, 0) = 0 (Timeout)那么,就可以确定是 file_get_contents() 导致的问题了。lsoflsof -i :80 显示占用 80 端口的进程lsof -p 1457 显示进程号为 1457 的进程所打开的文件查看服务器型号:dmidecode -s system-product-name