标签:nginx优化
1.隐藏nginx header里版本号信息
(安全优化)
在nginx配置文件nginx.conf中的http标签加入
http {
server_tokens off;
}
控制了header和网页中error messages显示nginx版本
修改源代码更改版本号显示。
vim +48 /home/xiaoyi/tools/nginx-1.6.2/src/http/ngx_http_header_filter_module.c
static char ngx_http_server_string[] = "Server: (nginx)BWS" CRLF;
static char ngx_http_server_full_string[] = "Server: " (NGINX_VER)BWS CRLF;
修改ngx_http_special_response.c
vi nginx-1.6.2/src/http/ngx_http_special_response.c
static u_char ngx_http_error_tail[] =
2.更改nginx默认用户及用户组
(安全优化)
user nginx;
(1)编译时指定--user=nginx --group=nginx
(2)如果编译时忘记了指定,可以在配置文件中使用user nginx来指定nginx运行用户
3. 调整硬件配置nginx worker进程个数(性能优化)
查看CPU核数
grep "physical id" /proc/cpuinfo
top 1
worker_processes 8;
指定了nginx要开启的进程数。建议CPU数量相等或x2
①查看物理CPU的个数
#cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l
2
②查看逻辑CPU的个数
#cat /proc/cpuinfo |grep "processor"|wc -l
24
③查看CPU是几核
#cat /proc/cpuinfo |grep "cores"|uniq
6
4. 绑定不同的进程到不同的CPU上,资源平均分配(配置CPU亲和力)
(性能优化)
4个进程时:
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
2个进程时:
worker_processes 2;
worker_cpu_affinity 0101 1010;
8个进程时:
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
命令行为某个服务指定CPU亲和力
taskset -c 1,2,3 /etc/init.d/mysql start
5. nginx事件处理模型优化为epoll
(性能优化)
nginx采用epoll的IO多路复用模型
freebsd才用kqueue的IO多路复用模型
solaris才用/dev/poll方式的IO多路复用模型
windows使用的是icop
epoll 2.6内核支持
events {
use epoll;
}
6. 调整nginx单个进程允许的客户端最大连接数
(性能优化)
events {
worker_connections 102400;
}
ulimit -HSn 65535
注意:设置此项的前提是ulimit的值必须修改,默认是1024
events指令是设定nginx的工作模式及连接数上限
7.配置nginx最大打开文件数
(性能优化)
ulimit -HSn 65535
worker_rlimit_nofile 65535;
8.优化服务器名字的hash表大小
(性能优化)
could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32
如果你遇到了上面这条报错,那么你可能就需要修改server_names_hash_bucket_size了,如果64还不够,那么就按64的倍数往上加。
http {
server_names_hash_bucket_size 64;
server_names_hash_max_size 512;
}
9.开启高效文件传输模式
(性能优化)
http {
sendfile on;
tcp_nopush on; #在包含了keepalive参数才有效
tcp_nodelay on;}
#tcp_nopush和tcp_nodelay互相排斥
sendfile on;#可以让sendfile()发挥作用。sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效(更多有关于sendfile)。
tcp_nopush on;告诉nginx在一个数据包里发送所有头文件,而不一个接一个发送
tcp_nodelay on;告诉nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就能立即得到返回值。
10.设置连接超时时间
(性能优化)
为什么要超时?保护服务器的资源、硬件、cpu、mem、连接数
php网站建议希望短链接,php程序建立连接消耗的资源要少
java网站建议长链接,java程序建立连接消耗的资源和时间要多
http {
keepalive_timeout 60;
tcp_nodelay on;
#打开了tcp_nodelay,在包含了keepalive参数才有效
client_header_timeout 15;
#设置客户端请求头读取时间,如果超过这个时间,客户端还没有发送任何数据,nginx将返回“Request time out(408)”错误
client_body_timeout 15;
#设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据, nginx将返回“Request time out(408)”错误,默认值是60
send_timeout 15;
#指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx将会关闭连接。
}
11.上传文件大小限制
(动态应用)
client_max_body_size 10m;设置为0不检查
12. fastcgi调优(配合php引擎动态服务)
fastcgi_connect_timeout 300;
#指定连接到后端fastcgi的超时时间
fastcgi_send_timeout 300;
#向fastcgi传送请求的超时时间,这个值是指已经完成两次握手后向fastcgi传送请求的超时时间
fastcgi_read_timeout 300;
#指定接收fastcgi应答的超时时间,这个值是指已经完成两次握手后接收fastcgi应答的超时时间
fastcgi_buffer_size 64k;
#指定读取fastcgi应答第一部分需要用多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为fastcgi_buffers选项指定的缓冲区大小
fastcgi_buffers 4 64k;
#指本地需要用多少和多大的缓冲区来缓冲fastcgi的应答请求。如果一个php脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中php脚本所产生的页面大小的中间值,如果站点大部分所产生的页面大小为256KB,那么可以把这个值设置为“16 16K”、“4 64K”等
fastcgi_busy_buffers_size 128k;
#建议为fastcgi_buffers的两倍
fastcgi_temp_file_write_size 128k;
#在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,设置上树数值设置大小时若负载上来时可能报502 Bad Gateway
fastcgi_cache oldboy_nginx
#表示开启fastcgi缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502错误的发生,但是开启缓存也可能会引起其他问题,要根据具体情况选择。
fastcgi_cache_valid 200 302 1h;
#用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一个小时
fastcgi_cache_valid any 1m;
#将其他应答缓存为1分钟
fastcgi_cache_min_uses 1;
#缓存在fastcgi_cache_path指令inactive参数值时间内的最少使用次数
13.配置nginx gzip压缩功能
nginx gzip压缩模块提供了对文件内容压缩的功能,允许nginx服务器将输出内容在发送到客户端之前根据具体的策略进行压缩,以节约网站带宽,同时提升用户访问体验。
此功能同apache的mod_deflate压缩功能,依赖ngx_http_gzip_module模块
gzip on;
gzip_min_length 1k;(小于1K不压缩)
gzip_buffers 4 32k;
#压缩缓冲区大小,表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.1;(可以不加)
gzip_comp_level 9;
#压缩比率,用来指定gzip压缩比,1压缩比越小,处理速度越快;9压缩比最大,传输速度快,但处理最慢,也比较消耗CPU资源
gzip_types text/css application/javascript text/plain application/xml;
#用来指定压缩的类型,"text/html"类型总是会被压缩
gzip_vary on;
vary header支持。该选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用squid缓存经过nginx压缩的数据
火狐浏览器安装yslow插件可以查看压缩
14.配置nginx expires缓存功能
优点:
1.第一次以后,访问网站快 体验好
2.节省网站带宽 成本
3.服务器压力降低 成本
缺点:
1.网站改版,对应的用户看到的还是旧的(js css,图片)
解决方法:
1.过期时间短一些
2.资源文件更新时,改名。
expire功能优点:
expires尅降低网站购买的带宽,节约成本,同时提升了用户访问体验,减轻服务器的压力,是web服务非常重要的功能
expire功能缺点:
被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。
解决缺点办法:
1.缩短缓存时间,例如:1天,不彻底,除非更新频率大于1天
2.对缓存的对象改名
图片,附件一般不会被用户修改,如果用户修改了,实际上也就是更改文件名重新传了而已
网站升级对于js,css元素,一般可以改名。把css,js推送到CDN
企业网站缓存日期:
1.51cto 1周
2.sina 15天
3.京东25年
4.淘宝10年
5.google 1天
6.百度10年
一般不希望被缓存的内容:
1.广告图片
2.网站流量统计文件
3.更新频繁的文件
在server中配置
针对扩展名
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)?$
{
expires 3650d;
root html/www;
}
针对目录
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d;
}
针对单个文件
location ~(robots.txt) {
log_not_found off;
expires 7d;
break;
}
15. nginx防爬虫(rebot协议,HTTP_USER_AGENT)
(安全+性能优化)
server {
listen 80;
server_name 127.0.0.1;
#添加如下内容即可防止爬虫
if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot")
{
return 403;
}
}
方法二:
网站根目录下建立robots.txt
禁止指定浏览器软件访问:
if($http_user_agent~*"Firefox|MSIE")
{
return 403;
rewrite ^(.*) http://blog.etiantan.org/$1 permanent;
}
某些网站做了只允许wget下载,比如张宴的博客http://zyan.cc,网站里的工具只允许使用wget下载,就是用了判断http_user_agent的方法
if ($http_user_agent ~ * LWP::Simple|BBBike|wget) {
return 403
}
16.nginx日志相关优化
日志轮询
cd /application/nginx/logs &&\
/bin/mv www_access.log www_access_$(date +%F -d -1day)
.log
/application/nginx/sbin/nginx -s reload
添加到cron
不记录不需要的访问日志
对于健康检查或某些图片,js,css的日志,一般不需要记录
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
17. 严格设置web站点目录的权限
安全的权限:
1.所有站点目录的用户和组都应该为root
2.所有目录权限是默认的755;
3.所有文件权限是默认的644;
注意:网站服务的用户不能用root
(业务拆分)
18. 根据扩展名限制程序和文件访问
location ~ ^/images/.*\.(php|php5)$ {
deny all;
}
location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$ {
deny all;
}
这些目录的限制写在以下配置的前面:
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
禁止访问*.txt文件
location ~* \.(txt|doc)$ {
if (-f $request_filename){
root /data/www/www;
#rewrite
break(deny all);
}
}
禁止访问指定目录下所有的文件和目录
范例1:配置禁止访问指定的单个或多个目录
location ~ ^/(static|js)/ {
deny all;
}
范例2:禁止访问目录并返回指定的http状态吗
location /admin/ {return 403; }
限制来源IP访问
location ~ ^/oldboy/ {
deny 1.1.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
19.web资源防盗链
1.根据http referer实现防盗链
在http协议中,有一个表头字段叫referer,使用URL格式来表示从哪里来的链接到当前网页的资源。通过referer可以检测目标访问的来源网页,如果是资源文件,可以跟踪到显示它的网页地址,一旦检测出来源不是本站,进行组阻止或返回指定的页面。
apache,nginx,lighttpd都支持根据http referer实现防盗链
2.根据cookie处理
3.通过加密交换访问路径实现防盗链
lighttpd有累死的插件mod_secdownload
通过判断referer变量的值,来判断图片或资源的引用是否合法,只有在根据配置符合设定需求范围内的referer,这样的的网站内容才能调用访问指定的资源内容,从而实现了资源被网站盗链的目的,需要注意的是:不是所有的用户代理(浏览器)都会设置referer变量,而且有的还可以手工修改referer,referer是可以被伪造的。上面配置,只是一种简单的防护手段。应付一般的盗链也足够了。
解决办法:
1.图片、视频上打水印,品牌
2.防火墙控制,根据IP控制
3.防盗链(根据referer机制)
location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers none blocked *.etiantian.org etiantian.org;
if($invalid_referer){
rewrite ^/ http://www.etiantian.org/img/nolink.jpg;
}
}
利用referer并且针对站点目录过滤返回错误码
location /images {
root /data0/www/www;
valid_referers none blocked *.etiantian.org etiantian.org;
if($invalid_referer){
return 403;
}
}
提示:要根据自己公司的业务,是否有外链的合作,进行设置域名允许。
NginxHttpAccessKeyModule实现防盗链
在产品设计上解决盗链方案:
为网站上传的图片增加水印
20. 错误页面优雅显示
(用户体验优化)
http://oldboy.blog.51cto.com/2561410/716294
error_page 403 /403.html;
error_page 404 http://oldboy.blog.com;
200 - OK,服务器成功返回网页
- Standard response for successful HTTP requests.
301 - Moved Permanently(永久跳转),请求的网页已永久跳转到新位置。
- This and all future requests should be directed to the given.
403 - Forbidden(禁止访问),服务器拒绝请求
- forbidden request (matches a deny filter) => HTTP 403
- The request was a legal request, but the server is refusing to respond to it.
404 - Not Found,服务器找不到请求的页面。
- The requested resource could not be found but may be available again in the future.
500 - Internal Server Error(内部服务器错误)
- internal error in haproxy => HTTP 500
- A generic error message, given when no more specific message is suitable.
502 - Bad Gateway(坏的网关),一般是网关服务器请求后端服务时,后端服务没有按照http协议正确返回结果。
- the server returned an invalid or incomplete response => HTTP 502
- The server was acting as a gateway or proxy and received an invalid response from the upstream server.
503 - Service Unavailable(服务当前不可用),可能因为超载或停机维护。
- no server was available to handle the request => HTTP 503
- The server is currently unavailable (because it is overloaded or down for maintenance).
504 - Gateway Timeout(网关超时),一般是网关服务器请求后端服务时,后端服务没有在特定的时间内完成服务。
- the server failed to reply in time => HTTP 504
- The server was acting as a gateway or proxy and did not receive a timely response from the
21.从正确途径取得nginx源代码
http://nginx.org
22.系统内核参数优化
23.使用tmpfs文件系统替代频繁访问的目录
mkdir /opt/tmp/
mv /tmp/* /opt/tmp/
mount -t tmpfs -o size=16m tmpfs /tmp
mount -t tmpfs /tmp /tmp/eaccelerator/
放入/etc/rc.local
24.尽可能减少http请求数
这属于架构思想了,这里提一下,从前面讲到的nginx exprise缓存,所有的目的就是劲量把请求往前推,首先在客户端放缓存,这样客户端有些资源不用再通过服务器获得;接着可能会有CDN缓存,反向代理缓存,php引擎缓存,等等。总之一句话就是尽量让用户的请求从缓存中获得,而不进行数据库,磁盘的读写。
25.TCMalloc优化nginx性能
26.使用普通用户跑nginx服务
不能用80端口,大于1024的端口
/application/nginx/sbin/nginx -c /home/xiaoyi/nginx/conf/nginx.conf
27.严格设置web站点目录的权限
(单机环境: f644 d 755 root root)
(集群环境:动静以及上传分离访问:)
动态:f644 d755 root root
静态:f644 d755 root root
上传:程序:f644 d755 root root
资源:f644 d755 nginx nginx
28.防非法域名恶意解析
nginx禁止非法域名解析访问
if($host !~^www/.duk/.cn$) {
rewrite ^(.*) http://www.duk.cn$1 permanent;
}
29.防止使用IP访问网站
server {
listen 80 default_server;
server_name_;
return 403;
}
#禁止IP访问,上面那条是老师教的,下面这条是百度到的
server {
listen 80 default;
server_name _;
server_name www.example.com example.com
return 500;
30. 防DOS攻击
(单IP并发连接的控制)
http{
limit_conn_zone $binary_remote_addr zone=addr:10m;
server{
listen 80;
server_name blog.etiantian.com;
root html/blog;
location /download/ {
root html/blog;
index index.php index.html index.htm;
limit_conn addr 1;
}
}
}
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server{
locaion /search/ {
limit_req zone=one burst=5;
}
}
}
31. 防DDOS攻击策略
http://oldboy.blog.51cto.com/2561410/845349
32.为web服务增加用户验证(适合内部机密网址)
控制力度,可以是一个虚拟主机,也可以是一个目录
auth_basec "oldboy training";
auth_basic_user_file /application/nginx/conf/htpasswd;
cat bbs.conf
server {
listen 80;
server_name bbs.etiantian.org;
location / {
root html/bbs;
index index.php index.html index.htm;
access_log logs/www_access.log;
auth_basic "oldboy training";
auth_basic_user_file /application/nginx/conf/htpasswd;
}
}
htpasswd -c(b) /application/nginx/conf/htpasswd oldboy 123
chmod 400 /application/nginx/conf/htpasswd
33.让nginx运行于监牢模式
1.给nginx服务降权用普通用户xiaoyi跑服务,站点xiaoyi,给开发设置普通帐号和xiaoyi同组
/application/nginx/sbin/nginx -c /home/xiaoyi/conf/nginx.conf
34.nginx伪静态
rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3 last;
rewrite ^([^\.]*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $1/plugin.php?id=$2:$3 last;
if (!-e $request_filename) {
return 404;
}
本文出自 “龚小逸” 博客,请务必保留此出处http://gongxiaoyi.blog.51cto.com/7325139/1825372
标签:nginx优化
原文地址:http://gongxiaoyi.blog.51cto.com/7325139/1825372