栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Nginx优化

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Nginx优化

1.Nginx进程

查看nginx进程

 ps -aux | grep nginx

 图中可以看到 worker 进程是 www 程序用户也是工作进程,master 是监控进程,也是主进程,可理解为 master 进程是监控管理 worker 工作进程的。

2. 设置Nginx运行进程个数

nginx运行进程个数一般我们设置cpu的核心一致或者核心数x2

2.1查看cpu个数

方法一:

grep processor /proc/cpuinfo 

也可加个wc -l 统计行数

grep processor /proc/cpuinfo | wc -l

 方法二:

使用 top 命令  #按1,可以查看cup的核心

 2.2设置Nginx中进程数

 在nginx.conf的全局配置中修改

我cpu数量是4,修改为4

 2.3重载nginx配置文件

 nginx -s reload

2.4查看nginx进程数

 3.Nginx运行cpu亲和力

cpu线程数配置,在高并发情况下,通过设置cpu亲和力来降低由于多核切换带来的性能损耗。

3.1 4核4线程配置

 在nginx.conf文件全局配置中添加:

vim /usr/local/nginx/conf/nginx.conf

注:4核cpu,开启4个进程 0001表示开启第一个cpu内核,0001表示开启第一个cpu内核 ,0010开启第2个cpu内核,依次类推;有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。

3.2  8核8线程配置

vim /usr/local/nginx/conf/nginx.conf 

 3.3如4线程的cpu,只想跑两个进程

vim /usr/local/nginx/conf/nginx.conf 

 表示第一个进程cpu上运行,第二个进程在第二个和第四个cpu上运行,两个进程分别在这两个组合上轮询!

补充:

2核CPU,开启2个进程

worker_processes2;

worker_cpu_affinity  01  10;

2核CPU,开启4进程

worker_processes 4;

worker_cpu_affinity  01  10  01  10;

2核CPU,开启8进程

worker_processes8;

worker_cpu_affinity  01 10 01 10 01 10 01 10;

8核CPU,开启2进程

worker_processes2;

worker_cpu_affinity  10101010 01010101;

说明:10101010表示开启了第2,4,6,8内核,01010101表示开始了1,3,5,7内核

通过 apache 的ab测试查看nginx对CPU的使用状况:

4. Nginx最多可以打开文件数  4.1设置nginx最大可打开文件数

 在nginx.conf文件全局配置中添加:

vim /usr/local/nginx/conf/nginx.conf

 nginx进程打开的最多文件数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。

4.2修改系统可以打开的最大文件数  1)临时修改 

-n 临时设定系统最多打开的文件数

ulimit -n 102400
ulimit -n 

2)永久修改 

 修改linux的软硬件限制文件/etc/security/limits.conf

 vim /etc/security/limits.conf 

在文件尾部添加:

 用户重新登录即生效

 5.Nginx事件处理模型

vim /usr/local/nginx/conf/nginx.conf

nginx采用epoll 事件模型。处理效率高。

5.1单个进程允许客户端最大并发连接数

worker_connections是单个worker进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,实际最大值就是worker进程数乘以work_connections

如何设置,可以根据一个进程启动所占内存,top -u www(www表示nginx程序用户)

刚启动一个进程占用内存是5M左右

6.http主体优化  6.1开启高效传输模式

 vim /usr/local/nginx/conf/nginx.conf

 sendfile  on;

开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来传输,输出文件,当nginx是一个静态文件服务器的时候,开启sendfile配置项能大大提高nginx的性能。

tcp_nopush on;

在sendfile开启模式才有效,防止网络阻塞,积极的减少网络报文段的数量(将响应头和响应体两部分一起发送,而不一个接一个的发送。)

6.2长连接超时时间 

 主要目的是CPU,内存,控制连接数,因为建立连接也是需要消耗资源的

vim /usr/local/nginx/conf/nginx.conf

keepalive_timeout  65;

 keepalived_timeout  与client的keep-alive连接超时时间,单位是秒,服务器和客户端无交互后将在这个时间后关闭连接,长连接可以减少重建连接的开销,如果设置时间过长,用户又多,长时间保持连接会占用大量资源。

6.3文件上传大小限制

 vim /usr/local/nginx/conf/nginx.conf

 client_max_body_size 10m;  #在40行添加

6.4 location匹配

Nginx的location通过指定模式来与客户端请求的URI相匹配,location可以把网站的不同部分,定位到不同的处理方式上,基本语法如下:

location 【= | ~ | ~* | ^~】pattern {

......

}

注:中括号中为修饰符, 即指令模式。Pattern为url匹配模式

=  #表示做精准匹配,即要求请求的地址和匹配路径完全相同

~  #正则匹配,区分大小写

~* #正则匹配,不区分大小写

注:nginx支持正则匹配,波浪号(~)表示匹配路径是正则表达式,加上 * 变成 ~* 表示对大小写不敏感

^~ #指令用于字符前缀匹配。例:location ^~ /images/ {…}

1)精确匹配

= 用于精确字符匹配(模式),不能使用正则,区分大小写

例:精确匹配,浏览器输入ip地址/text.html,定位到服务器/var/www/html/text.html文件

 重载nginx

nginx -s reload   #如没设置环境变量或软连接使用nginx安装路径重载

例2:

匹配命中的location,使用rewrite指令,用于转发。可以理解命中了就重定向到rewrite后面的url即可

重载nginx

nginx -s reload

测试:

 

 

可以看到给30.150的demo发请求,通过rewrite 重写到了百度

2)前缀匹配

^~指令用于字符前缀匹配,不能使用正则且区分大小写,不同的是访问的url无需url匹配模式一模一样,只需要其开头前缀和url匹配模式一样即可。

location ^~ /demo {

   rewrite ^ http://360.com;

}

重载nginx   

nginx  -s  reload 

对于该模式(/demo),访问下列的地址都能匹配

 http://ip/demo

http://ip/demo/

http://ip/demo/aaa 等等

测试:

 只需要以/demo为前缀开头的url都能匹配。与该模式后的是否大小写无关。

^~不支持正则。模式/demo$中的$并不代表字符模式结束,而是一个是实实在在的$,只有访问/demo$开头的url才能匹配

前缀匹配通常用于匹配文件夹,如配置静态文件。

3)正则匹配

nginx支持正则匹配。所使用的指令是 ~ 和 ~* ,前者表示使用正则,区分大小写,后者表示使用正则,不区分大小写。

例:

vim /usr/local/nginx/conf/nginx.conf

location ~ /[0-9]emo {

   rewrite ^ http://weibo.com;

}

重载nginx

nginx -s reload

测试:

 4)正常匹配

正常匹配的指令为空,即没有指定匹配指令的即为正常匹配。其形式类似 /XXX/YYY.ZZZ正常匹配中的url匹配模式可以使用正则,不区分大小写

 location /demo {

       rewrite ^ http://baidu.com;

}

正常匹配和前缀匹配的差别在于优先级。前缀的优先级高于正常匹配。

5)全匹配

全匹配与正常匹配一样,没有匹配指令,匹配的url模式仅一个斜杠 /

location / {

    rewrite ^ http://google.com;

}

匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和一些较长的字符串将被优先查询匹配。

6)命名查询

nginx的匹配优先级遵循一个大原则和一个小细节。

大原则是关于匹配模式的优先级:

精确匹配  >  前缀匹配  >  正则匹配  > 正常匹配  > 全匹配

小细节则是同级的优先级:

面对一个location,先判断是否是正则匹配,如果是正则匹配,匹配的模式,则命中。

如果不是正则,则把匹配的模式放到一边,继续往下阅读配置,阅读完毕所有的匹配模式,查看哪一种的匹配模式更长,则是最终命中的模式。

同级匹配需注意两个细节,是否正则匹配,是否最长匹配。

7)nginx配置文件检测

nginx -t    

6.5  gzip调优 1)启用gzip

 使用gzip压缩功能,可为我们节约带宽,加快传输速度,有更好的体验,节约成本

Nginx启用压缩功能需要用ngx_http_gzip_module模块,apache使用的是mod_deflate

一般我们需要压缩的内容有:文本,js,html,css,

对于图片,视频,flash不压缩,同时也要注意,我们使用gzip的功能是需要消耗CPU的!

在http{}区域中添加:

 vim /usr/local/nginx/conf/nginx.conf

    gzip  on;
    gzip_min_length  1k; 
    gzip_buffers     4 32k;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types  text/css text/xml application/javascript;
    gzip_vary on;

 参数说明:

gzip on;        #开启压缩功能

gzip_min_length  1k;    #设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length(内容长度)中获取,默认值是0,建议设置成大于1K,如果小于1K可能会越压越大。

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

gzip_http_version 1.1;  #压缩版本,用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可。

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

gzip_types  text/css text/xml application/javascript;   #用来指定压缩的类型,‘text/html’类型总是会被压缩 

默认值: gzip_types text/html (默认不对js/css文件进行压缩)

#不能使用通配符 text/*

#(不论是否指定)text/html  默认压缩

# 设置压缩哪种文本文件可参考 conf/mime.types

gzip_vary on;   #启用应答头"Vary: Accept-Encoding"。和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩。其实cdn,代理服务器,原理上都是代理服务器。他们一般以url为key值进行缓存。而vary属性的设置,告诉了代理根据url缓存的同时,vary的信息也作为key。比如客户端(浏览器)请求的信息里带上了Accept-Encoding:gzip 则返回压缩副本。如果没有带这个头信息,默认返回非压缩副本。

6.6拷贝测试文件

 cp /etc/passwd /usr/local/nginx/html/passwd.html

cd /usr/local/nginx/html/

ll  或 du -sh *     #查看文件大小

 

 6.7测试

打开浏览器,输入测试网址

192.168.30.150/passwd.html

 按F12刷新网页,在开发人员工具里可以看到,passwd.html大小

在网页标头里可以看到,Accept-Encoding: gzip, deflate启用了gzip压缩

 6.8 expires 缓存调优

缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存365d,css,js,html可以缓存个10来天,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的扩展名列出来!

Expires缓存配置在server字段里面。

1)以扩展名区分

vim /usr/local/nginx/conf/nginx.conf

location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
                expires      365d;
        }
        location ~ .*.(js|css)?$ {
                expires      30d;
        }

 2)对目录及其进行判断:

location ~ ^/(images|javascript|js|css|flash|media|static)/ {
                expires 360d;
        }
        location ~ (robots.txt) {
                expires 7d;
                break;
        }

 注:用于中断当前相同作用域中的Nginx配置,和循环语句中的break语法类似,可以在server块和location以及if块中使用

expire功能优点:

(1)expires可以降低网站购买的带宽,节约成本

(2)同时提升用户访问体验

 (3)减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是web服务非常重要的功能

6.9 expire 功能缺点:

被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。

解决方法:

第一个 缩短缓存时间,例如:1天,不彻底,除非更新频率大于1天

第二个 对缓存的对象改名

a.图片,附件一般不会被用户修改,如果用户修改了,实际上也是更改文件名重新传了而已

b.网站升级对于js,css元素,一般可以改名,把css,js,推送到CDN。网站不希望被缓存的内容

1)广告图片

2)网站流量统计

3)更新频繁的文件(google的logo)

7.日志切割优化

日志优化的目的,为了一天日志一压缩,按天存放

7.1创建日志切割脚本

cd /usr/local/nginx/logs/

vim cut_nginx_log.sh

#!/bin/bash
date=$(date +%F -d -1day)
cd /usr/local/nginx/logs
if [ ! -d cut ] ; then
        mkdir cut
fi
mv access.log cut/access_$(date +%F -d -1day).log
mv error.log cut/error_$(date +%F -d -1day).log
/usr/local/nginx/sbin/nginx -s reload
tar -jcvf cut/$date.tar.bz2 cut/*
rm -rf cut/access* && rm -rf cut/error*
find -type f -mtime +10 | xargs rm -rf

 crontab -e 设置计划任务

  chmod +x cut_nginx_log.sh  #添加可执行

 7.2去掉不需要的日志统计

健康检查的日志,不用输入到log中,这些日志没有意义,分析的话只需要分析访问日志,看看一些页面链接,如200,301,404的状态码,在SEO中很重要,如我们统计PV是页面计算,,反而消耗了磁盘IO,降低了服务器性能

location ~ .*.(js|jpg|jpeg|JPG|JPEG|css|bmp|gif|GIF)$ {
             access_log off; #对以上.结尾的文件不做日志记录
         }

注:

不要关闭error log 启动和程序允许错误会记录到error log里

正确关闭错误的方法:

error_log /dev/null;

7.3日志格式优化

Nginx软件会把每个用户访问网站的日志信息记录到指定的日志文件里,供我们分析用户的浏览行为等,功能由ngx_http_log_module模块负责。

对应的官方地址为:Module ngx_http_log_module

Nginx的访问日志主要由两个参数控制:

参数说明
log_format定义记录日志的格式(可以定义多种日志格式,取不同名字即可)
access_log用于指定日志文件的路径及使用各种日志记录日志

Nginx日志格式中默认的参数配置:

 vim /usr/local/nginx/conf/nginx.conf #开启25-29行

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
access_log  logs/access.log  main;

1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址。

2.$remote_user :用来记录客户端用户名称。

3.$time_local : 记录访问时间与时区。

4.$request : 记录请求的url与http协议。

5.$status : 记录请求状态;成功是200。

6.$body_bytes_sent :记录发送给客户端文件主体内容大小。

7.$http_referer :记录从那个页面链接访问过来的。

8.$http_user_agent :记录客户端浏览器的相关信息。

9. $http_x_forwarded_for:客户端IP地址列表(包中间经过的代理),当前有代理服务器时设置web站点记录客户段地址的配置,此参数生效的前提是代理服务器上也进行了相关x_forwarded_for设置

例:

 8.目录文件访问控制

主要用在禁止目录下指定文件被访问

8.1禁止访问images下php程序文件

 vim /usr/local/nginx/conf/nginx.conf

location ~ ^/images/.*.(php|php5|sh|py|pl)$ {
             deny all; #对 images 下以.结尾文件禁止访问
        }

重载nginx

nginx -s reload

测试:

 8.2多个目录书写方法:

vim /usr/local/nginx/conf/nginx.conf 

location ~ ^/images/(attachment|avatar)/.*.(php|php5|sh|py|py)$ {
            deny all;
        }
8.3配置nginx禁止访问 *.txt文件 1)创建测试文件

 echo test > /usr/local/nginx/html/a.txt

测试 

 2)配置规则,禁止访问txt

vim /usr/local/nginx/conf/nginx.conf

 location ~* .(txt|doc)$ {
                   root /usr/local/nginx/html;
                 deny all;
         }

 测试:

3) 可以错误重定向到某一个URL

显示权限被拒绝可能太潦草,可以重定向到别的网站不显示403状态码

 vim /usr/local/nginx/conf/nginx.conf

location ~* .(txt|doc)$ {
                   root /usr/local/nginx/html;
                 #deny all;
                rewrite ^ http://www.baidu.com last;

测试:

 8.4对目录进行访问限制 1)创建2个目录 

mkdir -p /usr/local/nginx/html/{aa,bb}

创建测试文件:

 echo 'aa' > /usr/local/nginx/html/aa/index.html

echo 'bb' > /usr/local/nginx/html/bb/index.html

2)配置目录拒绝访问 

 vim /usr/local/nginx/conf/nginx.conf

location /aa/       { return 404 ; }
         location /bb/       { return 403 ; }

 重载nginx

 nginx -s reload

测试:

 

3)也可以配置deny all 方式拒绝

 vim /usr/local/nginx/conf/nginx.conf

 location ~ ^/(aa)/ {
                deny all;
         }
         location /bb/       { return 403 ; }

重载nginx:    nginx -s reload

 

8.5 对访问来源控制

 需要ngx_http_access_module模块支持,默认会安装。

1)修改配置文件

 vim /usr/local/nginx/conf/nginx.conf

 location ~ ^/(aa)/ {
                allow 192.168.30.0/24; #允许30.0网段IP访问
                deny all;
         }
         location /bb/       { return 403 ; }

重载nginx:nginx -s reload

测试:

 2)对整个网站根目录访问控制

 针对整个网站的写法,对/限制就OK,允许1.0网段访问网站

 location ~ /       {
                 allow 192.168.1.0/24; #可以写IP段,也可以写IP
                 deny all;
         }
3)通过if语句控制,给以友好的错误提示

 拒绝192.168.30.150访问网站

vim /usr/local/nginx/conf/nginx.conf

location ~ /   {
                 allow 192.168.30.0/24;
                 if ( $remote_addr = 192.168.30.150 ) {
                         return 404;
                 }
                 deny all;
         }

重载nginx:nginx -s reload

测试:

 9.IP和301优化

访问网站的时候,使用IP也是可以得,我们可以把这一层给屏蔽掉,让其直接反馈给403,也可以做跳转

9.1跳转的做法 1)修改配置文件

vim /usr/local/nginx/conf/nginx.conf

server {
        listen       80;
        server_name  www.benet.com benet.com;
          if ($host = 192.168.30.150) {     #客户端IP访问会重定向,IP设置时web服务器的IP
                rewrite ^ http://www.baidu.com;
          }

重载nginx:nginx -s reload

测试:

如不想跳转可以显示404状态码

 通过域名访问:

域名解析我这做是在windows上host映射 

 9.2 403反馈做法

403状态码时权限被拒绝

  vim /usr/local/nginx/conf/nginx.conf

server {
        listen       80;
        server_name  www.benet.com benet.com;
          if ($host = 192.168.30.150) {
                return 403;
          }

在通过IP访问:

 9.3 301状态码跳转做法

在域名解析过程中,将 xiaolu.com 跳转到 www.xiaolu.com

1)配置301跳转

跳转是一个url 跳转到另一个url

301永久条转  302临时跳转

 vim /usr/local/nginx/conf/nginx.conf

server {
    listen       80;
    root         html;
    server_name  www.abc.com abc.com;
    if ($host = abc.com ) {   #当访问abc.com会自动跳转到www.abc.com
       rewrite ^/(.*)$ http://www.abc.com/$1 permanent;
 }
}

重载nginx:nginx -s reload

2)修改hosts文件 

重载nginx :nginx -s reload

测试:

以跳转www.abc.com

10.防盗链 

 防止别人直接从你网站引用图片等链接,消耗了你的资源和网络流量,解决办法有几种:

1:水印,品牌宣传,你的带宽,服务器足够

2:防火墙,直接控制,前提是知道IP来源

3:防盗链策略

10.1 直接给予404的错误提示

vim /usr/local/nginx/conf/nginx.conf 

server {
    listen       80;
    server_name  www.abc.com abc.com;
    location ~* .(png)$ {
        root /var/www/html;
        valid_referers none blocked *.abc.com abc.com ;
                if ($invalid_referer) {
                 return 404;
          }
      }
    }

上传图片:

 

 访问测试:

 10.2设置图片,来做rewrite跳转

 vim /usr/local/nginx/conf/nginx.conf

 server {
    listen       80;
    server_name  www.abc.com abc.com;
    location ~* .(png)$ {
        root /var/www/html;
        valid_referers none blocked *.abc.com abc.com;
                if ($invalid_referer) {
                     return 404;
                 rewrite ^/ http://www.abc.com/html/xkl.png;
          }
      }
    }

 参数说明:
 location ~* .(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ { #需要防盗的资源
 valid_referers none blocked *.qingniao.com qingniao.com; #这是可以盗链的域名或IP地址,一般情况可以把google,baidu,sogou>,soso,bing,feedsky等域名放进来
 none 意思是不存在的Referer头(表示空的,也就是直接访问,比如直接在浏览器打开一个图片)
 blocked 意为根据防火墙伪装Referer头,如:“Referer: XXXXXXX”。
 server_names 为一个或多个服务器的列表,0.5.33版本以后可以在名称中使用“*”通配符。 

10.3防盗链测试

1)在配置文件中增加一个server域名位benet.com在测试的主页上加个超链接a标签

vim /usr/local/nginx/html/index.html

xiaolu.

重载nginx:ginx  -s reload

2)测试benet网站是否能访问abc.com

 重定向失败,可以看到超链接被拒绝了,说明防盗链做成功了。

3)要想通过benet.com 访问abc.com在配置文件里添加benet的域名

 

 重载nginx:nginx -s reload

测试访问:

 

 访问成功

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/939280.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号