nginx优化
1. 隐藏nginx header里面的版本信息
执行:curl –I 127.0.0.1会显示nginx的版本信息
隐藏操作:在http标签内加入“server_tokenoff”参数
2. 更改源码隐藏软件名称及版本号
在nginx编译安装之前,先更改,之后再编译安装
cd /nginx-1.6.3/src/core
sed –n ’13,17p’ nginx.h里面修改NGINX_VERSION
修改ngx_http_header_filter_module.c
sed –I ‘s#Server:nginx#Server:Apache#g’ ngx_http_header_filter_module.c
修改ngx_http_special_response.c
3 更改nginx默认用户及用户组(worker进程优化)
建立nginx用户 useradd nginx–s/sbin/nologin –M
id nginx确认
在nginx.conf最外层上面配置usernginx;即可
也可以编译的时候指定用户
3. 让worker进程使用普通用户运行
为master服务降权:使用非root跑nginx master
注意不能用80特权端口,前端nginx反向代理转端口在启动的时候指定配置文件
4. 配置nginx worker进程个数
nginx由master和worker进程组成,master进程相当于管理员,worker进程为用户提供服务一般设置为cpu核数×2,用top按1查看cpu数量
修改nginx.conf配置文件第一行
worker_processes 4;
5. 根据cpu核数进行nginx进程优化
work_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
6nginx事件处理模型优化
nginx的连接处理机制在不同的操作系统上采用不同的IO模型,在linux下,nginx使用epoll的IO多路复用模型,windows下使用icop模型
具体配置:
events{
use epoll;
worker_connections 1024;
}
6. 调整nginx worker单个进程允许的客户端最大连接数
这个值根据服务器性能和程序的内存来指定(一个进程启动使用的内存根据程序确定)
events{
use epoll;
worker_connections 201480;
}
这个参数是单个进程的最大连接数,实际最大连接数公式为:
Max_client=worker_processes*worker_connections
8配置nginx worker进程最大打开文件数
worker_rlimit_nofile 65535;
相当于系统ulimit –HSn,应该是总的
9开启高效的文件传输模式
参数在http标签设置为:sendfileon;tcp_nopush on;(只有在sendfile开启模式下有效
10设置连接超时时间
建立连接也是消耗资源的,我们一般断掉那些连上的链接,但是不做事的
php网站建议短链接,java网站建议长连接
http标签设置:
keepalive_timeout 60;
设置客户端连接保持会话的超时时间,超过这个时间,服务器会关闭该链接
tcp_nodelay on;
打开tcp_nodelay,在包含keepalive参数才有效
client_header_timeout 15;
请求头超时
client_body_timeout 15
请求主体超时
send_timeout 15;
指定响应客户端超时时间,这个超时时间仅仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx将会关闭连接
11.上传文件大小限制
http{
client_max_body_size 10m;
}
12.fastcgi调优(配合php引擎动态服务)
cache读取缓存区
buffer写入缓存区
fastcgi是静态服务和动态服务之间的一个接口
http {
#向fastcgi传送请求的超时时间,这个值是指已经完成两次握手后向fastcgi传送请求的超时时间
fastcgi_send_timeout 240;
#指定链接到后端fastcgi的超时时间
fastcgi_connect_timeout 240;
#指定收fastcgi答应的超时时间,这个值是指已经完成两次握手后接收fastcgi应答的超时时间、
fastcgi_read_timeout 240;
#指定读取fastcgi应答第一部分需要用多大的缓冲区,这个值表示将使用1个64kb的
fastcgi_buffer_size 64kb的缓冲区读取应答的第一部分(应答头),可以设置为fastcgi_buffers选定的的缓冲区大小
fastcgi_buffers 64k;
#指定本地需要用多少和多大的缓冲区来缓冲fastcgi,如果一个php脚本所产生的页面大小为256kb,那么会分配4个64kb的缓存区来缓存,如果页面大于256kb,那么大于256kb的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度大于硬盘,一般这个值应该为站点中php所产生的页面大小的中间值,如果站点大部分脚本产生的页面大小为256kb,那么可以把这个值设置为“816k ”464k“等
fastcgi_buffers 4 64k;
#建议设置为fastcgi_buffer的两倍,繁忙时段的buffer
fastcgi_busy_buffers_size 128k;
##在写入fastcgi_temp_path时将用多大的数据库,默认值是fastcgi_buffers的两倍,设置上述数值小时负载上来时可能报 502 badgateway
fastcgi_temp_file_write_size 128k;
##表示开启fastcgi缓存为其指定一个名称,开启缓存非常有用,可以有效降低cpu的负载,并防止502错误
fastcgi_cache oldboy_nginx;
#用来指定应答代码的缓存时间,实例中的值表示将2000和302应答缓存一个小时,要和fastcgi_cache配合使用
fastcgi_cache_valid 200 302 1h;
#将301应答缓存一天
fastcgi_cache_valic 301 1d;
#将其他应答缓存为1分钟
fastcgi_cache_valid any 1m;
##请求的数量
fastcgi_cache_min_uses 1;
#定义缓存的路径
fastcgi_cache_path
13.配置nginx gzip压缩功能(重要)
使用的模块ngx_http_gzip_module(nginx)
mod_deflate模块(apaceh)
常用的压缩对象:纯文本(js,css,html),对于图片,视频,FLASH什么的不压缩,gzip——types参数控制,因为压缩占用cpu
对应参数的含义如下:
gzip on;
#开启压缩功能
gzip_min_length 1k;
#设置允许压缩的页面最小字节数,页面字节数从header头顶content-length中获取,默认值0,不管页面多大都进行压缩,建议设置成大于1k,如果小于1k可能会越压越大。
gzip_buffers 4 32k;
#压缩缓冲区大小,表示申请4个单位为32k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.1;
##压缩版本拥有设置http协议版本
gzip_comp_level 9;
###压缩比例,用来指定gzip压缩比 1最小9最大 建议设置为2.设置过大消耗cpu资源就多
gzip_types text/css test/xmlapplication/javascript;
##指定压缩的类型,test/html类型总是会被压缩
gzip_vary on;
##vary header支持,改选项可以让前端的缓存服务器经过gzip压缩的页面,例如用squid缓存经过nginx压缩的数据。
14.配置nginx expires缓存功能
对于图片,css,js等元素更改的机会较少,特别是图片,这时可以将图片设置在浏览器本地缓存365天或更长
location ~.*\.(gif|jpg|png|bmp|swf)$
{
expires 3650d;
location ~.*\.(js|css)$
{
expires 30d;
}
expire功能优点
1expires可以降低网站购买的带宽,节约成本
2同事提升用户访问体验
3减轻服务端压力
缺点:
被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验
解决办法:
第一个缩短缓存时间,例如1天,不彻底,除非更新频率大于1天
第二个对缓存的对象改名
a图片,附件一般不会被用户修改,如果用户修改了,实际上也是更改文件名重新传来而已
b网升级对于js,css元素,一般可以改名,把css,js,推送到cdn
15.nginx日志相关优化与安全
1)配置日志切割脚本并写入计划任务
cd /app/logs
mv www_access.log www_acess_$(date +%F –d-1day).log
/application/nginx/sbin/nginx –s reload
cat >>/var/spool/cron/root<<eof
00 00 * * * /bin/sh cut_nginx_log.sh>/dev/null2>&1
eof
2)不记录不需要的访问日志
对于健康检查或某些(图片,js,css)日志,一般不记录日志,因为在统计pv时是按照页面计算,而且日志写入频繁会消耗磁盘IO降低服务器性能。
参数:access_log off;
1. 访问日志的权限设置
假设日志目录为/app/logs,则授权
chown –R root.root /app/logs
chmod –R 700 /app/logs
16 nginx站点目录及文件URL访问控制(重要:防止恶意解析)
1)根据扩展名限制程序和文件访问
作用:禁止目录下指定文件被访问,或者禁止指定目录下所有内容被访问
最佳应用场景:集群的共享存储,本来就应该只是资源文件,禁止指定扩展名程序被执行,php,sh,pl
nginx下禁止访问资源目录下的php程序文件,配置方法如下:
location ~^/images/.*\.(php|php5|.sh|.pl|.py)$
{
deny all;
if ($request_method !~^(GET|HEAD|POST)${
return 404;
2)nginx下配置禁止访问.txt文件
location ~*\.(txt|doc)${
if (-f $request_filename){
###rewrite^^^^^
break;
}
location ~*\.(txt|doc)${
root /data/www;
deny all;
}
3)使用ngx_http_access_module限制ip访问
17.配置nginx图片及目录防盗链
原理:是利用http referer日志信息
当浏览器向web服务器发送请求的时候,一般会带上referer,告诉服务器我从那个页面链接过来的,服务器可以借此获得一下信息用于处理
location~*\.(jpg|gif|png|swf|flv|wma|asf|mp3|mmf|zip|rar)${
valid_referers none blocked *.etiantian.orgetiantian.org;
if ($invalid_referer){
rewrite ^/ http://www.xiaofeng886.org/img/nolink.jpg;
}
}
18.nginx错误页面优雅显示
参数:error_page 403 /403.html;
19 nginx 方爬虫优化
20 使用tmpfs文件系统给/tmp
提高效率,部分程序切图片操作临时放到/tmp下,可以把tmp设置成内存文件系统,占用内存空间的,就是从内存里拿出一块来当磁盘用
mount –t tmpfs –o size=16m tmpfs /tmp
21放DDos攻击
1)控制单个ip的并发请求防止DOS攻击
使用limit_conn_zone进行控制,控制单个IP或域名的访问次数,限制连续访问
者http标签添加控制,可以添加多个
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $binary_name zone=perserver:10m;
server {
limit_conn perip 10;
limit_conn perserver 100;
2)限制单个的请求速率防止DOS的访问速率
使用limit_req_zone进行控制,控制单个ip访问速率
22为web服务增加用户身份验证(适合内部机密网址)
nginx配置
location /phpmyadmin/{
auth_basic “oldboy training”;
auth_basic_user_file/application/nginx/conf/htpasswd;
}
创建密码文件
htpasswd –cb /application/nginx/conf/htpasswdoldboy 123456
cat /application/nginx/conf/htpasswd
chmod 400 /application/nginx/conf/htpasswd
chown nginx /application/nginx/conf/htpasswd
23 让nginx运行于监牢模式
创建普通用户,将站点目录以及nginx.conf放到普通用户目录,之后用/application/nginx/sbin/nginx –c
配置文件来启服务
注意相关日志所在路径,指定pid,端口不能用80
useradd inca
cd /home/inca
mkdir conf www log
echo inca >www/index.html
error_log /home/inca/log/error.log
pid /home/inca/log/nginx.pid
指定站点目录
日志
端口不能用80
用普通用户启动
解决端口问题