工具 | 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
):按照访问的url
的hash
结果分配请求- 提高缓存效率
- 需要安装
nginx
的hash
软件包
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
通过设置Expires
和Cache-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.0 或HTTP/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 版本 |