工具 | NGINX - 高级负载均衡器、Web服务器、反向代理

工具 | NGINX - 高级负载均衡器、Web服务器、反向代理

NGINX为世界上最繁忙的网站加速内容和应用的交付过程,并提高安全性、可用性和可扩展性。NGINX是用于 Web服务、负载均衡、反向代理、内容缓存、媒体流传输 等场景的开源软件,且F5 NGINX提供云原生的、Kubernetes 友好的开源和商业解决方案,如今已成为全世界最流行的 web 服务器!

  • NGINX是一个Http服务器,是一个使用C语言开发的高性能的http服务器及反向代理服务器。
  • NGINX官网地址 nginx.org/en/download...

NGINX常用功能


1 反向代理

客户端向服务器发送请求时,会先经过Nginx服务器,由Nginx服务器将请求分发到相应的WEB服务器。正向代理是代理客户端,而反向代理则是代理服务器Nginx在提供反向代理服务方面,通过使用正则表达式进行相关配置,采取不同的转发策略,配置相当灵活,而且在配置后端转发请求时,完全不用关心网络环境如何,可以指定任意的IP地址和端口号,或其他类型的连接、请求等。

  • 问题:真实的服务器不能直接被外部网络访问,想要访问内部网络就要通过代理的方式 。

反向代理方式是指以代理服务器来接受网络上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给网络上请求连接的客户 端。将端口号隐藏,换层自定义的网络地址就是反向代理

2 负载均衡

负载均衡,一方面是将单一的重负载分担到多个网络节点上做并行处理,每个节点处理结束后将结果汇总返回给用户,这样可以大幅度提高网络系统的处理能力;另一方面将大量的前端并发请求或数据流量分担到多个后端网络节点分别处理,这样可以有效减少前端用户等待相应的时间。而Nginx负载均衡都是属于后一方面,主要是对大量前端访问或流量进行分流,已保证前端用户访问效率,并可以减少后端服务器处理压力

  • 问题:当一个服务器的单位时间内的访问量过大,服务器的压力就是越大,达到服务器的承受能力时,服务器就会崩溃。

为了避免服务器崩溃,让用户有更好的体验,通过负载均衡的方式来分担服务器的压力。建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器中。这样执行后,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,服务器压 力受到了平分,分担了服务器压力,避免了服务器崩溃的情况。负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。

3 Web缓存

Nginx可以作为前置缓存服务器,它被用于缓存前端请求,从而提高Web服务器的性能。Nginx会对用户已经访问过的内容在服务器本地建立副本,在一段时间内再次访问该数据,就不需要通过Nginx服务器向后端发出请求。减轻网络拥堵,减小数据传输延时,提高用户访问速度

4 动静分离

运用Nginx的反向代理功能,分发请求;动态资源请求交给应用服务器;静态资源请求(图片、视频、CSS、JS文件等)则直接由Nginx返回到浏览器。能大大减轻应用服务器的压力。

NGINX安装


1 Windows 安装 Nginx
  • 解压文件,双击nginx.exe
2 Linux 安装 Nginx
  • 下载压缩包
arduino 复制代码
wget http://nginx.org/download/nginx-1.22.1.tar.gz
  • 解压压缩包

    tar zxvf nginx-1.22.1.tar.gz

  • 下载所需的依赖库和包

    yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

  • 配置环境,编译并安装。解压目录中操作

bash 复制代码
./configure --prefix=/usr/local/nginx
​
make && make install
  • 进入/usr/local/nginx目录,文件的解压目录和编译目录不能是同一文件夹
  • Nginx有关命令
bash 复制代码
# 检测配置文件是否正常
sbin/nginx -t -c conf/nginx.conf 
# 启动项目
sbin/nginx -c conf/nginx.conf
# 打印出 nginx 所有进程
# a = show processes for all users 显示所有用户的进程
# u = display the process's user/owner 显示用户
# x = also show processes not attached to a terminal 显示无控制终端的进程
ps aux | grep nginx 
# 修改配置后平滑重启
sbin/nginx -s reload -c conf/nginx.conf
# 优雅关闭Nginx,会在执行完当前的任务后再退出  
sbin/nginx -s quit 
# 强制终止Nginx,不管当前是否有任务在执行
sbin/nginx -s stop   
3 Docker 安装 Nginx
  • 获取镜像列表NGINX
sql 复制代码
docker search nginx
  • 拉取NGINX镜像到本地

    docker pull nginx

  • 启动容器
css 复制代码
docker run -d --name nginx -p 80:80 nginx

4 Docker 安装容器的挂载问题

为避免每次进入到容器内部修改配置文件,将容器内部配置文件挂载到宿主机,根据宿主机对应修改

bash 复制代码
mkdir -p ./nginx/{html,logs,conf}
bash 复制代码
docker run --name nginx -m 200m -p 80:80 \
-v /docker_wp/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /docker_wp/nginx/logs:/var/log/nginx \
-v /docker_wp/nginx/html:/usr/share/nginx/html \
-v /docker_wp/nginx/conf:/etc/nginx/conf.d \
-e TZ=Asia/Shanghai \
--privileged=true -d nginx
  • 将宿主机上的的nginx.conf覆盖容器的nginx.conf文件
  • 将日志文件进行挂载,把nginx服务器的日志写到宿主机的/docker_wp/nginx/logs
  • 将配置的默认html文件目录,覆盖到容器的html文件目录
  • 将宿主机上的的conf覆盖容器的conf.d文件目录
5 防火墙开启
ini 复制代码
# 开启防火墙 
systemctl start firewalld.service 
 
# 防火墙开机启动 
systemctl enable firewalld.service
 
# 关闭防火墙 
systemctl stop firewalld.service 
 
# 查看防火墙状态 
firewall-cmd --state 
​
# 添加端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
​
# 重载防火墙配置 
firewall-cmd --reload
​
# 添加多个端口
firewall-cmd --permanent --zone=public --add-port=8001-8009/tcp 
​
# 查看开放端口
firewall-cmd --zone=public --list-ports  
​
# 删除端口
firewall-cmd --permanent --zone=public --remove-port=81/tcp

❤️反向代理

正向代理代理客户端,反向代理代理服务器

正向代理

知道目标服务器地址,但由于网络限制等原因,无法直接访问。这时需要先连接代理服务器,然后再由代理服务器访问目标服务器。譬如访问国外网被墙了,然后找个代理服务,通过该服务器访问国外网站。

反向代理

反向代理对用户则是不可知的 ,客户端访问代理服务器,代理服务器访问应用服务器,获取资源返回给用户,用户不知道代理服务器是访问了应用服务器,也就应用服务器的地址。比如访问百度网站,百度的代理服务器对外的域名为https://www.baidu.com 。具体内部的服务器节点我们不知道,现实中通过访问百度的代理服务器后,代理服务器给我们转发请求到他们N多的服务器节点中的一个给我们进行搜索后将结果返回。

Nginx反向代理服务器
  • 简单的代理配置
ini 复制代码
location /dockerui {
  proxy_pass http://127.0.0.1:8004/;
  proxy_redirect      off;
  proxy_set_header    Host $host;
}
  • 进阶代理配置(upstream)
ini 复制代码
upstream zentao {
  server 0.0.0.0:8003;
}
​
server {
  listen 80;
  server_name example.com;
  
  location /zentao {
    proxy_pass http://zentao/;
  }
}
  • 支持WebSocket,并设置代理keepalive
ini 复制代码
upstream hsm {
  server 0.0.0.0:8011;
  keepalive 5;
}
​
server {
  listen 80;
  server_name example.com;
  
  location /hsm {
    proxy_pass http://hsm/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forward-Proto http;
    proxy_set_header X-Nginx-Proxy true;
    proxy_redirect off;
  }
}

🍏负载均衡

将接收到的请求按照一定规则分发给应用服务器

  • 简单实例
css 复制代码
upstream dockeruis {
  server 0.0.0.0:8003;
  server 0.0.0.0:8103;
}
  • 权重(weight):权重数据越大,被分配到请求的几率越大

    • 依据后端服务器硬件条件进行调整
ini 复制代码
upstream dockeruis {
  server 0.0.0.0:8003 weight=3;
  server 0.0.0.0:8103 weight=2;
}
  • 哈希(ip_hash):每个请求按照发起客户端的ip的hash结果进行匹配

    • 类似于固定访问,无Session共享问题
ini 复制代码
upstream dockeruis {
  ip_hash;
  server 0.0.0.0:8003;
  server 0.0.0.0:8103;
}
  • 哈希(url_hash):按照访问的urlhash结果分配请求

    • 提高缓存效率
    • 需要安装nginxhash软件包
ini 复制代码
upstream dockeruis {
  hash $request_uri;
  hash_method crc32;
  server 0.0.0.0:8003;
  server 0.0.0.0:8103;
}
  • 响应时间短优先(fair):响应时间短处理效率高的服务器分配到请求的概率高

    • 安装upstream_fair模块
ini 复制代码
upstream dockeruis {
  fair;
  server 0.0.0.0:8003;
  server 0.0.0.0:8103;
}

server参数
可选参数 参数描述
weight 访问权重数值越高,收到请求越多
fail_timeout 指定的时间内必须提供响应
max_fails 尝试失败服务器连接的最大次数
down 标记一个服务器不再接受任何请求
backup 有服务器宕机,标记的机器接收请求

🍋Web缓存

减少了向应用服务器请求,提高性能,缩短了响应时间,提升了加载速度

Nginx通过设置ExpiresCache-Control头信息来处理缓存

  • 永久缓存
arduino 复制代码
location /static {
    root /resources;
    expires max;
}
  • 永不缓存响应
ini 复制代码
location = /dynamic {
    root /resource_dynamic
    expires -1;
}

🌽动静分离

处理静态资源,减少后端压力

  • Nginx安装好后,默认的静态资源页面配置如下,可以查看配置文件找到静态文件界面

    • index.html 默认访问首页
    • 响应500 502 503 504 状态码时,展示50x.html
  • 修改nginx.conf

    • root:表示根目录
    • index:表示默认页
ini 复制代码
location ~ .*.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css){  
    root   /soft/nginx/static_resources;  
    expires 7d;  
}  

其他

变量 说明
$args 这个变量等于请求行中的参数,同 $query_string
$remote_port 客户端的端口
$content_length 请求头中的 Content-length 字段
$remote_user 已经经过 Auth Basic Module 验证的用户名
$content_type 请求头中的 Content-Type 字段
$request_filename 当前请求的文件路径,由 root 或alias指令与URI请求生成
$document_root 当前请求在 root 指令中指定的值
$scheme HTTP方法(如http,https)
$host 请求主机头字段,否则为服务器名称
$hostname 主机名
$http_user_agent 客户端agent信息
$http_cookie 客户端cookie信息
$server_protocol 请求使用的协议,通常是HTTP/1.0HTTP/1.1
$server_addr 服务器地址,在完成一次系统调用后可以确定这个值
$server_name 服务器名称
$server_port 请求到达服务器的端口号
$limit_rate 这个变量可以限制连接速率
$request_method 客户端请求的动作,如 GET/POST
$request_uri 包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz
$remote_addr 客户端的IP地址
$uri 不带请求参数的当前URI,$uri不包含主机名,如 /foo/bar.html
$document_uri $uri 相同
$nginx_version nginx 版本
相关推荐
bantinghy7 分钟前
Linux进程单例模式运行
linux·服务器·单例模式
小和尚同志1 小时前
29.4k!使用 1Panel 来管理你的服务器吧
linux·运维
帽儿山的枪手1 小时前
为什么Linux需要3种NAT地址转换?一探究竟
linux·网络协议·安全
就叫飞六吧9 天前
基于keepalived、vip实现高可用nginx (centos)
python·nginx·centos
shadon1789 天前
回答 如何通过inode client的SSLVPN登录之后,访问需要通过域名才能打开的服务
linux
小米里的大麦9 天前
014 Linux 2.6内核进程调度队列(了解)
linux·运维·驱动开发
算法练习生9 天前
Linux文件元信息完全指南:权限、链接与时间属性
linux·运维·服务器
忘了ʷºᵇₐ9 天前
Linux系统能ping通ip但无法ping通域名的解决方法
linux·服务器·tcp/ip
浩浩测试一下9 天前
渗透测试指南(CS&&MSF):Windows 与 Linux 系统中的日志与文件痕迹清理
linux·运维·windows·安全·web安全·网络安全·系统安全
敏叔V5879 天前
大模型Text2SQL之在CentOS上使用yum安装与使用MySQL
linux·mysql·centos