Nginx优化
Nginx特点介绍
- 支持高并发能力比较强,消耗资源少
- 软件功能布局多样
- 支持平台广泛
修改NGINX版本信息
修改版本信息需要修改程序源文件信息 修改内核信息
代码语言:javascript复制vim src/core/nginx.h
# ···
13 #define NGINX_VERSION "1.0"
14 #define NGINX_VER "linuxboy/" NGINX_VERSION
22 #define NGINX_VAR "linuxboy"
# ···
修改头部信息
代码语言:javascript复制vim src/http/ngx_http_header_filter_module.c
# ···
49 static char ngx_http_server_string[] = "Server: linuxboy" CRLF;
# ···
修改错误页显示
代码语言:javascript复制
vim src/http/ngx_http_special_response.c
# ···
28 static u_char ngx_http_error_tail[] =
29 "<hr><center>linuxboy</center>" CRLF
30 "</body>" CRLF
31 "</html>" CRLF
32 ;
# ···
编译安装
代码语言:javascript复制yum -y install openssl-devel pcre-devel
./configure --prefix=/application/nginx-1.10.3 --user=www --group=www --with-http_stub_status_module --with-http_ssl_module
make && make install
隐藏nginx版本信息优化
官方配置参数说明 server_tokens官方参数:
Syntax: server_tokens on | off | build | string; Default: server_tokens on; Context: http, server, location
测试结果:
代码语言:javascript复制curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: linuxboy
Date: Feb, 01 Nov 2020 18:32:40 GMT
Content-Type: text/html
Content-Length: 10
Last-Modified: Feb, 25 Oct 2020 01:20:56 GMT
Connection: keep-alive
ETag: "59efe6f8-a"
Accept-Ranges: bytes
上传文件大小的限制(动态应用)
语法说明:
syntax:client_max_body_size size; #<==参数语法 default:client_max_body_size 1m; #<==默认值是1m context:http,server,location #<==可以放置的标签段
配置:
代码语言:javascript复制http {
sendfile on;
keepalive_timeout 65;
client_max_body_size 8m; ### 设置上传文件最大值8M
}
站点 Nginx站点目录及文件URL访问控制
- 根据目录或扩展名,禁止用户访问指定数据信息
location ~ ^/images/.*.(php|php5|sh|pl|py|html)$
{
deny all;
}
location ~ ^/static/.*.(php|php5|sh|pl|py)$
{
deny all;
}
location ~* ^/data/(attachment|avatar)/.*.(php|php5)$
{
deny all;
}
Nginx图片及目录防盗链解决方案
什么是资源盗链 ? 简单地说,就是某些不法网站未经许可,通过在其自身网站程序里非法调用其他网站的资源,然后在自己的网站上显示这些调用的资源,达到填充自身网站的效果。
常见防盗链解决方案的基本原理 利用referer,并且针对扩展名rewrite重定向,下面的代码为利用referer且针对扩展名rewrite重定向,即实现防盗链的Nginx配置。
代码语言:javascript复制Syntax:valid_referers none | blocked | server_names | string …; Default:— Context:server, location none:表示无Referer值的情况。 blocked:表示Referer值被防火墙进行伪装。 server_names:表示一个或多个主机名称。,server_names中可以使用通配符”*”号。
location ~* /.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
root html/www;
valid_referers none blocked *.linuxboy.com linuxboy.com;
if ($invalid_referer){
rewrite ^/ http://www.linuxboy.com/img/nolink.jpg;
}
}
Nginx防爬虫优化
范例1:阻止下载协议代理,命令如下:
代码语言:javascript复制## Block download agents ##
if ($http_user_agent ~* LWP::Simple|BBBike|wget)
{
return 403;
}
范例2:添加内容防止N多爬虫代理访问网站,命令如下:这些爬虫代理使用“|”分隔,具体要处理的爬虫可以根据需求增加或减少,添加的内容如下:
代码语言:javascript复制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;
}
优化nginx worker进行个数
nginx服务主要有两个重要进程:
01) master进程:可以控制nginx服务的启动 停止 或重启 02) worker进程:处理用户请求信息,帮助用户向后端服务进行请求(php mysql)
添加worker进程方法
代码语言:javascript复制vim nginx.conf
worker_processes 1; # 修改nginx配置文件中worker_processes指令后面的数值
建议: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标签中添加。
代码语言:javascript复制gzip on | off; #gzip开关
gzip_buffers number size; #设置压缩缓冲区大小
gzip_comp_level level; #设置压缩比率,最小为1,处理速度快,传输速度慢;9为最大压缩比,处理速度慢,传输速度快(可根据CPU核数选择)。gzip_http_version 1.0 | 1.1; #压缩版本
gzip_min_length length; #设置压缩的页面最小体积(字节K)
gzip_types mime-type ...; #设置压缩的文件类型
gzip_vary on | off; #是否传输gzip压缩标志
gzip_disable regex ...; #正则匹配UA 什么样的Uri不进行gzip
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...; # 设置请求者代理服务器,该如何缓存内容。
案例:
代码语言:javascript复制server {
gzip on;
gzip_buffers 4 16k;
gzip_min_length 1000;
gzip_comp_level 1;
gzip_http_version 1.1;
gzip_types text/css application/x-javascript text/xml image/jpeg image/gif image/png;
gzip_vary on;
}
图片、CSS、JS缓存设置
展示实例:
代码语言:javascript复制expires 24h;
expires modified 24h;
expires @24h;
expires 0;
expires -1;
expires epoch;
expires $expires;
add_header Cache-Control private;
缓存设置:
代码语言:javascript复制server {
root /var/html/my_blog;
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 7d;
}
location ~ .*.(js|css)?$ {
expires 12h;
}
}
location标签详解
作用: 根据域名后面字符串进行相应的转发处理; 语法:
location [ = | ~ | ~* | ^~ ] uri { … }
解释:
符号 | 含义 |
---|---|
= | 精确匹配,如果找到匹配=的内容,立刻停止搜索,并立即处理请求(优先级最高); |
~ | 区分大小写; |
^~ | 只匹配字符串,不匹配正则表达式; |
~* | 不区分大小写; |
@ | 指定一个命名的location,一般只用于内部重定向请求,location @name {…}; |
匹配规则:
代码语言:javascript复制location = / {
#规则A
}
location = /login {
#规则B
}
location ^~ /static/ {
#规则C
}
location ~ .(gif|jpg|png|js|css)$ {
#规则D
}
location ~* .png$ {
#规则E
}
location !~ .xhtml$ {
#规则F
}
location !~* .xhtml$ {
#规则G
}
location / {
#规则H
}
那么产生的效果如下:
- 访问根目录/,比如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负载均衡
负载均衡作用
负载均衡:分摊到多个操作单元上进行执行,和它的英文名称很匹配。就是我们需要一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡。
负载均衡算法
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器;
代码语言:javascript复制upstream boysec-server {
server localhost:8001;
server localhost:8002;
}
ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
代码语言:javascript复制upstream boysec-server {
ip_hash;
server localhost:8001 weight=1;
server localhost:8002 weight=2;
}
最少连接:将请求分配到连接数最少的服务上。
代码语言:javascript复制upstream boysec-server {
least_conn;
server localhost:8001 weight=1;
server localhost:8002 weight=2;
}
fair:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持 fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair模块。
代码语言:javascript复制upstream boysec-server {
server localhost:8001 weight=1;
server localhost:8002 weight=2;
fair;
}
upstream模块是应用在http标签中:
代码语言:javascript复制upstream dynamic {
server backend1.example.com weight=5;
server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
server 192.0.2.1 max_fails=3
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
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