Nginx
2020-12-04 09:56:40 3 举报
AI智能生成
Nginx 集群/负载均衡
作者其他创作
大纲/内容
Nginx是什么?
Nginx 是一个高性能的Http 和反向代理服务器,特点是 占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,例如 百度,京东,阿里,腾讯都在用
Nginx 作为web服务器
Nginx 可以作为静态页面的 web服务器,同时还支持 CGI 协议的动态语言,比如 perl,php等,但不支持java
Java程序只能通过与tomcat 配合完成,Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受负载的考验,有报告表名能支持高并发达到 50000 个并发连接数
反向代理
什么是 正向代理?
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问
什么是反向代理?
其实客户端对代理时无感知的,因为客户端不需要任何配置就可以访问
我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实的服务器IP地址
nginx 实现反向代理1
需求1: 本地通过访问www.123.com 通过nginx的80端口跳转到 服务器8080端口的tomcat
1),修改本地host文件 把 www.123.com域名指向 服务器ip地址
在host文件添加 192.168.247.110 www.123.com
修改 nginx配置文件 nginx.conf文件
server {
listen 80;
server_name 192.168.247.110;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
listen 80;
server_name 192.168.247.110;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
重新启动nginx 访问 www.123.com成功可以访问
nginx 实现反向代理2
需求: 访问127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8080 访问 127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8081
1), 修改 nginx.conf 配置文件
server {
listen 9001;
server_name 192.168.247.110;
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/{
proxy_pass http://127.0.0.1:8081;
}
}
listen 9001;
server_name 192.168.247.110;
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/{
proxy_pass http://127.0.0.1:8081;
}
}
2),服务器开放 9001 端口 ,然后通过 ip:9001/vod/a.html 进行访问
正则表达式
=
用于不含正则表达式的 url 前,要求请求字符串与url 严格匹配,如果匹配成功,就停止向下搜索并立即处理该请求
~
用于表示url 包含正则表达式,并且区分大小写
~*
用于表示url包含正则表达式,并且不区分大小写
`~
用于不含正则表达式的url 前,要求nginx 服务器找到标识 url和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 lcoation块中的正则 url 和请求的字符串做匹配
注意: 如果url 包含正则表达式,则必须要有 ~ 或者 ~*标识
负载均衡
是什么
单个服务器解决不了高并发的请求,我们可以增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为分发到多个服务器上,将负载分发到不同服务器,也就是我们所说的负载均衡
nginx 怎么做
需求: 浏览器输入 ip/edu/a.html 负载均衡平分 8080 和 8081 端口(其中俩个tomcat 都有edu/a.html)
修改nginx.conf配置文件
http块添加
upstream myserver {
[ip_hash;]
server 192.168.247.110:8080 [weight=5];
server 192.168.247.110:8081 [weight=10];
[fair;]
}
[ip_hash;]
server 192.168.247.110:8080 [weight=5];
server 192.168.247.110:8081 [weight=10];
[fair;]
}
server块添加监听
server {
listen 9002;
server_name 192.168.247.110;
location / {
proxy_pass http://myserver;
}
}
listen 9002;
server_name 192.168.247.110;
location / {
proxy_pass http://myserver;
}
}
nginx分配服务器的策略
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
weight
weight weight 代表权重,权重默认值为1,权重越高被分配的客户端越多
ip_hash
每个请求访问ip的hash结果进行分配,这样每个访客固定访问一个后端服务器,可以解决sesson共享问题
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间越短的优先分配
动静分离
是什么
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力
nginx 怎么做
前提条件
子主题
nginx.conf 配置
#动静分离
server {
listen 9003;
server_name 192.168.247.110;
location /html/ {
root /home/data/;
index index.html index.html;
}
location /images/ {
root /home/data/;
#是否在浏览器列出整个文件夹
autoindex on;
}
}
server {
listen 9003;
server_name 192.168.247.110;
location /html/ {
root /home/data/;
index index.html index.html;
}
location /images/ {
root /home/data/;
#是否在浏览器列出整个文件夹
autoindex on;
}
}
在哪下
http://nginx.org/en/download.html
怎么玩
1),安装nginx运行环境
yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
2),判断 pcre 是否安装成功
pcre-config --version
3),解压nginx ,然后进入目录执行 ./configure
4),编译安装 make && make install
5),在 /user/local/nginx/sbin 有启动nginx的启动脚本
在 /user/local/nginx/sbin (常见命令)
启动 ./nginx
快速停止 ./nginx -s stop
重新加载
./nginx -s reload
查看nginx版本号 ./nginx -v
注意 : 需要防火墙开放 80 端口
nginx.conf配置文件
全局快
从配置文件开始到 events 块之间内容,主要设置了一些影响nginx 服务器整体运行的配置指令
主要包括配置运行 Nginx 服务器的用户(组),允许生成的 worker process 数,进程PID 存放路径,日志存放路径和类似以及配置文件的引入等。
worker_processes 1;
这是Nginx服务器并发处理服务相关的关键配置, worker processes 值越大,可以支持的并发处理量也越多,但是受到硬件,软件的制约
events块
涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化
是否允许同时接受多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等。
worker_connections 1024;
支持的最大连接数
http
http 全局块
server 块
Nginx高可用的集群
问题 : 当一个用户发送一个请求,若nginx宕机了,则用户的请求无法发送至tomcat服务器
前提要求:
1),需要2台nginx服务器
2), 需要keepalived
3),虚拟ip地址
怎么玩
1),在2台服务器安装 keepalived
官网 https://www.keepalived.org/download.html
手动安装
进行解压目录
./configure --prefix=/usr/local/keepalived
make && make install
启动/usr/local/keepalived/sbin/
./keepalived -f /usr/local/keepalived/etc/keepalived/keepalived.conf
安装位置 /usr/local/keepalived/etc/keepalived/keepalived.conf
自动安装
yum install keepalived -y
检查是否安装成功
rpm -q -a keepalived
安装位置 /etc/keepalived/keepalived.conf
修改 keepalived.conf 配置文件
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_ server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL # LVS_DEVEL这字段在/etc/hosts文件中看;通过它访问到主机
}
vrrp_script chk_http_ port {
script "/usr/local/src/nginx_check.sh"
interval 2 # (检测脚本执行的间隔)2s
weight 2 #权重,如果这个脚本检测为真,服务器权重+2
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将MASTER 改为BACKUP
interface ens33 //网卡名称 通过 ap addr命令来查看
virtual_router_id 51 # 主、备机的virtual_router_id必须相同
priority 100 #主、备机取不同的优先级,主机值较大(100),备份机值较小(90)
advert_int 1 #每隔1s发送一次心跳
authentication { # 校验方式, 类型是密码,密码1111
auth type PASS
auth pass 1111
}
virtual_ipaddress { # 虛拟ip
192.168.17.50 // VRRP H虛拟ip地址
}
}
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_ server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL # LVS_DEVEL这字段在/etc/hosts文件中看;通过它访问到主机
}
vrrp_script chk_http_ port {
script "/usr/local/src/nginx_check.sh"
interval 2 # (检测脚本执行的间隔)2s
weight 2 #权重,如果这个脚本检测为真,服务器权重+2
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将MASTER 改为BACKUP
interface ens33 //网卡名称 通过 ap addr命令来查看
virtual_router_id 51 # 主、备机的virtual_router_id必须相同
priority 100 #主、备机取不同的优先级,主机值较大(100),备份机值较小(90)
advert_int 1 #每隔1s发送一次心跳
authentication { # 校验方式, 类型是密码,密码1111
auth type PASS
auth pass 1111
}
virtual_ipaddress { # 虛拟ip
192.168.17.50 // VRRP H虛拟ip地址
}
}
添加脚本文件在 /usr/local/src/nginx_check.sh
#! /bin/bash
A=`ps -C nginx -no-header | wc - 1`
if [ $A -eq 0];then
/usr/local/nginx/sbin/nginx
sleep 2
if [`ps -C nginx --no-header| wc -1` -eq 0 ];then
killall keepalived
fi
fi
A=`ps -C nginx -no-header | wc - 1`
if [ $A -eq 0];then
/usr/local/nginx/sbin/nginx
sleep 2
if [`ps -C nginx --no-header| wc -1` -eq 0 ];then
killall keepalived
fi
fi
可以通过查看 ap addr 的ens33 里面查找到 端口为 17.50的是否绑定到 ens33
把主机nginx 开启,然后在开启 主机的keepalived 从机也开启 nginx 然后在开启 keepalivd
访问 192.168.17.50 如果主机的nginx 和 keepalivd 关闭 ,则从机默认替换主机
Nginx 原理
master--只有一个
worker--可以有多个work
这样有什么好处呢?
1), 每个worker 都是一个独立的进程,不需要加锁,省掉了锁带来的开销,如果其中一个worker 出现了问题,其它worker独立的继续争抢,实现请求过程,不会造成服务中断
2),可以使用 nginx -s reload 热部署,利用nginx 进行热部署操作
3), 设置多少个worker 才是合适的
Nginx 和Redis 类似都采用了 io的多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程
通过异步非阻塞的方式来处理请求,即便上千万请求也不在话下,每个worker的线程可以把cpu的性能发挥到机制
所以 worker 数和服务器的cpu 数相等 最为适宜,设置少了会浪费cpu 设置多了会造成cpu频繁切换上下文带来的消耗
代码设置 worker
子主题
4),连接数 worker_connection
发送一个请求占用了 worker 的几个连接数?
2 个或者 4个
Nginx 有一个master 有4个worker ,每个worker 支持最大连接数是1024,支持的最大并发数是多少?
worker的最大连接数是 4*1024 /2
worker的最大连接数是 4*1024 /4
0 条评论
下一页