代理 负载均衡

​目录

代理:将流量平均分配。

代理的方式

1、正向代理找完代理之后,还需要找服务器。应用:VPN2、反向代理只需要找代理,不需要找服务器。应用:负载均衡

Nginx代理服务支持的协议

ngx_http_uwsgi_module : Pythonngx_http_fastcgi_module : PHP ngx_http_scgi_module : Javangx_http_v2_module : Golangngx_http_proxy_module : HTTP

Nginx代理实践 :lb01--->web01

部署web01

[root@web01 conf.d]# cat game5.conf server {listen 80;server_name 192.168.15.7;location / {root /opt/Super_Marie; index index.html;}location ~ /images {root /opt/image;}}

部署lb01

部署Nginx

# 下载Nginx源代码包[root@lb01 ~]# wget # 解压[root@lb01 ~]# tar -xf nginx-1.20.2.tar.gz# 进入源代码目录[root@lb01 ~]# cd nginx-1.20.2# 安装依赖包[root@lb01 nginx-1.20.2]# yum install openssl openssl-devel zlib zlib-devel -y# 设置编译参数[root@lb01 nginx-1.20.2]# ./configure--with-http_gzip_static_module--with-stream --with-http_ssl_module# 编译[root@lb01 nginx-1.20.2]# make # 安装[root@lb01 nginx-1.20.2]# make install # 优化[root@lb01 nginx]# mkdir /etc/nginx[root@lb01 nginx]# mv /usr/local/nginx/conf/* /etc/nginx/[root@lb01 nginx]# mkdir /etc/nginx/conf.d[root@lb01 nginx]# groupadd www -g 666[root@lb01 nginx]# useradd www -u 666 -g 666 -M -r -s /sbin/nologin[root@lb01 nginx]# vim /usr/lib/systemd/system/nginx.service[Unit]Description=nginx - high performance web serverDocumentation=http://nginx.org/en/docs/After=network-online.target remote-fs.target nss-lookup.targetWants=network-online.target[Service]Type=forkingPIDFile=/var/run/nginx.pidExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.confExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)"ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)"[Install]WantedBy=multi-user.target[root@lb01 sbin]# ln -s /etc/nginx/nginx.conf /usr/local/nginx/conf/nginx.conf[root@lb01 sbin]# mv /usr/local/nginx/sbin/nginx /usr/sbin/[root@lb01 sbin]# mkdir /var/log/nginx[root@lb01 sbin]# systemctl start nginx

部署反向代理

[root@lb01 conf.d]# cat /etc/nginx/conf.d/game.conf server {listen 80;server_name _;location / {proxy_pass http://172.16.1.7:80;}}

Nginx代理常用参数 添加发往后端服务器的请求头信息

Syntax:proxy_set_header field value;Default:proxy_set_header Host $http_host;proxy_set_header Connection close;Context:http, server, location # 用户请求的时候HOST的值是linux.proxy.com, 那么代理服务会像后端传递请求的还是http://linux.proxy.comproxy_set_header Host $http_host;# 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ipproxy_set_header X-Real-IP $remote_addr;# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

代理到后端的TCP连接、响应、返回等超时时间

#nginx代理与后端服务器连接超时时间(代理连接超时)Syntax: proxy_connect_timeout time;Default: proxy_connect_timeout 60s;Context: http, server, location #nginx代理等待后端服务器的响应时间Syntax:proxy_read_timeout time;Default:proxy_read_timeout 60s;Context:http, server, location #后端服务器数据回传给nginx代理超时时间Syntax: proxy_send_timeout time;Default: proxy_send_timeout 60s;Context: http, server, locationproxy_connect_timeout 1s;proxy_read_timeout 3s;proxy_send_timeout 3s;

proxy_buffer代理缓冲区

#nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端Syntax: proxy_buffering on | off;Default: proxy_buffering on;Context: http, server, location #设置nginx代理保存用户头信息的缓冲区大小Syntax: proxy_buffer_size size;Default: proxy_buffer_size 4k|8k;Context: http, server, location #proxy_buffers 缓冲区Syntax: proxy_buffers number size;Default: proxy_buffers 8 4k|8k;Context: http, server, location

配置代理优化文件

[root@lb01 ~]# vim /etc/nginx/proxy_params proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_connect_timeout 10s;proxy_read_timeout 10s;proxy_send_timeout 10s;proxy_buffering on;proxy_buffer_size 8k;proxy_buffers 8 8k;[root@lb01 conf.d]# cat game.conf server {listen 80;server_name _;location / {proxy_pass http://172.16.1.7:80;include /etc/nginx/proxy_params;}}

负载均衡

将后端服务打包成一个IP连接池。 1、反向代理 server { listen 80; server_name _; location / { proxy_pass http://[连接池]; } } 2、IP连接池 upstream [连接池名称] { server [ip]:[port]; server [ip]:[port]; server [ip]:[port]; } [root@lb01 conf.d]# cat game.conf upstream supermarie { server 172.16.1.7:80; server 172.16.1.8:80; server 172.16.1.9:80; } server { listen 80; server_name _; location / { proxy_pass ; include /etc/nginx/proxy_params; } }

负载均衡的比例

轮询

# 默认情况下,Nginx负载均衡的轮询状态。 upstream supermarie { server 172.16.1.7:80; server 172.16.1.8:80; server 172.16.1.9:80; }

权重

# Nginx中的权重0-100,数字越大,权重越高。upstream supermarie {server 172.16.1.7:80 weight=9;server 172.16.1.8:80 weight=5;server 172.16.1.9:80 weight=1;}

ip_hash

# 每一个IP固定访问某一个后端。upstream supermarie {server 172.16.1.7:80;server 172.16.1.8:80;server 172.16.1.9:80;ip_hash;}

负载均衡后端状态

状态概述down当前的server暂时不参与负载均衡backup预留的备份服务器max_fails允许请求失败的次数fail_timeout经过max_fails失败后, 服务暂停时间

down

# 暂时不分配流量upstream supermarie {server 172.16.1.7:80 down;server 172.16.1.8:80;server 172.16.1.9:80;}server {listen 80;server_name _;location / {proxy_pass http://supermarie;include /etc/nginx/proxy_params;}}

backup

# 只有当所有的机器全部宕机,才能启动。upstream supermarie {server 172.16.1.7:80 backup;server 172.16.1.8:80;server 172.16.1.9:80;}server {listen 80;server_name _;location / {proxy_pass http://supermarie;include /etc/nginx/proxy_params;}}

max_fails、fail_timeout

# max_fails # proxy_next_upstream 后端错误标识 [root@lb01 ~]# cat /etc/nginx/conf.d/game.conf upstream supermarie { server 172.16.1.7:80 max_fails=3 fail_timeout=3s; server 172.16.1.8:80 max_fails=3 fail_timeout=3s; server 172.16.1.9:80 max_fails=3 fail_timeout=3s; } server { listen 80; server_name _; location / { proxy_pass ; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404; include /etc/nginx/proxy_params; } } 注意:proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; error # 与服务器建立连接,向其传递请求或读取响应头时发生错误; timeout # 在与服务器建立连接,向其传递请求或读取响应头时发生超时; invalid_header# 服务器返回空的或无效的响应; http_500# 服务器返回代码为500的响应; http_502# 服务器返回代码为502的响应; http_503# 服务器返回代码为503的响应; http_504# 服务器返回代码504的响应; http_403# 服务器返回代码为403的响应; http_404# 服务器返回代码为404的响应; http_429# 服务器返回代码为429的响应(1.11.13); non_idempotent# 通常,请求与 非幂等 方法(POST,LOCK,PATCH)不传递到请求是否已被发送到上游服务器(1.9.13)的下一个服务器; 启用此选项显式允许重试此类请求; off

负载均衡部署BBS 部署后端服务

部署Python

1、创建用户 [root@web01 opt]# groupadd django -g 888 [root@web01 opt]# useradd django -u 888 -g 888 -r -M -s /bin/sh 2、安装依赖软件 [root@web01 opt]# yum install python3 libxml* python-devel gcc* pcre-devel openssl-devel python3-devel -y

部署Django和uwsgi

3、安装Django和uwsgi [root@web01 opt]# pip3 install django==1.11 [root@web01 opt]# pip3 install uwsgi [root@web01 opt]# pip3 install pymysql 4、创建项目 [root@web01 opt]# unzip bbs.zip [root@web03 bbs]# pwd /opt/bbs [root@web03 bbs]# vim bbs/settings.py ALLOWED_HOSTS = [*] DATABASES = { default: { ENGINE: django.db.backends.mysql, NAME: bbs, USER: root, PASSWORD: , HOST: 172.16.1.61, PORT: 3306, CHARSET: utf8 } } # 启动测试 [root@web01 bbs]# python3 manage.py runserver 0.0.0.0:8000

配置并启动

5、编辑项目配置文件 [root@localhost ~]# cat /opt/linux/myweb_uwsgi.ini [uwsgi] # 端口号 socket= :8000 # 指定项目的目录 chdir = /opt/bbs # wsgi文件路径 wsgi-file = bbs/wsgi.py # 模块wsgi路径 module= bbs.wsgi # 是否开启master进程 master= true # 工作进程的最大数目 processes = 4 # 结束后是否清理文件 vacuum= true 6、启动uwsgi [root@web01 linux]# uwsgi -d --ini myweb_uwsgi.ini --uid 666 -d : 以守护进程方式运行 --ini : 指定配置文件路径 --uid : 指定uid TCP 服务 7、编辑Nginx配置文件 [root@localhost ~]# cat /etc/nginx/conf.d/python.conf server { listen 80; server_name py.test.com; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8000; uwsgi_read_timeout 2; uwsgi_param UWSGI_SCRIPT bbs.wsgi; uwsgi_param UWSGI_CHDIR /opt/bbs; indexindex.html index.htm; client_max_body_size 35m; } } 8、重启Nginx配置 systemctl restart nginx

部署负载均衡

[root@lb01 conf.d]# cat python.conf upstream bbs { server 172.16.1.7:80 max_fails=3 fail_timeout=3s; server 172.16.1.8:80 max_fails=3 fail_timeout=3s; server 172.16.1.9:80 max_fails=3 fail_timeout=3s; } server { listen 80; server_name py.test.com; location / { proxy_pass ; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404; include /etc/nginx/proxy_params; } }