Nginx主要应用
静态网站
Nginx是一个HTTP的web服务器,可以将服务器上的静态文件(如HTML、图片等)通过HTTP协议返回给浏览器客户端;
server{
listen 80;#端口号
location /app{ #/app是拦截访问路径 http://127.0.0.1:80/app/index.html
root /opt/app;#静态文件路径 root是指ip+端口即 http://127.0.0.1:80/
index index.html;
}
}
负载均衡(针对HTTP访问)
概述
- 在网站创立初期,我们一般都使用单台机器对外提供集中式服务
- 随着业务量的增大,一台服务器已经达不到要求,此时就会把多台机器组成一个集群对外提供服务。然而,网站对外访问入口通常只有一个,比如www.web.com,那么当用户在浏览输入网址进行访问时,如何将用户的请求分发到集群中不同的机器上呢,这就是负载均衡要做的事情
- 负载均衡通常指:将请求“均匀”分摊倒集群中多个服务器节点上执行,这里的均匀是指在一个比较大的统计范围内是基本均匀的,并不是完全均匀
负载均衡实现方式
- 硬件负载均衡
比如F5、深信服、Array等
优点:有厂商专业的技术服务团队提供支持,性能稳定;
缺点:费用昂贵,对于规模较小的网络应用成本太高 - 软件负载均衡
比如Nginx、LVS、HAProxy等
优点:免费开源,成本低廉
Nginx负载均衡
- Nginx如何实现负载均衡:
通过配置Nginx的nginx.conf文件进行配置即可实现
- 配置步奏
- 在http模块加上
#负载均衡配置 #weight=1 表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重越大访问机会越多; #max_fails 允许请求失败的次数,超过次数后,转发到下一个服务器,当有max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查 #fail_timeout 指定时间内无响应则失败, 在以后的fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器 #upstream是配置nginx与后端服务器负载均衡非常重要的一个模块, #并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障机器 http{ .... upstream www.myweb.com{ server 127.0.0.1:8080 weight=3 max_fails=2 fail_timeout=30s; server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=30s; } ... }
- 在server加上
... server{ ... #负载均衡配置location location /myweb{ proxy_pass http://www.myweb.com; } #转发的地址要和upstream后面的字符串相等; ... } ...
Nginx常用的负载均衡策略
-
轮询策略(默认)
每个请求轮流分配到不同的后端服务器,如果后端服务器宕机了,将自动剔除upstream www.myweb.com{ server 127.0.0.1:8080 ; server 127.0.0.1:8081 ; }
-
权重策略
表示权重,用于后端服务器性能不均的情况,每个请求按照一定比例分发到不同后端服务器,访问比率约等于权重之比,权重越大访问机会越多;upstream www.myweb.com{ server 127.0.0.1:8080 weight=3; server 127.0.0.1:8081 weight=1; }
-
ip_hash策略
ip_hash也叫IP绑定,每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决 会话session丢失问题
session丢失问题也可以用其它方法解决,如redisupstream www.myweb.com{ ip_hash; server 127.0.0.1:8080 ; server 127.0.0.1:8081 ; }
-
最少链接策略
web请求绘本转发到链接数量最少的服务器上
upstream www.myweb.com{
least_conn;
server 127.0.0.1:8080 ;
server 127.0.0.1:8081 ;
}
负载均衡其它几个配置
一般上线部署或某台服务器出现错误的时候使用,将其中一台服务器标注后,不影响其它的服务器的访问使用
- 备份
其它所有非backup机器dang的时候,菜请求backup服务器upstream www.myweb.com{ server 127.0.0.1:8080 ; server 127.0.0.1:8081 backup ; }
- down机状态
down表示当前的server是down状态,不参与负载均衡upstream www.myweb.com{ server 127.0.0.1:8080 ; server 127.0.0.1:8081 down; }
静态代理
- 把所有静态资源的访问改为访问nginx,而不是tomcat,因为nginx更擅长静态资源的处理,性能更好,效率更高;
所以在实际应用中,一般将静态资源如:图片、css、html、js等交给nginx处理,而不是由tomcat处理
- Nginx静态代理的实现
通过在nginx.conf配置文件中添加静态资源的location如:如:-
1.基于文件后缀
location ~.*\.(css|js|img|images|html|htm|gif|jpg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { root /opt/static; }
将静态资源放入/opt/static目录下,然后用户访问时由nginx返回这些静态资源;
放置静态资源的目录,要注意以下目录权限问题,如果权限不足,给目录赋予权限- ~表示正则匹配,表示后面的内容可以正则表达匹配;
- 第一个点 .表示任意字符
- *表示一个或多个字符;
- .是转义符
- | 表示或者
- $表示结尾
-
- 2.拦截访问路径
location ~ .*/(css|js|img|images|html|htm|gif|jpg|png){ root /opt/static; }
动静分离
Nginx的负载均衡和静态代理结合一起,我们可以实现动静分离,这是十几应用中常见 的一种场景;
动态资源,如jsp由tomcat或其他web服务完成;
静态资源,如图片、css、js等由nginx服务器完成;
他们各司其职,专注于自己擅长的事情;
动静分离从分利用了它们各自的优势,从而达到更高校合理的架构;
- 动静分离实例
- 负载均衡Nginx配置:
http{ ... upstream www.myweb.com{ server 127.0.0.1:8080 ; server 127.0.0.1:8081; } upstream static.myweb.com{ server 127.0.0.1:8080 ; server 127.0.0.1:8081; } server{ location /myweb{ procy_pass http://www.myweb.com; } location ~ .*/(css|js|img|images|html|htm|gif|jpg|png){ procy_pass http://static.myweb.com; } ....... } }
- 静态代理Nginx配置:
location ~ .*/(css|js|img|images|html|htm|gif|jpg|png){ root /opt/static; }
虚拟主机
虚拟主机就是把一台物理服务器划分为多个“虚拟”的服务器,这样一台物理服务器就可以当作多个服务器使用,从而可以配置多个网站;
Nginx提供虚拟主机的功能,就是为了让我们不用安装多个Nginx,就可以运行多个网站;
Nginx配置文件下,一个server标签就是一个虚拟主机,想要设置多个虚拟主机,配置多个server节点即可(可以配置200多个);
配置虚拟主机的方式:
- 基于域名的虚拟主机
最常见的
server{
listen 80;
server_name www.myweb.com; #此处是域名
location /myweb {
proxy_pass http://www.myweb.com;
}
}
server{
listen 80;
server_name www.web.com;
location /web {
proxy_pass http://www.web.com;
}
}
需要修改一下本地host文件,位置:C:\Windows\System32\drivers\etc\hosts
在hosts文件配置:127.0.0.1 www.myweb.com
前面是ip 后面是自定义的域名
- 基于端口的虚拟主机
server{
listen 8080;
server_name www.myweb.com; #此处是域名
location /myweb {
proxy_pass http://www.myweb.com;
}
}
server{
listen 9090;
server_name www.myweb.com;
location /web {
proxy_pass http://www.web.com;
}
}
- 基于IP的虚拟主机(有多个网卡的时候)
server{
listen 80;
server_name 127.0.0.1; #此处是Ip
location /myweb {
proxy_pass http://www.myweb.com;
}
}
server{
listen 80;
server_name 127.0.0.2;
location /web {
proxy_pass http://www.web.com;
}
}
- 示例:
配置三个城市的服务器
-
配置3个Tomcat,每个Tomcat一个站点,项目部署在tomcat的ROOT目录下;
-
配置3个Nginx虚拟主机
- 第一种方式
server{ listen 80; server_name bejing.myweb.com; #此处是域名 location / { proxy_pass http://bejing.myweb.com; } } server{ listen 80; server_name nanjing.myweb.com; #此处是域名 location / { proxy_pass http://nanjing.myweb.com; } } server{ listen 80; server_name tianjin.myweb.com; #此处是域名 location / { proxy_pass http://tianjin.myweb.com; } }
- 第二种方式
- 第一种方式
-
配置每个虚拟主机请求转发所对应的后端服务器
upstream beijing.myweb.com{ server 127.0.0.1:8080 ; } upstream nanjing.myweb.com{ server 127.0.0.1:8081 ; } upstream tianjin.myweb.com{ server 127.0.0.1:8082 ; } ```
-
修改hosts文件,让ip(是部署项目的服务器)指定到一个三个站点的域名
168.166.124 beijing.myweb.com
168.166.124 nanjing.myweb.com
168.166.124 tianjin.myweb.com