Nginx
1. 概述
1.1 概念
Nginx是一款代理服务器,轻量级web服务器,反向代理服务器,主要用于反向代理和负载均衡等
1.2 代理服务
- 正向代理:用于代理内部网络向因特网的连接请求,客户端发送请求,经代理服务器再发送给web服务器,返回的响应先经代理服务器再返回客户端
- 反向代理:反向代理服务器代理因特网到服务端的请求,客户端发送请求到因特网,再到代理服务器,由代理服务器从目标服务器获取信息数据,再返回客户端
1.3 负载均衡
将数据流量按一定规则分发到服务器集群(多个服务器)执行,从而减轻每台服务器压力,且提升了吞吐量
1.4 动静分离
将静态资源放到反向代理服务器(类似缓存),从而加快响应速度
- web服务器分两类:
- web应用服务器:tomcat, resin, jetty
- web服务器:Apache服务器,Nginx, IIS
- 区别:web服务器不能解析jsp等页面,只能处理 js,css,html 等静态资源,且web服务器的并发能力远高于web应用服务器
2.Nginx的安装
-
安装nginx依赖库
-
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
-
-
下载jar包
-
wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
-
-
解压
-
tar -zxvf nginx-1.12.0.tar.gz
-
-
配置nginx安装包
-
cd nginx-1.12.0 ./configure --prefix=/usr/local/nginx
-
-
编译并安装
-
make && make install
-
3. 目录结构
├── client_body_temp # 临时目录
├── conf # Nginx所有配置文件的目录
│ ├── nginx.conf # Nginx主配置文件
├── fastcgi_temp # fastcgi临时数据目录
├── html # Nginx默认站点目录
│ ├── 50x.html # 错误页面优雅替代显示文件,例如当出现502错误时会调用此页面
│ └── index.html # 默认的首页文件
├── logs # Nginx日志目录
│ ├── access.log # 访问日志文件
│ ├── error.log # 错误日志文件
│ └── nginx.pid # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp # 临时目录
├── sbin # Nginx命令目录
│ └── nginx # Nginx的启动命令
├── scgi_temp # 临时目录
└── uwsgi_temp # 临时目录
4. 启动与关闭
进入nginx下的sbin目录
cd /usr/local/nginx/sbin
4.1 启动
./nginx
4.2 关闭
./nginx -s stop
5. 配置文件
5.1 配置文件
nginx/config/nginx.config
#user nobody;
#工作进程
worker_processes 1;
events {
#连接池连接数
worker_connections 1024;
}
#请求方式
http {
#媒体类型
include mime.types;
#默认媒体类型 二进制
default_type application/octet-stream;
#上传文件
sendfile on;
#超时时间
keepalive_timeout 65;
#gzip on;
#服务器配置
server {
#监听端口
listen 80;
#监听域名
server_name localhost;
#请求头信息
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#请求映射规则,/代表所有请求路径
location / {
#请求转发地址
#root html;
proxy_pass http://manage.powershop.com:8080;
#欢迎页
#index index.html index.htm;
#转发连接超时时间
proxy_connect_timeout 600;
#转发读取超时时间
proxy_read_timeout 600;
}
}
}
5.2 动态加载配置文件
可以在不关闭nginx的情况下更新配置文件
./nginx -s reload
6. Nginx代理Tomcat
6.1 安装两台tomcat
-
解压两个tomcat到/usr/java,分别命名为tomcat-8080,tomcat-8090
-
修改tomcat配置文件中的端口
-
修改文件权限
- 进入tomcat目录的 bin 目录中,ll 列出文件发现 startup.sh 和 catalina.sh 文件的权限为 -rw-r–r–
- 使用命令赋予最高权限
- chmod 777 shtartup.sh
- chmod 777 catalina.sh
- 再次查看发现权限变为:-rwxrwxrwx
-
启动
- 使用 startup.sh 可直接启动,使用catalina.sh 可启动并输出日志
-
测试
-
如访问不通,可尝试关闭防火墙:systemctl stop firewalld
6.2 代理一台tomcat(反向代理)
修改nginx/conf/nginx.conf文件:
location / {
root html;
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
访问链接:ip/test
6.3 代理多台tomcat(负载均衡)
-
在 http 节点上添加一个 upstream
-
修改 location / 下的反向代理
-
# 服务器列表 upstream myTomcats{ server 127.0.0.1:8080; server 127.0.0.1:8090; } server { listen 80; server_name localhost; # 代理 location / { root html; proxy_pass http://myTomcats; index index.html index.htm; } }
-
-
重启,连续访问链接: 虚拟机ip/test,发现实现了在 tomcat1和tomcat2 的负载均衡访问
6.4 负载均衡策略
6 种负载均衡策略
负载均衡策略 | 说明 |
---|---|
轮询 | 默认 |
weight | 权重方式 |
ip_hash | 依据ip分配方式 |
least_conn | 按连接数 |
fair | 按响应时间 |
url_hash | 依据URL分配 |
-
轮询
- 默认的负载均衡方式,所有服务器交替执行,较为平均
-
weight
-
权重方式,权重越大,执行次数越多,默认为1
-
upstream upstream myTomcats{ server 127.0.0.1:8080 weight=1; server 127.0.0.1:8090 weight=3; }
-
-
ip_hash
-
根据计 客户端的 ip 得到的 hash 值,找到指定服务器执行,保证一个客户端每次访问同一台 tomcat
-
基本解决 session 跨域问题(多台服务器 session 不同步,则负载均衡可能访问到没有存储自己 session 的服务器上,导致访问失败),但如果这台 tomcat 挂了,还是会访问其他 tomcat,没有完全解决
-
upstream upstream myTomcats{ ip_hash; server 127.0.0.1:8080; server 127.0.0.1:8090; }
-
-
url_hash
-
根据 url 计算出的 hash 结果分配,使每个 url 定位到同一个服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。
-
upstream upstream myTomcats{ hash $request_uri; server 127.0.0.1:8080; server 127.0.0.1:8090; }
-
-
fair
-
需安装第三方插件
-
按照服务器响应时间来分配请求,响应时间短的优先分配
-
upstream upstream myTomcats{ server 127.0.0.1:8080; server 127.0.0.1:8090; fair; }
-
-
least_conn
-
把请求转发给连接数较少的后端服务器
-
upstream upstream myTomcats{ least_conn; server 127.0.0.1:8080; server 127.0.0.1:8090; }
-
session 丢失问题的解决:
- 基本解决 session 丢失问题,但如果这台 tomcat 挂了,还是会访问其他 tomcat,没有完全解决
- session复制同步:多台tomcat时,复制session非常耗费资源
- redis:redis和session都是k、v,都能设置过期时间
7. 动静分离
将静态资源放到反向代理服务器(类似缓存),从而加快响应速度
- web服务器分两类:
- web应用服务器:tomcat, resin, jetty
- web服务器:Apache服务器,Nginx, IIS
- 区别:web服务器不能解析jsp等页面,只能处理 js,css,html 等静态资源,且web服务器的并发能力远高于web应用服务器
实现
-
修改 nginx.config 配置文件
-
# 服务器列表 upstream upstream myTomcats{ server 127.0.0.1:8080; server 127.0.0.1:8090; } server { listen 80; server_name localhost; # 静态资源访问目录 images location ~* \.(gif|jpg|png|jpeg)$ { root /usr/upload/images; } # 动态资源访问代理服务器 location / { root html; proxy_pass http://myTomcats; index index.html index.htm; } }
-
-
新建文件夹 /usr/upload/images,并上传一张图片,404.jpg
-
启动 nginx
-
访问链接(静态资源):ip/404.jpg
-
访问链接(动态资源):ip/test