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<

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 ~^/p_w_picpaths/.*\.(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

用普通用户启动

解决端口问题