Nginx性能优化(下)

简介: Nginx性能优化(下)

3、try_files的使用(页面跳转)


  • 实验环境:


系统 ip 主机名 ngixn版本
Centos7.4 192.168.100.202 rzy nginx-1.18.0
Centos7.4 192.168.100.203 rzy02 nginx-1.18.0


  • 实验步骤


nginx的try_files按顺序检查文件是否存在,不存在就按照指定路径跳转


rzy配置:

******(1)使用源码包方式安装nginx(略)
******(2)修改配置文件,利用$uri进行本地页面跳转
[root@rzy ~]# vim /usr/local/nginx/conf/nginx.conf
。。。。。。 #修改文件,删除多余注释
 35     server {
 36         listen       80;
 37         server_name  localhost;
 38         root   html;
 39         index  index.html ;
 40         location / {
 41              try_files $uri $uri/ /aaa/index.html;  #uri判断默认目录下也就是访问的指定目录下有没有index.html文件的存在,存在则显示,不存在则通过$uri/重定向到/aaa/index.html,输出index.html的内容,这里的location是/默认匹配,即不管后面访问什么资源都进行跳转
 42         }
 43         error_page   500 502 503 504  /50x.html;
 44         location = /50x.html {
 45             root   html;
 46         }
 47     }
。。。。。。
#保存退出
[root@rzy ~]# cd /usr/local/nginx/html/ #进入默认的网页目录
[root@rzy html]# ll
总用量 8
-rw-r--r-- 1 root root 494 4月  21 00:03 50x.html
-rw-r--r-- 1 root root 612 4月  21 00:03 index.html
[root@rzy html]# echo "aaaaaaaaa" > index.html   #重新写一个页面
[root@rzy html]# /usr/local/nginx/sbin/nginx  #启动nginx
[root@rzy html]# curl 127.0.0.1  #访问本地测试是否可以正常访问
aaaaaaaaa
[root@rzy html]# mkdir aaa #在当前html目录下创建aaa目录
[root@rzy html]# echo "bbbbbbbbbb" > aaa/index.html #在aaa目录写一个页面
[root@rzy html]# rm -rf index.html  #删除当前html目录的index.html页面
[root@rzy html]# curl 127.0.0.1/afsdf #进行测试,发现就算不是访问aaa目录也能跳转到aaa目录的页面
bbbbbbbbbb
******(3)再次修改配置文件,利用porxy_pass和$uri进行网页跳转
[root@rzy html]# vim /usr/local/nginx/conf/nginx.conf
。。。。。。
 35     server {
 36         listen       80;
 37         server_name  localhost;
 38         root   html;
 39         index  index.html ;
 40         location / {
 41              try_files $uri @java_page; #配置眺转,这个@后面的字符只要跟下面的location匹配就行
 42         }
 43         location @java_page{
 44              proxy_pass http://192.168.100.203;  #配置跳转的java_page是http://192.168.100.203
 45         } 
 46         error_page   500 502 503 504  /50x.html;
 47         location = /50x.html {
 48             root   html;
 49         }
。。。。。。
#保存退出
[root@rzy html]# curl 127.0.0.1 #先进行访问
aaaaaaa
[root@rzy html]# ll
总用量 8
-rw-r--r-- 1 root root 494 4月  21 00:03 50x.html
drwxr-xr-x 2 root root  24 4月  21 00:08 aaa
-rw-r--r-- 1 root root   8 4月  21 00:10 index.html
[root@rzy html]# rm -rf index.html  #删除index.html
[root@rzy html]# killall -9 nginx  #关闭nginx
[root@rzy html]# /usr/local/nginx/sbin/nginx  #开启nginx使配置文件生效
[root@rzy html]# curl 127.0.0.1  #再次访问本地,发现访问的是192.168.100.203的页面,说明成功跳转
rzy-02

rzy02配置:

******(1)使用源码包方式安装nginx(略)
******(2)配置网页开启Nginx即可
[root@rzy02 ~]# echo "rzy-02" > /usr/local/nginx/html/index.html 
[root@rzy02 ~]# /usr/local/nginx/sbin/nginx 
[root@rzy02 ~]# curl 127.0.0.1
rzy-02

4、alias与root的区别


  • 实验环境:


系统 ip 主机名 ngixn版本
Centos7.4 192.168.100.202 rzy nginx-1.18.0


  • 实验步骤


******(1)使用源码包方式安装nginx
******(2)修改配置文件,root的作用
[root@rzy ~]# vim /usr/local/nginx/conf/nginx.conf
。。。。。。
 35     server {
 36         listen       80;
 37         server_name localhost;
 38         location /bbb/aaa {  #指定访问的资源,即用户访问服务器下的/bbb/aaa时,实际显示的时/html/bbb/aaa下的index,html
 39         root html;     #root只能写一个,location写了server就不能写了
 40         index index.html;
 41         }
 42     }
 43 }
。。。。。。
#保存退出
[root@rzy ~]# cd /usr/local/nginx/html/ 
[root@rzy html]# mkdir -p bbb/aaa
[root@rzy html]# mkdir -p bbb/aaa
[root@rzy html]# echo "aaaaaa" > bbb/aaa/index.html
[root@rzy html]# curl http://192.168.100.202/bbb/aaa/
aaaaaa   #实际访问的是/html/bbb/aaa/index.html
******(3)修改配置文件,alias的作用
[root@rzy html]# vim /usr/local/nginx/conf/nginx.conf
。。。。。。
 35     server {
 36         listen       80;
 37         server_name localhost;
 38         location /bbb/aaa {   #访问/bbb/aaa/时会跳转
 39         alias html;   #root修改为alias,会直接跳转
 40         index index.html;
 41         }
 42     }
。。。。。。
#保存退出
[root@rzy html]# echo "111111" > index.html
[root@rzy html]# killall -9 nginx
[root@rzy html]# /usr/local/nginx/sbin/nginx 
[root@rzy html]# curl http://192.168.100.202/bbb/aaa/ #再次访问发现直接跳转了
111111
******(4)alias和root的区别
root指定路径例如:
   location /bbb/aaa {
        root html;
        index index.html;
        }
location指定资源,即用户访问这个资源的时候location中的配置才会生效,location / 默认匹配则全部生效
这里的配置,即用户访问/bbb/aaa/资源时,location中的配置生效,root其实就是又加了一个根路径。用户实际访问变成了/html/bbb/aaa/下的资源
alias指定路径例如:
   location /bbb/aaa {
        alias html;
        index index.html;
        }
这里的location和上面的相同。都是用户访问/bbb/aaa的资源才会生效
alias在用户界面的命令中就是别名的意思,在这里也一样的,用户实际访问直接变成了/html/下的资源


5、获取用户真实ip


  • 实验环境:


系统 ip 主机名 ngixn版本
Centos7.4 192.168.100.202 rzy nginx-1.18.0
Centos7.4 192.168.100.203 rzy02 nginx-1.18,0


  • 实验步骤


rzy配置

******(1)使用源码包方式安装nginx(略)
******(2)修改配置文件
[root@rzy html]# vim /usr/local/nginx/conf/nginx.conf
。。。。。。
 35     server {
 36         listen       80;
 37         server_name localhost;
 38         root html;
 39         index index.html ;
 40         location / {
 41           try_files $uri @aaa;    #配置网页调转
 42         }
 43         location @aaa {
 44              proxy_pass http://192.168.100.203;  #跳转到100.203
 45         }
 46     }
 47 }
。。。。。。
#保存退出
[root@rzy html]# killall -9 nginx
[root@rzy html]# /usr/local/nginx/sbin/nginx  #重启


rzy02配置


******(1)使用源码包方式安装nginx(略)
******(2)配置网页目录和开启 Nginx即可
[root@rzy02 ~]# echo "rzy-02" > /usr/local/nginx/html/index.html 
[root@rzy02 ~]# /usr/local/nginx/sbin/nginx 
[root@rzy02 ~]# curl 127.0.0.1
rzy-02

先使用本机浏览器访问,发现可以成功眺转

20210511092014957.png

******(1)分别查看两台服务器的nginx访问日志
rzy:
[root@rzy html]# tail -1 /usr/local/nginx/logs/access.log  
192.168.100.230 - - [21/Apr/2021:01:13:50 +0800] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.100.202/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400"
#可以发现是100.230访问了rzy
rzy02:
[root@rzy02 ~]# tail -1 /usr/local/nginx/logs/access.log 
192.168.100.202 - - [21/Apr/2021:00:42:48 +0800] "GET /favicon.ico HTTP/1.0" 404 555 "http://192.168.100.202/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400"
#但是在rzy02只看到是rzy访问了,看不到是谁真正的访问了它
******(2)配置rzy来使rzy02可以看到真正访问它的ip地址
[root@rzy html]# vim /usr/local/nginx/conf/nginx.conf
。。。。。。
 35     server {
 36         listen       80;
 37         server_name localhost;
 38         root html;
 39         index index.html ;
 40         location / {
 41           try_files $uri @aaa;
 42         }
 43         location @aaa {
 44             proxy_pass http://192.168.100.203;
 45             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #添加这段配置
 46         }
 47     }
 48 }
。。。。。。
#保存退出
[root@rzy html]# killall -9 nginx                                                                              
[root@rzy html]# /usr/local/nginx/sbin/nginx  #重新启动nginx
******(3)再次使用本机的浏览器访问rzy,然后查看日志
rzy:
[root@rzy html]# tail -1 /usr/local/nginx/logs/access.log 
192.168.100.230 - - [21/Apr/2021:01:19:46 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400"
rzy02:
[root@rzy02 ~]# vim /usr/local/nginx/conf/nginx.conf
。。。。。。
 21     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  #把这三行去掉注释,让配置项生效
 22                       '$status $body_bytes_sent "$http_referer" '
 23                       '"$http_user_agent" "$http_x_forwarded_for"';
 24 
。。。。。。
#保存退出
[root@rzy02 ~]# killall -9 nginx
[root@rzy02 ~]# /usr/local/nginx/sbin/nginx  #重启服务
[root@rzy02 ~]# > /usr/local/nginx/logs/access.log  #清空日志
[root@rzy02 ~]# tail -f /usr/local/nginx/logs/access.log   #tail -f 即实时查看
192.168.100.202 - - [21/Apr/2021:00:54:14 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400" "192.168.100.230"
#发现在日志的最后增加了一个ip地址,而这个ip就是访问rzy02的真实ip


6、网站访问原理


  • DNS流程,即解析域名


  1. 先查询本地hosts文件
  2. 请求本地localDNS
  3. 返回对应的IP地址


  • HTTP连接


1.首先先建立TCP连接,即TCP的三次握手,发送请求内容、请求起始行、请求头部、请求的主体


将请求传递给负载均衡,通过负载均衡做出相应的请求调度


如果请求的是静态页面,那么会将请求调度到对应的静态集群解析


如果请求的是动态页面,那么会将请求调度到对应的动态集群解析


如果仅仅是请求页面,那么可以会通过Opcache


2.如果请求的页面需要查询数据库,或者是往数据库输入内容,那么就需要进行检查


检查对应的操作是查询还是写入,如果是查询数据库

会检查查询的内容是否有缓存,如果有缓存则返回,没有缓存则开始从数据库查询数据

检查查询语句,将查询结果返回


3.返回对应客户端的请求内容至WEB节点


4.WEB节点收到请求后返回内容至负载均衡


5.负责均衡返回客户端内容,然后TCP连接断开,即TCP的四次断开


6.HTTP断开连接


  • 按照分层结构,每一层都有其对应的缓存机制


image.png

7、Nginx优化方案总结


  1. Gizp压缩
  2. Expires静态文件缓存
  3. 调整网络IO模型,调整Nginx worker进程的最大连接数
  4. 隐藏Nginx名称和版本号
  5. 配置防盗链,防止资源被盗用
  6. 禁止通过ip地址访问,进程恶意域名解析,只允许域名访问
  7. 防止DDos、CC攻击,限制单ip并发请求连接
  8. 配置错误页面,根据错误代码指定网页反馈用户
  9. 限制上传资源目录被程序访问,防止木马入侵系统
  10. Nginx加密传输优化


接**


1.首先先建立TCP连接,即TCP的三次握手,发送请求内容、请求起始行、请求头部、请求的主体


将请求传递给负载均衡,通过负载均衡做出相应的请求调度


如果请求的是静态页面,那么会将请求调度到对应的静态集群解析


如果请求的是动态页面,那么会将请求调度到对应的动态集群解析


如果仅仅是请求页面,那么可以会通过Opcache


2.如果请求的页面需要查询数据库,或者是往数据库输入内容,那么就需要进行检查


检查对应的操作是查询还是写入,如果是查询数据库

会检查查询的内容是否有缓存,如果有缓存则返回,没有缓存则开始从数据库查询数据

检查查询语句,将查询结果返回


3.返回对应客户端的请求内容至WEB节点


4.WEB节点收到请求后返回内容至负载均衡


5.负责均衡返回客户端内容,然后TCP连接断开,即TCP的四次断开


6.HTTP断开连接


  • 按照分层结构,每一层都有其对应的缓存机制


image.png

7、Nginx优化方案总结


  • Gizp压缩
  • Expires静态文件缓存
  • 调整网络IO模型,调整Nginx worker进程的最大连接数
  • 隐藏Nginx名称和版本号
  • 配置防盗链,防止资源被盗用
  • 禁止通过ip地址访问,进程恶意域名解析,只允许域名访问
  • 防止DDos、CC攻击,限制单ip并发请求连接
  • 配置错误页面,根据错误代码指定网页反馈用户
  • 限制上传资源目录被程序访问,防止木马入侵系统
  • Nginx加密传输优化
目录
相关文章
|
设计模式 Oracle Java
设计模式--- 桥接模式、JDBC 源码剖析(桥接)
设计模式--- 桥接模式、JDBC 源码剖析(桥接)
240 2
|
4月前
|
弹性计算 负载均衡 定位技术
阿里云服务器ECS【地域】如何选择?不同地域区别及优缺点对比
阿里云服务器地域选择需综合考虑用户地理位置、网络延迟、备案要求、内网互通、价格差异及产品功能等因素。建议根据用户所在地区就近选择地域,以降低延迟、提升访问速度。同时注意地域一旦选定不可更改,需谨慎选择。
1145 155
|
机器学习/深度学习 并行计算 Shell
docker 获取Nvidia 镜像 | cuda |cudnn
本文分享如何使用docker获取Nvidia 镜像,包括cuda10、cuda11等不同版本,cudnn7、cudnn8等,快速搭建深度学习环境。
7636 0
|
12月前
|
前端开发 NoSQL Java
【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
本文介绍了如何配置和启动基于Java的若依(RuoYi)项目,涵盖后端和前端的详细步骤。首先,准备Redis、MySQL以及IDE(如Idea和VS)。接着,通过GitHub获取代码并导入到IDE中,执行必要的SQL文件和配置数据库密码。然后,启动Redis并进行相关配置。最后,按照前端配置步骤克隆前端代码库,打开终端执行命令完成前端配置。整个过程详细记录了每一步的操作,帮助开发者顺利部署若依项目。 如果你觉得有帮助,请点赞、关注和收藏,这将是我持续分享的动力!
6161 4
|
计算机视觉
【YOLOv8改进】 AFPN :渐进特征金字塔网络 (论文笔记+引入代码).md
YOLO目标检测专栏介绍了YOLO的有效改进和实战案例,包括AFPN——一种解决特征金字塔网络信息丢失问题的新方法。AFPN通过非相邻层直接融合和自适应空间融合处理多尺度特征,提高检测性能。此外,还展示了YOLOv8中引入的MPDIoU和ASFF模块的代码实现。详情可参考提供的专栏链接。
Qt6自定义QML控件的方式
Qt6自定义QML控件的方式
546 1
|
监控 安全 Java
Spring Boot日志文件(一)
Spring Boot日志文件
224 0
Spring Boot日志文件(一)
|
XML Dubbo NoSQL
SpringBoot从入门到精通(全)
前言 ==本博文结合软件idea进行主要讲解== **springboot的特性主要有** - 简化 Spring 应用程序的创建和开发过程 - 抛弃了繁琐的 xml 配置过程,采用大量的默认配置简化以及注解反射 - 直接使用 java main 方法启动内嵌的 Tomcat 服务器运行 Spring Boot 程序,不需要部署 war 包文件 **四大核心**分别为自动配置、起步依赖、Actuator和命令行界面
662 0
SpringBoot从入门到精通(全)
|
Linux
手把手教你 Linux 三种网络配置方法
手把手教你 Linux 三种网络配置方法
367 0
手把手教你 Linux 三种网络配置方法
|
Web App开发 存储 前端开发
WEB 剪切板操作navigator.clipboard的使用
浏览器允许 JavaScript 脚本读写剪贴板,自动复制或粘贴内容,而这一切都是通过 navigator clipboard 的API来实现的。剪贴板可以用于存储数据并在应用程序内部或应用程序之间使用的临时空间。这些操作的 API 都是异步操作并返回一个 promise。
2747 0