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

news2025/4/21 8:45:17

一、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 then
            local res, err = jwt.verify(token, "your_secret_key", {verify_exp = true})
            if res then
                ngx.exec("@user_service");
            else
                ngx.status = 401
                ngx.say("Unauthorized")
            end
        else
            ngx.status = 401
            ngx.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;  # 示例:将图片缩放为300x200
        root /var/www/html;
    }
}

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

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

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

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

相关文章

Docker环境下SpringBoot程序内存溢出(OOM)问题深度解析与实战调优

文章目录 一、问题背景与现象还原**1. 业务背景****2. 故障特征****3. 核心痛点****4. 解决目标** 二、核心矛盾点分析**1. JVM 与容器内存协同失效****2. 非堆内存泄漏****3. 容器内存分配策略缺陷** 三、系统性解决方案**1. Docker 容器配置**2. JVM参数优化&#xff08;容器…

【计算机网络】网络基础(协议,网络传输流程、Mac/IP地址 、端口号)

目录 1.协议简述2.网络分层结构2.1 软件分层2.2 网络分层为什么&#xff1f; 是什么&#xff1f;OSI七层模型TCP/IP五层&#xff08;或四层&#xff09;结构 3. 网络与操作系统之间的关系4.从语言角度理解协议5.网络如何传输局域网通信&#xff08;同一网段&#xff09; 不同网…

pgsql中使用jsonb的mybatis-plus和jps的配置

在pgsql中使用jsonb类型的数据时&#xff0c;实体对象要对其进行一些相关的配置&#xff0c;而mybatis和jpa中使用各不相同。 在项目中经常会结合 MyBatis-Plus 和 JPA 进行开发&#xff0c;MyBatis_plus对于操作数据更灵活&#xff0c;jpa可以自动建表&#xff0c;两者各取其…

使用MetaGPT 创建智能体(2)多智能体

先给上个文章使用MetaGPT 创建智能体&#xff08;1&#xff09;入门打个补丁&#xff1a; 补丁1&#xff1a; MeteGTP中Role和Action的关联和区别&#xff1f;这是这两天再使用MetaGPT时候心中的疑问&#xff0c;这里做个记录 Role&#xff08;角色&#xff09;和 Action&…

C# 使用.NET内置的 IObservable<T> 和 IObserver<T>-观察者模式

核心概念 IObservable<T> 表示 可观察的数据源&#xff08;如事件流、实时数据&#xff09;。 关键方法&#xff1a;Subscribe(IObserver<T> observer)&#xff0c;用于注册观察者。 IObserver<T> 表示 数据的接收者&#xff0c;响应数据变化。 三个核心…

Redis——网络模型之IO讲解

目录 前言 1.用户空间和内核空间 1.2用户空间和内核空间的切换 1.3切换过程 2.阻塞IO 3.非阻塞IO 4.IO多路复用 4.1.IO多路复用过程 4.2.IO多路复用监听方式 4.3.IO多路复用-select 4.4.IO多路复用-poll 4.5.IO多路复用-epoll 4.6.select poll epoll总结 4.7.IO多…

vue3 传参 传入变量名

背景&#xff1a; 需求是&#xff1a;在vue框架中&#xff0c;接口传参我们需要穿“变量名”&#xff0c;而不是字符串 通俗点说法是&#xff1a;在网络接口请求的时候&#xff0c;要传属性名 效果展示&#xff1a; vue2核心代码&#xff1a; this[_keyParam] vue3核心代码&…

旅游特种兵迪士尼大作战:DeepSeek高精准路径优化

DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 随着假期的脚步日渐临近&#xff0c;环球影城等备受瞩目的主题游乐场&#xff0c;已然成为大人与孩子们心中不可或缺的节日狂欢圣地。然而&#xff0c;随之而来的庞大客流&#xff0c;却总让无数游客在欢乐的…

【MySQL】第一弹——MySQL数据库结构与操作

目录 一. 数据库介绍1.1 什么是数据库1.2 为什么要使用数据库1.3 主流数据库1.3.1 关系型数据库1.3.2 非关系型数据库 二. MySQL 的结构2.1 MySQL服务器和客户端2.2 MySQL服务器是如何组织数据的 三. 数据库的操作3.1 创建数据库语法格式示例 3.2 查看数据库语法格式示例 3.3 使…

Spring_MVC 快速入门指南

Spring_MVC 快速入门指南 一、Spring_MVC 简介 1. 什么是 Spring_MVC&#xff1f; Spring_MVC 是 Spring 框架的一个模块&#xff0c;用于构建 Web 应用程序。它基于 MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;将应用程序分为模型&#xff08;M…

L38.【LeetCode题解】四数之和(双指针思想) 从汇编角度分析报错原因

目录 1.题目 2.分析 去重的代码 错误代码 3.完整代码 提交结果 1.题目 四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元…

字符串系列一>最长回文子串

目录 题目&#xff1a;解析&#xff1a;代码&#xff1a; 题目&#xff1a; 链接: link 解析&#xff1a; 代码&#xff1a; class Solution {public String longestPalindrome(String s) {char[] ss s.toCharArray();int n ss.length;int begin 0;//返回结果的起始字符串…

双击热备方案及不同方案的需求、方案对比

双击热备方案概述 一般实现双机热备的方案有三种,分别是共享存储双机热备方案、镜像双机热备方案、双机双柜双机热备方案,这三种方案对硬件要求不同,大家可以根据自身的业务应用特性来选择具体的双机热备方案以及对应的ServHA双机热备软件产品。 1、镜像双机热备 1.1镜像…

VSCODE插值表达式失效问题

GET https://cdn.jsdelivr.net/npm/vue2.6.14/dist/vue.js net::ERR_CONNECTION_-CSDN博客 更换正确的vue域名 GET https://cdn.jsdelivr.net/npm/vue2.6.14/dist/vue.js net::ERR_CONNECTION_ <script src"https://unpkg.com/vue2.6.14/dist/vue.js"></sc…

【失败】Gnome将默认终端设置为 Kitty

起因 一会儿gnome-terminal一会儿kitty终端&#xff0c;实在是受不了&#xff0c;决定取缔默认的gnome-terminal。 过程 在 Ubuntu 或 Debian 系统上&#xff1a; 确保 Kitty 已经安装。如果未安装&#xff0c;可以在终端中运行命令sudo apt install kitty -y进行安装。 使用系…

蓝桥杯:连连看

本题大意要我们在一个给定的nxm的矩形数组中找出符合条件的格子 条件如下&#xff1a; 1.数值相同 2.两个横坐标和纵坐标的差值相等&#xff08;由此可得是一个对角线上的格子&#xff09; 那么根据以上条件我们可以用HashMap来解决这个问题&#xff0c;统计对角线上数值相同…

Ext系列⽂件系统

Ext系列⽂件系统 1. 理解硬件1.1 磁盘的物理结构1.2 磁盘的存储结构1.3 磁盘的逻辑结构理解过程实际过程 1.4 CHS&&LBA地址 2. 引入文件系统块分区innode 3. Ext2文件系统3.1 宏观认识3.2 block group3.3 块组内部3.3.1 GDT&#xff08;Group Descriptor Table&#xf…

MTK-Android12 13 屏蔽掉Viewing full screen

去掉ROOM 开机第一次提示全屏弹框 文章目录 需求参考资料修改文件实现方案 解决思路grep 源码查找信息grep 查找 grep -rn "Viewing full screen" 找string 字段grep 查找 grep -rn immersive_cling_title 布局grep 查找 grep -rn layout.immersive_mode_cling 对应的…

GitHub创建远程仓库

使用GitHub创建远程仓库&#xff1a;从零开始实现代码托管与协作 前言 在当今软件开发领域&#xff0c;版本控制系统已成为开发者必备的核心工具。作为分布式版本控制系统的代表&#xff0c;Git凭借其强大的分支管理和高效的协作能力&#xff0c;已成为行业标准。而GitHub作为…

【AI部署】腾讯云GPU -—SadTalker的AI数字人访问web服务—未来之窗超算中心

访问部署在Cloud Studio上的web服务 当你把该项目部署在本地时&#xff0c;访问该服务的请求地址为http://localhost:8080/hello&#xff1b;当你把该项目部署在Cloud Studio工作台启动时&#xff0c;要想访问到该服务&#xff0c;需要先在工作台右侧打开访问链接面板&#xff…