nginx编译安装-nginx优化
nginx编译安装-nginx优化
王先森Nginx优化
Nginx特点介绍
- 支持高并发能力比较强,消耗资源少
- 软件功能布局多样
- 支持平台广泛
修改NGINX版本信息
修改版本信息需要修改程序源文件信息
修改内核信息
1 | vim src/core/nginx.h |
修改头部信息
1 | vim src/http/ngx_http_header_filter_module.c |
修改错误页显示
1 |
|
编译安装
1 | yum -y install openssl-devel pcre-devel |
隐藏nginx版本信息优化
官方配置参数说明
server_tokens官方参数:
Syntax: server_tokens on | off | build | string;
Default: server_tokens on;
Context: http, server, location
测试结果:
1 | curl -I 127.0.0.1 |
上传文件大小的限制(动态应用)
语法说明:
syntax:client_max_body_size size; #<==参数语法
default:client_max_body_size 1m; #<==默认值是1m
context:http,server,location #<==可以放置的标签段
配置:
1 | http { |
站点 Nginx站点目录及文件URL访问控制
- 根据目录或扩展名,禁止用户访问指定数据信息
1 | location ~ ^/images/.*\.(php|php5|sh|pl|py|html)$ |
Nginx图片及目录防盗链解决方案
什么是资源盗链 ?
简单地说,就是某些不法网站未经许可,通过在其自身网站程序里非法调用其他网站的资源,然后在自己的网站上显示这些调用的资源,达到填充自身网站的效果。
常见防盗链解决方案的基本原理
利用referer,并且针对扩展名rewrite重定向,下面的代码为利用referer且针对扩展名rewrite重定向,即实现防盗链的Nginx配置。
Syntax:valid_referers none | blocked | server_names | string …;
Default:—
Context:server, location
none:表示无Referer值的情况。
blocked:表示Referer值被防火墙进行伪装。
server_names:表示一个或多个主机名称。,server_names中可以使用通配符”*”号。
1 | location ~* /\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ { |
Nginx防爬虫优化
范例1:阻止下载协议代理,命令如下:
1 | # Block download agents ## |
范例2:添加内容防止N多爬虫代理访问网站,命令如下:这些爬虫代理使用“|”分隔,具体要处理的爬虫可以根据需求增加或减少,添加的内容如下:
1 | 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") |
优化nginx worker进行个数
nginx服务主要有两个重要进程:
01) master进程:可以控制nginx服务的启动 停止 或重启
02) worker进程:处理用户请求信息,帮助用户向后端服务进行请求(php mysql)
添加worker进程方法
1 | vim nginx.conf |
建议:worker进程数量=等于CPU的核数 worker进程数量=等于CPU的核数*2
绑定不同的nginx进程到不同的CPU上
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
8个worker进程分配CPU资源方法;
worker_processes 8;
worker_cpu_affinity 0001 0010 0100 1000 0001 0010 0100 1000;
#分配8进程方法
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
4个worker进程分配CPU资源方法:
worker_processes 4;
worker_cpu_affinity 0101 1010; # 将进程分配到两颗CPU上
Nginx压缩功能缓存功能
gzip (GNU-ZIP) 是一种压缩技术。经过 gzip 压缩后页面大小可以变为原来的 30%甚至更小。 这样,用户浏览页面的时候速度会快得多。 gzip 的压缩页面需要浏览器和服务器双方都支持,实 际上就是服务器端压缩,传到浏览器后浏览器解压并解析。浏览器那里不需要我们担心,因为 IE、 Firefox 、Opera 、Chrome 等绝大多数浏览器都支持解析 gzip
过的页面。
压缩好处:将响应报⽂发送⾄客户端之前可以启⽤压缩功能,这能够有效地节约带宽,并提⾼响应⾄客户端的速度,压缩会消耗nginx的cpu性能。
在配置文件中的http, server, location标签中添加。
1 | gzip on | off; #gzip开关 |
案例:
1 | server { |
图片、CSS、JS缓存设置
展示实例:
1 | expires 24h; |
缓存设置:
1 | server { |
location标签详解
作用: 根据域名后面字符串进行相应的转发处理;
语法:
location [ = | ~ |
* | ^] uri {
…
}
解释:
符号 | 含义 |
---|---|
= | 精确匹配,如果找到匹配=的内容,立刻停止搜索,并立即处理请求(优先级最高); |
~ | 区分大小写; |
^~ | 只匹配字符串,不匹配正则表达式; |
~* | 不区分大小写; |
@ | 指定一个命名的location,一般只用于内部重定向请求,location @name {…}; |
匹配规则:
1 | location = / { |
那么产生的效果如下:
- 访问根目录/,比如http://localhost/将匹配规则A
- 访问 http://localhost/login 将匹配规则B,http://localhost/register则匹配规则H
- 访问 http://localhost/static/a.html 将匹配规则C
- 访问 http://localhost/a.gif,http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而http://localhost/static/c.png则优先匹配到规则C
- 访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。
- 访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。
- 访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(PHP),tomcat(jsp),nginx作为方向代理服务器存在。
注:[ = ] 最优先,[ *] 第二,[^ ] 第三,[ /目录 ] 第四,[ / ] 第五。
Nginx负载均衡
负载均衡作用
负载均衡:分摊到多个操作单元上进行执行,和它的英文名称很匹配。就是我们需要一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡。
负载均衡算法
- 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器;
1
2
3
4upstream boysec-server {
server localhost:8001;
server localhost:8002;
} - ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
1
2
3
4
5upstream boysec-server {
ip_hash;
server localhost:8001 weight=1;
server localhost:8002 weight=2;
} - 最少连接:将请求分配到连接数最少的服务上。
1
2
3
4
5upstream boysec-server {
least_conn;
server localhost:8001 weight=1;
server localhost:8002 weight=2;
} - fair:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持 fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair模块。
1
2
3
4
5upstream boysec-server {
server localhost:8001 weight=1;
server localhost:8002 weight=2;
fair;
}
upstream模块是应用在http标签中:
1 | upstream dynamic { |
weight: 默认为1.weight越大,负载的权重就越大。
max_fails: 允许请求失败的次数默认为1.当超过最大次数时, 返回proxy_next_upstream 模块定义的错误
fail_timeout: [max_fails]次失败后,暂停的时间
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
slow_stat: 服务器将被恢复的时间默认是0s。
代理模块
proxy_pass: 指定将请求代理至server的URL路径;
proxy_send_timeout: 在连接断开之前两次发送到server的最大间隔时长;过了这么长时间后端还是没有收到数据,连接会被关闭
proxy_read_timeout: 是从后端读取数据的超时时间,两次读取操作的时间间隔如果大于这个值,和后端的连接会被关闭。
proxy_connect_timeout: 表示与后端服务建立连接的超时时间;
proxy_body_buffer_size: 用于指定客户端请求主体缓存大小;
proxy_set_header: 可将发送至server的报文的某首部进行重写;常用于nginx做负载均衡时,获取客户端IP时,需要添加forward头部。
proxy_set_header Host $host; 获取用户访问域名
proxy_set_header X-REMOTE-IP $remote_addr; 获取用户IP地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 获取用户的浏览器信息