一、Nginx动静分离
- 什么是动静分离
就是将动态的资源与静态的资源文件进行分离,如图:
文章图片
- 【Nginx(三)】目的
解决由于静态资源和动态资源竞争CPU导致的性能问题。
- 场景
主要的使用场景是 Web项目中使用。
比如:查询某个商品列表的页面,如图:
文章图片
商品列表页面初始化的时候,会加载Js和Css文件和数据库中的商品数据。
前提:并发量比较大,动态资源将cpu和内存等资源耗尽,导致静态资源无法访问,所以将项目中的静态资源进行拆分。
- 实例项目
- 条件
- Net5环境的 mvc项目
- Nginx
- 实例
- 新建Web项目,静态资源未分离的状态,如图:
文章图片
- 运行Nginx
如图:
文章图片
- 项目运行后如图:
-
文章图片
- 静态资源拆分
将项目中静态资源【wwwroot】拆分到其他文件夹中,新建一个StaticResource文件夹,
如图:
文章图片
- 新建Web项目,静态资源未分离的状态,如图:
- 条件
因项目中没有了静态资源文件,导致页面布局混乱,如图:![在这里插入图片描述](https://img-blog.csdnimg.cn/b3e5aa153a2642a2ae237c185b8421c6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQEDnpZ7lhpw=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)所以需要在Nginx服务器中配置静态文件,配置代码如下:```yaml
#配置静态资源
location ~ \.(ico|js|css|png|jpg|mp4)$ {
root 静态资源路径;
}
# ~代表优先匹配静态资源
```整体配置如下:```yaml
#usernobody;
worker_processes1;
#error_loglogs/error.log;
#error_loglogs/error.lognotice;
#error_loglogs/error.loginfo;
#pidlogs/nginx.pid;
events {
worker_connections1024;
}http {
includemime.types;
default_typeapplication/octet-stream;
server {
listen80;
server_namelocalhost;
error_page500 502 503 504/50x.html;
location = /50x.html {
roothtml;
}
#代理动态数据
location / {
proxy_passhttp://Demo.Application;
}
#代理静态资源
location ~ \.(ico|js|css|png|jpg|mp4)$ {
root D:/StaticResource/wwwroot;
}}
#负载均衡(分流配置)
upstream Demo.Application{
least_conn;
server localhost:5000;
server localhost:5001;
}
}```运行结果如图:![在这里插入图片描述](https://img-blog.csdnimg.cn/2a15fbf4618545e89035c405a51df632.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQEDnpZ7lhpw=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)按照以上的nginx配置,动态数据与静态资源还是共享CPU资源的 ,那么依然没有解决当并发量过大,动态资源将cpu和内存等资源耗尽,导致静态资源无法访问的问题,所以我们要将动态数据和静态资源放在不同的虚拟主机中,配置代码如下:```yml
worker_processes1;
events {
worker_connections1024;
} http {
includemime.types;
default_typeapplication/octet-stream;
#加载动态数据
server {
listen801;
server_namelocalhost;
error_page500 502 503 504/50x.html;
location = /50x.html {
roothtml;
}
#代理
location / {
proxy_passhttp://Demo.Application;
}
}#用来合并 动态数据和静态资源
server {
listen80;
server_namelocalhost;
error_page500 502 503 504/50x.html;
location = /50x.html {
roothtml;
} #代理 动态数据
location / {
proxy_passhttp://localhost:801;
}
#代理静态资源
location ~ \.(ico|js|css|png|jpg|mp4)$ {
proxy_pass http://localhost:802;
}
}#加载静态资源
server {
listen802;
server_namelocalhost;
error_page500 502 503 504/50x.html;
location = /50x.html {
roothtml;
} #代理静态资源
location ~ \.(ico|js|css|png|jpg|mp4)$ {
root D:/StaticResource/wwwroot;
}
}#负载均衡(分流配置)
upstream Demo.Application{
server localhost:5001;
}
}```按照以上的建立两个不同的虚拟机,但是还在一个Nginx当中,还是会存在资源竞争的问题,所以要将动态数据和静态资源放在不同的Nginx当中,【推荐使用这种方式】实现如下:- Nginx 1动态数据配置文件如下```yml
worker_processes1;
events {
worker_connections1024;
}http {
includemime.types;
default_typeapplication/octet-stream;
#加载动态数据
server {
listen801;
server_namelocalhost;
error_page500 502 503 504/50x.html;
location = /50x.html {
roothtml;
}
#代理
location / {
proxy_passhttp://Demo.Application;
}
}
#负载均衡(分流配置)
upstream Demo.Application{
server localhost:5001;
}
}```- Nginx2静态资源 配置文件如下```yml
worker_processes1;
events {
worker_connections1024;
}http {
includemime.types;
default_typeapplication/octet-stream;
#加载静态资源
server {
listen802;
server_namelocalhost;
error_page500 502 503 504/50x.html;
location = /50x.html {
roothtml;
} #代理静态资源
location ~ \.(ico|js|css|png|jpg|mp4)$ {
root D:/StaticResource/wwwroot;
}
}
}```- Nginx3 合并资源配置文件如下```yml
worker_processes1;
events {
worker_connections1024;
}http {
includemime.types;
default_typeapplication/octet-stream;
#用来合并 动态数据和静态资源
server {
listen80;
server_namelocalhost;
error_page500 502 503 504/50x.html;
location = /50x.html {
roothtml;
} #代理 动态数据
location / {
proxy_passhttp://localhost:801;
}
#代理静态资源
location ~ \.(ico|js|css|png|jpg|mp4)$ {
proxy_pass http://localhost:802;
}
}
}
```
二、Nginx代理缓存
- 条件
- 定义缓存
proxy_cache_path /cache/nginx/ levels=1:2 keys_zone=mycache:64m;
- 存储缓存
#代理 动态数据 location / { proxy_cache mycache; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_cache_methods GET HEAD; proxy_cache_revalidate on; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid any 1m; proxy_cache_min_uses 1; proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504; proxy_passhttp://localhost:801; }
- 建缓存文件夹
nginx-1.20.0\cache\nginx
- 定义缓存
- 运行 结果如下
如图:
文章图片
文章图片
- 缺陷
- 如果把数据库的数据改了,则页面不会发生变化,缓存时间过期后,则会发生变化。
解决方案:使用Redis来解决。
- 如果把数据库的数据改了,则页面不会发生变化,缓存时间过期后,则会发生变化。
- 生成证书的工具
- 生成工具: https://slproweb.com/download...
- 生成教程: https://jingyan.baidu.com/art...
- 使用命令
include配置文件名称.conf #备注 在nginx配置文件下创建配置文件
- 四层反向代理 mysql数据库
配置如下:
stream { server { listen 13306; proxy_connect_timeout 1s; proxy_timeout 3s; proxy_pass localhost:3306; } upstream mysql { server localhost:3306; } }
推荐阅读
- Nginx(一)
- Nginx的五大应用场景
- 微服务学习|Nginx学习笔记
- Linux|Nginx反向代理部署多个项目
- Nginx前端入门
- 其他|单点登录的几种方案
- nginx|Nginx+Tomcat负载均衡,动静分离群集
- nginx|Nginx优化与防盗链
- Go|Docker后端部署详解(Go+Nginx)