nginx
开源的高性能Web服务器和反向代理服务器,俄罗斯开发者伊戈尔·赛索耶夫(Igor Sysoev)使用C语言开发
特点
- 高性能:Nginx使用事件驱动和异步处理机制,能够支持数以万计的并发连接,而不会显著增加资源消耗。
- 高可靠性:Nginx设计为高可靠性,能够长时间运行而无需重启,这在生产环境中非常重要。
- 模块化:Nginx的模块化设计使其功能易于扩展,开发者可以根据需求添加或移除模块。
- 配置灵活性:Nginx的配置通过简单的文本文件进行,这使得定制服务器行为变得容易。
- 安全性:提供了SSL/TLS支持、防DDoS攻击、IP黑白名单等安全特性。
- 资源消耗低:运行时对内存和CPU的占用非常低,适合在资源受限的环境中运行。
nginx功能
- Web服务器:作为静态内容服务器,提供网页、图片、视频等的快速访问。
- 反向代理:将客户端的请求转发到后端服务器,隐藏实际提供服务的服务器。
- 负载均衡:智能地在多个后端服务器间分配请求,提高系统可用性和扩展性。
- 动静分离:将静态资源和动态内容分离,提高网站性能。
- API网关:作为API服务的前端,提供路由、限流、监控等功能。
- HTTPS服务:支持SSL/TLS协议,提供加密的安全连接。
- 邮件代理:支持IMAP/POP3/SMTP协议,可以作为邮件代理服务器。
架构
Master-Worker 进程模型
Master进程:负责管理Worker进程,包括启动、停止Worker进程,处理信号(如重新加载配置),以及管理共享资源(如缓存)。它不直接处理客户端请求,而是负责监控Worker进程的状态和进行必要的管理操作。
Worker进程:负责实际处理客户端请求。每个Worker进程都是独立的,它们之间互不干扰,共同处理来自客户端的并发请求。这种设计提高了Nginx的并发处理能力和稳定性。
Event模块
Event模块是Nginx的核心模块之一,负责处理底层的事件。它采用异步、非阻塞的事件驱动模型,通过操作系统提供的高效I/O多路复用机制(如epoll、kqueue等)来监听和处理大量的并发连接。这种机制使得Nginx能够高效地处理请求,而不会因为等待I/O操作而阻塞进程。
HTTP模块
HTTP模块是Nginx的HTTP请求处理模块,负责解析HTTP请求、处理请求头、处理请求内容,以及生成HTTP响应等。HTTP模块内部包含了很多子模块,如反向代理模块、负载均衡模块、静态文件模块等,可以根据需求进行自定义配置
Cache模块
Cache模块用于缓存静态资源和动态请求的响应结果
编译安装nginx
#创建存放nginx源码的目录
mkdir -p /nginx
#进入目录,开始下载nginx源码包
cd /nginx
curl -O https://nginx.org/download/nginx-1.26.1.tar.gz
#解压源码包
tar xf nginx-1.26.1.tar.gz
cd nginx-1.26.1
#解决依赖的软件包
yum install gcc pcre-devel openssl-devel -y
#新建用户nginx_user 用来启动nginx
useradd nginx_user -s /sbin/nologin
#配置工作
./configure --prefix=/usr/local/nginx-1 --user=nginx_user --with-http_ssl_module --with-http_v2_module --with-threads --with-stream --with-http_stub_status_module
#启动2个进程去编译
make -j 2
#安装编译,将前面编译好的二进制文件和配置文件复制到/usr/local/nginx-1目录下
make install
#修改PATH环境变量,增加nginx的安装目录,方便找到安装的nginx
echo 'PATH=/usr/local/nginx-1/sbin/:$PATH' >>/etc/profile
在当前终端里执行脚本/etc/profile 加载PATH环境变量
source /etc/profile
#启动nginx
/usr/local/nginx-1/sbin/nginx
通过查看进程来确认是否成功启动
可以通过查看端口来确认nginx是否启动
netstat -anplut 命令需要安装包net-tools
通过访问本机ip地址来查看,如果出现以下界面,恭喜你,已经成功安装(注意关闭防火墙和selinux)
nginx命令
nginx 启动nginx
nginx -v 查看nginx版本
nginx -t 检查nginx配置文件有没有问题
nginx -s reload 重新加载nginx
nginx -s stop 停止nginx服务
nginx开机启动
1.写入配置文件,开启自动启动编译安装的nginx
vim /etc/rc.local
/usr/local/nginx-1/sbin/nginx
2.创建一个 nginx.service文件,让systemctl进行管理
进入目录项
cd /usr/lib/systemd/system
cd /usr/lib/systemd/system编辑一个nginx.service文件内容如下:
[Unit]
Description=nginx - high performance web server
[Service]
Type=forking
PIDFile=/usr/local/nginx-1/logs/nginx.pid
ExecStart=/usr/local/nginx-1/sbin/nginx -c /usr/local/nginx-1/conf/nginx.conf
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat $PIDFile)"
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat $PIDFile)"
[Install]
WantedBy=multi-user.target
vim nginx.service
[Unit]
Description=nginx - high performance web server
定义了服务的描述信息,当您使用systemctl status 命令查看服务列表或服务的状态时,这个描述信息会显示出来,帮助用户了解这个服务是做什么的。
[Service]
Type=forking
#指定了服务的启动类型,forking
类型意味着服务在启动时会创建一个新的进程,并且父进程会立即退出。systemd将跟踪这个新创建的子进程作为服务的主进程。
PIDFile=/usr/local/nginx-1/logs/nginx.pid
#指定了服务的主进程ID(PID)文件的路径。Nginx的master进程的PID会被写入这个文件。systemd会使用这个文件来跟踪Nginx的主进程,并在需要时发送信号给它。
ExecStart=/usr/local/nginx-1/sbin/nginx -c /usr/local/nginx-1/conf/nginx.conf
#指定了启动服务时要执行的命令,告诉systemd使用指定的Nginx可执行文件(/usr/local/nginx-1/sbin/nginx
)和配置文件(/usr/local/nginx-1/conf/nginx.conf
)来启动Nginx服务。
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat $PIDFile)"
#指定了重新加载服务配置时要执行的命令。当您使用systemctl reload nginx
命令时,systemd会执行这个命令。
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat $PIDFile)"
#指定了停止服务时要执行的命令。当您使用systemctl stop nginx
命令时,systemd会执行这个命令
[Install]
WantedBy=multi-user.target
#指定了这个服务单元被哪个目标(target)所依赖
接下来重新加载系统配置,并设置开机启动
systemctl daemon-reload
部署web
部署一个网页
进入/usr/local/nginx-1/conf中,编辑nginx.conf
worker_processes 2;#启动两个进程
#pid logs/nginx.pid;
events {
worker_connections 2048;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
#keepalive_timeout 0;
keepalive_timeout 65;
#一个server 就是一个网站
#一个server就是一个虚拟主机(网站)
server {
#网站监听的端口
listen 80;
#网站对应的域名
server_name www.yqxweb.com;
#定义访问日志的路径和名字、记录的内容
access_log logs/yqxweb.access.log main;
#定义错误日志:访问网站出错的时候,服务器会记录下来
error_log logs/yqxweb.error.log;
#定义路由 / 网站根目录
location / {
#定义网站存放网页的文件夹--》网站内容根目录 ->在/usr/local/nginx-1/html
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
更改完配置文件后记得使用nginx -t检查是否有错误,接着重启一遍nginx最后可以使用curl+ip访问
,更改/etc/hosts文件添加域名解析,将你的域名和对应的ip写入,就可以使用 curl +域名进行访问
192.168.172.153 www.yqxweb.com
在windows的测试机器上添加dns域名解析对应的ip和域名
C:\Windows\System32\drivers\etc\hosts
给本机进行域名解析的
192.168.205.153 www.scweb.com
nginx还有许多其他的功能
隐藏nginx版本
nginx -t
nginx -s reload
再次打开刷新即可
提供下载功能和状态统计功能
访问时需在域名后添加/download
此处download需要在html新建一个文件夹download
访问时需在域名后添加/status
负载均衡
将工作负载(如访问请求、数据处理任务等)均匀地分配到多个服务器或网络设备上,以防止任何单一节点过载,从而提高整体系统的可用性和性能.
作用
- 资源优化:有效利用服务器资源,避免过载。
- 提升性能:增加系统处理请求的能力,提高吞吐量和响应速度。
- 改善体验:确保用户请求快速响应,提升用户体验。
- 增强可伸缩性:便于根据需要添加或减少服务器资源。
- 提高可靠性:分散请求,减少单点故障风险,提升服务连续性。
- 降低成本:优化资源使用,减少长期运营成本。
配置
进入/usr/local/nginx-1/conf
vim nginx.conf
worker_processes 2;
events {
worker_connections 2048;
}
http {
#定义一个负载均衡器,yqx's scweb
upstream yqxweb {
#最少连接算法
#least_conn;
#哈希算法
#ip_hash;
#加权轮询
server 192.168.172.140 weight=10;
#备份
#server 192.168.172.140 backup;
server 192.168.172.140:8080;
server 192.168.172.143;
}
#定义一个虚拟主机,对外提供web服务
server {
listen 80;
#定义一个访问页面根目录,定义一个路由,转达到yqx's web负载均衡配置上去处理
location / {
proxy_pass http://yqxweb;
#代理服务器在转发http请求时,在http头部增加一个字段X-Real_IP,值为ip;
proxy_set_header X-Real_IP $remote_addr;
#proxy_pass http://www.jd.com;
}
}
}
健康检测
被动检测模式下,Nginx并不主动向后端服务器发送检测请求。相反,它通过观察代理请求的实际响应来判断后端服务器的健康状况
主动检测模式下,Nginx会定期向后端服务器发送检测请求(通常称为“探针”或“心跳”),以验证其健康状况
高可用-keepalived
认识
高可用系统或服务能够持续并稳定地运行,对于任何因素造成的单点故障都具有较强的容错能力,保证系统或服务的连续性和可靠性
Keepalived是一个开源的、轻量级的、基于VRRP(虚拟路由器冗余协议)协议的高可用软件,主要用于实现Linux服务器的故障转移和负载均衡
体系架构
core模块:负责主进程的启动、维护及全局配置文件的加载和解析。
vrrp模块:实现VRRP协议的核心部分,负责处理VRRP的广播、接收和响应等操作。
check模块:负责健康检查功能,通过定期检测服务器的状态(如端口状态、URL响应等)来确保服务的可用性。如果检测到服务器故障,会触发故障切换机制。
作用
高可用系统网络服务:Keepalived可以实现在两台或多台主机之间的故障切换转移,确保服务的连续性。
LVS集群健康状态检测:Keepalived能够检测LVS集群中各台真实服务器的健康状态,并在服务器出现故障时自动将其从LVS的正常转发队列中移除。
管理LVS负载均衡软件:Keepalived可以读取配置文件,并通过一个更为底层的接口来管理IPVS并生成IPVS规则,使得LVS的使用更为方便
安装使用
yum install keepalived -y
cd /etc/keepalived/keepalived.conf
第一台主机的keepalived
#vrrp_strict 注释掉,遵守最严格的vrrp协议
#实现高可用的配置
vrrp_instance VI_1 { #启动一个vrrp的实例 VI_1 实例名,可以自定义,一个实例背后就是一个keepalived相关的进程
state MASTER #角色是master backup
interface ens33 #在哪个接口上监听vrrp协议,同时绑定vip到那个接口
virtual_router_id 105 #虚拟路由id(帮派) 0~255范围
priority 120 #优先级 0~255
advert_int 1 #advert interval 宣告消息 时间间隔 1秒
authentication { #认证
auth_type PASS #认证的类型是密码认证
auth_pass 11112222 #具体的密码,可以自己修改
}
virtual_ipaddress { #vip的配置,vip可以是多个ip,也可以是一个vip
192.168.172.188
}
}
systemctl start keepalived
systemctl enable keepalived
第二台主机
! onfiguration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 88
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.172.188
}
}
可以使用 ip add 查看可以发现有192.168.172.188这个地址
对外我们只公布有vip地址的负载均衡器
验证
直接将lb1的nginx关机
lb2出现了vip
会通过vrrp协议进行广播,一旦时隔多久没有收到广播就会进行vip漂移
脑裂
同时出现多台vip
原因
vrid(虚拟路由id)不一样
网络通信有问题:中间有防火墙阻止了网络之间的选举的过程,vrrp报文的通信
认证密码不一样也会出现脑裂
危害
冗余:资源浪费,但是能正常访问,反而还有负载均衡的作用
脑裂恢复的时候,还是有影响的,会短暂的中断,影响业务的使用