nginx
nginx 那可是经常有听到啊!!!
主要被用来做: 反向代理、负载均衡、动静分离
nginx如何重要,那么就要高可用(看到高可用,就想到冗余,集群)
nginx的原理要深入研究 (学技术不深入学习原理,那叫会用吗?)
来,开始!
思考一下,自己要做个nginx应该是怎样的?
1)要拦截所有的用户的请求(怎么拦截? 根据什么拦截呢?用于的请求都发给nginx? 不可能啊,用户的请求的url地址不可能重复的啊! )
2)然后均衡的发给后边的提供者 (也就是提供者的 ip+port nginx都要知道)
3)服务提供者,处理完请求后,会返回数据,要通过nginx再返回回去!(也就是先返回给nginx,再由nginx返回)
用户请求 -> nginx -> 服务的提供者
【有两个疑惑点: 1)nginx怎么获得的所有请求,(应该是拦截了所有的url,然后进行的判断,但是这一步是在那里做的呢?)
2)nginx又是怎么将服务提供者传来的数据返回给请求者的呢?】
【体会:
端口号! 通过端口号,拦截了所有的请求!! 也就是dns进行域名解析,解析后的ip地址就是 nginx的ip地址,同时nginx的端口号为80
然后又nginx根据后面的uri,来进行请求转发,这时请求转发的ip地址就是局域网中的地址了(也就是实际提供服务的服务器在局域网中,并没有联网,对外暴露的是nginx! 所以准确的说不是nginx拦截了所有的用户请求,而是用户请求直接就是发给nginx的!!通过ip+port 就将输入传给了nginx,然后就能够得到请求的url了,( springmvc中不也就是这样得到了url,然后根据url,调用不同的方法进行处理请求),然后nginx根据url的不同,进行转发处理!这时还会用到负载均衡,对于静态资源的请求,还会用到动静分离,鉴于nginx如此重要,还要搭建nginx集群,保证高可用!
】
带着疑惑,开始学习!!
Nginx是什么? (其实这个问题,在对nginx有个全面的了解后,才能准确的回答)
Nginx是一个web服务器,支持高并发(支持的并发数挺好,怎么做好的呢? 什么语言开发的呢?)!
最初是由俄罗斯人为俄罗斯的一个网站开发的!!!哇!!(在互联网中,很少听过俄罗斯的故事啊! )
正向代理 反向代理
正向代理:我们的电脑上网就属于正向代理,FQ也属于正向代理!(通过正向代理,我们去上网了,进入到了互联网里)
反向代理:(通过反向代理,我们进入到了局域网里了)
正向代理与反向代理的区别:(别想当然) 正向代理与反向代理是相对的,通过正向代理能够将请求成功发给互联网,那么响应的结果返回本机的实际,这时的代理是不是扮演的就是反向代理的角色呢??》》》
负载均衡:
思考:负载均衡跟什么有关系? 要均衡,说明提供服务的不止一个!还说明有请求来了。所以负载均衡与请求和服务的提供者有关系!那些就是根据请求和服务的提供者来进行的负载均衡。
常见的负载均衡均衡算法:
(思考一下,要想负载均衡,就是要尽可能的让服务器都提供差不多的服务资源啊!也就是如果服务器的性能如果一样的话,尽可能的让他们平坦请求,如果服务器的性能不一样,还要考虑服务器的性能问题)
1)轮询法
2)查看当前最空闲的服务器
3)随机选取(感觉也类似于轮询了)
动静分离:
( 这个问题很好,其实我一直在想一个问题,就是用户发送了请求后,服务端返回给用户一个 html页面,那么这个页面中是包含很多资源的!包含 图片、css、js等文件,响应返回的时候,只是返回的页面内容,这些uri地址也是被返回给了客户端(就是返回了这个html页面),然后客户端需要去根据静态资源的uri地址(因为浏览器解析这个html页面,进行渲染),去得到静态资源的内容,这时候uri很多,浏览器是怎么获取这些静态资源的?在一个tcp上面同时发送多个http请求?还是新创建了多个TCP, 在每个tcp上面发送请求;还是http在一个tcp上面发送,但是要排队,一个请求完成(收到了响应数据)再发送下一个请求?
》》》》》》》》 这是个很好的问题,一定要搞懂,弄明白!!!
)
由于请求都是先进入到了nginx,因此nginx就可以根据请求的url,来讲请求转发给不同的服务器,对于静态资源,转发给静态资源服务器,这就减少了服务器的压力!
静态资源就是 html、css、js、image这些,动态资源指的就是需要查询数据库或者需要进行一些处理,不是直接获得静态资源了。
安装 nginx
用docker 安装完成!
然后 docker exec -it 容器名 bash ; 后面这个bash啥意思?
来一波操作!
1)进入到nginx的容器 (这里用docker安装的nginx)
2) 查找到 nginx 用 whereis 命令 (whereis 用来查找二进制文件的,我们自己写的shell脚本可不是二进制文件)
3)cd到所在的目录
4)查看nginx文件的信息 ls -l | grep nginx 用到了| 管道符和grep过滤器
5)执行nginx脚本(这里得到的nginx其实是个脚本文件!)
执行nginx命令,其实就是执行的这个脚本!!!! (下面就是它的一些命令 -s 进行nginx进程的开启、关闭 以及重新加载配置文件等操作 )
docker安装nginx:
docker pull nginx // 拉取镜像
docker images // 可以看到所有的下载下来的镜像
mkdir // 创建目录
docker run -d -p 80:80 --name nginx1 -v // 创建并运行容器
docker ps // 查看运行的容器
创建的容器的时候, -d 后台运行 -p 端口映射 -v 将主机的目录挂载到容器中的目录
docker run -d -p 9999:80 --name nginx1
配置阿里云的出入口规则,开放9999端口,然后访问!
(这样不太好,之后不方便进行文件的配置,要启动容器的时候,记得挂载配置文件)
docker exec -it nginx1 bash // 进入到容器中
Nginx的配置文件:(nginx.conf)
全局块:
events块:
http块:
Nginx的反向代理:
listen 是监听的端口号,即 ip+这个监听的端口号 请求,会进入到这里进行处理
location 后面跟的是请求的 uri, / 则表示所有的请求
反向代理正常!!!!
动静分离:
也就是将动态请求和静态请求分离,分别去不同的地方获取。
静态请求就是来获取静态资源(html css js image等)
动态请求来获取数据(通常需要跟数据库打交道!)
那么,怎么区分动态请求和静态请求呢? 我想应该就是通过根据请求的uri来区分的吧!!!!!其实方法与反向代理如出一辙,将客户端发来的请求又转给了不同的服务器进行处理!
要想将html资源放到nginx中,进行处理,那么返回静态资源就得用重定向的方式,不能再用请求转发的方式对不对!!???》》》》》》》。
页面中的这些静态资源请求,又该怎么处理呢????
nginx的动静分离配置出现了严重的问题!!! ( 静态资源显示 404,但是在linux中加入了静态资源,应该就是路径的问题,但是这里的路径也没有错啊!!)
好像路径的问题可以通过 error.log来看到错误,但是这里error.log也看不到啊!(error.log也不知道怎么弄!!裂开了》》》》》》》)
解决问题:
能够获取静态资源! (注意: 静态资源是防止在docker容器中的!!!!!)
初步分析问题原因可能是: location 只截获了 / , 对于 /image/ 等uri不起作用!!!》》》》
(不是这个原因,而是只有 default.conf 这个配置文件起作用,自己新创建的配置文件没起作用,噢噢噢噢!!! 当时创建容器的时候,添加了这个默认的配置文件的映射,所以在宿主机中操作配置文件,docker中的也跟着改动,但是新创建的在docker中根本不存在!!!!!!!! 天啊!!!就是这个原因!!!以后要注意!!!)