中间件-Nginx概念及负载均衡实现
20221107: 初稿
20230828: nginx字
本文主要讲述nginx的概念,安装, 以及负载均衡的实现
概念
高性能, HTTP和反向代理web服务器, 同时提供邮件协议服务
特点: 占用内存少, 稳定, 并发能力强
功能: 反向代理, 负载均衡,动静分离,iphash
反向代理:
代理服务器接受客户端发出的请求, 再讲请求转发给请求服务器 获取数据, 再返回给客户端,实现了真实服务器ip的隐藏
负载均衡
使用轮询或加权轮询将请求压力分配到服务器集群中
动静分离
将静态资源直接部署在nginx服务器上, 当静态资源被请求时,会直接返回
iphash
将客户端的ip与服务器进行映射, 在一个session中, 客户端的请求始终发往一个服务器
实际业务中一般使用redis来实现session共享来解决这个问题
下载安装
win
windows官网现在windows安装版: nginx: download,解压在英文路径中
重要文件目录:
- conf -> nginx.conf : nginx配置文件
- nginx.exe : nginx启动文件
Linux
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel # 一键安装依赖 # 下载解压
wget http://nginx.org/download/nginx-1.14.2.tar.gz tar zxvf nginx-1.14.2.tar.gz # 进行编译和安装
cd nginx-1.14.2/
./configure
make && make install
重要文件目录:
- conf -> nginx.conf : nginx配置文件
常用命令
nginx # 启动nginx
nginx -s relaod # 重新加载配置文件(更新配置文件后使用)
nginx -s stop # 停止
nginx -s quit # 安全退出
ps -ef |gerp nginx # 查看nginx进程
负载均衡实现
准备服务器
为了模拟多服务器, 我这边使用flask本地快速起了2个服务, 2个服务返回的信息不同
app1
from flask import Flask
app = Flask(__name__)
@app.route("/api/t")
def get_ticket():
return "You are in ticket module"
if __name__ == '__main__':
app.run(port=8082)
app2
...
def get_ticket():
return "You are in txtanls module"
if __name__ == '__main__':
app.run(port=8084)
Nginx配置
修改nginx.conf对nginx进行配置
upstream :定义在http内部,用于配置负载均衡
server $server_ip:$port weight=$weight;
server: 定义服务器地址及端口
weight: 定义轮询权重
反向代理: 定义在location内部, 定义代理的服务器及通信协议
xxx_pass $代理服务器地址
xxx_pass: 定义服务器通信协议
- uwsgi_pass: uwsgi协议
- fascgi_pass: fascgi协议
- proxy_pass: http协议
代理服务器地址:
- 反向代理直接填写 $server_ip:$port ,
- 如果还要使用负载聚恒或者使用 http://$up_stream
# 全局设置
....
# http其他配置
http {
....
# 1.负载均衡设置
upstream test{
# 服务器资源及轮询权重
server localhost:8082 weight=1;
server localhost:8084 weight=1; # weight: 用于定义服务器之间的权重
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://test; # 2.反向代理, 使用http协议走负载均衡服务器
}
}
}
重启nginx并测试
nginx -s reload
浏览器访问服务器localhost/api/t, 不断刷新
最终发现返回的数据是2个服务器交替返回的, 就是我们成功实现了轮询模式的负载均衡
You are in txtanls module
# 刷新
You are in ticket module
# 刷新
You are in txtanls module
.....
子配置块
作用
将配置分为多个文件, 更利于配置管理
配置
nginx.conf配置
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
...
include /etc/nginx/conf.d/*.conf; # include配置子配置文件目录
}
子文件目录: 如 a.conf配置server
server {
listen 80;
server_name sapi.ilabpower.tech;
location / {
...
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
server {
listen 80;
server_name s.ilabpower.tech;
location / {
...
}
...
}