1 Nginx概述
读音
Nginx读作['ɛndʒɪn eks] 重读在En
1.1 简介
一个服务器软件,做
-
正向代理
-
反向代理
-
动静分离
Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,能支持高达 50000 个并发连接数。
并发能力强
1.2 Nginx相关概念
-
正向代理
需要在客户端配置代理服务器进行指定网站访问
在C-S架构中
正向代理:代理客户端向服务器发送请求
反向代理:代理服务器向客户端提供服务
原理:正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
应用:正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性(由mod_cache提供)减少网络使用率。
大白话:正向代表客户端这边,也就是所有客户端的总代理,所有客户端对外都通过这个代理,这个代理主要是为了集中管理所有客户端发起的请求,加以限制或者优化(客户端对外只有一条路,这条路就被叫做正向代理)。
-
反向代理
原理:反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。
应用:反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
大白话:reverse从英文的角度来看,reverse这个词包含翻转的意思,就是与正向代理相反,代理不在客户端,反过来跑到了服务端,成为了所有服务端的总代理,所有服务端对外都通过这个代理,这个代理主要是为了集中管理所有服务端。(服务端对外只有一条路,这条路就被叫做反向代理)
-
负载均衡
单个服务器解决不了的,将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
-
动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
1.3 Nginx安装
下载包
安装必要依赖
安装pcre
安装openssl
安装zlib
安装Nginx
1.4 Nginx常用命令
使用nginx命令都要在cd /usr/local/nginx/sbin路径下
查看nginx版本
[root@VMLinuxStudy sbin]# ./nginx -v nginx version: nginx/1.12.2
启动nginx
[root@VMLinuxStudy sbin]# ./nginx
关闭nginx
[root@VMLinuxStudy sbin]# ./nginx -s stop
重新加载nginx
./nginx -s reload
1.5 Nginx配置文件
Nginx配置文件位置
/usr/local/nginx/conf/nginx.conf
配置文件包含
包含三部分内容
1.全局块:配置服务器整体运行的配置指令
2.events块:影响 Nginx 服务器与用户的网络连接
3.http块
1.6 Nginx反向代理配置实例
1.6.1 反向代理实例1
1.实现效果:使用 Nginx 反向代理,访问 www.123.com 直接跳转到 192.168.111.100:8080(即服务器的8080端口)
2.准备工作
在Linux系统安装tomcat,使用默认端口号8080
3.具体配置
(1)在Windows的host文件进行域名和ip对应关系的配置
在host文件中添加这么一条,此时,对www.123.com的访问会跳转到192.168.111.100
(2)在Nginx进行请求转发的配置(反向代理配置)
对 /usr/local/nginx/conf/nginx.conf中的配置文件进行配置,server_name是需要转发的地址,下面proxy_pass是转发到的地址
proxy是代理的意思
这个配置实现的是对192.168.111.100的请求转发到192.168.111.100:8080
(3)测试
windows下访问www.123.com
host文件依照配置把www.123.com转发到192.168.111.100,然后nginx服务,依照配置把192.168.111.100转发到192.168.111.100:8080
1.6.2 反向代理实例2
实现效果:使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中 nginx 监听端口为 9001,
访问127.0.0.1:9001/studyedu/ 直接跳转到 127.0.0.1:8081
访问127.0.0.1:9001/studyvod/ 直接跳转到 127.0.0.1:8082
1.启动两个tomcat,一个 8080 端口,一个 8081端口,并准备好测试的页面
备注:此时,访问192.168.111.100:8080/studyedu/a.html
出现tomcat8080配置页面
此时,访问192.168.111.100:8081/studyvod/a.html
出现tomcat8081配置页面
2.修改 nginx 的配置文件
配置:
监听9001端口
~是通配符,所有”~/studyedu/"的访问都会转到//127.0.0.1:8081/studyedu/
所有”~/studyvod/"的访问都会转到//127.0.0.1:8081/studyvod/
3.测试
访问192.168.111.100:9001/studyedu/a.html
转发到127.0.0.1:8081/studyedu/a.html
访问192.168.111.100:9001/studyvod/a.html
转发到127.0.0.1:8081/studyvod/a.html
1.7Nginx负载均衡配置实例
实现效果:浏览器地址栏输入地址 http://192.168.17.129/edu/a.htm,负载均衡效果,平均8080和 8081端口中
1.7.1实例1
(1)准备:两台tomcat服务器8080和8081
备注:此时,访问192.168.111.100:8080/studyedu/a.html
出现tomcat8080配置页面
此时,访问192.168.111.100:8081/studyedu/a.html
出现tomcat8081配置页面
(2)再nginx的配置文件中进行负载均衡的配置
# 在http块中的全局块中配置 # upstream固定写法 后面的myserver可以自定义 upstream myserver{ server 192.168.111.100:8080; server 192.168.111.100:8081; } # server配置 server { # 监听80端口 listen 80; server_name : 192.168.111.100; #location块 location / { # 反向代理到上面的两台服务器 写上自定义的名称 proxy_pass http://myserver; } }
备注:
upstream中配置负载均衡的目标地址,就是用那几个来分别承担压力此处myserver是个名字,叫啥不重要,后面用的时候和这里这个myserver一致就行。
proxy_pass http://myserver 这里的myserver就是上面那个myserver,两个一致就行
实现的就是,把server_name : 192.168.111.100的请求,利用myserver中配置的upstream myserver{ server 192.168.111.100:8080;server 192.168.111.100:8081;}规则,转发到后面两个地址中
(重启nginx)
(3)测试
第一次访问http://192.168.111.100/studyedu/a.html
显示
说明转发到了192.168.111.100:8080/studyedu/a.html中
第二次访问http://192.168.111.100/studyedu/a.html
显示
说明转发到了192.168.111.100:8081/studyedu/a.html中
多次请求,请求分别依次转发到8080tomcat服务器和8081tomcat服务器,实现负载均衡
1.7.2 nginx提供的几种分配策略
第一种 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
第二种 weight
weight 代表权重默认为 1,权重越高被分配的客户端越多
第三种 ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器
第四种 fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
1.8 动静分离
1.8.1 简介
nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码 200。
1.8.4 实例
(1)准备工作
在根目录 / 下创建data目录,分别创建 /data/www和/data/image。分别存放静态资源01.png和动态资源a.html
(2)配置
备注:
所有对www的访问,到/data 中找
对image的访问,到/data里找
autoindex on是一个配置,是nginx开启目录浏览下载功能,处理以斜杠字符 "/" 结尾的请求,并生成目录列表,可以做为下载服务配置使用。
(3)测试
访问http://192.168.111.100/image/
显示
这个文件的实际地址是192.168.111.100服务器的/data/image/
访问http://192.168.111.100/www/a.html
显示
这个文件的实际地址是192.168.111.100服务器的/data/www/a.html
1.9 高可用的集群
这个是防止Nginx宕机,造成服务不可用
就弄两个Nginx服务器,然后配置个master-backup(主-备)
(1)克隆第二台虚拟机时候,两个虚拟机估计IP估计冲突了,改了半天没改好,这块看看视频得了,不整了。。。。。
1.10 Nginx原理
master-workers 的机制的好处
首先,对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会
影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的 worker 进程。当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
需要设置多少个 worker
Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话
下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu 数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。(几核就设置几个worker)