nginx编译安装-nginx优化

2023-04-24 16:54:53 浏览数 (1)

Nginx优化

Nginx特点介绍

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

修改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访问控制

  1. 根据目录或扩展名,禁止用户访问指定数据信息
代码语言:javascript复制
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中可以使用通配符”*”号。

代码语言:javascript复制
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
  }

那么产生的效果如下:

  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负载均衡

负载均衡作用

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

负载均衡算法

轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器;

代码语言: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

0 人点赞