1:开启对页面的压缩处理
gzip on; //开启压缩 gzip_min_length 1000; //小文件不压缩 gzip_comp_level 4; //压缩比率 gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; //对特定文件压缩,类型参考mime.types
2:服务器内存缓存
http { open_file_cache max=2000 inactive=20s; open_file_cache_valid 60s; open_file_cache_min_uses 5; open_file_cache_errors off; //设置服务器最大缓存2000个文件句柄,关闭20秒内无请求的文件句柄 //文件句柄的有效时间是60秒,60秒后过期 //只有访问次数超过5次会被缓存 }
3:通过location实现动静分离,一个location匹配动态,一个location匹配其他所有页面
###修改默认首页为index.php###
location / { root html; index index.php index.html index.htm; } ...省略部分配置文件内容... location ~ .php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf;
4:修改版本信息,并隐藏具体的版本号
http{
server_tokens off; #在http下面手动添加这么一行
… …
}
5:限制并发量,降低DDOS的攻击,但需要提供一个模块:
模块名: ngx_http_limit_req_module
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个则报错
6:拒绝非法的请求:由于网站使用的是http协议,协议中定义了N中方法,可以放用户连接服务器,获取的资源。但实际应用中,常用到的只是get和post
配置:
http{ server { listen 80; #这里,!符号表示对正则取反,~符号是正则匹配符号 #如果用户使用非GET或POST方法访问网站,则retrun返回错误信息 if ($request_method !~ ^(GET|POST)$ ) { return 444; } }
7:防止buffer溢出
--当客户端连接服务器时,服务器会启用各种缓存,用来存放连接的状态信息。
--如果攻击者发送大量的连接请求,而服务器不对缓存做限制的话,内存数据就有可能溢出(空间不足)
修改Nginx配置文件,调整各种BUFFER参数,可以有效降低溢出风险。
http{ client_body_buffer_size 1k; client_header_buffer_size 1k; client_max_body_size 1k; large_client_header_buffers 2 1k; … … }
8:线程和ulimit的优化
worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。
worker_connections 65535; 这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
修改ulimit
echo ulimit -n 65535 >>/etc/profile
source /etc/profile #加载修改后的profile
验证: ulimit -n //如若显示65536,则表示修改成功
ulimit -HSn 65536 #硬资源和软资源同时限制为最大打开文件描述符数65546 ulimit -v ulimited #将虚拟内存限制改为无限制
ulimit命令 -H 使用硬资源控制 -S 使用软资源控制 -a 查看所有的当前限制 -n 能打开的最大文件描述符数 -t 限制最大的 CPU 占用时间(每秒) -u 限制最大用户进程数 -v 限制虚拟内存大小(kB
优化官网有详细的解释:
http://nginx.org/en/download.html
------------------------------------
上面优化是工作中经常使用的优化手段,具体的参数可根据服务器具体情况来写相应的参数。
内核优化,是借鉴下面链接,详细参数点击下方链接即可。
8:内核的优化(具体看服务器的状况来决定是否进行相应的优化)
sysctl.conf文件
https://blog.51cto.com/yangrong/1321594
# 内核panic时,1秒后自动重启 kernel.panic = 1 # 允许更多的PIDs (减少滚动翻转问题); may break some programs 32768 kernel.pid_max = 32768 # 内核所允许的最大共享内存段的大小(bytes) kernel.shmmax = 4294967296 # 在任何给定时刻,系统上可以使用的共享内存的总量(pages) kernel.shmall = 1073741824 # 设定程序core时生成的文件名格式 kernel.core_pattern = core_%e # 当发生oom时,自动转换为panic vm.panic_on_oom = 1 # 表示强制Linux VM最低保留多少空闲内存(Kbytes) vm.min_free_kbytes = 1048576 # 该值高于100,则将导致内核倾向于回收directory和inode cache vm.vfs_cache_pressure = 250 # 表示系统进行交换行为的程度,数值(0-100)越高,越可能发生磁盘交换 vm.swappiness = 20 # 仅用10%做为系统cache vm.dirty_ratio = 10 # 增加系统文件描述符限制 2^20-1 fs.file-max = 1048575 # 网络层优化 # listen()的默认参数,挂起请求的最大数量,默认128 net.core.somaxconn = 1024 # 增加Linux自动调整TCP缓冲区限制 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 # 进入包的最大设备队列.默认是300 net.core.netdev_max_backlog = 2000 # 开启SYN洪水攻击保护 net.ipv4.tcp_syncookies = 1 # 开启并记录欺骗,源路由和重定向包 net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.default.log_martians = 1 # 处理无源路由的包 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 # 开启反向路径过滤 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # 确保无人能修改路由表 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 # 增加系统IP端口限制 net.ipv4.ip_local_port_range = 9000 65533 # TTL net.ipv4.ip_default_ttl = 64 # 增加TCP最大缓冲区大小 net.ipv4.tcp_rmem = 4096 87380 8388608 net.ipv4.tcp_wmem = 4096 32768 8388608 # Tcp自动窗口 net.ipv4.tcp_window_scaling = 1 # 进入SYN包的最大请求队列.默认1024 net.ipv4.tcp_max_syn_backlog = 8192 # 打开TIME-WAIT套接字重用功能,对于存在大量连接的Web服务器非常有效。 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 0 # 表示是否启用以一种比超时重发更精确的方法(请参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项 net.ipv4.tcp_timestamps = 0 # 表示本机向外发起TCP SYN连接超时重传的次数 net.ipv4.tcp_syn_retries = 2 net.ipv4.tcp_synack_retries = 2 # 减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。 net.ipv4.tcp_fin_timeout = 10 # 减少TCP KeepAlive连接侦测的时间,使系统可以处理更多的连接。 # 如果某个TCP连接在idle 300秒后,内核才发起probe.如果probe 2次(每次2秒)不成功,内核才彻底放弃,认为该连接已失效. net.ipv4.tcp_keepalive_time = 300 net.ipv4.tcp_keepalive_probes = 2 net.ipv4.tcp_keepalive_intvl = 2 # 系统所能处理不属于任何进程的TCP sockets最大数量 net.ipv4.tcp_max_orphans = 262144 # 系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。 net.ipv4.tcp_max_tw_buckets = 20000 # arp_table的缓存限制优化 net.ipv4.neigh.default.gc_thresh1 = 128 net.ipv4.neigh.default.gc_thresh2 = 512 net.ipv4.neigh.default.gc_thresh3 = 4096