Nginx之负载均衡
2019-10-25 本文已影响0人
红薯爱帅
1. 概述
Nginx完成对多个server的load balance,可以通过upstream完成,支持不同的规则,例如weight、backup等。
如果需要对单个server的多个URL做load balance,就不能使用upstream,需要借助rewrite完成。
例如,要完成对URL-A转发为URL-A1、URL-A2、URL-A3、URL-A4,转发规则可以轮寻,也可以是随机,也可以按weight分配。
另外,需要支持超时,以及失败次数达到上限后,不再继续向该URL转发,等健壮性要求。(规则较复杂,本文并未实现,可以考虑写一个lua插件,或者单独开发一个api-gateway)
2. 解决方案
- Dockerfile
FROM gcc:9
LABEL maintainer=shuzhang
WORKDIR /home
RUN wget http://nginx.org/download/nginx-1.17.4.tar.gz && \
wget https://github.com/openresty/set-misc-nginx-module/archive/v0.32.tar.gz && \
wget https://github.com/simplresty/ngx_devel_kit/archive/master.zip && \
tar -zxvf nginx-1.17.4.tar.gz && \
tar -zxvf v0.32.tar.gz && \
unzip master.zip
RUN cd nginx-1.17.4 && \
./configure --prefix=/opt/nginx \
--with-http_ssl_module \
--add-module=../ngx_devel_kit-master \
--add-module=../set-misc-nginx-module-0.32 && \
make -j2 && make install && \
rm -rf /home/*
EXPOSE 10386
ENTRYPOINT ["/opt/nginx/sbin/nginx"]
CMD ["-g", "daemon off;"]
- nginx.conf
worker_processes 8;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 10386;
server_name localhost;
location /service/detect {
set_random $a 0 4;
rewrite ^/service/detect\/([^\/]+?)(\/|$) /service/detect/$1_$a break;
proxy_pass http://127.0.0.1:10080;
}
}
}
- 测试执行
# docker run -d -v ~/temp/nginx.conf:/opt/nginx/conf/nginx.conf -p 10888:10386 nginx:test
3. 后记
nginx有很多好用的三方插件,详细可以查看
https://www.nginx.com/resources/wiki/modules/