nginx编译安装-nginx优化

Nginx优化

Nginx特点介绍

  1. 支持高并发能力比较强,消耗资源少
  2. 软件功能布局多样
  3. 支持平台广泛

修改NGINX版本信息

修改版本信息需要修改程序源文件信息
修改内核信息

1
2
3
4
5
6
vim  src/core/nginx.h
# ···
13 #define NGINX_VERSION "1.0"
14 #define NGINX_VER "linuxboy/" NGINX_VERSION
22 #define NGINX_VAR "linuxboy"
# ···

修改头部信息

1
2
3
4
vim  src/http/ngx_http_header_filter_module.c 
# ···
49 static char ngx_http_server_string[] = "Server: linuxboy" CRLF;
# ···

修改错误页显示

1
2
3
4
5
6
7
8
9

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 ;
# ···

编译安装

1
2
3
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

测试结果:

1
2
3
4
5
6
7
8
9
10
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 #<==可以放置的标签段

配置:

1
2
3
4
5
http {
sendfile on;
keepalive_timeout 65;
client_max_body_size 8m; ### 设置上传文件最大值8M
}

站点 Nginx站点目录及文件URL访问控制

  1. 根据目录或扩展名,禁止用户访问指定数据信息
1
2
3
4
5
6
7
8
9
10
11
12
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配置。

Syntax:valid_referers none | blocked | server_names | string …;
Default:—
Context:server, location
none:表示无Referer值的情况。
blocked:表示Referer值被防火墙进行伪装。
server_names:表示一个或多个主机名称。,server_names中可以使用通配符”*”号。

1
2
3
4
5
6
7
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:阻止下载协议代理,命令如下:

1
2
3
4
5
## Block download agents ##
if ($http_user_agent ~* LWP::Simple|BBBike|wget)
{
return 403;
}

范例2:添加内容防止N多爬虫代理访问网站,命令如下:这些爬虫代理使用“|”分隔,具体要处理的爬虫可以根据需求增加或减少,添加的内容如下:

1
2
3
4
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进程方法

1
2
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标签中添加。

1
2
3
4
5
6
7
8
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 ...; # 设置请求者代理服务器,该如何缓存内容。

案例:

1
2
3
4
5
6
7
8
9
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缓存设置

展示实例:

1
2
3
4
5
6
7
8
expires    24h;
expires modified +24h;
expires @24h;
expires 0;
expires -1;
expires epoch;
expires $expires;
add_header Cache-Control private;

缓存设置:

1
2
3
4
5
6
7
8
9
10
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 {…};

匹配规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
}

那么产生的效果如下:

  1. 访问根目录/,比如http://localhost/将匹配规则A
  2. 访问 http://localhost/login 将匹配规则B,http://localhost/register则匹配规则H
  3. 访问 http://localhost/static/a.html 将匹配规则C
  4. 访问 http://localhost/a.gif,http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而http://localhost/static/c.png则优先匹配到规则C
  5. 访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。
  6. 访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。
  7. 访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(PHP),tomcat(jsp),nginx作为方向代理服务器存在。

注:[ = ] 最优先,[ *] 第二,[^ ] 第三,[ /目录 ] 第四,[ / ] 第五。

Nginx负载均衡

负载均衡作用

负载均衡:分摊到多个操作单元上进行执行,和它的英文名称很匹配。就是我们需要一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡。

负载均衡算法

  1. 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器;
    1
    2
    3
    4
    upstream  boysec-server {
    server localhost:8001;
    server localhost:8002;
    }
  2. ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
    1
    2
    3
    4
    5
    upstream  boysec-server {
    ip_hash;
    server localhost:8001 weight=1;
    server localhost:8002 weight=2;
    }
  3. 最少连接:将请求分配到连接数最少的服务上。
    1
    2
    3
    4
    5
    upstream  boysec-server {
    least_conn;
    server localhost:8001 weight=1;
    server localhost:8002 weight=2;
    }
  4. fair:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持 fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair模块。
    1
    2
    3
    4
    5
    upstream  boysec-server {
    server localhost:8001 weight=1;
    server localhost:8002 weight=2;
    fair;
    }

upstream模块是应用在http标签中:

1
2
3
4
5
6
7
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 $proxy_add_x_forwarded_for; 获取用户的浏览器信息