一.nginx基础
目录
- 1. Nginx使用场景
- 2. Nginx中的进程
- 2.1 Nginx中的多进程模型
- 2.2 多进程模式的优点:
- 2.3 缓存
- 3. Ngnix的负载均衡策略
- 3.1 轮询法
- 3.2 加权轮询
- 3.3 原地址哈希
- 3.4 最小连接数法
- 3.5 Fair
- 3.6 url_hash
- 3. Nginx配置文件
- 4. Nginx+tomcat 集群示例
- 4.1 下载镜像
- 4.2 在宿主机中创建需要挂载的目录
- 4.3 常见测试用的index.html
- 4.4 创建Nginx配置文件
- 4.5 启动3个tomcat容器准备集群
- 4.6 根据tomcat容器实际IP修改Nginx配置文件
- 4.7 启动Nginx容器
- 4.8 测试集群
- 5. Nginx部署静态网站
- 5.1 准备前端应用
- 5.2 创建构建目录
- 5.3 构建镜像
- 5.4 运行容器
1. Nginx使用场景
Nginx的主要使用场景:
- HTTP服务器
Nginx可以作为静态服资源服务器来使用,例如在前后端分离的架构中可以将前端应用部署在Nginx服务器中。也可作为上传服务器、图片服务器等使用 - 作为反向代理
Nginx可以作为反向代理,将来自互联网的外部请求转发到内网中应用服务器。通过反向代理可以实现负载均衡。
Nginx内置了丰富的负载均衡算法:轮询,基于权重,ip_hash等,通过第三方支持,还有fair(响应时间短的优先分配),url_hash等。
2. Nginx中的进程
2.1 Nginx中的多进程模型
Nginx的具有很高的性能,有庞大的使用群体,这与它的基本架构有紧密关系。
在Nginx运行时后台包括一个master主进程和多个worker进程。Nginx也可以支持多线程方式工作,但模式使用多进程,也是主流的使用方式。
-
master进程
主进程主要进行Nginx配置文件解析,数据结构初始化,模块注册配置,信号处理,网络监听,工作进程生成和管理等工作。监控worker进程的状态,在worker进程异常退出后可以自动重新启动进程。 -
worker进程
多个worker进程之间是对等的关系,竞争去处理客户的请求,一个请求只有一个worker去处理。worker进程数量一般与机器cpu数量相当。每个worker都是单线程的,采用异步非阻塞方式处理请求。是Nginx服务器提供服务的主体。
当一个请求进来时,多个worker会竞争处理这个请求,但有且只有一个worker可以获取到该请求的处理权限。
2.2 多进程模式的优点:
每个worker进程是互相独立的,互相不影响,一个进程的退出不影响其他的进程服务。每个worker进程使用异步非阻塞方式来处理请求,具有很高的性能。
2.3 缓存
Nginx服务器为提供请求的处理效率,减轻网络压力,采用缓存机制。缓存机制将历史应答的数据缓存到本地,并且在Nginx启动后会启动一个专门的后台进程对本地缓存内容建立维护索引,以此来加快缓存文件的访问。
所以Nginx的后台进程出master进程,worker进程以外,还有后端服务进程。
3. Ngnix的负载均衡策略
Nginx中支持多种负载均衡策略,在不同的使用场景中我们可以选择合适的负载均衡策略
3.1 轮询法
将请求轮流分配到注册的后端服务器中,平等的对待所用的后端服务器,不关心服务器的实际连接数就负载情况。比较适合后端服务器的配置都差不多的情况。例如如下配置:
upstream server {
server 192.160.0.123:8080;
server 192.160.0.124:8080;
server 192.160.0.125:8080;
}
3.2 加权轮询
可以为每个武器配置一个权重值,权重值越大将会有机会分担更多的请求,该配置方式比价适合集群中各个服务器配置不均衡的情况,对高的服务器可以配置大一些的权重,对配置低的机器可以配置小一些的权重。
upstream server {
server 192.160.0.123:8080 weight=4;
server 192.160.0.124:8080 weight=2;
server 192.160.0.125:8080 weight=1;
}
3.3 原地址哈希
根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器的大小进行取模计算,得到的结果作为客户端要访问的服务器的序号。
特点:这种方式可以保证来自同一ip的请求被打的固定机器上,可以解决session问题。
示例:
upstream server {
ip_hash;
server 192.160.0.123:8080 weight=1;
server 192.160.0.124:8080 weight=2;
server 192.160.0.125:8080 weight=1;
}
3.4 最小连接数法
该算法根据后端服务器当前的连接情况,动态的选取其中当前堆积的连接数最少的一台服务器来处理请求,以便于提高服务的利用率。
这种算法比较适合后端各个服务器配置不同的情况。
示例:
upstream server {
least_conn;
server 192.160.0.123:8080 weight=1;
server 192.160.0.124:8080 weight=2;
server 192.160.0.125:8080 weight=1;
}
3.5 Fair
Fair负载均衡比基于权重,和ip_hash算法更加智能,可以根据后端服务器的响应时间来分配请求,响应时间短优先分配。
该算法由第三方提供,需要安装upstream_fair模块。
示例:
upstream server {
fair;
server 192.160.0.123:8080 weight=1;
server 192.160.0.124:8080 weight=2;
server 192.160.0.125:8080 weight=1;
}
3.6 url_hash
与ip_hash比较接近,该算法根据url的哈希结果来分配请求,使每个url定向到一台后端服务器上。
该算法为第三方提供,使用时需要先安装Nginx的hash软件包
upstream server {
hash $request_uri;
server 192.160.0.123:8080 weight=1;
server 192.160.0.124:8080 weight=2;
server 192.160.0.125:8080 weight=1;
}
3. Nginx配置文件
Nginx配置文件主要有4部分:
- main(全局配置)
Main部分的设置影响其他所有部分的设置 - server(主机配置)
主要用于指定虚拟机主机域名,ip和端口等内容 - upstream(上游服务器配置,用于反向代理,负载均衡)
用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡 - location(url匹配特定位置的配置)
用于匹配网页位置(如,跟目录“/”,”/images”等)
nginx配置文件示例:
#指定用户和用户组,不指定默认为nobody
user nginx;
#工作进程数,根据机器情况设置
worker_processes 1;
#日志设置
error_log /var/log/nginx/error.log warn;
#pid文件
pid /var/run/nginx.pid;
events {
#配置事件驱动模型,其他还要select,poll,kqueue等
use epoll;
#配置每个worker最大连接数
worker_connections 1024;
}
http {
#引入其他配置文件,在nginx服务器中有/etc/nginx/mime.types
#当nginx收到静态请求时,在请求文件的类型在mime.types中匹配mime type
#这些mime type数据告诉浏览器文件数据的类型,以便于更好的展示数。
include /etc/nginx/mime.types;
#默认为二进制数据流
default_type application/octet-stream;
#定义日志格式,$remote_addr,$remote_user等是nginx中的预定义变量
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$upstream_addr"';
#配置日志
access_log /var/log/nginx/access.log main;
#使用sendfile系统调用来提高性能
sendfile on;
#tcp_nopush on;
#指定 KeepAlive 的超时时间(timeout)
#keepalive模式告诉web服务器在处理完一个请求后保存这个tcp连接,
#如果在规定的超时时间内接收到客户端的其他请求,服务端会利用这个未关闭
#的连接,而不需在重新创建连接
keepalive_timeout 60s;
#是否开启gzip压缩功能
#gzip on;
upstream tomcat {
server 172.17.0.2:8080;
server 172.17.0.3:8080;
}
server {
listen 80;
server_name localhost;
#location部分,通过指定模式与客户端请求uri进行匹配。
#基本语法如下:location [=|~|~*|^~|@] pattern{……}
#1.没有修饰符 表示必须以指定模式开始。例如:location /abc
#2.=表示:必须与指定的模式精确匹配。例如:location = /abc
#3.~表示:指定的正则表达式要区分大小写。例如:location ~ ^/abc$
#4.~*表示:指定的正则表达式不区分大小写。例如:location ~* ^/abc$
#5.^~ 类似于无修饰符的行为,也是以指定模式开始,不同的是,如果模式匹配,那么就停止搜索其他模式了
#正则表达式示例:location ~* \.(gif|jpg|jpeg)$ 匹配任何以gif, jpg, or jpeg结尾的文件
#通用匹配,任何请求都匹配到
location / {
#配置转发
#tomcat为上面upstream部分的定义
proxy_pass http://tomcat;
#其作用是对发送给客户端的URL进行修改
proxy_redirect off;
#默认首页
index index.html index.htm;
#附加字段到请求头
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#静态资源配置
location /static/ {
#访问/static/目录中的文件时,
#nginx会到/usr/share/nginx/html/中查找文件
alias /usr/share/nginx/html/;
}
}
include /etc/nginx/conf.d/*.conf;
}
4. Nginx+tomcat 集群示例
本示例通过使用docker容器搭建Nginx + tomcat集群,来演示使用Nginx实现负载均衡的例子。
4.1 下载镜像
root@ubuntu:/# docker pull nginx
root@ubuntu:/# docker pull tomcat
4.2 在宿主机中创建需要挂载的目录
1)在宿主机上
- 创建用于存放nginx配置文件,及日志的目录,
- tomcat的部署目录,及日志目录。
这些目录在稍后创建容器时会被挂载到容器中,这种方式可以很方便的通过修改宿主机中文件来改变容器中对应文件的目的。
root@ubuntu:/# mkdir -p /opt/nginx/conf/ /opt/nginx/www /opt/nginx/logs
root@ubuntu:/# mkdir -p /opt/tomcat/webapps/ROOT /opt/tomcat/conf /opt/tomcat/logs
4.3 常见测试用的index.html
在宿主机/opt/tomcat/webapps/ROOT目录下创建一个用于测试的html文件。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Nginx+tomcat集群</title>
</head>
<body>
<h1>Nginx+tomcat集群部署示例</h1>
</body>
<html>
4.4 创建Nginx配置文件
在/opt/nginx/conf目录下创建nginx.conf配置文件, 具体内容请见shang“3. nginx配置文件示例”部分
4.5 启动3个tomcat容器准备集群
root@ubuntu:/# docker run -d --name tomcat1 -v /opt/tomcat/webapps:/usr/local/tomcat/webapps tomcat
root@ubuntu:/# docker run -d --name tomcat2 -v /opt/tomcat/webapps:/usr/local/tomcat/webapps tomcat
root@ubuntu:/# docker run -d --name tomcat3 -v /opt/tomcat/webapps:/usr/local/tomcat/webapps, tomcat
注意:必须将容器的挂载目录设置为:/usr/local/tomcat/webapps,因为在tomcat镜像中将目录设置为工作目录,可以通过:docker inspect tomcat 查看容器的详细信息进行验证。
获取三个tomcat容器的ip地址:
root@ubuntu:/# docker inspect tomcat1 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
root@ubuntu:/# docker inspect tomcat2 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
root@ubuntu:/# docker inspect tomcat3 | grep Address
"LinkLocalIPv6Address": "",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"GlobalIPv6Address": "",
"IPAddress": "172.17.0.4",
"MacAddress": "02:42:ac:11:00:04",
"IPAddress": "172.17.0.4",
"GlobalIPv6Address": "",
"MacAddress": "02:42:ac:11:00:04",
tomcat1, tomcat2, tomcat3 的ip地址分别为 : 172.17.0.2, 172.17.0.3,172.17.0.4
4.6 根据tomcat容器实际IP修改Nginx配置文件
4.7 启动Nginx容器
docker run -d -p 80:80 --name nginx -v /opt/nginx/www:/usr/share/nginx/html -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/nginx/logs:/var/log/nginx nginx
4.8 测试集群
Nginx容器正常启动后,访问:http://192.168.62.133/,如果能出现测试页面,则说明集群正常。如下图:
5. Nginx部署静态网站
本示例基于Docker容器在Nginx中部署一个前端网站。现在项目越来越流行前后端分离的开发方式,而Nginx是目前流行的高性能的web服务器,我们可以将前端应用部署在Nginx中。
5.1 准备前端应用
准备一个用于部署的前端应用,为方便演示课件提供一个用于测试的前端应用(\docker+ngnix+vue\dist)。
5.2 创建构建目录
创建一个构建目录,如“docker+ngnix+vue”,并将用于发布的前端应用放入构建目录。然后创建Dockerfile文件。
Dockerfile文件如下:
FROM nginx:1.17.9
MAINTAINER lisen "lisensir@qq.com"
#/usr/share/nginx/html
COPY dist/ /usr/share/nginx/html/
本Dockerfile非常简单:
- 指定基础镜像为 nginx1.17.9
- 指定维护者信息
- 将构建目录下的dist目录拷入到 容器的/usr/share/nginx/html/目录下,该目录是静态文件默认放置目录
5.3 构建镜像
将构建目录上传到linux中,然后在linux中进行构建目录,执行构建即可(docker build -t 镜像名称)
root@ubuntu:/home/lisen/docker+ngnix+vue# docker build -t nginx-vue .
5.4 运行容器
在镜像构建完成后,通过进行运行一个容器即可
root@ubuntu:/# docker run -p 80:80 -d --name nginxvue nginx-vue
容器启动后即可访问:http://192.168.62.133
至此部署完成。
二.使用Nginx负载均衡及动静分离
- 1. 系统拓扑图
- 2. 环境准备
- 3. 服务器安装
- 3.1 mysql,tomcat
- 3.2 Nginx的安装
- 4. 部署
- 4.1 后台服务部署
- 4.2 Nginx配置负载均衡及静态资源部署
1. 系统拓扑图
说明:
- 用户请求达到Nginx
- 若请求资源为静态资源,则将请求转发至静态资源服务器
- 若请求资源为动态数据,则将请求转发给web服务器(在这里为tomcat处理),在转发的同时,会根据配置的负载均衡策略进行负载均衡处理。
2. 环境准备
- 四个虚拟机,一个mysql服务器,两个tomcat服务器, 一个Nginx服务器(Nginx服务同时作为反向代理用于负载均衡,和静态资源服务器)
- 一套采用前后端分离模式开发的系统(该例准备了webserver.war,对应的前端程序)
3. 服务器安装
3.1 mysql,tomcat
mysql,与tomcat的安装与配置,在前面的课件中已经很详细,这里不再赘述。请参考“Linux-环境搭建-centos”
3.2 Nginx的安装
有两种方式,一种是先下载Nginx,在离线安装; 第二种是yum方式安装。 这里采用离线安装方式, 如果希望使用yum方式安装,可以参考Nginx官方文档。
离线安装步骤:
1) gcc安装
安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装
yum install gcc-c++
2)PCRE pcre-devel 安装
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。
yum install -y pcre pcre-devel
3) zlib 安装
zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库
yum install -y zlib zlib-devel
4)OpenSSL 安装
OpenSSL 套接字层密码库,有主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库
yum install -y openssl openssl-devel
5) wget下载Nginx
wget -c https://nginx.org/download/nginx-1.18.0.tar.gz
6)解压
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
7)配置安装
# 使用默认配置,命令在nginx目录中执行,执行完成会产生MakeFile等文件
./configure
#编译并安装
make
make install
8)启动与停止
#到命令所在目录
cd /usr/local/nginx/sbin/
#启动
./nginx
#停止,强制直接关停
./nginx -s stop
#等待nginx进程处理完任务再停止
./nginx -s quit
#重新加载配置文件
./nginx -s reload
9)配置Nginx自动启动
vim /etc/rc.d/rc.local
修改/etc/rc.d/rc.local的权限:
chmod 755 rc.local
4. 部署
4.1 后台服务部署
后台服务的部署,非常简单,之间将war包上传至tomcat的webapps目录下即可。
4.2 Nginx配置负载均衡及静态资源部署
1)修改前端程序
注:在部署前端程序时,需要先修改后台server的ip地址配置。
2)将前台程序打包
npm run build
3) 将打包好的前端程序上传到Nginx服务器
4) nginx.conf配置
vim /usr/local/nginx/conf/nginx.conf
重新加载配置文件
[root@localhost sbin]# pwd
/usr/local/nginx/sbin
[root@localhost sbin]# ls
nginx
[root@localhost sbin]# ./nginx -s reload
配置完成,启动mysql,tomcat1,tomcat2,nginx等服务进行测试