设为首页 收藏本站
查看: 1712|回复: 0

[经验分享] nginx-10947928

[复制链接]

尚未签到

发表于 2018-11-9 12:52:07 | 显示全部楼层 |阅读模式
  假如前端是LVS或者nginx,后端是Apache服务器
  nginx反向代理服务器,lvs代理服务器
  nginx的LVS的区别
  如果是lvs,lvs只是把用户发来的请求数据包转到后端的服务器,后端的服务器看到是用户请求是来自于客户端
  如果是nginx,nginx不是转发用户发来的请求,而是代替用户去后端的Apache服务器去访问,后端Apache服务器看到的用户请求是来自nginx服务器,这叫反向代理
  lvs 工作在内核级,支持并发400万
  nginx工作在应用级,支持并发3万
  nginx代替远程主机访问服务器
  nginx的并发是30000
  nginx新版本支持动态部署模块
  支持高可用
  支持热部署,不停机升级版本,新发起的请求,在新版本响应,如果是一个连接旧版本,就在旧版本响应,当旧的访问结束了,新发起的请求我们就可以连接新的版本。也加平滑升级
  低内存消耗
  支持的模块 event-driven ,aio,mmap,sendfile
  nginx是一个优秀的静态资源的web服务器,用来存放一些静态的页面
  例如:html,图片,js,css,txt等静态资源
  nginx还可以充当http协议的反向代理服务器
  nginx还可以充当邮件的反向代理服务器
  nginx支持fastcgi
  nginx支持动态加载模块
  lnmp :linux nginx mysql php-fpm php-mysql 注:php-fpm是fastcgi
  nginx充当的是fastcgi的客户端,nginx要监听fastcgi的9000端口
  客户端连接nginx,nginx连接php-fastcgi,php-fastcgi连接php-mysql,php-mysql在连接mysql数据库
  web服务器的功能
  支持室内主机
  支持keep-alive和管道连接
  访问日志
  url rewirte 地址重写
  路径别名
  基于ip及用户的访问控制
  支持速率限制及并发数字限制
  支持平滑升级
  nginx处理并发用户请求
  事件驱动或异步模型,
  主进程master负责生成子进程并读取重载配置文件等等
  而子进程worker连接各种所需要的模块来处理用户请求,而处理请求时基于事件驱动模型能实现单进程处理多路请求,单个进程能处理连接数由worker kenaiks定义,而一共能启用的进程数只有worker_processes定义,二者的乘级就是他能处理的并发连接请求数量
  nginx的架构
  nginx是一个master开多个worker,但是worker不多。但是每个worker可以并发支持很多人的访问,worker中没有线程,用的是I/O复用,
  一个worker就可以支持上万的用户请求,
  worker支持很多模块,每个模块有特定的功能,例如:web服务,代理服务,fastcgi
  当用户发来请求,用worker提供服务
  master和worker之间的关系:master管理worker进程,例如:销毁,会加载一个worker,平滑升级,都是master进程来负责的,master相当老板,用户发来请求,master不会提供服务
  nginx支持反向代理:nginx可以将用户的请求调度到后端的web服务器,或者fastcgi服务器
  nginx还支持缓存功能:用户将请求发给nginx,nginx可以缓存一份数据,下次用户访问就可以直接在缓存中响应请求,就不用到后端服务器去重新查找数据。nginx基于缓存加载,缓存管理的功能。这个缓存放在内存中也可能放在nginx磁盘里
  nginx的特性
  multiplexing 多路复用
  via kevent/epoll
  event-drivent 异步
  asynchronous 事件驱动
  non-blocking 非阻塞
DSC0000.jpg

  HTTP 和nginx的相同点和不同点
  Apache支持多http虚拟主机,不支持多https虚拟主机
  nginx支持多https虚拟主机,因为nginx支持SNI
  apache的并发只能达到10000,而nginx能轻松达到30000
  nginx支持epoll
  apache支持select
  select 跨平台,在linux实现了,也在windows支持
  epoll :epoll比select有巨大的区别,因为epoll具有信号驱动I/O模型的某些特性
  epoll和select的区别
  select和epoll都可以面对多个用户的进程发请求,select和epoll相当代理人收集很多用户的请求过来,然后收集完成,select和epoll去帮你从磁盘上发数据,得到数据方复制到内核中,来得到相应的数据,但是这个数据有没有准备好,select和epoll的实现机制是不一样的
  select和poll :遍历机制,一个一个的查找用户的数据是否准备好
  epoll :回调机制:相当于异步的机制,具有信号的一些特性,因此,当你的数据准备好以后epoll会主动通知你,相对来讲epoll比select效率要高 。
  select并发连接,接收的用户请求是1024个,poll的并发连接无上限
  epoll并发连接,接收的用户请求是无上限
  select 水平触发
  epoll支持水平触发和边缘触发
  select支持跨平台,支持windows和linux
  epoll只支持linux
  水平触发和边缘触发的区别
  当我们的一个程序准备好以后,我是通知你一次还是多次
  水平触发:如果是水平触发,是通知多次,这次数据没有准备好,在通知
  边缘触发:只做一次的事,不分多次做,相对消耗资源少,边缘触发性能要更好
  nginx的模块,分为三类
  核心模块:core module
  标准模块:只要描述了三个功能
  HTTP功能模块
  mail邮件功能模块
  stream功能模块,stream可以做的tcp协议的代理
  第三方模块
  如果要安装新版本的nginx可以在nginx的官方网站,进行拷贝官方提供的yum源
  老版本 1.12.2 17年10月发布的稳定版
  nginx 重新启动nginx服务
  nginx -s stop 停止nginx服务
  用什么工具启用的nginx服务,要用什么工具停止服务
  nginx -t 检查配置文件的语法
  nginx -V 查看版本和编译选项
  nginx -v 只显示版本

  nginx -s>  nginx的功能
  1.做web服务器用
  2.做web反向代理服务器
  3.和邮件相关
  4.和tcp/udp转发相关的
  nginx在配置文件中的指令都是由;分到结尾的
  支持变量
  内建变量:就是nginx自身的变量
  自定义变量:
  引用变量:
  pstree -p 查看线程
  ab命令的包
  yum install httpd-tools -y
  并发测试
  ab -c 1000 -n 2000 http://172.20.127.169/
  nginx的优化
  1.worker_processes auto; 根据CPU当前的情况自动定义worker的数量,最好和当前的CPU数量相等,例如:我们有两个cpu就有2个worker,但是并不是worker越多性能就越好,因为每开一个进程都要消耗CPU,如果开的进程多,消耗的CPU就越多。nginx的一个worker就可以并发支持多个用户的访问,所以nginx不是一个进程响应一个用户
  2.我们可以将一个worker和一个CPU绑定,这样的好处是提高缓存的命中率,我们的CPU里面也有缓存,如果一个worker和cpu绑定在一起,这样CPU里面的缓存就可以一直被这个worker重复使用,如果不绑定就有可能带来问题,例如:支持跑在这个CPU,待会又可能跑在另一个CPU上,这样原来CPU上的缓存就将失效了,由此会反过来影响我们的性能
  我们可以用命令查看worker进程在哪个CPU上
  watch -n 0.5 'ps axo pid,cmd,psr |grep nginx'
  worker绑定CPU的命令
  vim /etc/nginx/nginx.conf
  例如有两个CPU,两个worker,我们将worker绑定在第一个和第二个CPU上
  01 代表第一个CPU
  10 代表第二个CPU
  如果有4个CPU就是0001和0010
DSC0001.jpg

  3.worker进程的优先级,worker优先级的 -20,19
  查看worker的优先级,默认的优先级是0
  watch -n 0.5 'ps axo pid,cmd,psr,nice |grep nginx' 注:nice就是优先级
  vim /etc/nginx/nginx.conf
  worker_priority -10;
DSC0002.jpg

  4.worker进程能打开的文件数量上限,支持多少个用户并发
  vim /etc/nginx/nginx.conf
  worker_rlimit_nofile 30000; 代表worker的总值
DSC0003.jpg

  5. events 事件驱动,我们在nginx用的是epoll模型
  vim /etc/nginx/nginx.conf
  我们可以定义一个worker的并发连接是15000,两个worker的并发就是30000
DSC0004.jpg

  6. accept_mutex on |off 互斥 处理新请求的方法
  如果启用,如果有多个请求,第一个请求发送给第一个worker,第二个请求发送给第二个worker
  如果不启用,如果来了一个请求,就都唤醒所有的worker,最后还是一个worker提供服务的
  7.调试和定位的问题
  1. daemon on|off
  是否以守护进程方式运行,默认是守护进程,守护进程就是前台执行还是后台执行
  2. master_process on|off
  是否以master/worker模型运行nginx,默认是on启用的
  3. error_log 错误日志
  记录的nginx的各种错误信息
  nginx的配置
  ngx_http_core_module 模块,模块中的指令
  server 语句块,这个server语句块是放在http语句块里面的
  listen 监听的端口
  server_name 主机名
  root 指定网站的路径
DSC0005.jpg

  我们可以建多个虚拟主机,建每个虚拟主机放在不同的.conf文件里面,方便管理
  default_server 代表默认的网站
DSC0006.jpg

  server_name 也可以写成
  通配符 例: *.a.com
  正则表达式 例:~^www\d+magedu\.com$
  注:\d代表[0-9]
  tcp_nodelay on|offf
  是否当用户发请求到http网站的时候,如果我们启用keepalived服务器状态监测模式,意味着用户发来请求不立即断开,可以继续发多个请求过来,一次tcp握手,可以连接多次请求
  当是off时:延迟发送,合并多个请求后在发送
  默认是on:不延迟发送
  sendfile on|off
  直接从磁盘把数据复制到内核空间,然后内核空间直接把数据复制到内核关于socket ba fe的缓冲区
  server_tokens on |off | build |string
  显示服务器的nginx版本
  如果打开非常的危险,我们要把这个版本号隐藏了
  我们要在配置文件的http语句块里面设置,这样隐藏全部的版本号,如果想隐藏单独的虚拟主机我们可以虚拟主机的server里面设置
DSC0007.jpg

  location:可以定义某个位置,根据这个位置来单独的做额外的处理
  根据具体的路径,定义相应的规则
DSC0008.jpg

  当我们访问news的url的时候,访问的是/data/sitea/
DSC0009.jpg

  当访问url的news的上,访问的是/app/sitea/下news目录下的index.html
DSC00010.jpg

  我们也可以在url前面加一些符号
  location = / 精确匹配 /根
  访问www.a.com 的根站点 /www/sitea/目录
DSC00011.jpg

  还可以支持
  ^~ 对url的最左边部分做匹配检测,不区分大小写
  ~ 对url做正则表达式模式匹配,区分字符大小写
  ~*对url做正则表达式模式匹配,不区分字符大小写
  不带符号 :匹配起始于此uri的所有uri
  匹配优先级从高到第
  =,^~,~/~*,不带符号
  alias别名
  location /bbs/{
  alias /web/forum/;
  }
  alias和root不同
  alias 例如:当我们访问网站url的/bbs/目录时,得到的数据是来自于/web/forum/index.html
  location /bbs/ {
  root /web/forum/;
  }
  root 例如:当我们访问网站url的/bbs/目录时,的到的数据是来自于/web/forum/bbs/index.html
  root 相当于匹配的是location左侧的根
  alias相当于匹配的是location右侧的根
  error_page_code 错误页面
  如果访问的是一个不存在的页面,我们可以定义把报错转到我们定义的位置页面
  如果404报错就将报错页面转到我们指定的/data/sitea/404.html/ 页面
DSC00012.jpg

  防止流氓网站,盗取我们的错误页面
  当我们访问一个错误页面,我们将404响应改成200的响应码,我们看到的还是404报错的页面
DSC00013.jpg

  try_files :当我们找一个内容,按照什么顺序去寻找顺序
  location /images/ {
  try_files $uri /images/default.gif;
  }
  当访问/images/目录下的内容的时候,进到目录挨个找,先找$uri(xx.html),如果找不到就访问/images/default.gif默认页面
  location / {
  try_files $uri $uri/index.html $uri.html =404;
  }
  当访问根的时候,先找$uri,如果没有就找$uri $uri/index.html,如果还找不到,就找$uri.html并返回一个404页面
  当访问images目录下的a.jpg就返回a.jpg,如果没有a.jpg就返回default.jpg
DSC00014.jpg

  如果找不到我们也可以返回404
DSC00015.jpg

  client_body_buffer_size
  用于接收每个客户端请求报文的body部分的缓冲区大小,默认是16k,超出此大小时,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置。
  client_body_temp_path
  把数据做哈希运算
  limit_rate 限速
  limit_except method 只能用在location
  限定客户端的请求方法
  GET ,POST 生产中使用
  HEAD 测试的时候使用
  OPTIONS 探测对方网站支持哪些方法
  limit_except GET {
  allow 192.168.1.0/24;
  deny all;
  }
  只能是内部管理员访问除了GET的其他方法,其他互联网用户都不能访问
  只允许192.168.63.141访问,不允许其他人访问
DSC00016.jpg

  ngx_http_access_module 控制用户谁能访问,谁不能访问
  默认是不限制的
  allow 允许
  deny 拒绝
DSC00017.jpg

  ngx_http_auth_basic_module 用户身份验证
  创建账号
  yum install httpd-tools -y
  htpasswd -cm nginxuser httpuser1 创建用户httpuser1,第一次创建要加 c
  htpasswd -cm nginxuser httpuser2 创建用户httpuser2,第二次创建不用加 c
  在配置文件中告诉用户和密码的文件位置
  vim /etc/nginx/conf.d/a.com.conf
  auth_basic "login info" 提示符
  auth_basic_user_file 用户密码文件的位置
DSC00018.jpg

  ngx_http_stub_status_module 状态页
  启用状态页
  为了安全限制用户的访问
DSC00019.jpg

DSC00020.jpg

  ngx_http_log_module 指定日志格式的记录请求
  日志只能在主配置文件http语句块里面写
  vim /etc/nginx/nginx.conf
DSC00021.jpg

  [$time_iso8601] 更改日期格式
  调用日志
  access_log /var/log/nginx/a.com_access.log testlog;
  调用的日志是 testlog
  日志的存放位置 /var/log/nginx/a.com_access.log
DSC00022.jpg

  ngx_http_gzip_module 压缩 注:必须使用在生产中
  用gzip方法压缩响应数据,节约带宽
  gzip on |off 启用或禁用压缩
  gzip_comp_level 压缩的级别 1到9,默认是1
  gzip_min_length 达到多大才进行压缩
  gzip_http_version 1.0 | 1.1 启用压缩功能时的协议版本,http一般是1.1
  gzip_buffers 压缩时缓冲区数量及每个缓冲区的大小
  gzip_types 针对什么资源压缩 例如:text文本和html压缩,默认对html压缩
  gzip_vary on|off 如果启用压缩是否在响应报文的首部插入一个专门表示压缩的首部报文头部
  gzip_proxied 压缩的时候,如果nginx充当登录服务器,是否对后端服务器的响应报文在某中条件下压缩,根据后端服务器发的信息决定压缩不压缩
DSC00023.jpg

  gzip on; 启用压缩
  gzip_comp_level 9; 压缩级别
  gzip_min_length 64; 压缩的大小 单位字节
  gzip_proxied any; 反向代理
  gzip_types text/xml text/css application/javascript text/plain; 压缩的资源
  ngx_http_ssl_module 加密
  https在nginx中的实现
  只要加密就需要证书
  可以放在server和http中
  ssl on|off 启用或禁用加密
  ssl_certificate 证书文件
  ssl_certificate_key 私钥文件
  ssl_protocols ssl的协议支持的版本TLSv1;TLSv1.1;TLSv1.2
  ssl_session_cache 我们通过http连接到网站 会有一些session会话消息,session消息为了加速访问可以考虑缓存cache
  off 不启用缓存
  none 通知客户端表面上是支持客户端的,实际是不支持
  builtin[:size] 所用的openssl内建缓存,每个worker进程它的ssl会话信息是私有的,可以指定大小
  [shared:name:size] 在多个worker之间使用一个共享的缓存。使用的时候要起名,并指定大小
  ssl_session_timeout session会话的超时时长,默认是5分钟
  创建证书
  cd /etc/pki/tls/certs/ 进入目录下
  make a.crt 创建证书
  会生成两个文件
  a.crt  a.key
  我们是加密的,如果要启用nginx分为要输入密码,我们可以解密密码
  openssl rsa -in a.key -out aa.key a.key解密成aa.key
  将证书和秘钥文件拷贝到指定的目录
  cp a.crt aa.key /etc/nginx/conf.d/
  创建基于https加密的虚拟主机
DSC00024.jpg

  测试
DSC00025.jpg

  可以创建多https加密虚拟主机,因为nginx支持SNI名称空间,要创建新的证书,秘钥
  查看证书信息
  openssl s_client -connect www.c.com:443
  ngx_http_rewrite_module
  nginx第二天视频的第一节课第60分钟
  rewrite 重写地址
  例如:我们平常访问http:/www/baidu.com 会跳到https:/www/baidu.com,就是基于rewrite实现的
  新的url代替旧的url的规则
  last :url会按照正则表达式去查找,例如:如果找到符合的url2就会替换成新的url2,然后看到last就不会往下查找 ,建议不要在location中使用,会造成死循环
  break : 如果发现break就在终止跳转,不会在往下跳转,不会造成死循环
  redirect 临时重定向代码是302
  permanent 永久重定向,代码是301
  rewrite regex1 url1
  rewrite regex3 url2
  rewrite regex3 url3
  http://nginx/regex1 ---》http://nginx/url2
DSC00026.jpg

  rewrite ^/bbs/(.*)$ /froum/$1 last
  如果访问^/bbs/开头的index.html文件就跳转到froum下的index.html文件
DSC00027.jpg

  redirect 临时重定向,代表是302
DSC00028.jpg

  代表是302
DSC00029.jpg

  permanent 永久重定向,代码是301
DSC00030.jpg

  代码是301
DSC00031.jpg

  当访问不加密的网站,跳转到加密的网站
  rewrite / https://www.a.com/ redirect;
  如果访问/根网站,就转到https://www.a.com/
DSC00032.jpg

DSC00033.jpg

  我们也可以用一个虚拟主机
  location / {
  if ( $scheme = http ){ 如果是http就跳转到https://www.a.com/
  rewrite / https://www.a.com/ redirect;
  }
  }
DSC00034.jpg

DSC00035.jpg

  如果访问文本文件txt,就跳转到html
DSC00036.jpg

  break 到这就结束循环,避免死循环出现
DSC00037.jpg

  如果访问txt文件,就跳转到magedu网站
DSC00038.jpg

  跳转的时候返回指定的响应码
  如果访问www.a.com/admin/就返回拒绝,显示这是一个非法地址
  if如果 url ~* 不区分大小写,包含admin的就返回403拒绝访问,并返回一个提示DENY ACCESS
DSC00039.jpg

DSC00040.jpg

  ngx_http_referer_module 防盗链
  有两个网站www.a.com 和 www.b.com
DSC00041.jpg

  在a的网站主页目录/data/sitea/目录下创建一个daolian.html
  在a网站盗取了b网站的图片,为a网站服务
DSC00042.jpg

  我们要避免这种情况,来避免自己网站的图片被别的网站盗取我们的图片
  跳转,当我们点击www.b.com的时候。从当前站点跳转到www.b.com
DSC00043.jpg

  varid_referer有效的访问, 根据跳转的网站,是非法的还是合法的,假如,是从百度跳过来的就是合法的,从别的地方跳过来的就是非法的。
  我们用varid_referer决定谁是合法的,谁是非法的
  定义referer首部的合法值,不能匹配的将是非法的
  none :请求报文首部没有referer首部
  blocked:请求报文有referer首部,但没有有效值,可能是反向代理服务器吧referer清空了
  server_names 参数,将来带有的值是某一个域名,当然也有可能是某一个模式
  arbitrary_string 可以写通配符
  regular expression 可以写正则表达式,但是有一个要求,要用~波浪符表示开头,后面才是正则表达式
DSC00044.jpg

  valid_referers none block server_names *.b.com ~\.baidu\.; none 没有referer的,block有referer但是没值的,server_names带有域名的,*.b.com以b.com结尾的,~\.baidu\包含baidu的都是合法的
  if ($invalid_referer) { 其他的都是非法的,返回403
  return 403 ;
  }
  ngx_http_proxy_module 反向代理
  当访问www.a.com 的根时候就代理到后端的192.168.63.131服务器
DSC00045.jpg

  当访问特定的url,进行反向代理
DSC00046.jpg

  因为/bbs 比/ 更精确,优先级更高,所以先查找/bbs目录的url下的数据,发现一bbs开头的目录下的文件都转换成/froun目录下的文件,然后在查找/根发现,代理到192.168.63.131后端的服务器上,就变成了http://192.168.63.131//froun/.*
  如果后端服务器的端口发生改变,会发现报错502
  如果后端的服务器端口是8080
DSC00047.jpg

  如果是只有/bbs才反向代理,其他都不代理
DSC00048.jpg

  注意:加/斜杆和不加/斜杆的区别
DSC00049.jpg

  加/斜杆: 就是当访问/bbs的时候,就置换成http://192.168.63.131/
  不加/斜杆:当访问/bbs的时候,就在http://192.168.63.131/后面加/bbs目录充当我的URL,变成http://192.168.63.131/bbs
  proxy_pass 前面加斜杆是不允许有正则表达式的,否则会有语法错误
  例如:如下
DSC00050.jpg

  如果不加加斜杆是允许有正则表达式
  例如:如下
DSC00051.jpg

  只有图片文件的时候例如 .jpg .gif 等文件的时候,才调度到http://192.168.63.131 服务器
DSC00052.jpg

  动静分离
  一台后端服务器安装apache服务器
  一台后端服务器安装Apache,php-fpm ,php-mysql连接数据库
  一台后端服务器安装数据库,mariadb-server,创建允许远程连接的用户
  一台代理服务器安装nginx
  动态就调度到131服务器,如果是其他就调度到132服务器
DSC00053.jpg

  注意:后端服务器收到的请求的ip地址来源于nginx代理服务器的ip,并不是真正的远程客户端的ip
  解决方法:是在数据报文的头部在添加一个新的头,数据报文的结构有首行,首部字段行,还有实体行,其中我们可以在首部字段添加一个新的报文头部。就是在请求报文的头部加上客户端的ip
  proxy_set_header 给请求报文添加首部
  但是后端的web服务器默认记录日志,记录的是还是客户端也就是nginx代理服务器的地址,不会记录加的报文头部的地址,因为web服务器的日志格式是预先定义好的,所以我们要更改日志的格式
  %h 就是客户端的地址
DSC00054.jpg

  1. 在nginx代理服务器
  用proxy_set_header添加一个新的报文头部
  proxy_set_header remoteclientip $remote_addr
  remoteclientip 自己定义
  $remote_addr 代表客户端地址
DSC00055.jpg

  2.在后端Apache服务器端修改日志格式
  vim /etc/httpd/conf/httpd.conf
  LogFormat "%{remoteclientip}i
  remoteclientip是在nginx代理服务器上新加的头部
DSC00056.jpg

  这样就就可以看见远程客户端的ip地址
  proxy_add_x_forwarded_for 解决多层代理
  在生产中可能有多台代理服务器,我们可以将多台代理服务器地址累加在一起
  例如:有两层代理
  如果在两层代理服务器上都加proxy_set_header 会在后端服务器上看到所有叠加的代理服务器的ip,还有真实的客户端ip
  如果只在最外层的代理服务器上加proxy_setheader,在后端服务器上的日志只会显示真实客户端的ip,看不到中间发现代理服务器的地址
DSC00057.jpg

  在后端日志服务器上更改日志格式
DSC00058.jpg

  proxy_cache_path 可以定义反向代理缓存的功能
  我们可以将一些页面缓存到服务器上,下次客户端就不需要跑到后端服务器去找数据了,直接在代理服务器进行数据的响应,进而提高速度
  缓存只能放在主配置文件http语句块
  proxy_cache_path
  缓存的位置
  [levels=levels]存放缓存不是文件名的方式,而是把文件起哈希值做计算,把哈希值当文件名,哈希值存的时候会按照一级,二级,三级,定义多少级来存,每一级就是安装哈希值的数字来作为文件夹名,所以要设定,分几级,每一级占几个16进制数
  keys_zone=name:size 是否起一个名称,这个名字是将来要在某个虚拟主机去用这个缓存,所以要起一个名字,调用这个名称,接下来还要指定它的大小,缓存占多大空间
  [inactive=time] 缓存失效的时间,当失效了就将缓存删掉
  max_size=size:最多在磁盘占多大空间
  例:
  proxy_cache_path /var/cache/nginx/proxy_cache 将来要存放缓存的位置
  levels=1:1:1 keys_zone=proxycache:20m
  inactive=120s max_size=1g;
  注意: keys_zone指定的20m,说的是在内存中占20m的空间,但是这个缓存存的不是数据,真正的数据放在/var/cache/nginx/proxy_cache 磁盘路径里面,这个缓存放在内存中是key键和metadata源数据,所谓的key键就是用户访问的url,值就是文件名,但是值不放在缓存的内存中,它是放在磁盘空间上max_size=1g; 最大1g
  问:nginx的缓存里面内存中的缓存放的是什么?
  放的是key和metadata源数据,比如说源数据访问了多少次
  /var/cache/nginx/proxy_cache 这个路径放的的是页面文件,放在磁盘里面
  vim /etc/nginx/nginx.conf 主配置文件
DSC00059.jpg

  在我们的虚拟主机记录 在哪个location里面转发的时候反向代理服务器缓存信息放在过程指定的位置里面
  vim /etc/nginx/conf.d/c.conf
  proxy_cache proxycache; 指定前面定义缓存的名字proxycache,要定义这个缓存
  proxy_cache_key $request_uri; 调用的时候用$request_uri用户访问的url当key,值是文件内容
  proxy_cache_valid 200 302 301 1h; 在200 302 301 这些响应吗的时候才启用缓存,缓存1小时
  proxy_cache_valid any 1m; 其他的缓存1分钟
DSC00060.jpg

  nginx代理服务的缓存大概的原理是什么
  缓存的是什么
  缓存是放在什么地方
  缓存分两块
  一部分放在内存里面
  内存里面放的是,访问的url也就是key键,还有metadata源数据,访问了几次也就是缓存命中率
  一部分放在磁盘里面
  真正的数据是存放在磁盘上的,而且存放磁盘的时候他是把文件做了一个哈希运算,放到文件上
  proxy_cache_use_stale
  在某些场景下,可能还得做一些错误的缓存信息,或过期的缓存
  如果后端服务器down机了,然后缓存的信息又过期了,我们可以考虑用过期的缓存继续提供服务
  proxy_hide_header 隐藏后端服务器的特定报文
  默认将时间,后端服务器的版本号等等隐藏了
  ngx_http_headers_module模块,加这个模块有助于排除
  添加首部
  向由代理服务器响应给客户端的响应报文添加自定义首部,或修改指定首部的
  值
  add_header X-Via $server_addr; 中间的反向代理服务器地址
  add_header X-Cache $upstream_cache_status; 缓存的命中率情况
  add_header X-Accel $server_name; server的名称
DSC00061.jpg

  ngx_http_fastcgi_module
  让nginx支持fastcgi
  搭建lnmp nginx+mysql+php-fpm
  192.168.63.131 nginx
  192.168.63.132 php-fpm php-mysql
  192.168.63.141 mysql
  192.168.63.132
  yum install php-fpm php-mysql -y
  更改PHP的监听ip
  vim /etc/php-fpm.d/www.conf
  listen = 9000 监听本机的所有端口
  listen.allowed_clients = 192.168.63.131 允许访问的ip
  pm.status_path = /status 启用测试页面
  ping.response = pong 测试PHP测试是否存活
  启动服务并查看监听的端口
DSC00062.jpg

  让nginx发请求到php-fpm
  创建一个用于存放php页面的目录
  mkdir /data/php -p
  创建php测试页面
DSC00063.jpg

  创建连接数据库的php文件
DSC00064.jpg

  192.168.63.131
  yum install nginx -y
  nginx连接fastcgi
  nginx要启用下面几项
  fastcgi_pass fastcgi服务器的地址
  fastcgi_index fastcgi的主页程序
  fastcgi_param nginx要充当fastcgi的客户端要传一些变量参数过去
  在nginx的程序中已经有很多自带的有关fastcgi变量在/etc/nginx/fastcgi_params
  关键的参数有一项
  fastcgi_param 就是fastcgi传过去的具体路径,将来将前端发来的PHP请求发送到后端fastcgi哪个文件夹上
DSC00065.jpg

  在客户端测试
DSC00066.jpg

  获取php-fpm的状态信息
  location ~* ^/(pm_status|ping)$ { 当访问fastcgi的pm_status或ping的时候就转发大后端的fastcgi服务器
  include fastcgi_params;
  fastcgi_pass 192.168.63.141:9000;
  fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
  }
DSC00067.jpg

  测试
DSC00068.jpg

  配置fastcgi的缓存
  在主配置文件http语句块插入,缓存的存放的路径,还有定义缓存的名字fcgicache,内存的大小20m,这个内存存放的是key键和源数据和源数据的次数。缓存的值是放在磁盘里面
DSC00069.jpg

  fastcgi_cache fcgicache;
  fastcgi_cache_key $request_uri;
  fastcgi_cache_valid 200 302 10m;
  fastcgi_cache_valid 301 1h;
  fastcgi_cache_valid any 1m;
DSC00070.jpg

  ngx_http_upstream_module 调度
  nginx自带健康性检查功能,如果发现有一台后端服务器down机,可以实现不给down的服务器调度
  例如后端有多台服务器,可以用nginx的upstream模块实现调度
  upstream模块只能在主配置文件的http语句块设置
  vim /etc/nginx/nginx.conf
  在upstream模块指定要调度的server的服务器地址
DSC00071.jpg

  我们还要在我们自定义的虚拟主机定义怎么转发
  我们针对的这个网站
  location / 当访问根的时候,访问的www代表的两个主机
  www是在主配置文件定义的upstream模块的名字
DSC00072.jpg

  测试
DSC00073.jpg

DSC00074.jpg

  我们还可以实现权重
  weight=
  还可以设置连接后端服务器最大的并发活动连接数
  max_conns
  还可以设置连接后端服务器失败几次,超出这个数字,就是出故障了,就不调度了
  max_fails=
  还可以设置超时时长,多长时间连接不了后端服务器,后端服务器就故障了
  fail_timeout= 默认10s
  可以将后端服务器标记为备用,只有后端的所有服务器都不能用了,才启用备用服务器
  backup
  还可以吧后端服务器标记为不可用,就不往这个服务器上调度,例如要更新的时候,可以先把这个服务器下线,进行更新
  down
  进行源地址进行哈希运算,只要是同一个ip地址来的请求,始终往一个服务器上调度
  ip_hash
  在主配置文件的http语句块
DSC00075.jpg

  最少连接调度算法,如果后端的连接少,就给谁调度
  least_conn
DSC00076.jpg

  哈希,根据用户请求报文中的一些首部字段来做调度
  hash key
  hash $request_uri 根据uri进行调度,例如我们有一台调度服务器,后端有2台服务器,用户发来请求,我们查看uri是什么,如果一个url就向后端其中以个服务器进行调度,如果是另一个uri就向另外一个服务器调度,这2个服务器的权重还不一样,第一台服务器的权重是1,第二台服务器的权重是2,我们可以根据权重进行哈希运算并和权重的总和取模,
  只要uri固定,就始终往一个服务器上调度
DSC00077.jpg



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-632876-1-1.html 上篇帖子: nginx-linux运维小站 下篇帖子: nginx 的一个模块 nginx_upstream_jvm_route
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表