nginx介绍
nginx是一个http和web反向代理的服务器,处理并发性能十分强大,最高可达50000个并发连接数,
特点:占用内存小,并发能力高,
正向代理
nginx不仅可以做反向代理,也可以用作正向代理来进行上网,
正向代理:局域网 访问外网时通过代理服务器来访问,这就是正向代理。
反向代理
用户对代理是无感知的,客户端发送请求到反向代理服务器,代理服务器选择目标服务器获取数据,返回给客户端。(在客户端看来,反向代理服务器和目标服务器是一个服务器,客户端只知道代理服务器的地址。)
负载均衡
随着网站人数的增多,客户端并发访问服务器时,服务器压力会很大。
负载均衡就是增加服务器数量,将请求均衡的发送到各个服务器上,
nginx在这种架构模式的充当的负载均衡服务器,起到平衡请求的作用,从而合理分配客户端请求,从而减少服务器压力。
动静结合
为了加快网站的解析速度,我们可以静态资源与动态资源,分别部署在不同的服务器上,加快解析速度,减低单一服务器的压力。
Nginx环境搭建
1.下载nginx
wget -c https://nginx.org/download/nginx-x.xx.x.tar.
2.安装nginx所需要的环境
yum install gcc-c++ :nginx编译环境
yum install -y pcre pcre-devel :第一个安装包提供编译版本的库,而第二个提供开发阶段的头文件和编译项目的源代码 。
yum install -y zlib zlib-devel :nginx压缩工具。
yum install -y openssl openssl-devel : 传输安全
3.解压 nginx;
tar -zxvf nginx-x.xx.x.tar.gz
之后进入解压文件 执行 ./configure
4.安装编译nginx
在解压后的Nginx-x.xx.x中分别执行
make
make install
命令。
5.测试ngxin
在usr/local.nginx/sbin下执行 ./nginx
查看是否启动:
ps aux|grep nginx
登录nginx服务器及linux的ip
如果不能访问,则查看linux防火墙白名单时候,开启80端口(nginx默认端口)
firewall-cmd --list-ports 查看linux防火墙以开启的端口;
firewall-cmd --zone=public --add-port=端口号/tcp --permanent
添加端口后需要重启防火墙:systemctl reload firewalld
Nginx常用命令
在nginx/sbin目录下:
1.启动nginx。
./nginx
2.关闭nginx
./nginx -s stop
3.重启nginx
./nginx -s reload
4.查看nginx进程
ps aux|grep nginx
nginx配置文件
配置文件分为3大块;
nginx全局块:
从配置文件开始到events之间都为全局块,此部分一般是设置nginx服务器整体的配置。
例如work-processes 1; 是有关nginx处理并发能力的参数,数值越大,处理并发能力越强(但是受到硬件等环境的影响,根据cup数量配置,一般为cup的倍数。)
events块:
events块涉及的指令影响,nginx与用户之间的网络连接
例如 woker_connections 表示nginx的最大连接数。
HTTP块:
http全局块:
http全局指令一般包括:文件引入,MINE-TYPE定义,日志自定义 ,连接超时时间,单连接请求上线等。
server块:
这块的指令与虚拟主机有密切联系。虚拟主机从用户角度看和硬件主机没有什么区别。
每个http可以包括多个server块,每个server块就相当于一个虚拟主机,
每个server块又可以包括多个location块
反向代理简单实现
1.环境要求:
linux安装jdk和tomcat
2.开启tomcat(注意防火墙白名单)
在tomcat的bin目录下执行 ./startup.sh
参考上边配置:我们监听的是80端口,如果我们访问此端口我们会跳转到
location 内的 proxy_pass 对应的ip,此时nginx作为反向代理,监听server_name对应的ip下的listen对应的端口,访问该端口时,会跳转到prexy_pass对应ip的地址上;
反向代理实例:
server {
listen 9001;
server_name 192.168.10.129;
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081
}
}
配置解释:
listen:监听端口
server_name : linux主机ip
~/edu/ 路径上出现edu 就跳转到 proxy_pass对应的 ip端口 所对应的相同地址。
location指令补充:该指令用于匹配url,语法如下
location [ = | ~ | ~* | ^~] uri {
}
(1)= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,
如果匹配成功,就停止继续向下搜索并立即处理该请求。
(2)~:用于表示 uri 包含正则表达式,并且区分大小写。
(3)~*:用于表示 uri 包含正则表达式,并且不区分大小写。
(4)^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求
字符串匹配度最高的 location 后,立即使用此 location 处理请求,
而不再使用 location块中的正则 uri 和请求字符串做匹配。
负载均衡简单实现
1.负载均衡实现策略
1.轮询:nginx将请求顺序的分发给后端服务器,
2.源地址哈希法:根据客户端的ip地址,通过哈希函数得到唯一 一个数值,通过这个数值,固定的发给特定服务器,当后端服务器列表不变时,客户端只能特定访问某个服务器。
3.随机:通过系统的随机算法,随机将请求分发给服务器。
4.加权轮询:不同服务器的负载能力不同,给负载能力强的服务器设置更高的权重,处理更多请求。
5.加权随机:和加权轮询类似,只不过时随机分配;
6.最小连接数:动态的将请求分配给当前连接数最小的服务器。
1.权重(轮询)
upstream test-server(自定义名称) {
#每一个server对应一个负载服务
server localhost:8080 weight=3;
server localhost:8081 weight=1;
}
权重越高被访问的概率越高
2.轮询
upstream test-server(自定义名称) {
#每一个server对应一个负载服务
server localhost:8080 ;
server localhost:8081;
}
3.ip_hash
upstream test-server(自定义名称) {
ip_hash;
#每一个server对应一个负载服务
server localhost:8080 ;
server localhost:8081;
}
ip_hash设置后,同一个用户访问时就只能单一访问唯一一个负载服务。
动静结合简单实现
配置文件
server {
listen 9001;
server_name 192.168.17.129;
(tomcat) location ~ /edu/ {
root html;
proxy_pass http://127.0.0.1:8080
}
(nginx)location ~/image/ {
root /static/
}
}
nginx传输静态资源的速度,大约是tomcat的6倍,选择nginx处理静态资源,tomcat处理动态资源,这样可以提高资源的加载速度。
nginx的高可用集群
背景
在实际生产环境中,我们的服务器可能出现故障,如果我们只是用一台nginx服务器,那么出现故障时,用户就无法请求服务器。因此我们可以同时使用多台服务器,从而不免不幸~~。
高可用的集群实现环境
1.至少两台nginx服务器,
2.keepalived
3.虚拟ip
4.linux环境需求:
(1)都装上nginx和keepalived;
keeplived安装命令 yum install keepalived -y
(2)设置nginx与keepalived配置文件
nginx配置与以前没有差异,
keeplived:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.10.129
smtp_connect_timeout 30
# 通过它,可以访问到主机,在hosts文件中,要做映射关系,类似于 127.0.0.1 LVS_DEVEL
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" # 执行脚本所在的位置
interval 2 #检测脚本执行的间隔,单位秒,每个2秒执行一次脚本
weight 2
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 # 绑定的网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #每隔一秒发送一次心跳,确保从服务器是否还活着
authentication { # 心跳检测需要的密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 # VRRP H 虚拟地址
}
}
心跳检测脚本
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx #Nginx启动命令的位置
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
5.两台虚拟机开启nginx和keepalived
启动 nginx: ./nginx
启动 keepalived: systemctl start keepalived.service
6.测试
访问虚拟端口 192.168.17.50
测试成功后,关闭主服务器,
再次访问 192.168.17.50,
还可以访问nginx。
nginx原理
nginx工作原理:
1.一般情况下,在nginx启动后,会有一个master和多个worker,master管理多个worker,
worker(进程)从master竞争请求,各个woker是相互独立的,woker数量是可以设置的,我们一般设置为cpu的倍数。
2.在nginx启动后,重新加载配置文件时,worker会继续竞争请求,等到新的worker加载网配置文件后,老的我客人就会下岗了。
3.woker处理用户进程,master会根据配置文件产生多个一个监听端口socket,然后在产生多个worker进程,多个worker进行竞争请求(通过共享锁accpet-mutex保证”唯一性“),
之后进行请求数据的一系列操作,最后断开连接。
4.nginx的时间驱动机制
nginx采用异步非阻塞式策略,通过epool库(高性能事件驱动库)等实现,
nginx将一次请求分为多个阶段,每个阶段仅仅只完成请求中的一部分,如果期间发生阻塞nginx不会等待,会去处理请求中的其他部分。这样就大大的调高了nginx的并发能力。