为什么使用Nginx
在传统的Web项目中,并发量小,用户使用的少。所以在低并发的情况下,用户可以直接访问Tomcat服务器,然后Tomcat服务器返回消息给用户。
为了解决并发,可以使用负载均衡,也就是我们多增加几个Tomcat服务器。当用户访问时,请求可以提交到空闲的Tomcat服务器上。
但是这种情况下可以会出现一种问题,就是Tomcat1正好在工作,所以访问的请求就交给了其他Tomcat操作,而Tomcat之间的数据没有进行同步,所以就发生了我们要请求的数据找不到(如图片)
为了解决这种情况,比如上传图片。就可以想出分布式,我们专门建立一个图片服务器,用来存储图片。当我们上传图片时,不管哪个服务器接收到图片,都把图片上传到图片服务器。
图片服务器需要安装一个Http服务器,可以使用Tomcat、Apache和Nginx。
一般选择Nginx。因为Nginx常做静态内容服务和代理服务器,直面外来请求转发给后台的应用服务(Tomcat)。
Nginx的应用场景
- Http服务器。Nginx是一个Http服务,可以独立提供Http服务,可以做网页静态服务器。
- 虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。
- 基于端口的,不同的端口。
- 基于域名的,不同的域名。
- 反向代理、负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群,可以使用Nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
Nginx的配置
在/usr/nginx/conf目录下nginx.conf文件是Nginx的配置文件
端口和目录的配置
在nginx.conf文件中添加一个server节点,修改端口号就可以。
也就是一个nginx里面可以跑多个端口的服务,这个是Tomcat是有本质区别的。
一个Tomcat只能对应一个端口的多个项目服务。
一个Nginx可以对应多个端口下面的多个项目服务。
server {
# 端口
listen 80;
# 主机名
server_name localhost;
# 资源配置地址
location / {
# HTML
root html;
# 首页地址
index index.html index.htm;
}
}
通过域名虚拟机
- 需要修改nginx.conf配置文件,修改配置后需要重新加载配置文件
server {
listen 80;
# 配置域名
server_name www.rest1.com;
location / {
root test1;
index index.html index.htm;
}
}
server {
listen 80;
# 配置域名
server_name www.test2.com;
location / {
root test2;
index index.html index.htm;
}
}
- 刷新nginx配置
- 修改hosts文件,指定ip地址
- 访问
- 需要注意的是host文件的名字要和nginx.conf文件的server_name相同。
正向代理和反向代理
正向代理
拿借钱打个比方,A想向C借钱,但是C不认识A所以不借给他,然后A就通过B向C借钱,B借到钱之后再转交给A,在这个过程中B就扮演了一个正向代理的角色,这个过程中,真正借钱的人是谁,C是不知道的
我们常说的代理就是指正向代理。正向代理的过程,它隐藏了真实的请求服务器,服务器不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求。
比如我想访问www.google.com,要想翻越这堵墙,你可以在国外用Shadowsocks来搭建一台代理服务器,代理帮我们请求www.google.com,代理再把请求响应结果再返回给我。
反向代理
还是借钱的例子,A想向C借钱,然后C借给他了,但是实际上这个钱可能C向B借的至于钱到底是谁的,A是不知道的
这里C扮演着一个反向代理的角色,客户不知道真正提供服务的人是谁。
反向代理隐藏了真实的服务端,当我们访问www.baidu.com的时候,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了。www.baidu.com就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到提供真实服务的服务器那里去。Nginx就是性能非常好的反向代理服务器,它可以用来做负载均衡。
负载均衡
网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务、分离出图片作为单独服务。这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时候来自web前端的压力,也是很大的。怎样讲同一个域名的访问分散到两台或者更多的机器上。这其实就是另一种负载均衡了,Nginx自身就可以做到,只需要做个简单的配置就行。
Nginx可以按照调度规则实现动态、静态页面的分离,可以按照轮询、ip哈希、URL哈希,权重等多种方式怼后端服务器做负载均衡,同时还支持后端服务器的健康检查。
负载均衡策略
- 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 - weight(加权轮询)
指定轮询几率,weight和访问率成正比,用于后端服务器性能不均的情况 - Ip_Hash
每个请求按照访问的ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决Session问题
反向代理和负载均衡配置
配置Nginx服务器
#在server节点上加入以下配置
upstream www.erp.com {
# 加权
server 192.169.15.131:8080 weight=5;
server 192.168.15.131:8090;
server 192.168.15.131:8100;
}
#修改location的配置
server {
listen 80;
server_name www.erp.com;#配置访问的域名
location / {
# root html;
# index index.html index.htm;
proxy_pass http://www.erp.com; #指向上面配置的server的节点
}
}
动静分离
动静分离,就是将css、js、jpg等静态资源和jsp等动态资源分开处理,以此提高服务器响应速度,提高性能。
动静分离的配置正则
http.server.localtion语法
基本语法: location [=|~|~*|^~]/uri/{...}
= 严格匹配, 如果这个查询匹配,将停止搜索并立即处理此请求
~ 区分大小写匹配(可用正则表达式)
~* 不区分大小写匹配(可用正则表达式)
!~ 区分大小写匹配
!~* 不区分大小写匹配
^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx如果路径匹配那么不测试正则表达式
location = /{
#只匹配/查询
}
location /{
#匹配任何查询,因为所有请求都以/开头。但是正则表达式和长的块规则将被优先查询匹配
}
location ^~ /images/{
#匹配任何以/images/开头的查询并停止搜索。任何正则表达式将不会被测试。
}
location ~*.(gif|jpg|jpeg)${
#匹配任何以gif|jpg|jpeg结尾的请求
}
评论区