Nginx的四个版本
Nginx开源版
- 官网:nginx.org/
- Nginx 开源版是由 Nginx 团队开发和维护的一个高性能的 Web 服务器和反向代理服务器,它以其高并发处理能力和低资源消耗而闻名。
Nginx plus商业版
- 官网:www.nginx.com
- Nginx Plus 是 Nginx 公司提供的商业版,基于 Nginx 开源版,并附加了一些高级功能和企业级支持服务。
Openresty
- 官网:openresty.org
- OpenResty 是一个基于 Nginx 的 Web 平台,集成了大量的 Lua 库、第三方模块和大幅增强的功能,主要用于处理高并发的动态 Web 应用。
Tengine
- tengine.taobao.org/
- Tengine 是由阿里巴巴公司主导开发和维护的一个 Web 服务器项目,基于 Nginx 开源版并进行了大量扩展和优化。
Nginx的安装
Nginx开源版的安装-Linux
- 将压缩包上传到服务器
/usr/local
目录下,并解压缩
tar zxvf nginx-1.21.6.tar.gz
- 下载nginx所需的依赖
- 添加c语言编译器gcc:
yum install -y gcc
- 安装perl库:
yum install -y pcre pcre-devel
- 安装zlib库:
yum install -y zlib zlib-devel
- 安装nginx
- 利用解压的nginx目录下面的configure安装:
./configure --prefix=/usr/local/nginx
- 编译nginx
make
make install
- 启动nginx
# 启动nginx
./nginx
# 快速停止nginx
./nginx -s stop
# 优雅关闭nginx,在退出前完成已经接受的连接请求
./nginx -s quit
# 重新加载nginx配置
./nginx -s reload
# 查看nginx相关的服务
ps -ef | grep nginx
- 关于防火墙
# 关闭防火墙
systemctl stop firewalld.service
# 开启防火墙
systemctl start firewalld
# 启用防火墙
systemctl enable firewalld
# 重启端口
firewall-cmd --reload
# 查看已经开放的端口
firewall-cmd --list-ports
# 禁止防火墙开机自启动
systemctl disable firewalld.service
# 开启放行端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
# 关闭放行端口
firewall-cmd --zone=public –remove-port=80/tcp --permanent
# 重新加载防火墙配置
systemctl reload firewalld
- nginx脚本
创建nginx服务脚本:vim /usr/lib/systemd/system/nginx.service
脚本内容(注意nginx的安装路径)
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
重新加载服务:systemctl daemon-reload
查看nginx相关的服务:ps -ef | grep nginx
停止nginx(注意要在/usr/local/nginx/sbin目录下执行):./nginx -s stop
启动服务:systemctl start nginx
查看nginx服务是否启动成功:systemctl status nginx
开机启动:systemctl enable nginx
Nginx的Docker安装-Linux
- 拉取Nginx镜像
docker pull nginx:1.27.0-perl
- 创建Nginx配置目录
# 创建挂载目录
mkdir -p /home/nginx/conf
mkdir -p /home/nginx/log
mkdir -p /home/nginx/html
- 创建Nginx配置文件
方式一:通过网盘下载
方式二:通过创建容器获取
# 生成容器
docker run --name nginx -p 80:80 -d nginx:1.27.0-perl
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /home/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /home/nginx/
- 删除创建的容器
docker rm -f containerId
- 创建新的容器
多行命令版
docker run \
-p 80:80 \
--name nginx \
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /home/nginx/log:/var/log/nginx \
-v /home/nginx/html:/usr/share/nginx/html \
-d nginx:1.27.0-perl
单行命令版
docker run -p 80:80 --name nginx -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/conf/conf.d:/etc/nginx/conf.d -v /home/nginx/log:/var/log/nginx -v /home/nginx/html:/usr/share/nginx/html -d nginx:1.27.0-perl
Nginx的Docker安装-Windows
- 拉取Nginx镜像
docker pull nginx:1.27.0-perl
- 获取Nginx配置文件
方式一:通过网盘获取
方式二:通过Nginx镜像获取
2.1 创建并运行nginx容器
docker run -p 80:80 -d --name nginx nginx:1.27.0-perl
2.2 将nginx容器中的配置文件复制到本地
docker cp nginx:/etc/nginx/nginx.conf D:\app\nginx\docker\volumns\conf
docker cp nginx:/etc/nginx/conf.d D:\app\nginx\docker\volumns\conf
docker cp nginx:/usr/share/nginx/html D:\app\nginx\docker\volumns
2.3 删除nginx容器
docker rm nginx
- 创建并运行nginx容器
多行命令版
docker run -p 80:80 \
-d --name nginx \
-v D:\app\nginx\docker\volumns\conf\nginx.conf:/etc/nginx/nginx.conf \
-v D:\app\nginx\docker\volumns\conf\conf.d:/etc/nginx/conf.d \
-v D:\app\nginx\docker\volumns\html:/usr/share/nginx/html \
nginx:1.27.0-perl
单行命令版
docker run -p 80:80 -d --name nginx -v D:\app\nginx\docker\volumns\conf\nginx.conf:/etc/nginx/nginx.conf -v D:\app\nginx\docker\volumns\conf\conf.d:/etc/nginx/conf.d -v D:\app\nginx\docker\volumns\html:/usr/share/nginx/html nginx:1.27.0-perl
Nginx的目录结构
/usr/local/nginx
├── client_body_temp # POST 大文件暂存目录
├── conf # Nginx所有配置文件的目录
│ ├── fastcgi.conf # fastcgi相关参数的配置文件
│ ├── fastcgi.conf.default # fastcgi.conf的原始备份文件
│ ├── fastcgi_params # fastcgi的参数文件
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types # 媒体类型
│ ├── mime.types.default
│ ├── nginx.conf #这是Nginx默认的主配置文件,日常使用和修改的文件
│ ├── nginx.conf.default
│ ├── scgi_params # scgi相关参数文件
│ ├── scgi_params.default
│ ├── uwsgi_params # uwsgi相关参数文件
│ ├── uwsgi_params.default
│ └── win-utf
├── fastcgi_temp # fastcgi临时数据目录
├── html # Nginx默认站点目录
│ ├── 50x.html # 错误页面优雅替代显示文件,例如出现502错误时会调用此页面
│ └── index.html # 默认的首页文件
├── logs # Nginx日志目录
│ ├── access.log # 访问日志文件
│ ├── error.log # 错误日志文件
│ └── nginx.pid # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp # 临时目录
├── sbin # Nginx 可执行文件目录
│ └── nginx # Nginx 二进制可执行程序
├── scgi_temp # 临时目录
└── uwsgi_temp # 临时目录
Nginx的基本运行原理
Nginx的基本运行过程
- 启动Nginx时,会启动一个Master进程,Master进程读取和解析配置文件
nginx.conf
,Master进程初始化全局资源(比如日志文件、监听端口等)。 - 创建Worker进程,根据配置文件中的设置,Master进程会创建一个或多个Worker进程,Worker进程由Master进程管理,负责处理实际的请求。
- 客户端请求到达后,Nginx监听的端口会收到请求,监听套接字分发给Worker进程,Worker进程通过异步、非阻塞的事件驱动机制处理请求,完成后返回响应给客户端。
- Master进程负责监控和管理Worker进程,当配置文件更新或Worker进程异常退出时,Master可以重启Worker进程以确认服务的稳定运行。
Nginx的配置文件
Nginx的和核心配置文件:nginx/conf/nginx.conf
- worker_processes 1; 默认为1,表示开启一个业务进程
- worker_connections 1024; 单个业务进程可接受连接数
- include mime.types; 引入http mime类型
- default_type application/octet-stream; 如果mime类型没匹配上,默认使用二进制流的方式传输。
- sendfile on; 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。
- keepalive_timeout 65;
虚拟主机配置
server
:用于定义一个虚拟主机配置。一个 Nginx 配置文件中可以包含多个 server 块,每个 server 块代表一个虚拟主机。listen
:用于指定服务器监听的 IP 地址和端口。可以指定单个端口,也可以同时指定 IP 地址和端口。server_name
:用于指定当前虚拟主机响应的域名。可以指定多个域名,使用空格分隔。支持通配符和正则表达式。location
:用于匹配请求的 URI,并指定处理这些请求的配置。可以使用前缀匹配、正则匹配和精确匹配。root
:指令用于指定文档根目录,即静态文件所在的目录。可以是相对路径(相对于nginx目录下),也可以是绝对路径。index
:用于指定默认的索引文件。proxy_pass
:指定反向代理,可以直接填写反向代理的URL,填了 proxy_pass ,那么 location 中就不能填 root 和 index 。upstream
:用来配置一组负载均衡的 server 组,upstream 和 server 标签在同一级别下。
server {
listen 80; 监听端口号
server_name localhost; 主机名
location / { 匹配路径
root html; 文件根目录
index index.html index.htm; 默认页名称
}
error_page 500 502 503 504 /50x.html; 报错编码对应页面
location = /50x.html {
root html;
}
}
Nginx反向代理
反向代理是什么?
- 正向代理(代理):正向代理是位于客户端和目标服务器之间的服务器,代理客户端向目标服务器发送请求,并将目标服务器的响应返回给客户端。正向代理隐藏了客户端的真实IP地址。
- 反向代理:反向代理是位于目标服务器和客户端之间的服务器,代理目标服务器接收客户端请求,并将目标服务器的响应返回给客户端。反向代理隐藏了目标服务器的真实IP地址。
Nginx的负载均衡
Nginx的负载均衡:将客户端的请求分发到多个后端服务器,以提高服务的可靠性和性能。这种方式可以避免单一服务器过载,提高系统的整体处理能力和响应速度。
Nginx常见的负载均衡策略
- 轮询:默认策略,按顺序将请求分发到各服务器。
- 权重:按权重比例分发请求,权重越高的服务器获得的请求越多。
- IP哈希:基于客户端IP地址的哈希值分发请求,用于会话保持。
- 最少连接:将请求分发到当前活动连接数最少的服务器。
- 一致性哈希:通常用于缓存或数据库分片,使得相同的请求总是落在同一台服务器上。
Nginx的动静分离
Nginx的动静分离用于优化网站性能的技术,将动态请求和静态请求分离处理。
- 动态请求:指请求的资源内容是由后端应用程序生成的,内容会根据请求的不同而变化,通常涉及数据处理和数据库交互。
- 静态请求:指请求的资源是固定不变的,服务器直接返回文件内容,包括HTML文件、IMG图片、CSS文件和脚本文件等,静态请求处理过程非常简单,服务器直接从文件系统读取请求的文件,并将文件内容返回给客户端。
Nginx动静分离的原理:利用Nginx的高效静态文件处理能力和反向代理功能,将不同类型的请求路由到相应的处理单元。
Nginx实现动静分离
# 将静态文件存放在相对路径下的 html/js 目录下
server {
listen 80;
server_name localhost;
# 表示访问URI为js
location /js {
# 静态文件存放在nginx的相对路径html的js下面
root html;
# 表示默认的文件是index.html
index index.html index.htm;
}
}
Nginx高可用
Nginx高可用:指通过一系列技术和配置手段,确保Nginx服务器在出现硬件故障、网络问题或其它意外情况时,仍然能够保持服务的持续可用性。实现Nginx高可用的目的是提高网站或应用程序的可靠性和稳定性,避免单点故障导致服务中断。
Nginx + Keepalived实现高可用:Keepalived结合 VRRP 可以实现主备服务器切换。通过配置虚拟IP地址,当主服务器故障时,备用服务器会自动接管该虚拟IP,确保服务的持续可用。
- 虚拟IP:由Keepalived管理的一个IP地址,在主服务器和被服务器之间漂移。在任何时间点只在一个服务器上激活,用于对外提供服务。
- 真实IP:指服务器的实际网络接口IP地址,用于服务器之间的通信。
虚拟IP地址主要用于提供一个固定的IP地址,对外暴露服务。客户端只需要访问这个虚拟IP,而不需要关心具体是哪台服务器在提供服务。当主服务器宕机时,Keepalived会自动将这个虚拟IP切换到备服务器上,从而实现高可用性。
参考文章
- 【尚硅谷Nginx教程(亿级流量nginx架构设计)】 www.bilibili.com/video/BV1yS…