码迷,mamicode.com
首页 > 其他好文 > 详细

nginx优化

时间:2016-07-11 19:29:46      阅读:640      评论:0      收藏:0      [点我收藏+]

标签: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优化

标签:nginx优化

原文地址:http://gongxiaoyi.blog.51cto.com/7325139/1825372

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!