nginx优化和location匹配

发布于:2024-12-18 ⋅ 阅读:(116) ⋅ 点赞:(0)

一、nginx优化

1.隐藏版本号

  • 隐藏版本号(通用)

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

http{

server_tokens off;

}

#只是隐藏版本,服务名称还在

  • 修改源码文件,仅限于编译安装

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

http{

server_tokens on;

}

vim /opt/nginx-1.22.0/src/core/nginx.h

#修改第13、14行

#重新编译、安装

cd nginx-1.22.0/

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module

make  -j  4  &&  make  install

2.使用shell脚本实现日志分割

cd /opt

vim nginx.log.sh

#!/bin/bash

d=$(date+ %Y-%m-%d) #直接获取当前的日期

dir="/usr/local/nginx/logs" #获取日志目录所在的位置

#获取需要分割的日志文件

logs_access='/usr/local/nginx/logs/access.log'

logs_error='/usr/local/nginx/logs/error.log'

pid_file='/usr/local/nginx/run/nginx.pid' #定义pid文件的位置

if [ ! -d "$dir" ]

then

mkdir -p $dir

fi

mv ${logs_access} ${dir}/access_${d.log}

mv ${logs_error} ${dir}/error_${d.log}

kill -USR1 $(cat ${pid_file})

#-USR1 通过kill发送USR1这个信号,给nginx的主进程,让Nginx重新生成access.log和error.log

#日志清理,清理30天以前的日志

find $dir -mtime +30 -exec rm -rf {} \;  

#用定时任务生成每日的日志

chmod 777 nginx.logs.sh

crontab -e

0  0  *  *  *  /opt/nginx.logs.sh

3.nginx的页面压缩

作用:对文件进行压缩的功能,节约带宽,提高访问速度。

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

http {

gzip on;
#开启nginx的页面压缩模块
gzip_min_length 1k;
#最小压缩文件(大于1K以上的文件才会进行压缩)
gzip_buffers 4 64k;
#设置压缩的一个缓冲区,把缓冲区分为4个,每个缓冲大小为64K
gzip_comp_level 6;
#压缩的等级1-9,既保证了压缩也兼顾了速度
gzip_vary on;
#前端的缓存服务器存储压缩的页面
gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif application/x-httpd-php application/javascript application/json;
#支持压缩的文件类型,如果写明表示有上述文件会进行压缩

}

4.keepalive和time_out

连接保持 

http1.1之后特有的模式,keepalive模式,主流的前端软件都支持keppalive。

数据传送完毕之后,连接不是立刻断开,而是一段时间之内保持连接,无需再进行三次握手。

如果需要传输数据,可以继续使用这个连接。

连接保持的时间不宜太长,一般在60-18,keepalive的连接保持时间太长,会占用过多的系统资源,影响性能。

连接保持是关于连接的控制

会话保持

客户端和服务端建立连接之后,在一定时间内保持登录或者固定的状态,保证在浏览时数据一致。 

会话保持是关于交互的控制。

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

http {

client_header_timeout 80;
#客户端向服务端发送一个完整请求头的超时时间,如果80s内没有,nginx就会返回408
client_body_timeout 80;
#客户端和服务端建立连接之后,没有在规定时间内发送一个完整的请求体,或者没有请求任何内容,nginx也会返回408

}

5.nignx的并发处理和time_wait的回收机制

  • 并发处理 

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

worker_processes 4; #修改为内核数量的两倍或者一致,一般设置4个,不能超过8个,超过8个性能反而会降低

events {

worker_connections 1024;

}

http {

worker_cpu_affinity 0001 0010 0100 1000; #绑定到CPU核心0, 1, 2, 3,防止cpu之间的切换,提高性能

}

如果要修改并发数,需要修改/etc/security/limits.conf

*soft nproc 65536

*hard nproc 65536

*soft nofile 65536
*hard nofile 65536

  • time_wait的回收机制

timewait回收机制是tcp连接当中的一种正常状态。http1.1版本多了一个连接保持。
time_wait状态下,tcp连接处于等待状态,等待一个持续的时间,确保双方的数据尽可能的传输完毕
两个目的:
(1)确保连接时被可靠的关闭,即便是四次挥手之后,对方还可能有数据未处理完毕,在time_wait阶段可以保证数据包依然被正确的处理,防止旧的数据包影响其他新的连接;
(2)避免出现连接复用的问题:如果time_wait不存在,或者时间较短,旧的连接可能依然处于网络中,有可能被认为新的连接。

当服务器上同时有大量的短连接,频繁的创建和销毁,或者处理大量并发连接时,time_wait就会出现堆积。如果堆积的数量太多,需要系统能够尽快的把time_wait回收。

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
#查看tcp连接状态和time_wait

vim /etc/sysctl.conf #修改内核配置的文件
net.ipv4.tcp_syncookies=1
#表示开启SYN cookies,当syn等待连接的队列溢出,启用cookies来进行处理

net.ipv4.tcp_tw_reuse=1
#让time_wait状态的连接可以复用,time_wait状态的连接占用了所有端口,也不会拒绝新的请求

net.ipv4.tcp_fin_timeout=65
#保持在fin-wait-2状态的时间,表示套接字文件由本端关闭

#net.ipv4.tcp_tw_recycle=1(ubuntu内核不支持,centos支持)
#让time_wait尽快回收
#ubuntu不支持的原因是:在NAT环境中,地址转换,会加速系统回收timewait,在net环境中,源地址会发生变化,他总是基于源ip地址进行识别,多个客户端使用一个相同的外部地址时,连接混淆的情况,导致客户端无法正确连接

fin-wait-1:终止等待1,表示应用程序已经发送了连接关闭的请求,正在等待另一端的确认。

fin-wait-2:表示另一端已经确认连接关闭的请求,正在等待另一端发送连接关闭的请求。

6.配置防盗链

防止别的用户通过链接的方式盗用网站的图片。

实验:nginx1的www.xy104.com的网页内有一张图片,nginx2的www.xy105.com直接盗用了xy104.com里面图片的链接,但是只能显示error

nginx1的配置:

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

#添加一个location匹配机制

location ~* \.(gif|jpg|jpeg)$ {               #括号里不能再或上png,否则error.png无法显示

    root html;
    expires 1d;
    #正则匹配的方式,表示访问以.gif .jpg .jpeg为结尾的文件,缓存一天
    

#valid_referers  设置信任的网站可以正常的使用图片

#none  允许没有http_refer的请求, www.xy104.com/ls.jpg = www.xy104.com

#blocked  允许不是http:// 开头的请求 
#invaild_referer 不是信任的网站的地址,就认为是真 true,为真执行rewrite就是重写,重定向访问:http://www.xy104.com

    valid_referers none blocked *.xy104.com xy104.com;
    if ( $invalid_referer ) {
    
        rewrite ^/ http://www.xy104.com/error.png;
        #嫌麻烦也可以直接设置return 403
    
    }

}

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

<img src="2.jpg"/>
</body>
</html>

vim /etc/hosts

192.168.206.60 www.xy104.com

192.168.206.70 www.xy105.com

nginx1的配置:

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

<img src="http://www.xy104.com/2.jpg"/> 
</body>
</html>

vim /etc/hosts

192.168.206.60 www.xy104.com

192.168.206.70 www.xy105.com

二、location匹配的规则和优先级

在nginx当中,匹配的对象一般是根据URI来匹配。

完整的链接地址:http://192.168.206.60/usr/local/nginx/html/index.html

但是一般输入192.168.206.60/就能找到是因为设置了location匹配。

1.location匹配的分类

  • 精确匹配

location = / {...}

=: 完全相同,一个字错都匹配不到

  • 正则匹配

location ~ / {..}

^_ 表示普通字符的前缀匹配,如果匹配成功,不再匹配其他的的location

~ 区分大小写的字符匹配

~* 不区分大小写进行匹配 (最常用)

!~ 区分大小写,匹配的取非

!~* 不区分大小写,匹配取非

  • 一般匹配

location /

2.location匹配的优先级

精确匹配>正则匹配>一般匹配

location = > location ^~ > location ~或者~* > location /test1 > location /

实验:创建三个文件夹,放入不同的图片,但都命名为1.jpg,通过location匹配来查看三种匹配的优先级

#创建文件夹

mkdir -p /data/nginx/static1

mkdir -p /data/nginx/static2

mkdir -p /data/nginx/static3

vim  /usr/local/nginx/conf/nginx.conf #修改配置文件

#每次修改完毕需要重启服务

systtemctl  restart  nginx

 

 

 

 

3.网站配置的location的规则

  • location = / {}

直接匹配网站的根目录,也就是网站的首页。首页一般都是一个静态页面,直接匹配可以提高访问速度

  • 处理静态文件的请求

通过前缀或者是后缀进行匹配的规则:

location ^~ /static {}

location ~* \ .{jsp|gif|png|html|php}$ {}

  • 通用匹配

location /  {}

一般用来转发包含.php或者.jsp为结尾的动态请求


网站公告

今日签到

点亮在社区的每一天
去签到