1.docker介绍

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化

1.1什么是镜像:

  • 含义:镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
  • 镜像概念:所谓镜像站点,就是把一个互联网上的网站数据镜像在本地服务器,并保持本地服务器数据的同步更新,用户访问本地服务器即可获得远程服务器上同样的数据。

1.2 Docker中容器和镜像的关系是什么?

  • 镜像你可以把它看成Java中的类,而容器可以看做是类的实例化对象。
  • 一个类可以有多个对象,同理,一个镜像可以有多个容器。
  • docker的整个生命周期有三部分组成:镜像(image)+容器(container)+仓库(repository)
  • docker 容器=镜像+可读层; 容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件
  • 容器是由镜像实例化而来。简单来说,镜像是文件,容器是进程
  • 相关介绍地址 https://blog.csdn.net/qq_40722827/article/details/102827125

1.3 dockerfile

1.3.1

1.3.2


  • 1.3.3

1.3.4

1.3.5

2.nginx知识

2.1nginx背景介绍

2.1.1简介

Nginx (engine x)是一个开源、高性能的 HTTP 和反向代理 Web 服务器,同时也提供了 IMAP/POP3/SMTP 服务”。

2.1.2正向代理和反向代理概念:

  • 正向代理:局域网中的电脑用户想要直接访问网络是不可行的,只能通过代理服务器来访问,这种代理服务就被称为正向代理。
  • image.png
  • 反向代理:客户端无法感知代理,因为客户端访问网络不需要配置,只要把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据,然后再返回到客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址
  • image.png

  • 总结:正向代理服务器代理的是客户端,而反向代理服务器代理的是服务端,这是一个非常重要的区别!

    2.1.3 nginx使用场景

  • HTTP服务器:Nginx 作为 Web 服务器能独立提供 Http 服务。另外,我们常常通过 Nginx 作为静态资源服务器来访问服务器上的静态资源,比如对于最新热门的前后端分离架构,前端打好包后直接放到某个地址,在 Nginx 配置后可以通过 Nginx 来访问主机上的前端页面。

  • 反向代理:以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。这样的好处是,将不暴露内部的服务地址,只统一使用一个公共出口,通过 URI 匹配转发到不同的内部服务处理请求。

  • 负载均衡: Nginx 的一个高频使用场景,对于下游存在的多个相同服务,可以将请求采用某种策略(随机、轮询、权重)发到相应的服务处理。这样由于多个相同服务的存在,可以实现高可用功能,在一个服务不可用时,Nginx 会自动发现并将其剔出服务集群,将请求转发给正常的服务进行处理

    2.1.4nginx特点

  • 开源免费,安装简单,配置简洁,服务器本身的 Bugs 非常少;

  • 稳定的性能,丰富的功能集、示例配置文件和低系统资源的消耗;
  • 占有内存少,并发能力强 (能够支持高达 50,000 个并发连接数的响应 )。

    2.1.5nginx作用

    1.反向代理,可以拦截一些web攻击,保护后端的web服务器
    2.负载均衡,根据轮询算法,分配请求到多节点web服务器
    3.缓存静态资源,加快访问速度,释放web服务器的内存占用,专项专用

2.2 初探 nginx 架构

Nginx 在启动后,在 unix 系统中会以 daemon (守护进程)的方式在后台运行,后台进程包含一个 master 进程和多个 worker 进程。我们也可以手动地关掉后台模式,让 Nginx 在前台运行,并且通过配置让 Nginx 取消。Nginx 在启动后,会有一个 master 进程和多个 worker 进程。master 进程主要用来管理 worker 进程,包含:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker 进程。而基本的网络事件,则是放在 worker 进程中来处理了。多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。worker 进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与 Nginx 的进程模型以及事件处理模型是分不开的 master 进程

2.2.1Nginx 的进程模型

image.png

2.3 Nginx配置文件

2.3.1 nginx配置文件结构

  • 1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  • events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  • http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  • server块:配置虚拟主机的相关参数,一个http中可以有多个server。
  • location块:配置请求的路由,以及各种页面的处理情况。 ```nginx … #全局块

events { #events块 … }

http #http块 { … #http全局块 server #server块 { … #server全局块 location [PATTERN] #location块 { … } location [PATTERN] { … } } server { … } … #http全局块 }

  1. <a name="AFqi3"></a>
  2. #### 2.3.2 nginx配置文件示例
  3. ```python
  4. ########### 每个指令必须有分号结束。#################
  5. #user administrator administrators; #配置用户或者组,默认为nobody nobody。
  6. #worker_processes 2; #允许生成的进程数,默认为1
  7. #pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
  8. error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
  9. events {
  10. accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
  11. multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
  12. #use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
  13. worker_connections 1024; #最大连接数,默认为512
  14. }
  15. http {
  16. include mime.types; #文件扩展名与文件类型映射表
  17. default_type application/octet-stream; #默认文件类型,默认为text/plain
  18. #access_log off; #取消服务日志
  19. log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
  20. access_log log/access.log myFormat; #combined为日志格式的默认值
  21. sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
  22. sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
  23. keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
  24. upstream mysvr {
  25. server 127.0.0.1:7878;
  26. server 192.168.10.121:3333 backup; #热备
  27. }
  28. error_page 404 https://www.baidu.com; #错误页
  29. server {
  30. keepalive_requests 120; #单连接请求上限次数。
  31. listen 4545; #监听端口
  32. server_name 127.0.0.1; #监听地址
  33. location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
  34. #root path; #根目录
  35. #index vv.txt; #设置默认页
  36. proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
  37. deny 127.0.0.1; #拒绝的ip
  38. allow 172.18.5.54; #允许的ip
  39. }
  40. }
  41. }

2.3.3 nginx的event模块详情地址

https://www.w3cschool.cn/nginx/phjy1pen.html

2.3.4 nginx的负载均衡

  • RR(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
    • image.png
    • 这里我配置了2台服务器,当然实际上是一台,只是端口不一样而已,而8081的服务器是不存在的,也就是说访问不到,但是我们访问http://localhost 的时候,也不会有问题,会默认跳转到http://localhost:8080 具体是因为Nginx会自动判断服务器的状态,如果服务器处于不能访问(服务器挂了),就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况,由于Nginx默认是RR策略,所以我们不需要其他更多的设置。
  • 权重:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况
    • image.png
    • 那么10次一般只会有1次会访问到8081,而有9次会访问到8080
  • ip_hash:上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
    • image.png
  • fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配
    • image.png
  • url_hash(第三方):按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
    • image.png
  • 总结:以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,不过fair和url_hash需要安装第三方模块才能使用

    2.3.5 nginx作为HTTP服务器(动静分离)

    动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路
    image.png
    这样我们就可以吧HTML以及图片和css以及js放到wwwroot目录下,而tomcat只负责处理jsp和请求,例如当我们后缀为gif的时候,Nginx默认会从wwwroot获取到当前请求的动态图文件返回,当然这里的静态文件跟Nginx是同一台服务器,我们也可以在另外一台服务器,然后通过反向代理和负载均衡配置过去就好了,只要搞清楚了最基本的流程,很多配置就很简单了,另外localtion后面其实是一个正则表达式,所以非常灵活

    2.3.5 nginx作为正向代理

    正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。当你需要把你的服务器作为代理服务器的时候,可以用Nginx来实现正向代理resolver是配置正向代理的DNS服务器,listen 是正向代理的端口,配置好了就可以在ie上面或者其他代理插件上面使用服务器ip+端口号进行代理了。
    image.png

    2.3.6 nginx反向代理

    范例:使用 nginx 反向代理 www.123.com 直接跳转到127.0.0.1:8080
    ①、启动一个 tomcat,浏览器地址栏输入 127.0.0.1:8080,出现如下界面
    image.png
    ②、通过修改本地 host 文件,将 www.123.com 映射到 127.0.0.1
    将127.0.0.1 www.123.com代码添加到 Windows 的host 文件中,该文件位置在:
    image.png

配置完成之后,我们便可以通过 www.123.com:8080 访问到第一步出现的 Tomcat初始界面。

那么如何只需要输入 www.123.com 便可以跳转到 Tomcat初始界面呢?便用到 nginx的反向代理。

③、在 nginx.conf 配置文件中增加如下配置:

  1. server {
  2. 2 listen 80;
  3. 3 server_name www.123.com;
  4. 4
  5. 5 location / {
  6. 6 proxy_pass http://127.0.0.1:8080;
  7. 7 index index.html index.htm index.jsp;
  8. 8 }
  9. 9 }

如上配置,我们监听80端口,访问域名为www.123.com,不加端口号时默认为80端口,故访问该域名时会跳转到127.0.0.1:8080路径上。
image.png
④、总结
其实这里更贴切的说是通过nginx代理端口,原先访问的是8080端口,通过nginx代理之后,通过80端口就可以访问了

2.3.7 nginx.conf配置参数详解

  • listen:该指令用于配置网络监听
  • server_name:该指令用于虚拟主机的配置,可以只有一个名称,也可以有多个名称,中间用空格隔开
  • location:该指令用于匹配 URL
    • 1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
    • 2、~:用于表示 uri 包含正则表达式,并且区分大小写。
    • 3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
    • 4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
    • 注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识
  • proxy_pass:该指令用于设置被代理服务器的地址。可以是主机名称、IP地址加端口号的形式
  • index:该指令用于设置网站的默认首页
  • root:则是最上层目录的定义(一般和index结合使用)

    • 可以理解为当求地址为“/”时,会到root指定的的路径下去找index所指定的文件,一般用于访问项目首页。

      1. location / {
      2. root /var/www/;
      3. index index.htm index.html;
      4. }
    • 当用户请求 / 地址时,Nginx 就会自动在 root 配置指令指定的文件系统目录下依次寻找 index.htm 和index.html 这两个文件。如果 index.htm 文件存在,则直接发起“内部跳转”到 /index.htm 这个新的地址;而如果 index.htm 文件不存在,则继续检查 index.html 是否存在。如果存在,同样发起“内部跳转”到/index.html

  • try_files: “尝试读取静态文件” ```python location / {

    1. root /var/www/build;#上层目录,请求会从这个上层目录里去找路径/
    2. index index.html index.htm;
    3. #先尝试看访问地址是以.html结尾匹配的是$uri,若对应的uri存在则返回,否则
    4. #匹配$uri/也就是个目录,换句话说就是访问地址如getuser/结尾匹配的是$uri/
    5. #如果应用程序存在这个路径就返回对应的相应,反之就会去查找第三个参数locat
    6. #ion:@router,返回重写的index.html页面
    7. try_files $uri $uri/ @router;
    8. }

location @router { rewrite ^(.+)$ /index.html last; }

  1. - 第三方**try_files**详情参考地址[https://blog.51cto.com/riverxyz/3883300#:~:text=Nginx%20try_files,%E6%8C%87%E4%BB%A4%20%E6%8C%89%E9%A1%BA%E5%BA%8F%E6%A3%80%E6%9F%A5%E6%96%87%E4%BB%B6%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%EF%BC%8C%E8%BF%94%E5%9B%9E%E7%AC%AC%E4%B8%80%E4%B8%AA%E6%89%BE%E5%88%B0%E7%9A%84%E6%96%87%E4%BB%B6%E3%80%82
  2. ](https://blog.51cto.com/riverxyz/3883300#:~:text=Nginx%20try_files,%E6%8C%87%E4%BB%A4%20%E6%8C%89%E9%A1%BA%E5%BA%8F%E6%A3%80%E6%9F%A5%E6%96%87%E4%BB%B6%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%EF%BC%8C%E8%BF%94%E5%9B%9E%E7%AC%AC%E4%B8%80%E4%B8%AA%E6%89%BE%E5%88%B0%E7%9A%84%E6%96%87%E4%BB%B6%E3%80%82)
  3. [
  4. ](https://blog.csdn.net/xujin0/article/details/83552349)
  5. <a name="ypsa8"></a>
  6. ## 3.uWSGI知识
  7. <a name="zAPEW"></a>
  8. ### 3.1什么是uWSGI
  9. uWSGI是一个web服务器,它实现了WSGI协议、uwsgi协议、http协议等,它要做的就是把HTTP协议转化成语言支持的网络协议。比如把HTTP协议转化成WSGI协议,让Python可以直接使用
  10. <a name="m1mM4"></a>
  11. ### 3.2什么是WSGI
  12. WSGI是一种Web服务器网关接口。它是一个Web服务器(uWSGI等服务器)与web应用(如用Django/Flask框架写的程序)通信的一种协议。
  13. <a name="bVhRK"></a>
  14. ### 3.3什么是uwsgi
  15. uwsgi是一种线路协议而不是通信协议,常用于在uWSGI服务器与其他网络服务器的数据通信<br />(uwsgi是一个二进制协议允许uWSGINginx等应用服务器交互)
  16. <a name="Ljbqo"></a>
  17. ### 3.4作用:
  18. - 协议之间进行转换
  19. - Python application进行通信
  20. <a name="gQ4aA"></a>
  21. ### 3.5uwsgi.ini配置文件
  22. 启动uWSGI服务器加载Djiango项目<br />$ uwsgi --ini uwsgi.ini
  23. <a name="D0yOP"></a>
  24. #### 3.5.1 uWSGI常用配置(uwsgi.ini)
  25. ```python
  26. [uwsgi]
  27. # 以下uwsgi与nginx通信手段3选一即可
  28. # 选项2, 使用unix socket与nginx通信,仅限于uwsgi和nginx在同一主机上情形
  29. # Nginx配置中uwsgi_pass应指向同一socket文件
  30. socket=/run/uwsgi/%(project).sock
  31. # 选项2,使用TCP socket与nginx通信
  32. # Nginx配置中uwsgi_pass应指向uWSGI服务器IP和端口
  33. # socket=0.0.0.0:8000 或则 socket=:8000
  34. # 选项3,使用http协议与nginx通信
  35. # Nginx配置中proxy_pass应指向uWSGI服务器一IP和端口
  36. # http=0.0.0.0:8000
  37. # 项目目录
  38. chdir = ./
  39. # 虚拟环境目录
  40. home = ./venv
  41. # 项目的application
  42. module = 项目名.wsgi:application
  43. # 项目中wsgi.py文件的目录,相对于项目目录
  44. wsgi-file = 项目名/wsgi.py
  45. # 以独立守护进程运行
  46. master = True
  47. # 开启的进程数量
  48. processes = 4
  49. # 允许在请求中开启新线程
  50. enable-threads = true
  51. # 每个进程的线程数
  52. threads = 6
  53. # 最大超时时间
  54. harakiri = 300
  55. # 最大请求数
  56. max-requests = 5000
  57. #指定pid文件
  58. pidfile = ./uwsgi.pid
  59. # 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器
  60. daemonize = ./uwsgi.log
  61. # 为文件上传修复UnicodeEncodeError,能接受非ASCII字符的文件名
  62. env = LANG = en_US.UTF-8
  63. # 服务退出或重启,自动删除pid和socket文件
  64. vacuum = True
  65. # 设置请求的最大大小
  66. buffer-size = 65536
  67. # 序列化接受的内容,如果可能的话
  68. thunder-lock = true
  69. # 启用内存报告,报告占用的内存
  70. memory-report = true

3.5.2 如果nginx与uwsgi不在同一台服务器上,两者使用TCP socket通信时,nginx可使用如下配置

  1. server {
  2. listen 80;
  3. server_name 域名;
  4. location / {
  5. # 包含uwsgi的请求参数
  6. include uwsgi_params;#uwsgi_params文件是NginxuWSGI传递的参数
  7. # 转发动态请求给uwsgi
  8. uwsgi_pass uwsgi服务器的ip:port;#通过upstream处的域名传递给uWSGI
  9. }
  10. }
  • uwsgi_params参数内容都包含QUERY_STRING,REQUEST_METHOD,CONTENT_TYPE,CONTENT_LENGTH,CONTENT_LENGTH,PATH_INFO,DOCUMENT_ROOT,SERVER_PROTOCOL,REMOTE_ADDR,REMOTE_PORT,REMOTE_PORT,SERVER_NAME
  • ngx_http_uwsgi_module模块允许把请求传递给uwsgi服务器地址详细介绍:http://timd.cn/nginx-uwsgi/

    3.5.2 如果nginx与uwsgi不在同一台服务器上,两者使用http协议进行通信,nginx配置应修改如下

    ```python server { listen 80; server_name 域名;

    location / {

    uWSGI_SERVER_IP:port

    proxy_pass http://127.0.0.1:5000/ #必须加http:// } }

    此设定会将所有访问/的url映射到http://127.0.0.1:5000/,

    若将location改为/hello/那么所有访问/hello/的请求将会转

    发给http://127.0.0.1:5000/,这些可以理解为映射.

  1. <a name="uYzpk"></a>
  2. #### 3.5.3 如果你的nginx与uwsgi在同一台服务器上,优先使用本地机器的unix socket进行通信,这样速度更快。此时nginx的配置文件如下所示:
  3. ```python
  4. location / {
  5. include /etc/nginx/uwsgi_params;
  6. uwsgi_pass unix:/run/uwsgi/project.sock;
  7. }

nginx与uwsgi之间的通信方式参考地址:https://zhuanlan.zhihu.com/p/366440889


4. redis知识

4.1redis的介绍

Redis 是开源免费的,遵守BSD协议,是一个高性能的key-value非关系型数据库。
Redis 是一个 内存 键值 key-value 数据库,且键值对数据保存在 内存 中,因此 Redis 基于内存的数据操作,其效率高,速度快; 其中, Key 是 String 类型, Redis 支持的 value 类型包括了 String 、 List 、 Hash 、 Set 、 Sorted Set 、 BitMap 等

4.1.1 为什么使用

  • 解决应用服务器的cpu和内存压力
  • 减少io的读操作,减轻io的压力
  • 关系型数据库的扩展性不强,难以改变表结构

    4.1.2 优点

  • nosql数据库没有关联关系,数据结构简单,拓展表比较容易

  • nosql读取速度快,对较大数据处理快

4.2redis作用

可以减轻数据库压力,查询内存比查询数据库效率高

4.3redis应用场景

4.3.1 缓存

缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力

4.3.2 计数器

如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis提供的incr命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。

4.3.3 分布式锁

在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败,实际应用中要考虑的细节要更多。

4.3.4 消息队列

消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比

4.3.5 排行榜

很多网站都有排行榜应用的,如淘宝的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类构能实现各种复杂的排行榜应用

4.3.6 共享Session

如果一个分布式Web服务将用户的Session信息保存在各自服务器,用户刷新一次可能就需要重新登录了,这样显然有问题。实际上,可以使用Redis将用户的Session进行集中管理,每次用户更新或者查询登录信息都直接从Redis中集中获取。

4.3.7 社交网络

点赞、踩、关注/被关注、共同好友等是社交网站的基本功能,社交网站的访问量通常来说比较大,而且传统的关系数据库类型不适合存储这种类型的数据,Redis提供的哈希、集合等数据结构能很方便的的实现这些功能。

4.3.8 位操作

用于数据量上亿的场景下,例如几亿用户系统的签到,去重登录次数统计,某用户是否在线状态等等。腾讯10亿用户,要几个毫秒内查询到某个用户是否在线,能怎么做?千万别说给每个用户建立一个key,然后挨个记(你可以算一下需要的内存会很恐怖,而且这种类似的需求很多。这里要用到位操作——使用setbit、getbit、bitcount命令。原理是:redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统。

4.4 redis适用场景

4.4.1 数据高并发的读写

4.4.2 海量数据的读写

4.4.3 对扩展性要求高的数据

[

](https://blog.csdn.net/weixin_45827693/article/details/120525085)

4.5docker安装redis指定配置文件

4.5.1 获取Redis镜像

docker pull redis

4.5.2 查看本地镜像

docker images | grep redis

4.5.3 修改配置文件

  • 创建配置文件目录存放redis.conf,文件从官网下载
  • 创建文件夹,新建配置文件贴入从官网下载的配置文件并修改

    1. mkdir /usr/local/docker/redis
    2. vi /usr/local/docker/redis/redis.conf
  • 修改启动默认配置(从上至下依次) ```shell bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问

protected-mode no #默认yes,开启保护模式,限制为本地访问

daemonize no#默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程,改为yes会使配置文件方式启动redis失败

databases 16 #数据库个数(可选),我修改了这个只是查看是否生效。。

dir ./ #输入本地redis数据库存放文件夹(可选)

appendonly yes #redis持久化(可选)

  1. <a name="UAbhj"></a>
  2. #### 4.1.4 docker启动redis
  3. ```shell
  4. docker run -itd --name redis-test -p 6379:6379 redis

4.5.5 参数解释说明

  • —name myredis 指定该容器名称,查看和进行操作都比较方便。
  • -v 挂载目录,规则与端口映射相同。
    为什么需要挂载目录:个人认为docker是个沙箱隔离级别的容器,这个是它的特点及安全机制,不能随便访问外部(主机)资源目录,所以需要这个挂载目录机制。
    例: -v /usr/local/docker/redis/redis.conf:/etc/redis/redis.conf 容器 /etc/redis/redis.conf 配置文件 映射宿主机 /usr/local/docker/redis/redis.conf。 会将宿主机的配置文件复制到docker中
    重要: 配置文件映射,docker镜像redis 默认无配置文件。
  • -d redis 表示后台启动redis
  • redis-server /etc/redis/redis.conf 以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录/usr/local/docker/redis/redis.conf
    重要: docker 镜像reids 默认 无配置文件启动
  • —appendonly yes 开启redis 持久化

    4.5.6 查看是否运行成功

    1. [root@localhost docker]# docker ps -a | grep redis
    2. 602659d1b445 redis "docker-entrypoint.s…" 54 minutes ago Up 54 minutes 0.0.0.0:6379->6379/tcp modest_ramanujan
    3. 65bb6e6cab9f redis "docker-entrypoint.s…" About an hour ago Exited (0) About an hour ago myredis

    4.5.7 Redis配置文件redis.conf超详细的解析参考文档

    https://www.php.cn/redis/470708.html

5. WEB应用访问流程

参考地址:https://www.cnblogs.com/yanjidong/articles/13198697.html

5.1web应用访问的流程图

Docker部署 uwsgi+nginx+redis+django - 图14

5.2nginx-uwsgi-django交互流程

  • 1.首先客户端请求服务资源
  • 2.nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析
  • 3.如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源
  • 4.如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI 将接收到的包进行处理,并转发给wsgi
  • 5.wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi
  • 6.wsgi将返回值进行打包,转发给uWSGI
  • 7.uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)
  • *注:不同的组件之间传递信息涉及到数据格式和协议的转换