+ 我要发布
我发布的 我的标签 发现
浏览器扩展
斑点象@Edge

Flask + gunicorn + Nginx 在Linux环境下配置Nginx负载均衡操作实践

gunicorn是一个Python Wsgi http server,Flask + gunicorn + Nginx在Linux上部署的详细操作这里不做赘述,网上有很多关于这方面的资料。 这里详细介绍下 Flask + gunicorn + Nginx 部署完成后,如何使用 Nginx 来做负载均衡。 Nginx 做负载均衡依赖 upstream 模块。 upstream 模块语法(custom_name是自定义的一个名称): ``` upstream custom_name { server 127.0.0.1:8080; server 127.0.0.1:8081; server 127.0.0.2:8080; } ``` 可以配置本机的多个端口,也可以配置内网的其他机器。 负载均衡有两类算法,一是静态调度算法,负载均衡器根据自身设定的规则进行分配,不需要考虑后端节点服务器的情;二是动态调度算法,负载均衡器会根据后端节点的当前状态来决定是否分发请求。 简单介绍下各种负载均衡算法: 1、轮询 rr 轮循即 round robin 默认调度算法,静态调度算法。客户端请求顺序把客户端的请求逐一分配到不同的后端节点服务器,这相当于 LVS 中的 rr 算法,如果后端节点服务器宕机(默认情况下nginx 只检测80端口)。宕机的服务器会自动从节点服务器池中剔除,以便客户端的用户访问不受影响。新的请求会分配给正产的服务器。 upstream 模块语法中使用的就是轮循算法。 2、权重轮询 wrr 即 weight 权重轮循,静态调度算法。在 rr 轮循算法的基础上加上权重,即为权重轮循算法,当使用该算法时,权重和用户访问成正比,权重值越大,被转发的请求也就越多。可以根据服务器的配置和性能指定权重值大小,有效解决新旧服务器性能不均带来的请求分配问题。 示例: ``` upstream custom_name { server 127.0.0.1:8080 weight=1; server 127.0.0.1:8081 weight=2; server 127.0.0.2:8080 weight=3; } ``` 3、IP哈希 ip_hash 是静态调度算法,每个请求按客户端 IP 的 hash 结果分配,当新的请求到达时,先将其客户端IP通过哈希算法哈希出一个值,在随后的客户端请求中,客户 IP 的哈希值只要相同,就会被分配至同一台服务器,该调度算法可以解决动态网页的 session 共享问题,但有时会导致请求分配不均,即无法保证 1:1 的负载均衡,因为在国内大多数公司都是 NAT 上网模式,多个客户端会对应一个外部 IP,所以,这些客户端都会被分配到同一节点服务器,从而导致请求分配不均。LVS 负载均衡的 -P 参数、keepalived 配置里的 persistence_timeout 50 参数都类似这个 Nginx 里的 ip_hash 参数,其功能均为解决动态网页的 session 共享问题。 示例: ``` upstream custom_name { ip_hash; server 127.0.0.1:8080; server 127.0.0.1:8081; server 127.0.0.2:8080; } ``` 4、最小连接数 least_conn 是动态调度算法,会根据后端节点的连接数来决定分配情况,哪个机器连接数少就分发。 示例: ``` upstream custom_name { least_conn; server 127.0.0.1:8080; server 127.0.0.1:8081; server 127.0.0.2:8080; } ``` 5、最短响应时间 最短响应时间 fair 调度算法是动态调度算法,会根据后端节点服务器的响应时间来分配请求,响应时间端的优先分配。这是更加智能的调度算法。此种算法可以依据页面大小和加载时间长短只能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx 本身是不支持 fair 调度算法的,如果需要使用这种调度算法,必须下载 Nginx 的相关模块 upstream_fair。 示例: ``` upstream custom_name { fair; server 127.0.0.1:8080; server 127.0.0.1:8081; server 127.0.0.2:8080; } ``` 6、url_hash算法 url_hash算法是动态调度算法,按访问 URL 的 hash 结果来分配请求,使每个 URL 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率命中率。(多用于后端服务器为缓存时的场景下)Nginx 本身是不支持 rul_hash的,如果需要使用这种调度算法,必须安装 Nginx 的hash 模块软件包。 示例: ``` upstream custom_name { server 127.0.0.1:8080; server 127.0.0.1:8081; server 127.0.0.2:8080; hash $request_uri; hash_method crc32; } ``` 以一台服务器部署一个项目的两个实例为例,来看下采用默认的轮循算法 Nginx 该如何配置。 实例1用的 8080 端口,通过 gunicorn 可以 start、restart、stop 该实例,gunicorn 配置的端口为 8080,实例项目名 hello1。 实例2用的 8080 端口,通过 gunicorn 可以 start、restart、stop 该实例,gunicorn 配置的端口为 8081,实例项目名 hello2。 两个实例将 80 端口挑战到 443,外网可以通过 https 访问。 实例1的 Nginx 配置文件如下: ``` upstream hello { server 127.0.0.1:8080; server 127.0.0.1:8081; } server { listen 80; server_name hello.com; rewrite ^(.*) $scheme://www.$server_name$1 permanent; } server { listen 80; server_name www.hello.com; # 以下配置是http跳转到https rewrite ^(.*)$ https://$host$1 permanent; #将所有HTTP请求通过rewrite重定向到HTTPS。 } server { listen 443 ssl; #配置HTTPS的默认访问端口号为443。此处如果未配置HTTPS的默认访问端口,可能会造成Nginx无法启动。Nginx 1.15.0以上版本请使用listen 443 ssl代替listen 443和ssl on。 server_name www.hello.com; ssl_certificate /etc/nginx/cert/hello.com.pem; ssl_certificate_key /etc/nginx/cert/hello.com.key; ssl_session_timeout 60m; ssl_ciphers xxxxxxxxxxxxx; #使用此加密套件。 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #使用该协议进行配置。 ssl_prefer_server_ciphers on; access_log /opt/logs/nginx/hello_access.log; error_log /opt/logs/nginx/hello_error.log; location / { proxy_pass http://hello; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-User-Agent $http_user_agent; } } ``` 注意,配置文件中 upstream 模块定义的名称 和 server 模块中 proxy_pass 节点的名称要保持一致,均为 hello。 配置完后,重启 Nginx 即可,重启 Nginx 命令如下: sudo nginx -s reload
我的笔记