代理和负载均衡
一.代理的方式
1)代理的定义:将流量平均分配
2)代理方式
>>>正向代理
找完代理之后,还需要找服务器。
应用:vpn
>>>反向代理
只需要找代理,不需要找服务器。
应用:负载均衡
二.Nginx代理服务支持的协议
1 ngx_http_uwsgi_module : Python
2 ngx_http_fastcgi_module : PHP
3 ngx_http_scgi_module : Java
4 ngx_http_v2_module : Golang
5 ngx_http_proxy_module : HTTP
三.Nginx代理实践
3.1 部署web01
[root@web01 conf.d]# cat game.conf
server {
listen 80;
server_name 192.168.15.7;
location / {
root /opt/marrio;
index index.html;
}
}
3.2 部署lb01
部署nginx
1 # 下载Nginx源代码包 2 [root@lb01 ~]# wget https://nginx.org/download/nginx-1.20.2.tar.gz 3 4 # 解压 5 [root@lb01 ~]# tar -xf nginx-1.20.2.tar.gz 6 7 # 进入源代码目录 8 [root@lb01 ~]# cd nginx-1.20.2 9 10 # 安装依赖包 11 [root@lb01 nginx-1.20.2]# yum install openssl openssl-devel zlib zlib-devel -y 12 13 # 设置编译参数 14 [root@lb01 nginx-1.20.2]# ./configure --with-http_gzip_static_module --with-stream --with-http_ssl_module 15 16 # 编译 17 [root@lb01 nginx-1.20.2]# make 18 19 # 安装 20 [root@lb01 nginx-1.20.2]# make install 21 22 # 优化 23 [root@lb01 nginx]# mkdir /etc/nginx 24 [root@lb01 nginx]# mv /usr/local/nginx/conf/* /etc/nginx/ 25 [root@lb01 nginx]# mkdir /etc/nginx/conf.d 26 [root@lb01 nginx]# groupadd www -g 666 27 [root@lb01 nginx]# useradd www -u 666 -g 666 -M -r -s /sbin/nologin 28 29 [root@lb01 nginx]# vim /usr/lib/systemd/system/nginx.service 30 [Unit] 31 Description=nginx - high performance web server 32 Documentation=http://nginx.org/en/docs/ 33 After=network-online.target remote-fs.target nss-lookup.target 34 Wants=network-online.target 35 36 [Service] 37 Type=forking 38 PIDFile=/var/run/nginx.pid 39 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf 40 ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)" 41 ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)" 42 43 [Install] 44 WantedBy=multi-user.target 45 46 [root@lb01 sbin]# ln -s /etc/nginx/nginx.conf /usr/local/nginx/conf/nginx.conf 47 [root@lb01 sbin]# mv /usr/local/nginx/sbin/nginx /usr/sbin/ 48 [root@lb01 sbin]# mkdir /var/log/nginx/ 49 [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常用参数
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.com
proxy_set_header Host $http_host;
# 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip
proxy_set_header X-Real-IP $remote_addr;
# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
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, location
proxy_connect_timeout 1s;
proxy_read_timeout 3s;
proxy_send_timeout 3s;
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 配置优化文件
[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.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 |
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_fail、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.4 负载均衡部署BBS
5.4.1 部署后端服务
5.4.1.1 部署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
5.4.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 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': '123456',
'HOST': '172.16.1.61',
'PORT': 3306,
'CHARSET': 'utf8'
}
}
# 启动测试
[root@web01 bbs]# python3 manage.py runserver 0.0.0.0:8000
5.4.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 = 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;
index index.html index.htm;
client_max_body_size 35m;
}
}
8、重启Nginx配置
systemctl restart nginx
5.4.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;
}
}


浙公网安备 33010602011771号