Nginx

43 阅读10分钟

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

  1. 将压缩包上传到服务器/usr/local目录下,并解压缩
tar zxvf nginx-1.21.6.tar.gz
  1. 下载nginx所需的依赖
  • 添加c语言编译器gcc:yum install -y gcc
  • 安装perl库:yum install -y pcre pcre-devel
  • 安装zlib库:yum install -y zlib zlib-devel
  1. 安装nginx
  • 利用解压的nginx目录下面的configure安装:./configure --prefix=/usr/local/nginx
  • 编译nginx
make
make install
  1. 启动nginx
# 启动nginx
./nginx
# 快速停止nginx
./nginx -s stop 
# 优雅关闭nginx,在退出前完成已经接受的连接请求
./nginx -s quit 
# 重新加载nginx配置
./nginx -s reload 
# 查看nginx相关的服务
ps -ef | grep nginx
  1. 关于防火墙
# 关闭防火墙
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
  1. 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

  1. 拉取Nginx镜像
docker pull nginx:1.27.0-perl
  1. 创建Nginx配置目录
# 创建挂载目录
mkdir -p /home/nginx/conf
mkdir -p /home/nginx/log
mkdir -p /home/nginx/html
  1. 创建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/
  1. 删除创建的容器
docker rm -f containerId
  1. 创建新的容器

多行命令版

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

  1. 拉取Nginx镜像
docker pull nginx:1.27.0-perl
  1. 获取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
  1. 创建并运行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的基本运行过程

  1. 启动Nginx时,会启动一个Master进程,Master进程读取和解析配置文件nginx.conf,Master进程初始化全局资源(比如日志文件、监听端口等)。
  2. 创建Worker进程,根据配置文件中的设置,Master进程会创建一个或多个Worker进程,Worker进程由Master进程管理,负责处理实际的请求。
  3. 客户端请求到达后,Nginx监听的端口会收到请求,监听套接字分发给Worker进程,Worker进程通过异步、非阻塞的事件驱动机制处理请求,完成后返回响应给客户端。
  4. Master进程负责监控和管理Worker进程,当配置文件更新或Worker进程异常退出时,Master可以重启Worker进程以确认服务的稳定运行。

image.png

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地址。

image.png

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切换到备服务器上,从而实现高可用性。

测试文件.png

参考文章