Nginx安全优化包括:删除不要的模块、修改版本信息、限制并发、拒绝非法请求、防止buffer溢出。
MySQL安全优化包括:初始化安全脚本、密码安全、备份与还原、数据安全。
Tomcat安全优化包括:隐藏版本信息、降权启动、删除默认测试页面.javascript
###################################################################php
vim /usr/local/nginx/logs/access.log //访问日志css
keepalive_timeout //长时间不访问,服务器断开链接html
[root@proxy ~]# curl http://192.168.4.5/statusjava
Active connections: 1 //多少人同时访问 server accepts handled requests 10 10 3 Reading: 0 Writing: 1 Waiting: 0
客户端访问10次 TCP握手链接数
服务器接收10次
发送3次请求 点页面的次数nginx
###################################################################web
http是tcp协议面试
worker_processes 2; //与CPU核心数量一致json
events {
worker_connections 50000; //并发链接数
}vim
即便修改了配置文件的并发链接数,可是内核的默认参数仍是不变的。
###################################################################
优化Linux内核参数(最大文件数量)
ulimit-a
open files (- n) 1024
ulimit -Hn 100000 //硬限制 不能超过这个数
(都是临时规则)
ulimit -Sn 100000 //软限制 只是警告
vim /etc/security/limits.conf //永久配置
soft nofile 100000 //软限制
####################################################################
优化Nginx数据包头缓存
1)优化前,使用脚本测试长头部请求是否能得到响应
[root@proxy ~]# cat lnmp_soft/buffer.sh
#!/bin/bash
URL=http://192.168.4.5/index.html?
for i in {1..5000}
do
URL=${URL}v$i=$i
done
curl $URL //通过5000次循环后,生成一个长的URL地址栏
[root@proxy ~]# ./buffer.sh
.. ..
<center><h1>414 Request-URI Too Large</h1></center> //提示头部信息过大`
url=192.168.4.5/
for i in 1..5000
url=$url_v$i=$i
url=192.168.4.5/v1=1
usl=http://192.168.4.5/v1=1v2=2v3=3 v5000=5000
服务器和客户端都会报错414,说明服务器给的内存过小,地址栏过长
修改配置文件,能存更多的地址栏
414报错,优化缓存大小,让他处理地址栏数据更大
修改Nginx配置文件,增长数据包头部缓存大小
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
http }
client_header_buffer_size 1k; //默认请求包头信息的缓存
large_client_header_buffers 4 4k; //大请求包头部信息的缓存个数与容量
}
[root@proxy ~]# nginx -s reload
######################################################################
浏览器自带缓存功能
若是你访问的是 (多媒体) jpg,视频,mp3
expries 30; //缓存多久
修改Nginx配置文件,定义对静态页面的缓存时间
[root@proxy ~]# 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天
}
}
[root@proxy ~]# cp /usr/share/backgrounds/day.jpg /usr/local/nginx/html
[root@proxy ~]# nginx -s reload
#请先确保nginx是启动状态,不然运行该命令会报错,报错信息以下:
#[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
###############################################################################
日志切割
日志文件愈来愈大怎么办?单个文件10G? 如何切割?(很是常见的面试题)
步骤:
1)手动执行
备注:/usr/local/nginx/logs/nginx.pid文件中存放的是nginx的进程PID号。
[root@proxy ~]# mv access.log access2.log
[root@proxy ~]# kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
2)自动完成
每周5的03点03分自动执行脚本完成日志切割工做。
[root@proxy ~]# vim /usr/local/nginx/logbak.sh
#!/bin/bash
date=date +%Y%m%d
logpath=/usr/local/nginx/logs
mv $logpath/access.log $logpath/access-$date.log
mv $logpath/error.log $logpath/error-$date.log
kill -USR1 $(cat $logpath/nginx.pid)
[root@proxy ~]# crontab -e
03 03 5 /usr/local/nginx/logbak.sh
########################################################################
/usr/local/nginx/conf/mime.types
步骤七:对页面进行压缩处理
1)修改Nginx配置文件
[root@proxy ~]# cat /usr/local/nginx/conf/nginx.conf
http {
.. ..
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
.. ..
}
###################################################################
客户端能够经过内存读取数取,不经过硬盘。能够更快速获取数据
服务器内存缓存
1)若是须要处理大量静态文件,能够将文件缓存在内存,下次访问会更快。
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次会被缓存
//缓存报错关掉
}
Nginx安全优化包括:删除不要的模块、修改版本信息、限制并发、拒绝非法请求、防止buffer溢出。
性能优化:定义状态页面、优化NGINX并发量、优化Linux内核参数、优化nginx数据包头缓存、对页面进行压缩处理
服务器内存缓存
#############################################################################
Nginx常见报错及处理方法
403是很常见的错误代码,通常就是未受权被禁止访问的意思。
可能的缘由有两种:
Nginx程序用户无权限访问web目录文件
Nginx须要访问目录,可是autoindex选项被关闭
修复方法:
授予Nginx程序用户权限读取web目录文件
设置autoindex目录为on
location /path/to/website/folder {
...
autoindex on;
... }
404
第一种:Nginx本身的错误页面
Nginx访问一个静态的html 页面,当这个页面没有的时候,Nginx抛出404,那么如何返回给客户端404呢?
看下面的配置,这种状况下不须要修改任何参数,就能实现这个功能。
第二种:反向代理的错误页面
若是后台Tomcat处理报错抛出404,想把这个状态叫Nginx反馈给客户端或者重定向到某个链接,配置以下:
location / {
if ($request_uri ~ ‘^/$’) {
rewrite . http://域名/index.html redirect;
}
第三种:Nginx解析php代码的错误页面
1
若是后端是php解析的,须要加一个变量
在http段中加一个变量
fastcgi_intercept_errors on 就能够了。
2
指定一个错误页面:
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
3
指定一个url地址:
error_page 404 /404.html;
error_page 404 = http://www.test.com/error.html;
413 Request Entity Too Large
通常缘由:通常出如今上传文件
解决方法:配置nginx.conf相关设置
1.client_max_body_size 10m; //客户端最大上传大小
配置php.ini以下(必须和nginx.conf配置一致)
1.post_max_size=10M //设置最大大小
2.upload_max_filesize=2M //上传最大文件大小
499 Client Closed Request
通常缘由:server处理请求未结束,而client提早关闭了链接,此时也会返回499。
解决方法:proxy_ignore_client_abort on; //代理忽视客户端终止计划
#让代理服务端不要主动关闭客户端的链接。
只在作反向代理的时候加入,做为其余服务器的时候,关闭为好,默认设置是关闭的!
若是使用了 proxy_ignore_client_abort on ;
默认 proxy_ignore_client_abort 是关闭的,此时在请求过程当中若是客户端端主动关闭请求或者客户端网络断掉,那么 Nginx 会记录 499
那么客户端主动断掉链接以后,Nginx 会等待后端处理完(或者超时),而后记录「后端的返回信息」到日志。因此,若是后端返回 200,就记录 200 ;若是后端放回 5XX ,那么就记录 5XX 。
若是超时(默认60s,能够用 proxy_read_timeout 设置),Nginx 会主动断开链接,记录 504
500 Internal Server Rrror
通常缘由:脚本错误,(php语法错误、lua语法错误)
访问量过大,系统资源限制,不能打开过多文件
磁盘空间不足。(access log开启可能致使磁盘满溢 关闭)
解决方法:语法错误查看nginx_err_log php_err_log。
文件访问量:
1.修改nginx配置文件
1.worker_rlimit_nofile 65535; //worker进程最大打开文件数
2.修改/etc/security/limits.conf
通常分析思路:
(1)查看nginx error log ,查看php error log;
(2)若是是too many open files,修改nginx的worker_rlimit_nofile参数,使用ulimit查看系统打开文件限制,修改/etc/security/limits.conf;
(3)若是是脚本的问题,则须要修复脚本错误,并优化代码;
(4)各类优化都作好,仍是出现too many open files,那就要考虑作负载均衡,把流量分散到不一样服务器上去了。
502 Bad Gateway、503 Serveice Unavailable
通常缘由:后端服务没法处理,业务中断。
解决方法:从后端日志获取错误缘由,解决后端服务器问题。
504 Gateway Timeout
通常缘由:后端服务器在超时时间内,未响应Nginx代理请求
解决方法:根据后端服务器实际处理状况,调正后端请求超时时间。
1.proxy_read_timeout 90;
2.proxy_send_timeout 90;
通常缘由:可能网站页面缓存大,而fastcgi默认进程响应缓存区8k
解决方法:配置nginx.conf相关设置
1.fastcgi_buffers 8 128k2.send_timeout 60;