Nginx安全优化包括:删除不要的模块、修改版本信息、限制并发、拒绝非法请求、防止buffer溢出。
MySQL安全优化包括:初始化安全脚本、密码安全、备份与还原、数据安全。
Tomcat安全优化包括:隐藏版本信息、降权启动、删除默认测试页面.

###################################################################

vim /usr/local/nginx/logs/access.log //访问日志

keepalive_timeout //长时间不访问,服务器断开连接

[root@proxy ~]# curl http://192.168.4.5/status

Active connections: 1         //多少人同时访问
server accepts handled requests
 10 10 3 
Reading: 0 Writing: 1 Waiting: 0

客户端访问10次 TCP握手连接数
服务器接收10次
发送3次请求 点页面的次数

###################################################################

http是tcp协议

worker_processes 2; //与CPU核心数量一致

events {
worker_connections 50000; //并发连接数
}

即使修改了配置文件的并发连接数,但是内核的默认参数还是不变的。

###################################################################

优化Linux内核参数(最大文件数量)

ulimit-a

open files (- n) 1024

ulimit -Hn 100000 //硬限制 不能超过这个数
(都是临时规则)
ulimit -Sn 100000 //软限制 只是警告

vim /etc/security/limits.conf //永久配置

  • soft nofile 100000 //软限制

  • hard 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
.. ..

414 Request-URI Too Large

//提示头部信息过大`

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. 把旧的日志重命名
  2. kill USR1 PID(nginx的进程PID号)

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;
}

关键参数:这个变量开启后,我们才能自定义错误页面,当后端返回404,nginx拦截错误定义错误页面

第三种: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

    • soft nofile 65535 //软文件数
    • hard nofile 65535 //硬文件数

一般分析思路:
(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 128k
2.send_timeout 60;