NGINX的相关优化总结
基本安全优化:
1.隐藏版本信息
软件漏洞与版本相关,隐藏或者消除web服务队访问用户显示各种敏感信息
解决办法·:在nginx.conf配置文件http{ 添加: server_tokens off;
修改源代码,重新编译:
1 /home/oldboy/tools/nginx-1.6.3/src/core/nginx.h 第14,16行
2 #define NGINX_VERSION "1.6.2" 修改为想要的版本号如2.4.3
3 #define NGINX_VER "nginx/" NGINX_VERSION 将nginx修改为想要修改的软件名称,如Apache。
------------------------
1 /home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_header_filter_module.c第49行
2 grep 'Server:nginx' ngx_http_header_filter_module.cstatic
3 sed -i 's#Server:nginx#Server:Apache#g' ngx_http_header_filter_module.c
-------------------------
/home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_special_response.c第21,30行
"<hr><center>"NGINX_VER "(http://oldboy.blog.51cto.com)</center>" CRLF
"<hr><center>OWS</center>" CRLF
2.更改nginx服务的默认用户
1.直接修改nginx.conf.default参数
2.在编译安装时指定用户
参数优化服务性能
--参数优化nginx服务性能
1、优化nginx进程个数策略
worker_processes 1;一般调整到与CPU的颗数相同
--查看linux可查看cup个数及总核数
grep processor /proc/cpuinfo|wc -l
--查看cpu总颗数
grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l
--通过top,然后数字1,显示所有cpu数 top 按1键就会显示第一个的信息
Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0
2、优化绑定不同ningx进程到不同的cpu上
解释:在默认情况下nginx的进程泡在一个cpu或cpu的某一个核上
解决:优化不同的nginx进程给不同的cpu处理,充分有效利用有效的硬件资源
--四核cpu配置
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
--双核配置
worker_processes 2;
worker_cpu_affinity 0101 1010;
--taskset -c 用来分配服务给cpu
3、nginx事件处理模型优化
--解释:nginx链接处理机制在于不同操作系统会采用不同的I/O模型
events {
worker_connections 1024;
use epoll;
}
4、调整nginx单个进程允许的客户最大连接数
参数语法:worker_connections number
默认配置:worker_connections 512
放置位置:events 标签
events {
worker_connections 1024; #一个worker进程的并发
}
总并发= worker_processes* worker_connections
5、配置nginx worker进程最大打开文件数
参数语法:worker_rlimit_nofile number
放置位置:主标签段
说明:作用是改变worker processes能打开的最大文件数
worker_rlimit_nofile 65535;
各参数受系统文件的最大打开数限制
[root@admin nginx]# cat /proc/sys/fs/file-max
8192
6、文件系统最大可打开文件数
[root@admin nginx]# ulimit -n
1024
开启高效文件传输模式
设置参数 sendfile on;
sendfile参数用于开启文件的高效传输模式。同时将tcp_nopush和tcp_nodelay两个指令设置为on,可防止网络及磁盘i/o阻塞,提升nginx工作效率
http {
sendfile on; #放在http,server,location都可以
}
例:
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
server_names_hash_bucket_size 128;
server_names_hash_max_size 512;
keepalive_timeout 65;
client_header_timeout 15s;
client_body_timeout 15s;
send_timeout 60s;
fastcgi相关参数调优
7、配合nginx向后请求php动态引擎
fastcgi_connect_timeout 240;
fastcgi_send_timeout 240;
fastcgi_read_timeout 240;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#fastcgi_temp_path /data/ngx_fcgi_tmp;
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
8、nginx的gzip性能优化
nginx gzip压缩模块提供了压缩文件内容的功能,用户请求的内容在发送给客户端之前,nginx服务器会根据一些具体的策略实施压缩,以节省网站出口带宽,同时加快了数据传输效率,提升了用户的访问体验。
优点
提升网站用户体验:由于发给用户的内容小了,所以用户访问单位大小的页面就快了,用户体验就提升了
缺点
节约网站带宽成本:由于数据时压缩传输的,因此,会消耗一些cpu资源
压缩对象
纯文本内容压缩比很高,因此,纯文本的内容最好要压缩
被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩反而变大
图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的,如果再压缩很可能不会减 小或减小很少,或者有可能增大,而在压缩时还会消耗大量的CPU、内存资源
参数配置
gzip on; #表示开启压缩功能
gzip_min_length 1k; #表示允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,表示不管页面多大都进行压缩,建议设置成大于1K。如果小于1K可能会越压越大
gzip_buffers 4 32k; #压缩缓存区大小
gzip_http_version 1.1; #压缩版本
gzip_comp_level 9; #压缩比率
gzip_types text/css text/xml application/javascript; #指定压缩的类型
gzip_vary on; #vary header支持
9、nginx的expires
为用户访问网站的内容设定一个过期时间,当用户第一次访问到这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及之后继续访问该网站,浏览器就会检查已经缓存在用户浏览器本地的内容,就不会去浏览器下载了,直到缓存的内容过期或者被清除为止。
--expires可以降低网站的带宽,节约成本
--加快用户访问网站的速度,提升了用户访问体验
--服务器访问量降低,服务器压力就减轻了,服务器的成本也会降低,甚至可以节约人力成本
--几乎对于所有web服务来说,这是非常重要的功能之一,apache服务也有此功能
参数配置:
## Add expires header according to URI(path or dir).
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d;
}
日志优化
1、--编写脚本实现日志轮询
用户请求一个软件时,绝大多数软件都会记录用户的访问情况,nginx软件目前没有类似apache通过cronolog或者rotatelog对日志分隔处理的功能,但是,运维人员可以通过利用脚本开发、nginx的信号控制功能或reload重新加载,来实现日志的自动切割、轮询。
--定时任务
mv www_access.log www_access_$(date +F -d -1day).log
/applocation/nginx/sbin/nginx -s reload
2、--不记录不需要的日志
具体配制方法:
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
3、--日志访问权限设置
chown -R root.root /app/logs
chmod -R 600 /app/logs
限制http的请求方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 501;
}
#Only allow these request methods##
if ($request_method ~*(GET)$ ) {
return 501;
}
控制nginx的并发连接数
ngx_http_limit_conn_module
限制每个定义key值得连接数,特别是单个TP的连接数。
不是所有的连接数都会被计算。一个符合计数要求的连接是整个请求头已经被读取的连接。
控制Nginx并发连接数量参数的说明
1)limit_conn_zone参数:
语法:limit_conn_zone key zone=name:size;
上下文:http
用于设置共享内存区域,key可以是字符串、Nginx自带变量或前两个组合。name为内存区域的名称, size为内存区域的大小。
2)limit_conn参数
语法:limit_conn zone number;
上下文:http、server、location
用于指定key设置最大连接数。当超时最大连接数时,服务器会返回503报错。
控制客户端请求nginx的速率
ngx_http_limit_req_module
用于限制每个IP访问每个定义key的请求速率。
limit_req_zone参数说明如下。
语法:limit_req_zone key zone=name:size rate=rate;
上下文:http
用于设置共享内存区域,key可以是字符串,Nginx自带变量或前两个组合。name为内存区域的名称, size为内存区域的大小,rate为速率,单位为r/s,每秒一个请求。
limit_req参数说明如下:
语法:limit_req zone=name [burst-number] [nobelay]
上下文:http、server、location
这里运用了令牌桶原理,burst=num,一个有num快令牌,令牌发完后,多出来的那些请求就会返回503。
nodelay默认在不超过burst值得前提下会排队等待处理,如果使用此参数,就会处理完num+1次请求,剩余 的请求为超时,返回503。
防爬虫
if ($http_user_agent ~* LWP:Simple|BBBike|wget) {
return 403 ;
rewrite ^(.*) http://blog.etiantian.org/$1 permanent;
}
错误页面优雅显示
--nginx错误页面优雅显示
出现403错误会跳转到403.html页面
error_page 403 /403.html;
nginx图片防盗链
经过你的允许在自己网站嵌入你的图片。
根据HTTP referer实现防盗链
据cookie防盗链
#Preventing hot linking of images and other file types
location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ {
valid_referers none blocked *.etiantian.org etiantian.org;
if ($invalid_referer) {
rewrite ^/ http://bbs.etiantian.org/img/nolink.gif;
}
root html/www;
15 }
Nginx的一些特性:
反向代理/L7负载均衡器
嵌入式Perl解释器
动态二进制升级
可用于重新编写URL,具有非常好的PCRE支持
Nginx处理HTTP请求:
Nginx使用反应器模式。主事件循环等待操作系统发出准备事件的信号,这样数据就可以从套接字读取,在该实例中读取到缓冲区并进行处理。单个线程可以提供数万个并发连接
Nginx服务器的最佳用途:
在网络上部署动态HTTP内容,使用SCGI、WSGI应用程序服务器、用于脚本的FastCGI处理程序。它还可以作为负载均衡器。
Nginx服务器上的Master和Worker进程:
Master进程:读取及评估配置和维持
Worker进程:处理请求
stub_status和sub_filter指令的作用:
Stub_status指令:该指令用于了解Nginx当前状态的当前状态,如当前的活动连接,接受和处理当前读/写/等待连接的总数
Sub_filter指令:它用于搜索和替换响应中的内容,并快速修复陈旧的数据