Nginx具体应用
部署静态资源
Nginx相对于Tomcat处理静态资源的能力更加高效,所以在生产环境下一般都会将Nginx可以作为静态web服务器来部署静态资源
- 静态资源: 在服务端真实存在并且能够直接展示的一些html页面、css文件、js文件、图片、视频等资源文件
- 将静态资源部署到Nginx非常简单,只需要将静态资源文件放到到Nginx安装目录下的html目录中就可以正常访问
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
# 监听80端口
listen 80;
# 服务器的IP地址(域名)
server_name localhost;
# 处理80端口的location块,用来匹配客户端请求的url,匹配到后去根目录找对应的文件
location / {
# 指定静态资源的根目录,默认当前目录是配置文件所在的conf目录,html目录和conf目录同级
root html;
# 指定默认访问的首页(可以指定多个,中间用空格隔开,以";"结尾),默认当前目录是我们指定的根目录
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
正向/反向代理
正向代理: 为了从目标服务器取得内容, 客户端向代理服务器发送一个请求并指定目标服务器的地址,然后代理将请求转发给目标服务器并将获得的内容返回给客户端
- 正向代理是给客户端设置代理服务器,客户端知道代理服务器的存在, 通过代理服务器转发请求最终访问到目标服务器
- 正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径即通过代理访问无法访问的资源
反向代理: 用户直接访问反向代理服务器就可以获得目标服务器的资源(用户不需要指定目标服务器的地址), 反向代理服务器负责将请求转发给目标服务器
- 反向代理服务器也是位于用户与目标服务器之间,但却是给服务端设置代理服务器(用户不知道它的存在),用户以为自己访问的就是目标服务器
正向代理和反向代理的区别
-
正向代理隐藏的是用户
: 原始服务器接收的是代理服务器的请求,用户知道可以通过代理服务器访问无法访问的资源(帮助客户端访问目标服务器) -
反向代理隐藏的是服务器
: 用户以为自己访问的是目标服务器,其实自己访问的资源是通过反向代理服务器转发的(帮助目标服务器统一处理请求)
负载均衡
随着业务流量越来越大并且业务逻辑也越来越复杂, 单台服务器的性能及单点故障问题就凸显出来了, 因此需要多台服务器组成应用集群进行性能的水平扩展
- 应用集群: 将同一应用部署到多台机器上组成应用集群,集群接收
负载均衡器
分发的请求进行业务处理并返回响应数据 - 负载均衡器: 将用户请求根据对应的负载均衡算法分发到应用集群中的一台服务器进行处理,既保证服务的可用性又保证响应足够快
- 注意: Nginx是在服务端实现负载均衡,在SpringCloud的客户端我们也可以实现负载均衡
负载均衡的规则
名称 | 说明 |
---|---|
轮询(默认方式) | 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器挂掉能自动剔除 |
weight | 权重方式(权重默认为 1,权重越高请求分发机率越高) |
ip_hash | 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器(IP地址固定),可以解决session的问题 |
least_conn | 依据最少连接方式,分发给处理连接少的服务器 |
url_hash | 依据url分配方式,一个固定的url对应的服务器也是固定的 |
fair | 按后端服务器的响应时间来分配请求,响应时间短的服务器优先分配请求 |
# 不指定默认采用轮询的方式实现负载均衡
upstream myserver{
server 192.168.77.130:8080;
server 192.168.77.130:8081;
}
# 采用权重的方式实现负载均衡
upstream myserver{
server 192.168.77.130:8080 weight=10;
server 192.168.77.130:8081 weight=5;
}
# 访问ip的hash结果实现负载均衡
upstream myserver{
ip_hash;
server 192.168.77.130:8080;
server 192.168.77.130:8081;
}
# 按后端服务器的响应时间实现负载均衡
upstream myserver{
server 192.168.77.130:8080;
server 192.168.77.130:8081;
fair;
}
需求: 浏览器地址栏输入地址http://192.168.17.129/edu/a.html,根据负载均衡效果将请求平均分配到两台tomcat服务器的8080和8081
端口中
- 在服务器的两台tomcat里面webapps目录中创建web
项目edu
,在edu文件夹中创建页面a.html
第一步: 在http块中添加upstream指令
定义一组服务器,新增一个server块采用负载均衡的规则将请求转发到集群中的某一台服务器
第二步: 访问http://192.168.77.130/edu/a.html发现结果在8080和8081两个服务之间切换
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# upstream指令可以定义一组服务器
upstream targetServer{
# 默认使用轮询的方式实现负载均衡
server 192.168.17.129:8080;
server 192.168.17.129:8081;
}
server {
# 监听的端口
listen 80;
# nginx服务的地址
server_name localhost;
location / {
# 添加定义的服务地址,使用定义好的targetServer
proxy_pass http://targetServe
}
}
}
动静分离
Nginx动静分离不能理解成只是单纯的把动态页面和静态页面物理分离,严格意义上说应该是把动态请求跟静态请求分开
动静分离从目前实现角度来讲大致分为两种
- 第一种方案也是目前主流推崇的方案就是把静态文件独立成单独的域名然后放在独立的服务器上,如使用Nginx服务器处理静态页面,Tomcat服务器处理动态页面
- 第二种方案就是把动态跟静态文件混合在一起发布,通过
nginx
来分开动态请求和静态请求,具体就是通过location指定不同的后缀名实现不同的请求转发
对于不经常变动的资源可以使用Expires
参数给一个资源(请求)设定一个过期时间,这样浏览器每次访问的时候可以走缓存的数据,减少浏览器与服务器之前的请求
- 用户在第一次访问服务器后浏览器中会将请求对应的资源进行缓存,下次访问的时候如果缓存的资源没有过期且服务端对应的资源也没有更新就直接走缓存
- 满足则返回浏览器缓存的数据并返回状态码304,不满足则需要从服务器重新下载数据并返回状态码200
第一步: 在liunx系统中/data
目录下准备静态资源,如www/a.html
和image/1.png
第二步: 在nginx的配置文件的location块
配置要访问的静态资源路径
-
autoindex on
: 在访问静态资源目录时,能够显示目录里面的内容 -
expire
: 设置缓存过期时间
server {
# 监听的端口
listen 80;
# nginx的服务地址
server_name 192.168.77.129;
# http://192.168.77.129/www/a.html
location /www/ {
root /data/;
index index.html index.htm;
# http://192.168.77.129/image/
location /image/ {
root /data/;
# 显示image目录的内容
autoindex on;
}
}
反向代理一台服务器
需求: 打开浏览器在浏览器地址栏输入地址www.123.com跳转到liunx系统中tomcat的主页面中
第一步: 在windows系统的host文件进行域名和ip对应关系的配置
192.168.17.129 www.123.com
第二步: 在nginx.conf配置文件中添加proxy_pass
属性进行请求转发的配置(反向代理配置)
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 在http块中新增一个server块,用来将请求转发
server {
# 监听80端口
listen 80;
server_name 192.168.17.129;
location / {
# 反向代理配置,将请求转发到目标服务器
proxy_pass http://127.0.0.1:8080;
}
}
}
反向代理多台服务器
使用nginx反向代理(nginx监听端口为9001),根据访问的路径跳转到不同端口的服务中,注意放行8080/8081/9001
对外访问的端口
第一步: 准备两个文件夹安装两个tomcat服务器,修改服务器的conf/erver.xml
配置文件,修改它们的端口号防止冲突
<Server port ="8015" shutdown="SHYTDOWN" >
<Connector port="8080" protocol="HTTP/1.1">
<Connector port="8019" protocol="AJP/1.3">
第二步: 在两个Tomcat的webapps目录下分布创建web项目edu和vod
并存放对应的测试文件a.html
文章来源:https://uudwc.com/A/pjwLV
<!--edu/a.html-->
<h1>8080<h1>
<!--vod/a.html-->
<h1>8081<h1>
第三步: 在http块中添加一个新的server块并添加两个location块文章来源地址https://uudwc.com/A/pjwLV
- 访问http://192.168.17.129:9001/edu/a.html直接跳转到http://127.0.0.1:8080/edu/a.html
- 访问http://192.168.17.129:9001/vod/a.html直接跳转到http://127.0.0.1:8080/vod/a.html
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 在http块中新增一个server块,用来将请求转发
server {
# 监听9001端口
listen 9001;
server_name 192.168.17.129;
location ~ /edu/ {
# 反向代理配置,将请求转发到目标服务器
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/ {
# 反向代理配置,将请求转发到目标服务器
proxy_pass http://127.0.0.1:8081;
}
}
}