您的位置:首页 > 运维架构 > Nginx

nginx优化25条

2015-06-17 18:16 525 查看
本文章的个人博客地址:

http://www.z-dig.com/nginx-optimization-25.html

本文内容来自老男孩教育运维班课程,由本人整理 http://oldboy.blog.51cto.com/


1.1 隐藏nginx header里版本号信息

1.2 更改源码隐藏软件名称及版本号

1.3 更改掉nginx默认用户及用户组(worker进程服务用户优化)

1.4 配置nginx worker进程个数

1.5 根据cpu核数进行nginx进程优化

1.6 nginx事件处理模型优化

1.7 调整nginx worker单个进程允许的客户端最大连接数

1.8 配置nginx worker进程最大打开文件数

1.9 开启高效的文件传输模式

1.10 设置连接超时时间

1.11 上传文件大小限制(动态应用)

1.12 fastcgi调优(配合PHP引擎动态服务)

1.13 配置nginx gzip压缩功能(重要)

1.14 配置nginx expires缓存功能(重要)

1.15 nginx日志相关优化与安全

1.16 nginx站点目录及文件URL访问控制(重要:防止恶意解析)

1.17 配置nginx图片及目录防盗链

1.18 nginx错误页面优雅显示

1.19 nginx防爬虫优化

1.20 使用tmpfs文件系统给/tmp

1.21 防DOS攻击

1.22 防DDOS策略

1.23 限制客户端请求的HTTP方法

1.24 为web服务增加用户身份验证(适合内部机密网址)

1.25 让Nginx运行于(A Chroot Jail (Containers))监牢模式

1.26 其他优化

1.1 隐藏nginx header里版本号信息

1、查看版本号
2、隐藏版本号
在nginx配置文件的http标签内加入“server_tokens off; ”参数,也可以放大server标签和location标签中,如下:
http {

..........

server_tokens off;

..........

}

/application/nginx/sbin/nginx -t

/application/nginx/sbin/nginx -s reload
再此查看如下,浏览器访问错误页面也就没有版本号了
[root@oldboy /]# cd /home/oldboy/tools/

[root@oldboy tools]# cd nginx-1.6.2/src/core

[root@oldboy core]# sed -n '13,17p'nginx.h

#define NGINX_VERSION  "1.6.2" 修改为想要的版本号如2.4.3

#define NGINX_VER "nginx/" NGINX_VERSION 将nginx修改为想要修改的软件名称,如Apache。
修改后查看header结果:
[root@M-SERVER http]# grep 'Server:nginx' ngx_http_header_filter_module.c

static char ngx_http_server_string[] ="Server:nginx" CRLF;

[root@M-SERVER http]# sed -i 's#Server:nginx#Server:Apache#g' ngx_http_header_filter_module.c
修改后的字符串
3)修改ngx_http_special_response.c
#vi nginx-1.3.4/src/http/ngx_http_special_response.c

static u_char ngx_http_error_full_tail[]=

"<hr><center>"NGINX_VER"</center>"CRLF

"</body>"CRLF

"</html>"CRLF

;

static u_char ngx_http_error_tail[]=

"<hr><center>nginx</center>"CRLF

"</body>"CRLF

"</html>"CRLF

;
修改为:

1.3 更改掉nginx默认用户及用户组(worker进程服务用户优化)

1、默认情况下,nginx服务启动,使用的用户和组默认都是nobody,查看默认配置如下: [root@c66-kslx conf]# grep '#user' nginx.conf.default #user nobody;
将web用户改为特殊的用户名如:nginx或更特殊点的dabaojian,但是这个用户必须是系统存在的。
2、建立nginx用户
worker_processes 1;

user nginx;
4、让woker进程使用普通用户运行
为master服务降权:使用非root跑nginx master
[inca@nginx ~]$ /application/nginx/sbin/nginx -c /home/inca/conf/nginx.conf
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)

1.4 配置nginx worker进程个数

nginx由master和worker进程组成,master进程相当于管理员,worker进程为用户提供服务
一般设置为cpu核数或则核数x2,用top按1查看
修改nginx.conf配置文件第一行
worker_processes    4;
worker_cpu_affinity 0001 0010 0100 1000;
八核cpu服务器参数配置:
worker_processes    4;
worker_cpu_affinity 0001 0010 0100 1000;
binds each worker process to a separate CPU, while
worker_processes 2; 4核2进程
worker_cpu_affinity 0101 1010;

1.6 nginx事件处理模型优化

nginx
的连接处理机制在不同的操作系统上采用不用的IO模型,在linux下,nginx使用epoll的IO多路复用模型,在freebsd使用kqueue
的IO多路复用模型,在solaris使用/dev/pool方式的IO多路复用模型,在windows使用的icop等等。
根据系统类型不同选择不同的事务处理模型,选择有“use [ kqueue | rtsig |epool |dev/pool |select |pllo ];”我们使用的是Centos6.5的linux,因此将nginx的事件处理模型调整为epool模型。
1、具体参数如下在优化4下边挨着:
events {

use epoll;

worker_connections 20480;

}
这个参数是单个进程的最大链接数,实际最大链接数是worker技能书乘以这个数。
Max_client=worker_processes*worker_connections

1.8 配置nginx worker进程最大打开文件数

http {

include       mime.types; 媒体类型

default_type application/octet-stream; 默认媒体类型

sendfile        on;

tcp_nopush     on; 只有在sendfile开启模式下有效

..........

}
tcp_nopush参数可以允许把http response header和文件的开始放在一个文件里发布,积极的作用是减少网络
报文段的数量。From: http://nginx.org/en/docs/http/ngx_http_core_module.html

1.10 设置连接超时时间

保护服务器资源,硬件CPU mem,连接数。
建立连接也是要消耗资源的,我们一般断掉那些连上的链接,但是不做事的
php网站建议短连接,PHP程序建立连接消耗的资源和时间要少。
JAVA网站建议长连接,JAVA程序建立连接消耗的资源和时间要多。
在http字段设置
http {

..........

client_max_body_size 10m;

......

}

1.12 fastcgi调优(配合PHP引擎动态服务)

cache 写入缓存区
buffer 读取缓冲区
fastcgi是静态服务和动态服务之间的一个接口
1、参数详解:有的只能放在http标签
fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

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;
缓存路径,levels目录层次2级,定义了一个存储区域名字,缓存大小,不活动的数据在缓存中多长时间,目录总大小
在server location标签添加如下:
gzip on;

###开启压缩功能

gzip_min_length  1k;

###设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取,默认值是0,不管页面多大都进行压缩,建议设置成大于1K,如果小与1K可能会越压越大。

gzip_buffers     4 32k;

###压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。

gzip_http_version 1.1;

###压缩版本(默认1.1,前端为squid2.5时使用1.0)用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可

gzip_comp_level 9;

###压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。

gzip_types  text/css text/xml application/javascript;

###用来指定压缩的类型,‘text/html’类型总是会被压缩。

gzip_vary on;
###vary header支持,改选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过nginx压缩的数据。
5、具体配置如下
在http标签中配置
范例1:

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires      3650d;
}
范例2:
location ~ .*\.(js|css)?$
{
expires      30d;
}

百度的logo就是10年
2、根据目录及其他进行判断,添加expires功能范例
[root@web-1 conf]# cd /server/scripts/

[root@web-1 scripts]# cat cut_nginx_log.sh

#!/bin/sh

cd /app/logs

mv www_access.log www_access_$(date +%F -d -1day).log

mv bbs_access.log bbs_access_$(date +%F -d -1day).log

mv blog_access.log blog_access_$(date +%F -d -1day).log

/application/nginx/sbin/nginx -s reload

cat >>/var/spool/cron/root<<eof

#cut nginx log by lxy at 20150327#

00 00 * * * /bin/sh /server/scripts/cut_nginx_log.sh >/dev/null 2>&1

eof
2、不记录不需要的访问日志
对于健康检查或某些(图片,js,css)日志,一般不记录日志,因为在统计PV时是按照页面计算,而且日志写入频繁会消耗磁盘IO,降低服务器性能。
chown -R root.root /app/logs

chmod -R 700 /app/logs
不需要再日志目录给nginx用户读或者写许可。因为nginx的master进程是root,不要担心权限不够写不进去日志

1.16 nginx站点目录及文件URL访问控制(重要:防止恶意解析)

1、根据扩展名限制程序和文件访问
作用:禁止目录下指定文件北风文,或者禁止指定目录下所有内容被访问
最佳应用场景:集群的共享存储,本来就应该只是资源文件,禁止指定扩展名程序被执行,例如:.php,.sh,.pl
nginx下禁止访问资源目录下的php程序文件,配置方法如下:
范例1:nginx配置限制指定目录下的php程序被解析
location ~* \.(txt|doc)$ {
if (-f $request_filename) {
root /data/www/www;
#rewrite …..可以重定向到某个URL
break;
}
}
location ~* \.(txt|doc)${
root /data/www/www;
deny all;
}

location ~ ^/(static)/ {
deny all;
}

location ~ ^/static {
deny all;
}
location ~ ^/(static|js) {
deny all;
}
location /admin/ { return 404; }
location /templates/ { return 403; }
2、限制来源ip访问
使用ngx_http_access_module限制ip访问
例如:phpmyadmin数据库web客户端,内部开发人员用
范例1:禁止某目录让外界访问,但允许某ip访问改目录,且支持php解析。
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
官网资料 http://nginx.org/en/docs/http/ngx_http_access_module.html 其他写法
if ( $remote_addr = 10.0.0.7 ) {
return 403;
}
if ( $remote_addr = 218.247.17.130 ) {
set $allow_access_root 'true';
}
3、限制使用网站ip访问网站
防止别的网站指定到你的ip,盗用你的流量,占你贷款,假冒你。
方法1:ngnix第一个虚拟主机设置403,不够友好
server {
listen 80 default_server;
server_name _;
rewrite ^(.*) http://blog.etiantian.org/$1 permanent;
}
nginx的所有变量 http://nginx.org/en/docs/varindex.html

1.17 配置nginx图片及目录防盗链

1、什么是防盗链
简单的说,就是某些不法的网站,通过在其自身网站程序里未经许可非法调用其他网站的资源,然后在自己的网站上显示这些调用的资源,达到了填充自身网站显示的效果,但是浪费了调用资源网站的网站流量,造成其他网站的带宽及服务压力吃紧,甚至宕机。
2、解决办法
(1)图片,视频上打水印,品牌。
(2)防火墙控制,根据ip控制。
(3)防盗链(根据referer控制)
运维的价值:轻松应得IDC机房流量暴涨问题。 http://oldboy.blog.51cto.com/2561410/909696 如何及时发现问题
第一、对IDC及CDN带宽做监控报警。
第二、作为高级运维或者运维经理,每天上班的一个重要任务,就是经常查看网站流量图,关注流量变化,关注异常流量。
第三、对访问日志做分析,对于异常流量能迅速定位,并且和公司市场推广等有比较好的默契沟通交流,以便调度贷款和服务器资源。确保网站正常的访问体验得到保证。
3、利用http referer设置防盗链
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。
利用referer并且针对扩展名rewrite重定向
# Stop deep linking or hot linking
location /images/ {
valid_referers none blocked www.example.com example.com;
if ($invalid_referer) {
return   403;
}
}

1.18 nginx错误页面优雅显示

范例:403跳转
error_page   404  http://oldboy.blog.51cto.com;
阿里门户天猫网站的nginx优雅显示配置案例:
if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot")
{
return 403;
}
实战演示:禁止不同浏览器软件访问:

1.20 使用tmpfs文件系统给/tmp

提高效率,部分程序切图片操作临时放到/tmp下,可以把tmp设置成内存文件系统,占用内存空间的,就是从内存里拿出一块来当磁盘用 mount -t tmpfs -o size=16m tmpfs /tmp

1.21 防DOS攻击

1、控制单个ip的并发请求防止DOS攻击 使用limit_conn_zone进行控制,控制单个ip或域名的访问次数,限制连续访问 在http标签添加控制,可添加多个,在server或location中使用, limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; server { ... limit_conn perip 10; limit_conn perserver 100; } ----------------------------------- limit_conn_zone $binary_remote_addr zone=addr:10m; server { location /download/ { limit_conn addr 1; }
2、限制单个ip的请求速率防止DOS攻击
使用limit_req_zone进行控制,控制单个ip的访问速率

1.22 防DDOS策略

http://oldboy.blog.51cto.com/2561410/845349

1.23 限制客户端请求的HTTP方法

location /phpmyadmin/ {
auth_basic     "oldboy training";
auth_basic_user_file /application/nginx/conf/htpasswd;
}
创建密码文件:
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[/code]指定站点目录
日志
端口不能用80
用普通用户启动
解决端口问题
用反向代理解决端口问题haproxy,nginx,f5.
解决方案的优点:
a、服务降权网站更安全了
b、按用户设置站点权限。站点更独立了(无需虚拟化隔离)
c、开发不需要root可以管理服务,不要吵来吵去
d、责任划分:网络问题:运维责任,网站打不开开发责任。(共同承担)

1.26 其他优化

1、安全优化:web磁盘挂载优化
LABEL=/nginx /nginx ext3 defaults,nosuid,noexec,nodev 1 2
2、内核优化
3、移除不想要的nginx模块(最小化原则)
编译时加--without-http-**不安装模块
4、开启iptables防护

本文出自 “李新宇” 博客,请务必保留此出处http://linuxlxy.blog.51cto.com/9876010/1662881
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: