代理与负载均衡
代理与负载均衡
简介
将流量平均分配
代理方式
正向代理
找完代理之后,还需要找服务器
应用:VPN
反向代理
只需要找代理,不需要找服务器
应用:负载均衡
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
[root@web01 conf.d]# vim game5.conf
server { listen 80; server_name 192.168.15.7; location / { root /opt/Super_Marie; index index.html; } location ~ /images { root /opt/image; } }
# 下载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]# vim /etc/nginx/conf.d/game.conf
server { listen 80; server_name _; location / { proxy_pass http://172.16.1.7:80; } }
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;
#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;
#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]# vim 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]# vim 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; } }
轮询
# 默认情况下,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; }
# 暂时不分配流量
[root@lb01 ~]# vim /etc/nginx/conf.d/game.conf
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; } }
# 只有当所有的机器全部宕机,才能启动
[root@lb01 ~]# vim /etc/nginx/conf.d/game.conf
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
# proxy_next_upstream 后端错误标识
[root@lb01 ~]# vim /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; } }

部署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@web01 bbs]# pwd
/opt/bbs
[root@web01 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.编辑项目配置文件
[root@web01 bbs]# vim /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 bbs]# uwsgi -d --ini myweb_uwsgi.ini --uid 666
7.编辑Nginx配置文件
[root@web01 bbs]# vim /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配置
[root@web01 bbs]# systemctl restart nginx
[root@lb01 conf.d]# vim 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; } }
END

浙公网安备 33010602011771号