8、架构--代理、负载均衡

笔记

1、晨考

1、搭建BBS的步骤
2、uwsgi的作用
3、如果出现502错误,一般是什么原因
	502不要怀疑,就是uwsgi出问题。

2、昨日问题

1、数据库
[root@db01 ~]# systemctl start mariadb

2、502问题

3、今日内容

1、代理
2、负载均衡

4、代理

将流量平均分配。

4.1、代理的方式

1、正向代理
找完代理之后,还需要找服务器。
应用:VPN

2、反向代理
只需要找代理,不需要找服务器。
应用:负载均衡

4.2、Nginx代理服务支持的协议

ngx_http_uwsgi_module		: Python
ngx_http_fastcgi_module		: PHP 
ngx_http_scgi_module		: Java
ngx_http_v2_module			: Golang
ngx_http_proxy_module		: HTTP

4.3、Nginx代理实践

lb01  --->  web01
4.3.1、部署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;
    }
}
4.3.2、部署lb01
  • 部署Nginx
# 下载Nginx源代码包
[root@lb01 ~]# wget https://nginx.org/download/nginx-1.20.2.tar.gz

# 解压
[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 server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/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;    }}

4.4、Nginx代理常用参数

4.4.1、添加发往后端服务器的请求头信息
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, 那么代理服务会像后端传递请求的还是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;
4.4.2、代理到后端的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;
4.4.3、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
4.4.4、配置代理优化文件
[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;    }}

5、负载均衡

为什么要用负载均衡?

5.1、负载均衡的架构

通过代理将流量按照一定的比例,转发到后端。

5.2、负载均衡的实现

5.2.1、实现
将后端服务打包成一个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 http://supermarie;        include /etc/nginx/proxy_params;    }}
5.2.2、负载均衡的比例
5.2.2.1、轮询
# 默认情况下,Nginx负载均衡的轮询状态。upstream supermarie {    server 172.16.1.7:80;    server 172.16.1.8:80;    server 172.16.1.9:80;}
5.2.2.2、权重
# 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;}
5.2.2.3、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;}

5.3、负载均衡后端状态

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

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

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

5.3.3、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 http://supermarie;        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               # 禁用将请求传递给下一个服务器。

5.3、负载均衡部署BBS

5.3.1、部署后端服务
5.3.1.1、部署Python
1、创建用户[root@web01 opt]# groupadd django -g 888[root@web01 opt]# useradd django -u 888 -g 888 -r -M -s /bin/sh2、安装依赖软件[root@web01 opt]# yum install python3 libxml* python-devel gcc* pcre-devel openssl-devel python3-devel -y
5.3.1.2、部署Django和uwsgi
3、安装Django和uwsgi[root@web01 opt]# pip3 install django==1.11[root@web01 opt]# pip3 install uwsgi[root@web01 opt]# pip3 install pymysql4、创建项目[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': '123456',        'HOST': '172.16.1.61',        'PORT': 3306,        'CHARSET': 'utf8'    }}# 启动测试[root@web01 bbs]# python3 manage.py runserver 0.0.0.0:8000
5.3.1.3、配置并启动
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          = true6、启动uwsgi[root@web01 linux]# uwsgi -d --ini myweb_uwsgi.ini --uid 666-d 	  : 以守护进程方式运行--ini : 指定配置文件路径--uid : 指定uidTCP 服务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;        index  index.html index.htm;        client_max_body_size 35m;    }}8、重启Nginx配置systemctl restart nginx
5.3.2、部署负载均衡
[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 http://bbs;        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404;         include /etc/nginx/proxy_params;    }}
posted @ 2022-01-06 19:06  简爱cx  阅读(30)  评论(0编辑  收藏  举报