目录

1.Nginx进程

2. 设置Nginx运行进程个数

2.1查看cpu个数

 2.2设置Nginx中进程数

 2.3重载nginx配置文件

2.4查看nginx进程数

 3.Nginx运行cpu亲和力

3.1 4核4线程配置

3.2  8核8线程配置

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

4. Nginx最多可以打开文件数

 4.1设置nginx最大可打开文件数

4.2修改系统可以打开的最大文件数 

1)临时修改 

2)永久修改 

 5.Nginx事件处理模型

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

6.http主体优化 

6.1开启高效传输模式

6.2长连接超时时间 

6.3文件上传大小限制

6.4 location匹配

1)精确匹配

2)前缀匹配

3)正则匹配

​编辑 4)正常匹配

5)全匹配

6)命名查询

6.5  gzip调优

1)启用gzip

6.6拷贝测试文件

 6.7测试

​编辑 6.8 expires 缓存调优

1)以扩展名区分

6.9 expire 功能缺点:

7.日志切割优化

7.1创建日志切割脚本

 7.2去掉不需要的日志统计

7.3日志格式优化

 8.目录文件访问控制

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

​编辑 8.2多个目录书写方法:

8.3配置nginx禁止访问 *.txt文件

1)创建测试文件

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

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

 8.4对目录进行访问限制

1)创建2个目录 

2)配置目录拒绝访问 

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

8.5 对访问来源控制

1)修改配置文件

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

3)通过if语句控制,给以友好的错误提示

 9.IP和301优化

9.1跳转的做法

1)修改配置文件

 9.2 403反馈做法

 9.3 301状态码跳转做法

1)配置301跳转

2)修改hosts文件 

10.防盗链 

10.1 直接给予404的错误提示

 10.2设置图片,来做rewrite跳转

10.3防盗链测试


查看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

<a href="http://abc.com/xkl.png">xiaolu</a>.</p>

重载nginx:ginx  -s reload

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

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

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

 重载nginx:nginx -s reload

测试访问:

 访问成功

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐