跳到主要内容

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是否准许被ping0
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可以查看各种信息及服务

  • 软件网站:http://tsar.taobao.org/

  • 安装部署:

    # 解压后的目录里有makefile,所以不用再制作

    # make

    # make install
    [root@web03 ~]# which tsar
    /usr/bin/tsar
  • 常用参数:

    参数描述
    -i , --interval 时间更新间隔
    -l , --live持续监控
    --cpucpu
    --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