nginx比较全面的知识点

nginx比较全面的知识点

1、请解释一下什么是 Nginx?

Nginx 是一个 web 服务器和反向代理服务器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议

2、请解释 Nginx 如何处理 HTTP 请求。

Nginx 使用反应器模式。主事件循环等待操作系统发出准备事件的信号,这样 数据就可以从套接字读取,在该实例中读取到缓冲区并进行处理。单个线程可
以提供数万个并发连接

3、 使用“反向代理服务器”的优点是什么?

反向代理服务器可以隐藏源服务器的存在和特征。它充当互联网云和 web 服务
器之间的中间层。这对于安全方面来说是很好的,特别是当您使用 web 托管服务时

4、解释如何在 Nginx 服务器上添加模块?

在编译过程中,必须选择Nginx 模块,因为Nginx不支持模块的运行时间选择

Nginx的模块

Nginx由内核和模块组成。

Nginx的模块从结构上分为核心模块、基础模块和第三方模块:

核心模块:HTTP模块、EVENT模块和MAIL模块

基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块,

第三方模块:HTTP Upstream
Request Hash模块、Notice模块和HTTP Access Key模块。

用户根据自己的需要开发的模块都属于第三方模块。正是有了这么多模块的支撑,Nginx的功能才会如此强大。

Nginx的模块从功能上分为如下三类。

Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。

Filters(过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。

Proxies(代理类模块)。此类模块是Nginx的HTTP、Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。

Nginx能做什么

——反向代理

——负载均衡

——HTTP服务器(动静分离)

——正向代理

以上就是我了解到的Nginx在不依赖第三方模块能处理的事情,下面详细说明每种功能怎么做。

反向代理

反向代理应该是Nginx做的最多的一件事了,什么是反向代理呢,以下是百度百科的说法:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。

下面贴上一段简单的实现反向代理的代码

保存配置文件后启动Nginx,这样当我们访问localhost的时候,就相当于访问localhost:8080了

负载均衡

负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。

1、RR(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

简单配置

负载均衡的核心代码为

这里我配置了2台服务器,当然实际上是一台,只是端口不一样而已,而8081的服务器是不存在的,也就是说访问不到,但是我们访问http://localhost 的时候,也不会有问题,会默认跳转到http://localhost:8080 具体是因为Nginx会自动判断服务器的状态,如果服务器处于不能访问(服务器挂了),就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况,由于Nginx默认是RR策略,所以我们不需要其他更多的设置。

2、权重

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

例如

那么10次一般只会有1次会访问到8081,而有9次会访问到8080

3、ip_hash

上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

4、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,不过fair和url_hash需要安装第三方模块才能使用,由于本文主要介绍Nginx能做的事情,所以Nginx安装第三方模块不会再本文介绍

HTTP服务器

Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现,首先看看Nginx做静态资源服务器

这样如果访问http://localhost 就会默认访问到E盘wwwroot目录下面的index.html,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。

静态服务器缓存

nginxproxy_cache可以将用户的请缓存到本地一个目录,当下一个请求时可以直接调取缓存文件,就不用去服务器去取文件了。nginx.conf配置如下:

http
{
  ##cache##
  proxy_connect_timeout 5;
 
proxy_read_timeout 60;
 
proxy_send_timeout 5;
 
proxy_buffer_size 16k;
 
proxy_buffers 4 64k;
 
proxy_busy_buffers_size 128k;
 
proxy_temp_file_write_size 128k;
 
proxy_temp_path /home/temp_dir;
 
proxy_cache_path /home/cache levels=1:2keys_zone=cache_one:200m
inactive=1d max_size=30g;
  ##end##
  upstream appserver
{
       server
192.168.1.251;
  }
  server {
       listen      80 default;
       server_name
blog.slogra.com;
        location~
..(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.) {
            
proxy_pass http://appserver ;
            
proxy_redirect off;
            
proxy_set_header Host $host;
            
proxy_cache cache_one;
            
proxy_cache_valid 200 302 1h;
            
proxy_cache_valid 301 1d;
            
proxy_cache_valid any 1m;
            
expires 30d;
      
}
      
location ~ ..(PHP)(.){
           
proxy_pass http://appserver ;
           
proxy_set_header       Host
$host;
           
proxy_set_header       X-Real-IP
r e m o t e a d d r ;                       p r o x y s e t h e a d e r             X − F o r w a r d e d − F o r remote_addr;             proxy_set_header       X-Forwarded-For remoteaddr;           proxysetheader      XForwardedForproxy_add_x_forwarded_for;
      
}
       access_log
/var/log/nginx/blog.slogra.com.log;
  }
}

上面红色的部分就是关于缓存的配置。

动静分离

动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路

这样我们就可以吧HTML以及图片和css以及js放到wwwroot目录下,而tomcat只负责处理jsp和请求,例如当我们后缀为gif的时候,Nginx默认会从wwwroot获取到当前请求的动态图文件返回,当然这里的静态文件跟Nginx是同一台服务器,我们也可以在另外一台服务器,然后通过反向代理和负载均衡配置过去就好了,只要搞清楚了最基本的流程,很多配置就很简单了,另外localtion后面其实是一个正则表达式,所以非常灵活

正向代理

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。当你需要把你的服务器作为代理服务器的时候,可以用Nginx来实现正向代理,但是目前Nginx有一个问题,那么就是不支持HTTPS,虽然我百度到过配置HTTPS的正向代理,但是到最后发现还是代理不了,当然可能是我配置的不对,所以也希望有知道正确方法的同志们留言说明一下。

resolver是配置正向代理的DNS服务器,listen 是正向代理的端口,配置好了就可以在ie上面或者其他代理插件上面使用服务器ip+端口号进行代理了

接下来我介绍一下nginx+tomcat+redis+session同步

有这样一个场景,我们有一个已经发布的项目,要定期的实现更新,更新的时候我们需要停掉服务器,恰恰就在这个时候有用户还在访问你的网站,你突然给停了,用户会认为你的网站被攻击了,可能存在安全隐患,那么你的网站信任度就会降低,可能还会失去一些潜在的客户,这样我们一台代理服务器一台正式服务器显然满足不了我们的需求,那么我们就需要部署多台正式服务器,nginx充当负载均衡服务器,其他tomcat服务器充当正式服务器,nginx根据他的算法会把请求分配到不同的服务器进行处理,这样当我们需要更新的时候,只需要停掉一台另一台继续运行,不会影响到客户的体验,而且还会解决高并发的问题。Nginx负载均衡的配置也比较简单:

首先要明白nginx配置文件里面的两个节点参数的作用,server就是定义一个代理服务器,upstream就是定义一个数据库集群,把这两个节点配置到nginx.conf配置文件里负载均衡也就配置完了

那么此时又会出现另一个问题,用户访问a的时候登录了,session信息存储到了a服务器中,那么他紧接着又发送了一个请求被分配到了b服务器,而b服务器并访问不到a服务器里面存储的session就会让用户又要进行登录,那么此时是不是用户的体验度会很低。所以我们就用到了redis缓存技术来实现session同步,而spring是支持redis和session管理的,只需要把spring-session-data-redis的依赖引到项目里面,然后配置spring配置文件(session的过期时间和redis的连接信息),然后在web.Xml里面配置session过滤器,我本人认为就是告诉spring我把session交给你管理了。致辞session同步就配置完成了,其实原理也简单,就是用户登录的时候把session信息存到redis里面,下次用到的时候去session里面取就ok了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值