1.并发量
1)nginx参数
# vim /usr/local/nginx/conf/nginx.conf
.. ..
worker_processes 2; //与CPU核心数量一致,起多少进程
events {
worker_connections 65535; //每个worker最大并发连接数
use epoll; //用epoll处理I/O,效率高
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2)优化linux内核参数
# ulimit -a //查看所有属性值
# ulimit -Hn 100000 //设置硬限制(临时规则)
# ulimit -Sn 100000 //设置软限制(临时规则)
# vim /etc/security/limits.conf //永久修改
.. ..
* soft nofile 100000
* hard nofile 100000
#该配置文件分4列,分别如下:
#用户或组 硬限制或软限制 需要限制的项目 限制的值
#硬限制是最后限制,只有root可以修改,软限制普通用户可以调整
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
3)优化后测试服务器并发量
# ab -n 2000 -c 2000 http://127.0.0.1/
- 1
2.优化Nginx数据包头缓存
# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
client_header_buffer_size 1k; //默认请求包头信息的缓存
large_client_header_buffers 4 4k; //大请求包头部信息的缓存个数与容量
.. ..
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
3.定义对静态页面的缓存时间
# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
expires 30d; //针对特定文件,定义客户端缓存时间为30天
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
4.数据包头部缓存大小调整
# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
client_header_buffer_size 1k; //默认请求包头信息的缓存
large_client_header_buffers 4 4k; //大请求包头部信息的缓存个数与容量
}
- 1
- 2
- 3
- 4
- 5
- 6
5.对页面进行压缩处理
# cat /usr/local/nginx/conf/nginx.conf
http {
.. ..
gzip on; //开启压缩
gzip_min_length 1000; //小文件不压缩
gzip_comp_level 4; //压缩比率,1~9分别是速度与效率的选择,数字越大效果越好,但速度越慢
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
//对特定文件压缩,类型参考**mime.types**,多媒体文件不要压缩比如jpg、mp4、mp3等
.. ..
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
6.服务器内存缓存
如果需要处理大量静态文件,可以将文件缓存在内存,提高访问速度。
http {
open_file_cache max=2000 inactive=20s; //设置服务器最大缓存2000个文件句柄,关闭20秒内无请求的文件句柄
open_file_cache_valid 60s; //文件句柄的有效时间是60秒,60秒后过期
open_file_cache_min_uses 5; //只有访问次数超过5次会被缓存
open_file_cache_errors off; //缓存文件错误不报错
}
- 1
- 2
- 3
- 4
- 5
- 6
7.查看服务器状态信息
1)编译安装时使用–with-http_stub_status_module开启状态页面模块
2)修改Nginx配置文件,定义状态页面
# cat /usr/local/nginx/conf/nginx.conf
… …
location /status {
stub_status on;
}
… …
- 1
- 2
- 3
- 4
- 5
- 6
3)查看状态页面信息
Active connections
server accepts handled requests
10 10 3
Reading: 0 Writing: 1 Waiting: 0
--------------------------------------------------------------------------------------------
Active connections:当前活动的连接数量。
Accepts:已经接受客户端的连接总数量。
Handled:已经处理客户端的连接总数量(一般与accepts一致,除非服务器限制了连接数量)。
Requests:客户端发送的请求数量。
Reading:当前服务器正在读取客户端请求头的数量。
Writing:当前服务器正在写响应信息的数量。
Waiting:当前多少客户端在等待服务器的响应。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
8.删除不需要的模块
Nignx是模块化设计的软件,需要什么功能与模块以及不需要哪些模块,都可以在编译安装软件时自定义,使用–with参数可以开启某些模块,使用–without可以禁用某些模块。最小化安装永远都是对的方案!
下面是禁用某些模块的案例:
# tar -xf nginx-1.12.tar.gz
# cd nginx-1.12
# ./configure \
>--without-http_autoindex_module \ //禁用自动索引文件目录模块
>--without-http_ssi_module
# make
# make install
- 1
- 2
- 3
- 4
- 5
- 6
- 7
9.修改版本信息,并隐藏具体的版本号
默认Nginx会显示版本信息以及具体的版本号,这些信息给攻击者带来了便利性,便于他们找到具体版本的漏洞。
如果需要屏蔽版本号信息,执行如下操作,可以隐藏版本号。
1)修改配置文件
# vim /usr/local/nginx/conf/nginx.conf
… …
http{
server_tokens off; //在http下面手动添加这么一行
… …
}
- 1
- 2
- 3
- 4
- 5
- 6
2)修改ngx_http_header_filter_module.c源码
# vim +48 src/http/ngx_http_header_filter_module.c
//注意:vim这条命令必须在nginx-1.12源码包目录下执行!!!!!!
//该文件修改前效果如下:
static u_char ngx_http_server_string[] = "Server: nginx" CRLF;
static u_char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
static u_char ngx_http_server_build_string[] = "Server: " NGINX_VER_BUILD CRLF;
//下面是我们修改后的效果:
static u_char ngx_http_server_string[] = "Server: Jacob" CRLF;
static u_char ngx_http_server_full_string[] = "Server: Jacob" CRLF;
static u_char ngx_http_server_build_string[] = "Server: Jacob" CRLF;
//修改完成后,再去编译安装Nignx,版本信息将不再显示为Nginx,而是Jacob
# ./configure
# make && make install
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
10.限制并发量
DDOS攻击者会发送大量的并发连接,占用服务器资源(包括连接数、带宽等),这样会导致正常用户处于等待或无法访问服务器的状态。
Nginx提供了一个ngx_http_limit_req_module模块,可以有效降低DDOS攻击的风险,操作方法如下:
# vim /usr/local/nginx/conf/nginx.conf
… …
http{
… …
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
server_name localhost;
limit_req zone=one burst=5;
}
}
//备注说明:
//limit_req_zone语法格式如下:
//limit_req_zone key zone=name:size rate=rate;
//上面案例中是将客户端IP信息存储名称为one的共享内存,内存空间为10M
//1M可以存储8千个IP信息,10M可以存储8万个主机连接的状态,容量可以根据需要任意调整
//每秒中仅接受1个请求,多余的放入漏斗
//漏斗超过5个则报错
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
11.拒绝非法的请求
网站使用的是HTTP协议,该协议中定义了很多方法,可以让用户连接服务器,获得需要的资源。但实际应用中一般仅需要get和post。
# vim /usr/local/nginx/conf/nginx.conf
http{
server {
listen 80;
#这里,!符号表示对正则取反,~符号是正则匹配符号
#如果用户使用非GET或POST方法访问网站,则retrun返回444的错误信息
if ($request_method !~ ^(GET|POST)$ ) {
return 444;
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
12.防止buffer溢出
当客户端连接服务器时,服务器会启用各种缓存,用来存放连接的状态信息。
如果攻击者发送大量的连接请求,而服务器不对缓存做限制的话,内存数据就有可能溢出(空间不足)。
修改Nginx配置文件,调整各种buffer参数,可以有效降低溢出风险。
# vim /usr/local/nginx/conf/nginx.conf
http{
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
… …
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8