【web服务_负载均衡Nginx】三、Nginx 实践应用与高级配置技巧

一、Nginx 在 Web 服务器场景中的深度应用​

1.1 静态网站部署与优化​

在 CentOS 7 系统中,使用 Nginx 部署静态网站是最基础也最常见的应用场景。首先,准备网站文件,在/var/www/html目录下创建index.html文件:

sudo mkdir -p /var/www/html
sudo echo "<html><body><h1>Welcome to My Static Website</h1></body></html>" > /var/www/html/index.html
sudo chown -R nginx:nginx /var/www/html

上述命令中,mkdir -p用于创建目录(如果目录不存在),echo命令生成一个简单的 HTML 页面,chown -R修改文件和目录的所有者为nginx用户和组,确保 Nginx 有权限访问。​

接下来,修改 Nginx 的配置文件/etc/nginx/nginx.conf,添加或修改server块:

server {listen 80;server_name example.com;  # 替换为实际域名location / {root /var/www/html;index index.html;}
}

在这个配置中,listen 80表示 Nginx 监听 80 端口;server_name指定网站的域名;location /定义了根路径的处理规则,root指定网站文件的根目录,index设置默认首页文件。​

配置完成后,通过以下命令重新加载 Nginx 配置:

sudo nginx -s reload

此时,在浏览器中输入服务器的 IP 地址或域名,即可访问部署的静态网站。​

为进一步优化静态网站性能,可利用 Nginx 的缓存功能。在http块中添加如下配置:

http {# 其他配置...proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;server {listen 80;server_name example.com;location / {root /var/www/html;index index.html;proxy_cache my_cache;proxy_cache_key "$uri$is_args$args";proxy_cache_valid 200 302 60m;proxy_cache_valid 404 10m;}}
}

这里,proxy_cache_path定义了缓存路径和相关参数,包括缓存层级、缓存区域名称、最大缓存大小、缓存失效时间等;proxy_cache启用缓存功能,proxy_cache_key定义缓存键,proxy_cache_valid设置不同响应状态码的缓存有效期。通过这些配置,Nginx 可以缓存静态资源,减少后端服务器的负载,提升访问速度。​

1.2 高并发处理策略​

面对高并发访问,Nginx 提供了多种策略来保障服务的稳定性和性能。首先,可以调整 Nginx 的工作进程数和连接数限制。在nginx.conf的main块中,修改worker_processes和worker_connections参数:

worker_processes auto;  # 根据CPU核心数自动设置工作进程数
events {worker_connections 1024;  # 每个工作进程的最大连接数
}

worker_processes auto会自动检测服务器的 CPU 核心数来设置合适的工作进程数,充分利用服务器资源;worker_connections则限制了每个工作进程能够处理的最大连接数。​

其次,配置限流功能可以有效防止恶意请求或突发流量对网站造成冲击。Nginx 的limit_req_zone模块提供了基于漏桶算法的限流功能。在http块中添加如下配置:

http {limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;server {listen 80;server_name example.com;location / {limit_req zone=mylimit;# 其他配置...}}
}

limit_req_zone定义了限流区域,$binary_remote_addr表示基于客户端 IP 地址进行限流,zone=mylimit:10m指定限流区域名称和大小,rate=10r/s设置限流速率为每秒 10 个请求。在location块中应用limit_req指令启用限流功能。

二、Nginx 在 API 网关场景中的应用​

2.1 API 网关概念与作用​

API 网关是微服务架构中的重要组件,它作为系统的统一入口,负责接收所有客户端对系统内 API 的请求,并进行统一的管理和分发。API 网关的主要功能包括请求路由、认证授权、流量控制、监控统计等。Nginx 通过灵活的配置和丰富的模块扩展能力,可以实现 API 网关的多种功能。​

2.2 Nginx 作为 API 网关的配置与实践​

假设我们有一个微服务架构,包含用户服务(部署在192.168.1.110:8080)和订单服务(部署在192.168.1.111:8081),需要通过 Nginx 作为 API 网关将不同的 API 请求转发到对应的服务。在nginx.conf中添加如下配置:

http {upstream user_service {server 192.168.1.110:8080;}upstream order_service {server 192.168.1.111:8081;}server {listen 80;server_name api.example.com;  # 替换为实际API域名location /user/ {proxy_pass http://user_service;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}location /order/ {proxy_pass http://order_service;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
}

在这个配置中,通过upstream分别定义了用户服务和订单服务的后端服务器地址;在server块中,根据请求 URL 的前缀(/user/和/order/),将请求分别转发到对应的服务,并设置了相关的请求头信息,以便后端服务获取客户端的真实 IP 等信息。​

为了实现认证授权功能,我们可以使用 Nginx 的 Lua 模块结合 JWT(JSON Web Token)进行身份验证。首先,安装 Nginx 的 Lua 模块(编译 Nginx 时添加--with - lua选项),然后在location块中添加如下 Lua 脚本:

location /user/ {content_by_lua 'local ngx = require "ngx"local jwt = require "resty.jwt"local token = ngx.req.get_headers()["Authorization"]if token thenlocal res, err = jwt.verify(token, "your_secret_key", {verify_exp = true})if res thenngx.exec("@user_service");elsengx.status = 401ngx.say("Unauthorized")endelsengx.status = 401ngx.say("Unauthorized")end';location @user_service {proxy_pass http://user_service;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
}

上述 Lua 脚本从请求头中获取Authorization字段的 JWT 令牌,验证令牌的有效性和过期时间,如果验证通过则将请求转发到后端服务,否则返回 401 未授权错误。​

三、Nginx 高级配置技巧​

3.1 SSL/TLS 配置​

随着网络安全的重要性日益凸显,为网站配置 SSL/TLS 证书实现 HTTPS 访问已成为标配。首先,从证书颁发机构(如 Let's Encrypt)申请 SSL 证书,获取证书文件(通常为.crt文件)和私钥文件(.key文件)。​

然后,在nginx.conf中添加如下配置:

server {listen 443 ssl;server_name example.com;  # 替换为实际域名ssl_certificate /path/to/your/certificate.crt;ssl_certificate_key /path/to/your/private.key;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;location / {root /var/www/html;index index.html;}
}

listen 443 ssl表示监听 443 端口并启用 SSL;ssl_certificate和ssl_certificate_key指定证书文件和私钥文件的路径;ssl_protocols设置支持的 SSL 协议版本,ssl_ciphers设置加密算法。配置完成后,重新加载 Nginx 配置,网站即可通过 HTTPS 安全访问。​

3.2 日志管理与分析​

Nginx 的日志管理功能可以帮助我们了解用户访问行为、排查故障。在nginx.conf中,可以自定义日志格式和存放路径。例如,定义一个详细的日志格式:

http {log_format detailed '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for" ''$request_time';access_log /var/log/nginx/access.log detailed;
}

log_format定义了名为detailed的日志格式,包含客户端 IP、用户、请求时间、请求内容、响应状态码、响应大小、来源页面、用户代理、转发 IP、请求处理时间等信息;access_log指定访问日志的存放路径和使用的日志格式。​

为了更方便地分析日志,可以使用 AWStats、GoAccess 等工具。以 GoAccess 为例,首先安装 GoAccess:

sudo yum install goaccess

然后,生成日志分析报告:

goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED

上述命令将生成一个 HTML 格式的日志分析报告,包含访问统计、热门页面、用户 IP 分布等信息,可在浏览器中查看。​

3.3 动态模块加载与扩展​

Nginx 支持动态加载模块,通过安装第三方模块可以扩展其功能。以安装 Nginx 的ngx_http_image_filter_module模块为例,用于对图片进行实时处理(如缩放、裁剪)。​

首先,下载模块源码:

git clone https://github.com/openresty/ngx_http_image_filter_module.git

然后,重新编译 Nginx 并添加模块:

cd nginx-1.23.3
./configure \
--prefix=/usr/local/nginx \
--conf-path=/etc/nginx/nginx.conf \
--add - module=/path/to/ngx_http_image_filter_module
make && sudo make install

编译完成后,在nginx.conf中配置模块:

http {# 其他配置...location /image/ {image_filter resize 300 200;  # 示例:将图片缩放为300x200root /var/www/html;}
}

上述配置在/image/路径下启用图片处理功能,将请求的图片进行缩放操作。​

本篇文章围绕 Nginx 在 CentOS 7 环境下的实践应用与高级配置技巧展开了全面深入的探讨,涵盖了 Web 服务器场景、API 网关场景以及多种高级配置功能。

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

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

相关文章

C语言格式化输入输出总结 (printf和scanf)

一、printf格式化输出 1. 整数格式化 (%d, %i, %u, %o, %x) c复制代码 int num 42; // 以下为不同格式输出示例 printf("%d", num); // 42 (十进制) printf("%i", num); // 42 (同%d) printf("%u", num); // 42 (无符号十进制…

哈夫曼编码和哈夫曼树

哈夫曼编码&#xff08;Huffman Coding&#xff09; 是一种基于字符出现频率的无损数据压缩算法&#xff0c;通过构建哈夫曼树&#xff08;Huffman Tree&#xff09; 来生成最优前缀编码&#xff0c;使得高频字符用短编码&#xff0c;低频字符用长编码&#xff0c;从而实现高效…

Jetson Orin NX 部署YOLOv12笔记

步骤一.创建虚拟环境 conda create -n yolov12 python3.8.20 注意&#xff1a;YOLOv12/YOLOv11/YOLOv10/YOLOv9/YOLOv8/YOLOv7a/YOLOv5 环境通用 步骤二.激活虚拟环境 conda activate yolov12 #激活环境 步骤三.查询Jetpack出厂版本 Jetson系列平台各型号支持的最高Jetp…

Linux指令篇 (2)

指令篇&#xff08;2&#xff09; Linux基本指令&#xff08;2&#xff09;(1) mkdir指令&#xff08;重要&#xff09;&#xff08;2&#xff09;rmdir指令&&rm指令(重要)&#xff08;3&#xff09;man指令(重要)&#xff08;4&#xff09;cp指令&#xff08;重要&…

致远OA——自定义开发rest接口

文章目录 :apple: 业务流程 &#x1f34e; 业务流程 代码案例&#xff1a; https://pan.quark.cn/s/57fa808c823f 官方文档&#xff1a; https://open.seeyoncloud.com/seeyonapi/781/https://open.seeyoncloud.com/v5devCTP/39/783.html 登录系统 —— 后台管理 —— 切换系…

区块链如何成为智能城市的底层引擎?从数据透明到自动化治理

区块链如何成为智能城市的底层引擎&#xff1f;从数据透明到自动化治理 引言&#xff1a;智能城市真的智能吗&#xff1f; 在数字化时代&#xff0c;智能城市&#xff08;Smart City&#xff09;逐步成为各国推动城市创新的重要方向。城市管理者希望借助物联网&#xff08;IoT…

洛谷P1177【模板】排序:十种排序算法全解(1)

扯谈 之前我已经把十大排序算法全讲了一遍&#xff08;具体详见专栏C排序算法&#xff09;,今天我们来用一道简单的题目总结实战一下。 算法实现 一、桶排序&#xff08;Bucket Sort&#xff09; ‌适用场景‌&#xff1a;数据范围已知且较小&#xff08;需根据测试数据调整…

SuperMap iClient3D for WebGL 如何加载WMTS服务

在 SuperMap iClient3D for WebGL 中加载WMTS服务时&#xff0c;参数配置很关键&#xff01;下面我们详细介绍如何正确填写参数&#xff0c;确保影像服务完美加载。 一、数据制作 对于上述视频中的地图制作&#xff0c;此处不做讲述&#xff0c;如有需要可访问&#xff1a;Onl…

再读bert(Bidirectional Encoder Representations from Transformers)

再读 BERT&#xff0c;仿佛在数字丛林中邂逅一位古老而智慧的先知。初次相见时&#xff0c;惊叹于它以 Transformer 架构为罗盘&#xff0c;在预训练与微调的星河中精准导航&#xff0c;打破 NLP 领域长久以来的迷雾。而如今&#xff0c;书页间跃动的不再仅是 Attention 机制精…

从零开始 保姆级教程 Ubuntu20.04系统安装MySQL8、服务器配置MySQL主从复制、本地navicat远程连接服务器数据库

从零开始&#xff1a;Ubuntu 20.04 系统安装 MySQL 8、服务器配置 MySQL 主从复制、本地 Navicat 远程连接服务器数据库 初始化服务器1. 更新本地软件包列表2. 安装 MySQL 服务器3. 查看 MySQL 安装版本4. 登录 MySQL 管理终端5. 设置 root 用户密码&#xff08;推荐使用 nativ…

java怎么完善注册,如果邮箱中途更换,能否判断

解析在下面 附赠代码 private static class CodeInfo {String code;long timestamp;CodeInfo(String code, long timestamp) {this.code code;this.timestamp timestamp;}}// 存储验证码&#xff08;邮箱 -> 验证码信息&#xff09;(保证线程安全) 以免中途更改邮箱pri…

n8n 中文系列教程_01. 简单易懂的现代AI魔法,n8n的快速了解与概念科普(文末有彩蛋)

1. 教程简介 欢迎来到“无代码工具探索”课程&#xff0c;这是专为非技术人员设计的指南&#xff08;当然&#xff0c;技术人员也可以从中受益&#xff09;。我们的目标是通过无代码工具来提升工作效率&#xff0c;尤其是利用像 n8n 这样的灵活数据库平台。这些工具被誉为“现…

解码 Web Service:从技术原理到应用场景的深度剖析

Web Service 是一种基于网络的、分布式的计算技术&#xff0c;它允许不同的应用程序之间通过网络进行通信和交互。以下是关于 Web Service 的详细介绍&#xff1a; 一、定义与概念 Web Service 是一种可以通过 Web 协议&#xff08;如 HTTP&#xff09;进行访问的软件组件&am…

Nacos启动报错

Nacos启动是在单机模式下&#xff0c;不是集群模式 点击startup.cmd启动会报错 打开bin目录 rem是注释的意思&#xff0c;在nacos1.3.2之后&#xff0c;nacos默认的都是集群模式&#xff0c;我们这里单机测试就是用单机模式。 也可以修改MODE&#xff0c;如果选择不修改&…

uniapp-商城-26-vuex 使用流程

为了能在所有的页面都实现状态管理&#xff0c;我们按照前面讲的页面进行状态获取&#xff0c;然后再进行页面设置和布局&#xff0c;那就是重复工作&#xff0c;vuex 就会解决这样的问题&#xff0c;如同类、高度提炼的接口来帮助我们实现这些重复工作的管理。避免一直在造一样…

Git 命令速查手册

听说用美图可以钓读者&#xff1f; 一、基础操作核心命令 1. 仓库初始化与克隆 命令作用示例git init创建新仓库git init my-projectgit clone克隆远程仓库git clone [https://github.com/user/repo.git](https://github.com/user/repo.git)git remote add关联远程仓库git re…

信息量、香农熵、交叉熵、KL散度总结

信息量 对于一个事件而言&#xff0c;它一般具有三个特征&#xff1a; 小概率事件往往具有较大的信息量 大概率事件往往具有较小的信息量 独立事件的信息量相互可以相加 比如我们在买彩票这个事件中&#xff0c;彩票未中奖的概率往往很高&#xff0c;对我们而言一点也不稀…

使用C语言的cJSON中给JSON字符串添加转义

在 cJSON 库中&#xff0c;没有直接提供 一个函数来专门给 JSON 字符串添加转义&#xff08;如将 " 转义为 \"&#xff0c;\n 转义为 \\n 等&#xff09;。 但 cJSON 在 序列化&#xff08;cJSON_Print 或 cJSON_PrintUnformatted&#xff09; 时会自动处理转义字符…

宇树机器狗go2—slam建图(1)点云格式

0.前言 上一篇番外文章教大家如何在宇树机器狗go2的gazebo仿真环境中实现简单的导航运动&#xff0c;本期文章会教大家如何让宇树的机器狗go2在仿真环境中进行slam建图时经常会遇到的一些点云格式&#xff0c;在后续的slam建图和slam算法解析的时候会经常与这些点云信息打交道…

linux socket编程之udp(实现客户端和服务端消息的发送和接收)

目录 一.创建socket套接字(服务器端) 二.bind将prot与端口号进行绑定(服务器端) 2.1填充sockaddr_in结构 2.2bind绑定端口 三.直接通信(服务器端) 3.1接收客户端发送的消息 3.2给客户端发送消息 四.客户端通信 4.1创建socket套接字 4.2客户端bind问题 4.3直接通信即可…