1. Linux系统优化

1.1 基础必备优化

1.2 基础服务优化

1.3 内核优化

内核参数及含义 含义 默认
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 卸载之前yum安装的nginx
rpm -e 'rpm -qa | grep nginx' --nodeps

# 下载nginx源码包
wget -P /app/tools http://nginx.org/download/nginx- 1.16.1.tar.gz

# 进入软件下载目录
cd /app/tools/

# 解压软件
tar xf nginx-1.16.1.tar.gz

# 进入源代码编译安装的目录
cd nginx-1.16.1/

# 安装依赖软件包
yum install -y openssl-devel pcre-devel

2.2 nginx安全优化

2.2.1 隐藏nginx版本信息优化
1
2
3
4
5
6
7
8
9
10
# 增加server_tokens off
vim /app/nginx/conf/nginx/conf
......
http {
......
server_tokens off;
......
}

# 注意:要使修改生效,要重新读取配置文件。
2.2.2 修改nginx版本信息优化(上边编译安装前已经修改)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 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

# 注意:要使修改生效,要重新读取配置文件。
2.2.3 修改nginx软件work_processes进程用户信息
1
2
3
4
5
# 将nginx进程运行用户改为www
[root@web03 ~]# cat /app/nginx/conf/nginx.conf

user www www;
......
2.2.4 优化nginx服务上传文件限制
1
2
3
# 默认是1m,改为100m
[root@web03 ~]# cat /app/nginx/conf/nginx.conf
client_max_body_size 100m; # 放在http、server、location里都可以
2.2.5 nginx图片及目录防盗链
1
2
3
4
5
6
7
8
9
# 方法1:给所有图片、文档、视频加上水印

# 方法2:根据http referer实现防盗链,在对应网页代码中加上,防盗链语句:
if ($http_referer !~ "www.baidu.com"){ # 设置白名单,可加多个网站
return 403;
}

# 方法3:根据cookie防盗链
用户第1次请求的时候,服务器给用户设置cookie
2.2.6 nginx站点目录及文件权限优化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 整体用户权限    root    root  file 644  dir 755
# 上传用户权限 www www file 644 dir 755
# 注意: nginx/php/tomcat用户要统一

# 设置html文件的权限命令
find /app/nginx/html -type f | xargs chmod 644

# 设置html下目录的权限命令
find /app/nginx/html/ -type d | xargs chmod 755

# 修改上传的文件所有者
chown -R www.www /app/nginx/html/uploads

# 修改原因:如果权限设置不当,就会导致一些人把木马、病毒上传到linux中,如果这个木马、病毒被执行的话,可能会导致网站页面被修改;严重的话,可能导致网站linux系统被植入病毒,相当于获取了root权限,会很危险。
2.2.7 nginx防爬虫优化
2.2.8 利用nginx限制请求访问
2.2.9 nginx监牢模式
2.2.10 控制nginx并发连接数
2.2.11 控制客户端请求nginx的速率
2.2.12 nginx错误页面的优雅显示

2.3 nginx性能优化

2.3.1 tsar 安装部署及测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 检测cpu
[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

# 也可简写
[root@web03 ~]# tsar --cpu -i 1 -l

# 使用--spec
[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
2.3.3 修改nginx软件work_processes进程数量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 修改配置文件
[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;

# 重新加载配置
[root@web03 ~]# nginx -s reload
2.3.4 调整cpu亲和力
1
2
3
4
5
6
7
8
9
10
11
# 2个核心 
worker_cpu_affinity 10 01 ;

# 1颗cpu 4个核心
worker_cpu_affinity 1000 0100 0010 0001 ;

# 2颗cpu 每个cpu2个核心
worker_cpu_affinity 1010 0101 ;

# 简单粗暴
worker_cpu_affinity auto ;
2.3.5 调整事务模型
2.3.6 优化nginx单进程客户端连接数
1
2
# /app/nginx/conf/nginx.conf
events { worker_connections 10240; }
2.3.7 优化nginx服务进程打开文件数
1
2
3
4
[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 使用高效传输模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# /app/nginx/conf/nginx.conf 
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{ }中
1
2
3
4
5
6
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中
1
2
3
location ~* \.(html|js|css|jpg|jpeg)$ { 
expires 10d; #max 10year 可写成expires max ;
}
2.3.11 以上优化之后nginx.conf文件展现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

1
2
3
4
5
6
7
#可修改参数 
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

1
2
3
4
5
6
#网站站点目录 整体配置 
f644 d755 root root

#用户上传目录 /app/blog/uploads
f644 d755 www www
chown -R www.www /app/blog/

4.2 上传之后无法运行

1
2
3
4
5
#nfs挂载参数 存储挂载 
#用户上传可执行的文件 也无法执行
nosuid,nodev,noexec
#eg
mount -t nfs -o nosuid,nodev,noexec nfs01:/data /data

4.3 只让网站上传指定类型的文件

1
2
3
4
5
6
# 网站代码中进行控制的, 图片格式错误,请使用jpg/jpeg/png/gif文件
location /uploads {
if ( $request_uri !~ \.(jpg|jpeg|png|gif)$ ) {
return 403;
}
}

4.4 检查出网站文件被修改

4.5 rpm -aV 检查yum、rpm软件安装是否有差异

1
2
#适用于 yum或rpm安装的软件 
rpm -aV #检查是否发生变化

4.6 clamav 安全软件

1
2
3
4
5
6
7
8
#clamav 软件 clamav-data 病毒库
yum install -y clamav clamav-data

# 进行扫描
clamscan -ri /tuboshu/wordpress

# 更新病毒库
freshclam