本文介绍: Nginx服务器为提供请求处理效率,减轻网络压力,采用缓存机制可以每个武器配置一个权重值,权重值越大将会有机会分担更多的请求,该配置方式比价适合集群各个服务器配置均衡的情况,对高的服务器可以配置大一些的权重,对配置低的机器可以配置小一些的权重。根据获取客户端的IP地址通过哈希函数计算得到一个数值,用该数值对服务器大小进行取模计算,得到的结果作为客户端访问服务器序号。该算法根据后端服务器当前连接情况,动态选取其中当前堆积的连接数最少一台服务器来处理请求以便提高服务利用率。

目录

1. Nginx使用场景

2. Nginx中的进程

2.1 Nginx中的多进程模型

2.2 多进程模式的优点:


Nginx的主要使用场景

Nginx具有很高的性能,有庞大的使用群体,这与它的基本架构有紧密关系
在Nginx运行后台包括一个master主进程和多个worker进程。Nginx也可以支持多线程方式工作,但模式使用多进程,也是主流的使用方式

当一个请求进来时,多个worker竞争处理这个请求,但有且只有一个worker可以获取到该请求的处理权限

每个worker进程是互相独立的,互相不影响,一个进程的退出影响其他的进程服务。每个worker进程使用异步阻塞方式来处理请求,具有很高的性能

Nginx服务器为提供请求的处理效率,减轻网络压力,采用缓存机制缓存机制将历史应答的数据缓存本地,并且在Nginx启动后会启动一个专门的后台进程对本地缓存内容建立维护索引,以此来加快缓存文件访问

所以Nginx的后台进程出master进程,worker进程以外,还有后端服务进程。

Nginx中支持多种负载均衡策略,在不同的使用场景我们可以选择合适的负载均衡策略

将请求轮流分配到注册的后端服务器中,平等的对待所用的后端服务器,不关心服务器的实际连接数负载情况。比较适合后端服务器的配置都差不多的情况。例如如下配置:

upstream server {
    server 192.160.0.123:8080;
    server 192.160.0.124:8080;
    server 192.160.0.125:8080;
}

可以为每个武器配置一个权重值,权重值越大将会有机会分担更多的请求,该配置方式比价适合集群各个服务器配置不均衡的情况,对高的服务器可以配置大一些的权重,对配置低的机器可以配置小一些的权重。

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;
}

根据获取客户端的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;
}

算法根据后端服务器当前的连接情况,动态选取其中当前堆积的连接数最少一台服务器来处理请求,以便提高服务的利用率。

这种算法比较适合后端各个服务器配置不同的情况。

示例

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;
}

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;
}

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;
}

Nginx配置文件主要有4部分

nginx配置文件示例

#指定用户用户组,不指定默认nobody
user  nginx;

#工作进程数,根据机器情况设置
worker_processes  1;

#日志设置
error_log  /var/log/nginx/error.log warn;

#pid文件
pid        /var/run/nginx.pid;

events {
	#配置事件驱动模型,其他还要selectpoll,kqueueuse 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;
}

示例通过使用docker容器搭建Nginx + tomcat集群,来演示使用Nginx实现负载均衡的例子

root@ubuntu:/# docker pull nginx
root@ubuntu:/# docker pull tomcat

1)宿主机

这些目录在稍后创建容器时会被挂载到容器中,这种方式可以很方便的通过修改宿主机中文件来改变容器中对应文件的目的。

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

宿主机/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>

在/opt/nginx/conf目录下创建nginx.conf配置文件, 具体内容请见shang“3. nginx配置文件示例”部分

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

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

Nginx容器正常启动后,访问http://192.168.62.133/,如果能出现测试页面,则说明集群正常。如下图

本示例基于Docker容器在Nginx中部署一个前端网站。现在项目越来越流行前后分离开发方式,而Nginx是目前流行的高性能web服务器,我们可以将前端应用部署在Nginx中。

准备一个用于部署的前端应用,为方便演示课件提供一个用于测试前端应用docker+ngnix+vuedist)。

创建一个构建目录,如“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非常简单

构建目录上传linux中,然后linux中进行构建目录,执行构建即可(docker build -t 镜像名称

root@ubuntu:/home/lisen/docker+ngnix+vue# docker build -t nginx-vue .

在镜像构建完成后,通过进行运行一个容器即可

root@ubuntu:/# docker run -p 80:80 -d --name nginxvue nginx-vue

容器启动后即可访问http://192.168.62.133

至此部署完成

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注