Nginx主要应用在如下方面
一、静态网站
Nginx是一个HTTP的web服务器,可以将服务器上的静态文件(如HTML、CSS、js、图片等)通过HTTP协议返回给浏览器客户端
如,我们创建一个Java web工程,命名为 myweb ,将其上传到Linux服务器上的 opt/static目录下
修改 nginx.conf 核心配置文件
注:
此处修改的是 Nginx安装路径 /usr/local/nginx/conf 下的 nginx.conf配置文件
而不是Nginx的解压缩之后的路径 /opt/software/nginx-1.14.2/conf
在server中,通过location匹配访问的路径,然后转发给静态资源
server {
listen 80;
server_name localhost;
......
location / {
root html;
index index.html index.htm;
}
#location / {
#root /opt/static/myweb;
#index index.html index.htm;
#}
# 设置根路径;接收myweb请求,去/opt/static下找资源
location /myweb {
root /opt/static;
index index.html index.htm;
}
......
}
在浏览器中输入 http://IP地址:80 进行访问,如: http://192.168.133.128:80/
注:
一定要注意路径问题,即 location 地方的配置,可能会遇到404找不到页面的错误,主要原因是配置路径问题
规则:ip + port 等于 root
http://192.168.92.128:80/ = root = /opt/static/ace
location匹配顺序
在没有标识符的请求下,匹配规则如下:
1、nginx服务器首先在server块的多个location块中搜索是否有标准的uri和请求字符串匹配。如果有多个标准uri可以匹配,就匹配其中匹配度最高的一个location。
2、然后,nginx在使用location块中,正则uri和请求字符串,进行匹配。如果正则匹配成功,则结束匹配,并使用这个location处理请求;如果正则匹配失败,则使用标准uri中,匹配度最高的location。
注:
1、如果有精确匹配,会先进行精确匹配,匹配成功,立刻返回结果。
2、普通匹配与顺序无关,因为按照匹配的长短来取匹配结果。
3、正则匹配与顺序有关,因为是从上往下匹配。(首先匹配,就结束解析过程)
4、在location中,有一种统配的location,所有的请求,都可以匹配,如下:
location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
# 但是正则和最长字符串会优先匹配
}
结合标识符,匹配顺序如下:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)
即
(精确匹配)> (最长字符串匹配,但完全匹配) >(非正则匹配)>(正则匹配)>(最长字符串匹配,不完全匹配)>(location通配)
二、负载均衡(Load Balance)
在网站创立初期,我们一般都使用单台机器对外提供集中式服务。当一台服务器的访问量越大时,服务器所承受的压力也就越大,超出自身所指定的访问压力就会崩掉,避免发生此类事情的发生,因此也就有了负载均衡来分担服务器的压力。
负载均衡通常是指将请求"均匀"分摊到集群中多个服务器节点上执行,这里的均匀是指在一个比较大的统计范围内是基本均匀的,并不是完全均匀
负载均衡(Load Balance)就是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案
通俗些讲,就是我们有几十台、几百台甚至更多服务器,将这些服务器组成一个服务器集群,当客户端访问某台设备的数据时,首先发送的请求先到一台中间服务器,并通过中间服务器在服务器集群中平均分摊到其他服务器中
,因此,当用户每次所发送的请求都将会保证服务器集群中的设备均与平摊,以此来分担服务器的压力,从而保持服务器集群的整理性能最优
,避免出现有崩溃的现象。
如:我们网站对外提供的访问入口通常只有一个,比如 www.web.com。那么当用户在浏览器输入www.web.com进行访问的时候,如何将用户的请求分发到集群中不同的机器上呢,这就是负载均衡要做的事情。
实现负载均衡两种方案
1、硬件负载均衡
比如 F5、深信服 等服务器
优点是有厂商专业的技术服务团队提供支持,性能稳定
缺点是费用昂贵,对于规模较小的网络应用成本太高
2、软件负载均衡
比如 Nginx等
优点是免费开源,成本低廉
当前就是软件nginx 实现负载均衡
我们创建一个 Java web 项目,打包为 myweb.war,分别上传到两台Linux服务器上的 Tomcat安装目录下的 webapps目录下(可分别对两台Linux上myweb项目 加上IP地址进行区分)
在浏览器中分别输入IP + 项目名如 myweb 进行访问
http://192.168.133.128:8080/myweb;http://192.168.133.129:8080/myweb
配置nginx
在http模块上加
http {
# 通过upstream可以实现服务的负载均衡规则
upstream www.myweb.com {
# 默认 轮询
server 192.168.133.128:8080;
server 192.168.133.129:8080;
}
}
在server模块加
server {
# 设置根路径;接收myweb请求,去/opt/static下找资源
location /myweb {
# www.myweb.com 字符串要和 upstream 后面的字符串相等
proxy_pass http://www.myweb.com;
}
}
通过配置文件启动nginx
浏览器上输入,http://192.168.133.130:80/myweb 访问刷新一次,就会发现不同IP地址myweb被加载
负载均衡策略
1、轮询 Round Robin(默认)
在http、server模块上加
http {
# 通过upstream可以实现服务的负载均衡规则
upstream www.myweb.com {
# 默认 轮询
server 192.168.133.128:8080;
server 192.168.133.129:8080;
}
server {
# 设置根路径;接收myweb请求,去/opt/static下找资源
location /myweb {
# www.myweb.com 字符串要和 upstream 后面的字符串相等
proxy_pass http://www.myweb.com;
}
}
}
2、权重(加权随机(weight Rondom)算法)
每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况
在http、server模块上加
http {
# 通过upstream可以实现服务的负载均衡规则
upstream www.myweb.com {
# 默认 轮询
server 192.168.133.128:8080 weight=3;
server 192.168.133.129:8080 weight=2;
}
server {
# 设置根路径;接收myweb请求,去/opt/static下找资源
location /myweb {
# www.myweb.com 字符串要和 upstream 后面的字符串相等
proxy_pass http://www.myweb.com;
}
}
}
3、ip_hash(源地址哈希Source IP Hash算法)
ip_hash也叫IP绑定,每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题
http {
# 通过upstream可以实现服务的负载均衡规则
upstream www.myweb.com {
ip_hash;
server 192.168.133.128:8080;
server 192.168.133.129:8080;
}
server {
# 设置根路径;接收myweb请求,去/opt/static下找资源
location /myweb {
# www.myweb.com 字符串要和 upstream 后面的字符串相等
proxy_pass http://www.myweb.com;
}
}
}
4、最少连接 Least Connections
web请求会被转发到连接数最少的服务器上
http {
# 通过upstream可以实现服务的负载均衡规则
upstream www.myweb.com {
least_conn;
server 192.168.133.128:8080;
server 192.168.133.129:8080;
}
server {
# 设置根路径;接收myweb请求,去/opt/static下找资源
location /myweb {
# www.myweb.com 字符串要和 upstream 后面的字符串相等
proxy_pass http://www.myweb.com;
}
}
}
三、静态代理
把所有静态资源的访问改为访问nginx,而不是访问tomcat,这种方式叫静态代理。因为nginx更擅长于静态资源的处理,性能更好,效率更高。
所以在实际应用中,我们将静态资源比如图片、css、html、js等交给nginx处理,而不是由tomcat处理。
将 IP 128上的 Tomcat 和 IP129 上的Tomcat 下webapps中的 war包下的image,js,html,css等文件资源删除,并在各自服务器上
/opt/static/myweb(即项目名)中创建 image,js,html,css 等文件夹 上传到此位置
在 nginx配置文件 的server模块上加
server{
# 访问静态资源
location ~ .*/(css|js|img|image|images) {
root /opt/static;
}
}
注:
~ 表示正则匹配,也就是说后面的内容可以是正则表达式匹配
第一个点 . 表示任意字符
*表示一个或多个字符
\. 是转移字符,是后面这个点的转移字符
| 表示或者
$ 表示结尾
整个配置表示以 .后面括号里面的这些后缀结尾的文件都由nginx处理
放置静态资源的目录,要注意一下目录权限问题,如果权限不足,给目录赋予权限;
否则会出现403错误 chmod 755
四、动静分离
Nginx的负载均衡和静态代理结合在一起,我们可以实现动静分离,这是实际应用中常见的一种场景。
动态资源,如jsp由tomcat或其他web服务器完成
静态资源,如图片、css、js等由nginx服务器完成
http {
# 通过upstream可以实现服务的负载均衡规则
# 动态资源负载均衡
upstream www.myweb.com {
# 默认 轮询
#server 192.168.133.128:8080;
#server 192.168.133.129:8080;
}
#静态资源负载均衡
upstream static.myweb.com {
# 默认 轮询
#server 192.168.133.128:80;
#server 192.168.133.129:80;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /ace {
root /opt/static;
index index.html index.htm;
}
# 设置根路径;接收myweb请求,去/opt/static下找资源
location /myweb {
# www.myweb.com 字符串要和 upstream 后面的字符串相等
proxy_pass http://www.myweb.com;
}
# 访问静态资源目录
location ~ .*/(css|js|img|image|images) {
proxy_pass http://static.myweb.com;
}
}
}
五、虚拟主机
虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站。
Nginx提供虚拟主机的功能,就是为了让我们不需要安装多个Nginx,就可以运行多个域名不同的网站。
Nginx下,一个server标签就是一个虚拟主机。nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要设置多个虚拟主机,配置多个server节点即可
http {
upstream beijing.myweb.com {
server 192.168.133.128:8080;
}
upstream nanjing.myweb.com {
server 192.168.133.129:8080;
}
server {
listen 80;
server_name beijing.myweb.com;
location / {
proxy_pass http://beijing.myweb.com;
}
}
server {
listen 80;
server_name nanjing.myweb.com;
location / {
proxy_pass http://nanjing.myweb.com;
}
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
}