###################################################################
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 //软限制
####################################################################
优化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 128k
2.send_timeout 60;
原文:https://blog.51cto.com/14050800/2393463