Nginx基础学习

1. 引言

项目刚上线时,用户使用少,并发量小,在这种情况下,在这种情况下,一个jar包部署到一台服务器上启动就满足需求了。

随着,平台使用的用户量增多,并发量也慢慢增大,这种情况下一台服务器已经满足不了需求了。这时就会横向扩展,增加服务器。这个时候几个项目启动在不同的服务器上,用户要访问,就需要增加一个代理服务器了,通过代理服务器来帮我们转发和处理请求。

我们需要这个代理服务器可以接收用户的请求,然后将用户的请求按照规则转发到不同的服务器节点之上,并且这个过程用户是无感知的,用户不需要知道哪个服务器返回的结果。由此我们使用了Nginx。

2. Nginx简介

        Nginx (engine x) 是一个高性能的开源反向代理服务器,也可以用作 HTTP 服务器、负载均衡器、邮件代理服务器等。它是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。

        Nginx的特点是占有内存少,并发能力强。由于nginx的并发能力在同类型的网页服务器中表现较好,国内有很多大公司都使用Nginx,比如百度、腾讯、淘宝等。

        Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 5万 个并发连接数的响应

3. Nginx的作用

3.1 反向代理服务器

Nginx 可以作为反向代理服务器,接收客户端的请求,然后将请求转发给后端的服务器,最后将后端服务器的响应返回给客户端。这有助于隐藏后端服务器的真实 IP 地址,提高了系统的安全性。

以百度为例,百度的请求地址永远是www.baidu.com,而请求的服务器可能是深圳服务器,北京服务器,上海服务器等,其中就是通过Nginx代理服务器作为跳板访问别的服务器的。

扩展:正向代理是指代理客户端,反向代理指代理服务器端。

反向代理使用proxy_pass指令来配置,如

server {listen      80;location / {proxy_pass http://192.168.243.30:5000;}
}

当访问http://localhost:80时就会被代理到http://192.168.243.30:5000上。
还可以进一步配置成server_group的形式,为后面的负载均衡做准备:

upstream api_server {                                                         server 192.168.243.30:5000;server 192.168.243.30:5001;
}server {listen      80;location / {proxy_pass http://api_server;}
}

3.2 负载均衡

Nginx 具有负载均衡的功能,可以将来自客户端的请求分发到多个后端服务器,以均衡服务器的负载。这有助于提高系统的可伸缩性和稳定性。

在 Nginx 中,负载均衡是通过 upstream 模块实现的。Nginx 提供的负载均衡策略有2种:内置策略和使用第三方模块实现更多的扩展策略。以下是这两种类型的一些策略:

3.2.1 内置策略

Nginx 内置的负载均衡策略主要包括以下几种:

(1)轮询(Round Robin): 默认策略,将每个请求依次分配到不同的后端服务器上,实现简单且均匀的负载分布。

upstream api_server {                                                                             server 192.168.243.30:5000;server 192.168.243.30:5001 weight=2 max_fails=2 fail_timeout=10;  
}

扩展:

以上有3个指令可通过需要添加:

(1)weight:用于配置轮询目标的权重,默认权重都是1。如上设置目标1权重为2,则2/3的请求会被导向目标1中。

(2)max_fails:设置调用失败的次数,超过设定的次数后,nginx会认为这个目标不可用。默认为1次,如果被设置为0,健康检查会被禁用。

(3)fail_timeout:设置将目标标记为不可用的时长,默认为10秒,超过这个时间后,nginx会尝试将少部分流量导到这个目标,如果目标恢复响应,则取消其不可用标记。

(2)最小连接数(Least Connections): 将请求发送到当前连接数最少的服务器,这样可以尽量避免有些已经很繁忙的服务器过载。

upstream api_server {     least_conn;                                                      server 192.168.243.30:5000;                           server 192.168.243.30:5001;
}

(3)IP 哈希(IP Hash): 基于客户端 IP 地址的哈希算法,确保相同的客户端 IP 的请求被发送到相同的后端服务器,适用于某些需要保持会话的场景。

upstream api_server {       ip_hash;                                                  server 192.168.243.30:5000;                           server 192.168.243.30:5001;
}

(4)泳道(Least Time): 将请求发送到响应时间最短的服务器,通常用于后端服务器的性能差异比较大的情况。

3.2.2 扩展策略

Nginx 也支持通过第三方模块实现更多的负载均衡策略。例如,nginx-upsync-module 提供了动态发现和删除后端服务器的功能。

在这些扩展中,一些常见的扩展负载均衡策略包括:

  • 加权轮询(Weighted Round Robin): 为每个后端服务器分配一个权重,以决定其接收请求的频率。

  • 加权最小连接数(Weighted Least Connections): 将请求发送到当前连接数加权最小的服务器,考虑到服务器性能和权重。

  • URL 哈希(URL Hash): 基于请求的 URL 进行哈希,确保相同的 URL 请求被发送到相同的后端服务器。

  • 自适应(Adaptive Load Balancing): 根据后端服务器的性能动态调整权重,以适应实时的负载情况。

这些扩展策略允许根据具体需求进行更灵活的配置,以满足不同应用场景的负载均衡需求。

3.3 动静分离

动静分离是指将动态生成的内容(通常是由应用服务器动态生成的)与静态内容(如图片、CSS 文件、JavaScript 文件等)分开处理,从而提高网站的性能和扩展性。这通常是通过将请求分发到不同的服务器或处理路径上来实现的。

Nginx 最初是设计用于处理静态内容的,但它现在也支持 FastCGI、uWSGI、SCGI 等协议,从而可以处理动态生成的内容,如 PHP、Python 和 Java等。

以下是实现 Nginx 动静分离的主要方法:

(1)代理请求到后端应用服务器:将动态请求(如 PHP、Python、Java 等应用生成的请求)代理到后端应用服务器(如应用服务器集群)进行处理。

location /dynamic/ {proxy_pass http://backend_dynamic_server;
}

(2)直接服务静态内容:将静态内容的请求直接由 Nginx 处理,而不必通过后端应用服务器。这通常包括图片、样式表、脚本等静态资源。还可以缓存静态内容到Nginx服务器上,从而加速后续的访问。

location /static/ {alias /path/to/static/files;expires 1d;  # 可设置缓存过期时间,也可去掉
}

(3)路径重写:通过 Nginx 的路径重写规则,将特定路径的请求分发到后端应用服务器,而其他路径的请求直接由 Nginx 处理。

location / {try_files $uri $uri/ /index.php?$query_string;
}

(4)CDN 集成:使用 CDN(内容分发网络)来缓存和分发静态资源,将静态内容分发到全球各地的 CDN 节点,减轻源服务器的负载。

扩展:什么是CDN?

CDN(Content Delivery Network, 内容分发网络)是为加快网络访问速度而建立在现有网络之上的分布式网络,它依靠部署在全球各地边缘节点的服务器群,通过负载均衡,内容发布,内容管理和内容存储的功能,由CDN服务器集群分担源站点服务器集群的压力,使用户可以就近获取已缓存的访问资源,避免网络拥堵,加快访问速度。与此同时,CDN是基于DNS解析进行管理的,其利用DNS技术和HTTPS协议确保了传输内容的安全性,保障用户的访问内容的安全性。

通过这些配置,Nginx 可以根据请求的类型将其动静分离,提高了系统的性能和可伸缩性。这种架构的优点在于可以通过独立扩展静态内容的服务器或 CDN 来优化性能,同时灵活配置动态内容的处理方式。

3.4 其他作用

3.4.1 HTTP 服务器

Nginx 可以用作静态内容的 HTTP 服务器。它能够高效地处理静态文件的服务请求,释放后端服务器的资源,提高网站的性能和响应速度。

举例:

(1)创建一个简单的 HTML 文件,比如 index.html,并将其放在 Nginx 默认的静态文件目录,现在放在 /var/www/html/目录下。

(2)编辑Nginx 的配置文件nginx.conf,确保以下内容:

server {listen 80;server_name localhost;location / {root /var/www/html;index index.html;}# 可以添加更多的配置,如日志记录等
}

(3)重启Nginx,通过浏览器访问服务器http://localhost:80,可看到index.html的页面了。

3.4.2 SSL/TLS终端

Nginx 可以充当 SSL/TLS 的终端,负责加密和解密来自客户端的请求和向后端服务器发送的请求。这有助于保护数据的安全性。

以下是配置 Nginx 作为 SSL/TLS 终端的基本步骤:

(1)获取 SSL 证书和密钥:可购买 SSL 证书,也可使用免费的证书颁发机构(CA)如 Let's Encrypt 提供的证书。

(2)编辑Nginx 的配置文件nginx.conf

server {listen 443 ssl http2;          # 指定 Nginx 监听 443 端口,并启用 SSL和http2(协议可选填)server_name yourdomain.com;    # 服务名,替换为你的域名ssl_certificate /path/to/your/certificate.crt;   # SSL证书本地路径ssl_certificate_key /path/to/your/private.key;   # SSL证书私钥的路径ssl_protocols TLSv1 TLSv1.1 TLSv1.2;  # 定义支持的 SSL/TLS 协议版本ssl_prefer_server_ciphers on;         # 告诉Nginx 优先使用服务器端定义的密码套件ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';   # 设置密码套件# (可选配置) 启用 HSTS(HTTP Strict Transport Security)add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;# (可选配置) HTTP 重定向到 HTTPSserver {listen 80;server_name yourdomain.com;return 301 https://$host$request_uri;}location / {# 你的其他配置项}
}

(3)检查配置并重新加载 Nginx

# 判断是否有语法错误
sudo nginx -t# 重启nginx服务
sudo service nginx reload

3.4.3 反向代理缓存

Nginx 对于静态或相对不经常更改的内容缓存到后端服务器中,从而减轻后端服务器的负担,提高系统的性能。

以下是配置Nginx反向代理缓存的基本步骤:

1、新建用于缓存文件的目录/var/cache/nginx

2、 编辑Nginx 的配置文件nginx.conf

# proxy_cache_path定义了缓存路径、层次、缓存名称和大小等参数。
# levels定义了缓存目录的层次结构;
# keys_zone定义了缓存名称和分配的内存大小;
# max_size定义了缓存的最大大小;
# inactive定义了缓存文件在多久没有被访问后被视为不活跃;
# use_temp_path=off表示直接在缓存路径中存储缓存文件,而不会在缓存路径下创建一个临时文件夹
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;server {listen 80;server_name yourdomain.com;location / {proxy_pass http://backend_server;   # 指定了代理到的后端服务器地址proxy_set_header Host $host;        # 将原始请求的 Host 头传递给后端服务器。proxy_set_header X-Real-IP $remote_addr;    #将客户端真实 IP 地址传递给后端服务器。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 将客户端的原始 IP 地址传递给后端服务器,即使请求通过多个代理。proxy_set_header X-Forwarded-Proto $scheme;  # 传递客户端请求的协议(http 或 https)给后端服务器,有助于后端服务器判断请求是否通过了 SSL/TLS。# 启用缓存proxy_cache my_cache;                         # 定义缓存的名称  proxy_cache_key "$scheme$host$request_uri";   # 定义缓存的 key,key可以确保唯一性(可选)        proxy_cache_valid 200 302 10m;                # 设置不同HTTP状态码的缓存时间。proxy_cache_valid 404 1m;proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;         # 允许在后端服务器不可用时使用旧的缓存数据proxy_cache_bypass $http_upgrade;    # 防止缓存的一部分请求,如 WebSocket 请求。}
}

3.4.4 高并发处理

Nginx 采用异步事件驱动的架构,能够高效处理大量并发连接,适用于高访问量的网站和应用。

以下是 Nginx 异步事件驱动模型的一些关键特征:

  1. 事件驱动: Nginx 的设计中,所有的 I/O 操作都是异步和非阻塞的。这意味着当一个请求触发一个 I/O 操作时,Nginx 不会等待 I/O 操作完成,而是将其挂起,并继续处理其他请求。一旦 I/O 操作完成,Nginx 会通过事件回调的方式得知,然后再处理这个请求。

  2. 事件模块: Nginx 使用事件模块来管理事件的触发和处理。事件模块负责监控文件描述符上的事件,如新连接的建立、数据的到达等。Nginx 支持多种事件驱动模块,包括 epoll(在 Linux 上的事件模型)、kqueue(在 FreeBSD、Mac OS X 上的事件模型)等,以适应不同的操作系统。

  3. 工作进程: Nginx 使用多进程的方式工作。一个主进程负责管理配置、启动子进程、接受新连接,而多个工作进程负责处理实际的请求。每个工作进程都是独立的,它们之间通过共享内存来交换信息。

  4. 无锁设计: Nginx 尽量避免使用锁,因为锁会引起阻塞,而 Nginx 旨在实现高并发和低延迟。它使用了一些无锁的数据结构,如基于原子操作的计数器和队列,以减小锁的使用。

  5. 连接池: Nginx 使用连接池来提高性能。连接池预先分配一些连接,当有新的请求到来时,Nginx 从连接池中获取一个可用连接,而不是每次请求都去创建新的连接。

  6. 定时器: Nginx 使用定时器来处理超时和一些需要延迟执行的任务。这允许 Nginx 在处理请求的同时,能够管理定时事件而不会阻塞整个进程。

这种异步事件驱动的架构使得 Nginx 能够高效地处理大量并发连接,而不会因为阻塞等待 I/O 操作而浪费系统资源。

3.4.5 HTTP/2 和 WebSocket 支持

Nginx 支持 HTTP/2,提供更高效的页面加载速度。它还支持 WebSocket 协议,使其成为实时通信应用的理想选择。

(1)HTTP/2支持:

server {listen 443 ssl http2;          # 指定 Nginx 监听 443 端口,并启用 SSL和http2(协议可选填)server_name yourdomain.com;    # 服务名,替换为你的域名ssl_certificate /path/to/your/certificate.crt;   # SSL证书本地路径ssl_certificate_key /path/to/your/private.key;   # SSL证书私钥的路径# 其他SSL配置location / {# 你的其他配置项}
}

(2)WebSocket支持:

 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。为了支持 WebSocket,可以使用 proxy_pass 来代理 WebSocket 连接。

server {listen 80;server_name yourdomain.com;location /ws {proxy_pass http://backend_server;   # 指定后端 WebSocket 服务器的地址proxy_http_version 1.1;             # 设置代理的 HTTP 版本proxy_set_header Host $host;        # 将原始请求的 Host 头传递给后端服务器。proxy_set_header Upgrade $http_upgrade; #允许升级为 WebSocket 协议。proxy_set_header Connection "upgrade";  #允许升级为 WebSocket 连接。# 可以添加其他代理相关的配置}# 其他配置项
}

3.4.6 邮件代理服务器

Nginx 不仅可以用于 HTTP 服务,还可以作为邮件代理服务器,支持 POP3 和 IMAP4 协议。

4 Nginx的优点

Nginx具有以下优点:

  • 高性能:相比于其他Web服务器如Apache,在正常请求以及高峰请求期,可以更快地响应请求。

  • 高可靠:Nginx采用多进程模型,分为主进程和工作进程。主进程负责监视工作进程,当工作进程异常退出时,可以快速拉起一个新的工作进程,从而为用户提供稳定服务

  • 高并发:Nginx通常作为网关级服务,其支持的并发量通常在万级别,经过优化甚至可以达到十万级别。

  • 易扩展:Nginx是模块化设计,具有极高的扩展性,使用者可以根据自身需求,定制开发相应模块。

  • 热部署:Nginx提供了优雅重启以及平滑升级的方案,使用户在修改配置文件或者升级Nginx时,不会影响线上服务。

  • 跨平台:支持Linux、Windows、macOS多种平台。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/139604.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于W5500网卡使用过程的部分问题记录

某个项目中用到了W5500这种自带网络协议栈的网卡芯片,由于该项目开发时间很紧,就临时网上买了一些模块拼凑到了一套系统,经过验证果真这种拼积木的方法只能用在学生实验开发中,真不能拿来做工程应用,硬件太不稳定很容易…

【力扣1528】重新排列字符串

👑专栏内容:力扣刷题⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、题目描述二、题目分析1、Java代码2、C代码 一、题目描述 给你一个字符串 s 和一个长度相同的整数数组 indices。 请你…

【TA 挖坑05】效果:空间切换 场景切换

不知不觉挖坑都第5篇了,,,,再不填坑就成挖坑专业户拉!!! 记录一下想实现的效果,实际上之前尝试从shader层面做能看得过去的,但是应用起来很拉跨,必须场景所有…

Apache HTTPD 换行解析漏洞(CVE-2017-15715)

Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在 一个解析漏洞,在解析PHP时,1.php\x0a将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。 影响范围 apache :2.4.0~2.…

NEFU计算机网络实验一常见网络命令的使用

一、实验目的 1、理解、验证常用网络命令的原理和功能。 2、掌握常用的网络命令使用方法,合理使用相关命令对网络进行管理与维护。 二、实验内容 网络参数查询命令:IPCONFIG 网络测试命令:ping 路由表命令ROUTE 网络端口查询命令&…

sql中的group by 举例子数据库日期带汉字转换2023年10月18天

sql中的group by 举例子 sql中 group by多个字段,对所有字段做group by_group by 多个字段_Foools的博客-CSDN博客 【精选】玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!_sql多个分组查询-CSDN博客 select to_char…

unigui添加ssl(https)访问的方法

首先到腾讯云或者阿里云去申请免费的证书,前提是在该服务商那有申请过域名,怎么找出这个界面?网页顶部一般都有个搜索框,输入【证书】或者【SSL】就能看到了,然后点击申请免费证书,把解析信息填入自己的域名…

如何使用Python抓取PDF文件并自动下载到本地

目录 一、导入必要的库 二、发送HTTP请求并获取PDF文件内容 三、将PDF文件内容写入到本地文件中 四、完整代码示例 五、注意事项 六、错误处理和异常处理 七、进一步优化 总结 在Python中,抓取PDF文件并自动下载到本地需要使用几个不同的库。首先&#xff0…

1022 D进制的A+B

1022 D进制的AB 输入两个非负 10 进制整数 A 和 B (≤230−1)&#xff0c;输出 AB 的 D (1<D≤10)进制数。 输入格式&#xff1a; 输入在一行中依次给出 3 个整数 A、B 和 D。 输出格式&#xff1a; 输出 AB 的 D 进制数。 输入样例&#xff1a; 123 456 8输出样例&a…

VMware Greenplum 7 正式发布!

在当今瞬息万变的商业环境中&#xff0c;企业持续寻求创新途径以优化运营、简化决策过程&#xff0c;并构建独特的竞争优势。实现这些目标的关键在于有效利用海量数据资源。然而&#xff0c;这项任务并不轻松。数据的数量、复杂性和来源呈现出爆发性增长&#xff0c;同时从数据…

如何利用PHP快速抓取音频数据?

以下是一个使用Dusk库和PHP编写的爬虫程序&#xff0c;用于爬取海量的音频数据。这个程序使用了https://www.duoip.cn/get_proxy的代码。 <?php // 引入Dusk库 require Dusk.php;// 创建Dusk对象 $dusk new Dusk();// 设置代理 $dusk->setProxy(127.0.0.1, 8080);// 使…

常用JS加密/解密类型以及案例

简介 这里给大家汇总常用不常用的JS加密案例&#xff0c;免得大家用的时候到处去找例子。 正题 对称加密&#xff1a; 替代字符表示法&#xff1a;使用Base64或类似的编码对数据进行简单的转换&#xff0c;不过这并不是真正的加密&#xff0c;而只是一种表示形式的转换。 &l…