一、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_waitvim /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.comvalid_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为结尾的动态请求