Linux优化体系
· 阅读需 18 分钟
1. Linux系统优化
1.1 基础必备优化
-
关闭SElinux
-
Firewalld (CentOS7)
-
Iptables (CentOS6)
-
安全组 (阿里云)
-
添加普通用户,配置sudo,预防root密码忘记
tuboshu ALL=(ALL) NOPASSWD:ALL 或 tuboshu ALL=(ALL) NOPASSWD:/bin/su -
hosts文件解析当前的主机名
-
锁定关键文件 chattr lsattr
- 基于文件系统的权限(系统隐藏权限)
- 给配置文件 +a 只能追加
- 给命令 +i 不能修改
-
系统字符集:
- 默认都是UTF-8
- 语言 en_US(推荐)
- 中文环境 zh_CN.UTF-8
-
调整用户登录提示信息 /etc/motd
-
清空 /etc/issue /etc/issue.net
1.2 基础服务优化
-
ssh 优化
cat /etc/ssh/sshd_config
UseDNS no # 禁止IP解析为对应的域名
GSSAPIAuthentication no
Port 52113 # 自定义端口
PermitRootLogin no #是否准许root远程登录
PasswordAuthentication yes #是否开启密码登录
ListenAddress 10.0.0.7:52113 #ListenAddress 准许用户从哪个网卡连接 还可以同时指定端口
ListenAddress 172.16.1.7:22 -
yum源:修改系统默认的yum源,增加epel源
-
时间同步:定时任务+ntpdate/chrony
-
调整文件描述符
-
每个进程可以打开的最大文件数量
# 1. 临时
ulimit -n65535
# 2. 永久 /etc/security/limits.conf #重启生效
echo '* - nofile 65535 ' >>/etc/security/limits.conf
# 3. 或者写为两行:
soft nofile 65535
hard nofile 65535 -
故障案例: 如果 ulimit 文件描述符设置过小 系统提示
too many open files
-bash: start_pipeline: pgrp pipe: Too many open files
vim: error while loading shared libraries: libm.so.6: cannot open shared object file: Error 24
-
-
修改历史命令环境变量
命令 描述 TMOUT 超时时间 HISTSIZE 控制history记录条数 HISTFILESIZE 文件记录条数 HISTCONTROL 控制history是否记录用过的命令 PROMPT_COMMAND 下1个命令之前会运行环境变量里面的命令,常用语用户审计 -
time out 不进行任何操作 300秒自动退出用户
export TMOUT=300 -
HIST history
export HISTFILE=1000 # history命令最多记录条数
export HISTFILESIZE=1000 # history 历史记录的文件里面最多记录条数 -
清空命令历史记录
history -c -
把当前的shell历史命令内存缓冲区的内 容写入命令历史文件
history -w -
控制history命令如何记录历史命令
exprot HISTCONTROL=ignorespace # 只要以空格开头的命令 history不记录
-
1.3 内核优化
-
优化文件 /etc/sysctl.conf
-
参数生效命令
sysctl -p -
内核参数存放文件 /proc/sys
| 内核参数及含义 | 含义 | 默认 |
|---|---|---|
| net.ipv4.ip_forward=1 | 是否开启内核转发 | 0 |
| net.ipv4.icmp_echo_ignore_all=1 | 是否准许被ping | 0 |
| net.ipv4.tcp_tw_recycle=1 | 开启tcp回收功能 | 0 |
| net.ipv4.tcp_tw_reuse=1 | 开启tcp复用(重复利用) | 0 |
| vm.swapiness=0 | 设置系统是否优先使用物理内存,数值越小越优先使用物理内存 | 30(C7) |
2. 服务优化之nginx
2.1 编译安装nginx
- 正式安装前的准备
# 卸载之前yum安装的nginx
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
rpm -e 'rpm -qa | grep nginx' --nodeps
# 下载nginx源码包
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
wget -P /app/tools http://nginx.org/download/nginx- 1.16.1.tar.gz
# 进入软件下载目录
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
cd /app/tools/
# 解压软件
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
tar xf nginx-1.16.1.tar.gz
# 进入源代码编译安装的目录
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
cd nginx-1.16.1/
# 安装依赖软件包
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
yum install -y openssl-devel pcre-devel
-
修改源码文件,伪造nginx真实版本信息----生产时可按需修改
-
需要修改的nginx源码配置文件:
- nginx-xxx/src/core/nginx.h
- nginx-xxx/src/http/ngx_http_header_filter_module.c
- nginx-xxx/src/http/ngx_http_special_response.c
-
修改方法:
# src/core/nginx.h 13 14 22行
[root@web03 ~]# sed -n '13,14p;22p' src/core/nginx.h
#define NGINX_VERSION "8.5.50"
#define NGINX_VER "Tomcat/" NGINX_VERSION
#define NGINX_VAR "Tomcat"
# /src/http/ngx_http_header_filter_module.c 49行
[root@web03 ~]# grep -n Tomcat src/http/ngx_http_header_filter_module.c
49:static u_char ngx_http_server_string[] = "Server: Tomcat" CRLF;
# src/http/ngx_http_special_response.c 36行
[root@web03 ~]# grep -n Tomcat src/http/ngx_http_special_response.c
36:"<hr><center>Tomcat</center>" CRLF
-
-
开始编译安装nginx
-
编译安装三部曲
- ./configure #进行配置 configure脚本,生成makefile,配置完成后生成一个文件
- make #进行编辑(源代码(c语言)-->可以执行命令)
- make install # 创建目录,复制文件
-
具体操作
# 进行编译前的配置
./configure --prefix=/app/nginx-1.16.1 --user=nginx -- group=nginx --with-http_stub_status_module --with- http_ssl_module
# 进行编译
make
......
make[1]: Leaving directory '/app/tools/nginx-1.16.1' #出现此内容表示make成功
# 安装
make install
# 创建软链接
ln -s /app/nginx-1.16.1 /app/nginx
# 检查是否安装成功
[root@web03 ~]# /app/nginx/sbin/nginx -V
nginx version: Tomcat/8.5.50
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/app/nginx-1.16.1 --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
# 创建/sbin软链接
ln -s /app/nginx/sbin/nginx /sbin
# 启动nginx
nginx
# 检查语法
nginx -t
# 重新读取配置文件,要求nginx在运行
nginx -s reload
# 关闭nginx
nginx -s stop
-
2.2 nginx安全优化
2.2.1 隐藏nginx版本信息优化
# 增加server_tokens off
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
vim /app/nginx/conf/nginx/conf
......
http {
......
server_tokens off;
......
}
# 注意:要使修改生效,要重新读取配置文件。
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
2.2.2 修改nginx版本信息优化(上边编译安装前已经修改)
# src/core/nginx.h 13 14 22行
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
[root@web03 ~]# sed -n '13,14p;22p' src/core/nginx.h
#define NGINX_VERSION "8.5.50"
#define NGINX_VER "Tomcat/" NGINX_VERSION
#define NGINX_VAR "Tomcat"
# /src/http/ngx_http_header_filter_module.c 49行
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
[root@web03 ~]# grep -n Tomcat src/http/ngx_http_header_filter_module.c
49:static u_char ngx_http_server_string[] = "Server: Tomcat" CRLF;
# src/http/ngx_http_special_response.c 36行
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
[root@web03 ~]# grep -n Tomcat src/http/ngx_http_special_response.c
36:"<hr><center>Tomcat</center>" CRLF
# 注意:要使修改生效,要重新读取配置文件。
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
2.2.3 修改nginx软件work_processes进程用户信息
# 将nginx进程运行用户改为www
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
[root@web03 ~]# cat /app/nginx/conf/nginx.conf
user www www;
......
2.2.4 优化nginx服务上传文件限制
# 默认是1m,改为100m
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
[root@web03 ~]# cat /app/nginx/conf/nginx.conf
client_max_body_size 100m; # 放在http、server、location里都可以
2.2.5 nginx图片及目录防盗链
# 方法1:给所有图片、文档、视频加上水印
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
# 方法2:根据http referer实现防盗链,在对应网页代码中加上,防盗链语句:
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
if ($http_referer !~ "www.baidu.com"){ # 设置白名单,可加多个网站
return 403;
}
# 方法3:根据cookie防盗链
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
用户第1次请求的时候,服务器给用户设置cookie
2.2.6 nginx站点目录及文件权限优化
# 整体用户权限 root root file 644 dir 755
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
# 上传用户权限 www www file 644 dir 755
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
# 注意: nginx/php/tomcat用户要统一
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
# 设置html文件的权限命令
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
find /app/nginx/html -type f | xargs chmod 644
# 设置html下目录的权限命令
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
find /app/nginx/html/ -type d | xargs chmod 755
# 修改上传的文件所有者
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
chown -R www.www /app/nginx/html/uploads
# 修改原因:如果权限设置不当,就会导致一些人把木马、病毒上传到linux中,如果这个木马、病毒被执行的话,可能会导致网站页面被修改;严重的话,可能导致网站linux系统被植入病毒,相当于获取了root权限,会很危险。
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
2.2.7 nginx防爬虫优化
- 爬虫: wget/curl 访问网站页面,下载 或收集页面存放在磁盘或数据库中。
- 爬虫应用:
- 搜索引擎:定时搜索各种网站的火爆的页面及文章,缓存到搜索引擎数据库中,加速用户搜索速度体验。
- 数据收集分析:通过wget/curl下载静态资源,利用python书写爬虫下载动态资源。
- 灰色产业:批量创建用户来刷人气等。
- 爬虫利弊
- 我们希望搜索引擎爬虫爬取网站数据,让网站更加靠前,容易被用户搜索到
- 我们不希望恶意爬取
- 常见预防方式:
- 君子协议:robots.txt robot协议
- 利用http_user_agent屏蔽,访问我网站的时候不能是bot|spider
- 利用程序开发验证码,阻止进行爬虫
2.2.8 利用nginx限制请求访问
-
限制http请求方法
-
GET 下载
-
POST 上传
-
HEAD 只查看响应头部
location /xxxx {
if ( $method ~ "POST")
{
return 403;
}
}
-
2.2.9 nginx监牢模式
- nginx通过普通用户运行时,nginx不能使用默认的80端口
- 1-1024端口是特权端口,只能root使用
2.2.10 控制nginx并发连接数
- limit_conn_zone # conn connection 连接数
2.2.11 控制客户端请求nginx的速率
- limit_req_zone # req request 请求速率
2.2.12 nginx错误页面的优雅显示
-
由开发人员制作普通用户能够看懂的错误页面,运维人员进行指向设置
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
2.3 nginx性能优化
2.3.1 tsar 安装部署及测试
-
tsar属于sar增强版本,由taobao二次开发
-
tsar可以查看各种信息及服务
-
安装部署:
# 解压后的目录里有makefile,所以不用再制作
# make
# make install
[root@web03 ~]# which tsar
/usr/bin/tsar -
常用参数:
参数 描述 -i , --interval 时间 更新间隔 -l , --live 持续监控 --cpu cpu --mem 内存 --load 负载 --spec/-s 选择要显示的字段(列) -
使用示例
# 检测cpu
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
[root@web03 ~]# tsar --cpu --interval 1 --live
Time -----------------------cpu----------------------
Time user sys wait hirq sirq util
16/02/20-21:58:46 0.00 0.12 0.00 0.00 0.00 0.12
16/02/20-21:58:47 0.00 0.00 0.00 0.00 0.00 0.00
16/02/20-21:58:48 0.00 0.00 0.00 0.00 0.00 0.00
16/02/20-21:58:49 0.00 0.12 0.00 0.00 0.00 0.12
# 也可简写
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
[root@web03 ~]# tsar --cpu -i 1 -l
# 使用--spec
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
[root@web03 ~]# tsar --cpu -i 1 -l --spec time,util
Time ---cpu--
Time util
16/02/20-22:05:08 0.00
16/02/20-22:05:09 0.25
16/02/20-22:05:10 0.00
16/02/20-22:05:11 0.12
16/02/20-22:05:12 0.00
2.3.2 tsar监控nginx
-
准备工作
# 需要在nginx开启监控功能
[root@web03 ~]# vim /app/nginx/conf/nginx.conf
......
http {
......
server {
......
location /nginx_status {
stub_status;
access_log off; # 暂时关掉,不然tsar监控时会产生大量日志
allow 172.16.1.0/24;
allow 127.0.0.1;
deny all;
......
}
.....
}
......
}
# 上述配置也可直接在/etc/profile中添加
export NGX_TSAR_HOST=172.16.1.xxx
export NGX_TSAR_PORT=8080
export NGX_TSAR_URI=/nginx_status
# 检测
[root@web03 ~]# curl 172.16.1.9/nginx_status
Active connections: 1
server accepts handled requests
139 139 139
Reading: 0 Writing: 1 Waiting: 0
# 开启对nginx监控的配置
[root@web03 ~]# grep mod_nginx /etc/tsar/tsar.conf
mod_nginx on -
监控nginx
# 全部参数监控
[root@web03 ~]# tsar --nginx --live -i 1
# 选择部分参数监控
[root@web03 ~]# tsar --nginx --live -i 1 -s time,qps,active -
压力测试命令
[root@web03 ~]# ab -n 9999999 -c 2 http://172.16.1.9/ # -c 后接cpu核心数量
2.3.3 修改nginx软件work_processes进程数量
# 修改配置文件
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
[root@web03 ~]# head /app/nginx/conf/nginx.conf
user www www;
worker_processes 2; # 与cpu核心总数一致或2倍
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# 重新加载配置
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
[root@web03 ~]# nginx -s reload
2.3.4 调整cpu亲和力
- 优化nginx服务进程均匀分配到不同CPU进行处理,让所cpu核心都有事情做,添加到main区域
# 2个核心
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
worker_cpu_affinity 10 01 ;
# 1颗cpu 4个核心
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
worker_cpu_affinity 1000 0100 0010 0001 ;
# 2颗cpu 每个cpu2个核心
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
worker_cpu_affinity 1010 0101 ;
# 简单粗暴
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
worker_cpu_affinity auto ;
2.3.5 调整事务模型
- 使用epoll模型,异步模型
2.3.6 优化nginx单进程客户端连接数
# /app/nginx/conf/nginx.conf
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
events { worker_connections 10240; }
2.3.7 优化nginx服务进程打开文件数
[root@web03 ~]# head /app/nginx/conf/nginx.conf
user www www; worker_processes 2;
worker_cpu_affinity auto ;
worker_rlimit_nofile 65535; # nginx服务进程打开文件数
2.3.8 使用高效传输模式
# /app/nginx/conf/nginx.conf
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
http {
include mime.types;
default_type application/octet-stream;
#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;
sendfile on; # 开启高效传输模式
tcp_nopush on; # 表示将数据积攒到一定的量再进行传输
tcp_nodelay on; # 表示将数据信息进行快速传输
2.3.9 gzip压缩,放在http{ }中
gzip on;
gzip_min_length 1k; #设置大于1K才进行压缩
gzip_buffers 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 媒体类型.
2.3.10 expires缓存,放在server中
location ~* \.(html|js|css|jpg|jpeg)$ {
expires 10d; #max 10year 可写成expires max ;
}
2.3.11 以上优化之后nginx.conf文件展现
[root@oldboyedu ~]# egrep -v '#|^$' /app/nginx/conf/nginx.conf
user www www;
worker_processes 2;
worker_cpu_affinity auto ;
worker_rlimit_nofile 65535;
events {
worker_connections 10240;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
server_tokens off;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php ;
server {
listen 80;
server_name localhost;
client_max_body_size 100m;
location ~* \.(html|js|css|jpg|jpeg)$ {
}
location / {
root html;
index index.html index.htm;
}
location /nginx_status {
stub_status ;
allow 172.16.1.0/24;
allow 127.0.0.1;
deny all;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
3. 服务优化之php优化
3.1 安全相关 php.ini
safe_mode = off
safe_mode_gid = off
##01. 禁用危险函数
disable_functions = system,passthru,exec,shell_exec,popen,phpinfo #关闭危险函数
338 行 设置为 safe_mode = On #开启安全模式
435 行 设置为 expose_php = Off #关闭版本信息
538 行 设置为 display_errors = Off #错误信息控制,测试的 时候开启
#报错的级别在521行 默认为 error_reporting = E_ALL & ~E_DEPRECATED
559 行 设置为 log_errors = On #打开log 日志
643 行 设置为 error_log = /app/logs/php_errors.log #log日志得 路径(需log_errors 为 On 才能生效)
703 行 设置为 register_globals = Off #关闭全局变量(默认即为 关闭,万万不能开启)
##02. 预防SQL注入
756 行 设置为 magic_quotes_gpc = On #防止SQL注入
##03. 禁止远程操作
902 行 设置为 allow_url_fopen = Off #打开远程打开(禁止)
854 行 设置为 cgi.fix_pathinfo=0 #防止Nginx文件类型错误解 析漏洞
3.2 性能相关 php.ini
#可修改参数
444 max_execution_time = 30 #一个脚本可使用多少CPU秒
454 max_input_time = 60 #一个脚本等待输入数据的时间有多长 (秒)
465 memory_limit = 128M #单个脚本最大使用内存,单位为K或 M(128M稍大可以适当调小)
891 upload_max_filesize = 2M #上传文件最大许可
output_buffering #数据发送给客户机之前,有多少数据(字 节)需要缓存
894 max_file_uploads = 20 #可以通过单个请求上载的最大文件数
4. Linux安全优化
4.1 站点目录权限 /app/blog
#网站站点目录 整体配置
f644 d755 root root
#用户上传目录 /app/blog/uploads
f644 d755 www www
chown -R www.www /app/blog/
4.2 上传之后无法运行
#nfs挂载参数 存储挂载
#用户上传可执行的文件 也无法执行
nosuid,nodev,noexec
#eg
mount -t nfs -o nosuid,nodev,noexec nfs01:/data /data
4.3 只让网站上传指定类型的文件
# 网站代码中进行控制的, 图片格式错误,请使用jpg/jpeg/png/gif文件
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
location /uploads {
if ( $request_uri !~ \.(jpg|jpeg|png|gif)$ ) {
return 403;
}
}
4.4 检查出网站文件被修改
- md5sum 定时检查;
- 定期给站点目录制作指纹(代码上线),然后定时检查 不一致报警;
- 做指纹的时候 排除临时文件 和 缓存文件;
- fifind /app/blog -type f |egrep -v 'cache|tmp' |xargs md5sum >/root/md5 #以weordpress为例
- 检查对比 我们每个人的文件/软件 是否一致
- 检查文件内容是否变化
- 修改时间 (touch)
4.5 rpm -aV 检查yum、rpm软件安装是否有差异
#适用于 yum或rpm安装的软件
rpm -aV #检查是否发生变化
4.6 clamav 安全软件
#clamav 软件 clamav-data 病毒库
yum install -y clamav clamav-data
# 进行扫描
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
clamscan -ri /tuboshu/wordpress
# 更新病毒库
分享Linux系统性能优化的实用技巧和最佳实践,提升服务器运行效率。
<!-- truncate -->
freshclam