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