Nginx配置文件全解析【深度剖析细节】

news2025/1/12 20:53:14

文章目录

  • 💥 简介
  • 💫 基本结构
    • 🍉 事件处理器
      • 🥭 配置分析
      • 🍏 配置示例
    • 🍉 HTTP服务器
      • 🥭 配置分析
      • 🍏 配置示例
    • 🍉 虚拟主机
  • 🍊 优化
  • 🍔 总结

💥 简介

Nginx就是一个高性能的Web服务器反向代理服务器,它可以处理大量的并发连接,支持高速缓存、负载均衡、SSL/TLS终止、HTTP/2协议等功能,本篇主要讲述nginx的核心配置以及配置分析和优化,能够应用到你企业生产中为目的!

💫 基本结构

events:定义事件处理器,包括连接数、超时时间等。
http:定义HTTP服务器的行为,包括端口、服务器名称、日志、MIME类型等。
server:定义虚拟主机的行为,包括监听端口、服务器名称、文档根目录等。
location:定义URL路径的行为,包括URL路径、文件类型、反向代理、缓存等。

🍉 事件处理器

Nginx的事件处理器是负责处理客户端请求和服务器响应的核心组件。它可以处理大量的并发连接和高负载的请求,提高服务器的性能和可靠性。

🥭 配置分析

worker_processes
worker_processes定义了Nginx启动的工作进程数。每个工作进程都是一个独立的进程,可以处理多个并发连接。通常,worker_processes的值应该等于CPU核心数的两倍。例如,如果服务器有4个CPU核心,那么worker_processes应该设置为8。一般情况可以设置为auto,由程序自行选择适配。

worker_connections

worker_connections定义了每个工作进程可以处理的最大连接数。如果请求数很大,可以适当增加这个值,以提高服务器的并发处理能力。

use
use定义了Nginx使用的事件处理器类型。Nginx支持多种事件处理器类型,包括epoll、kqueue、poll等。不同的事件处理器类型适用于不同的操作系统和硬件平台。如果服务器的性能不佳,可以尝试不同的事件处理器类型。

常用的事件处理器类型

  • epoll
    epoll是Linux内核提供的事件处理器类型,它可以处理大量的并发连接和高负载的请求。epoll使用一个文件描述符来监听事件,因此它不需要像select()和poll()那样每次都轮询所有的连接。epoll还支持边缘触发和水平触发两种模式,可以更加高效地处理事件。
    缺点
    需要Linux内核支持,因此在非Linux系统上不适用。
    在Linux内核2.6.x版本之前,epoll的水平触发模式可能会导致一些问题,因此需要注意这个问题。
    参考地址:https://blog.csdn.net/weixin_28673511/article/details/130114682
  • kqueue
    kqueue是FreeBSD和Mac OS X提供的事件处理器类型,它可以处理大量的并发连接和高负载的请求。kqueue使用一个事件表来监听事件,因此它不需要像epoll那样每次都轮询所有的连接。kqueue还支持边缘触发和水平触发两种模式,可以更加高效地处理事件。
    缺点
    在FreeBSD和Mac OS X系统上使用时,需要安装Nginx的kqueue模块。
    在FreeBSD和Mac OS X系统上,kqueue的水平触发模式可能会导致一些问题,因此需要注意这个问题。
    kqueue流程分析:https://www.cnblogs.com/damiao-hungry/p/14172072.html
  • poll
    poll是Unix和Linux提供的事件处理器类型,它可以处理大量的并发连接和高负载的请求。poll使用一个文件描述符来监听事件,因此它不需要像epoll和kqueue那样每次都轮询所有的连接。poll还不支持边缘触发和水平触发两种模式,只能使用水平触发模式。
    缺点
    在处理大量的并发连接和高负载的请求时,可能会导致性能下降。
    不支持边缘触发和水平触发两种模式,只能使用水平触发模式。
    参考地址:https://blog.csdn.net/weixin_51582527/article/details/114154502
  • select
    select是Unix和Linux提供的事件处理器类型,它只能处理少量的并发连接和低负载的请求。select使用一个文件描述符来监听事件,因此它需要轮询所有的连接,比较浪费资源。select还不支持边缘触发和水平触发两种模式,只能使用水平触发模式。
    参考地址:[https://blog.csdn.net/weixin_51582527/article/details/114154502]

multi_accept
multi_accept定义了Nginx是否允许多个连接同时处理请求。如果请求数很大,可以适当增加这个值,以提高服务器的并发处理能力。

accept_mutex
accept_mutex定义了Nginx是否使用互斥锁来保护accept()系统调用。如果多个进程同时调用accept()系统调用,可能会导致竞争条件死锁。可以尝试关闭accept_mutex,以提高服务器的并发处理能力。

accept_mutex_delay
accept_mutex_delay定义了Nginx在使用互斥锁时,如果锁已经被其他进程持有,等待的时间。可以尝试增加这个值,以减少锁的竞争。

accept_mutex_retries
accept_mutex_retries定义了Nginx在使用互斥锁时,如果锁已经被其他进程持有,尝试获取锁的最大次数。可以尝试增加这个值,以减少锁的竞争。

🍏 配置示例

events {
    worker_connections 1024;
    use epoll;
    multi_accept on;
}

worker_connections:指定Nginx在处理请求时可以创建的最大连接数。
use epoll:使用epoll事件驱动模型来处理客户端请求。
multi_accept on:允许Nginx同时接受多个客户端连接请求。
这些参数可以根据您的服务器硬件配置和应用程序需求进行调整。

🍉 HTTP服务器

Nginx是一个高性能的Web服务器和反向代理服务器,它可以处理大量的并发连接和请求。Nginx的HTTP服务器模块可以用于处理HTTP请求和响应,包括静态文件、动态内容和代理请求等。

🥭 配置分析

server块:每个server块都定义了一个虚拟主机,它可以监听一个或多个端口,并处理来自客户端的HTTP请求。
location块:每个location块都定义了一个URL路径,它可以处理特定的HTTP请求。例如,您可以使用location块来处理静态文件请求或动态内容请求。
upstream块:每个upstream块都定义了一个后端服务器组,它可以处理来自客户端的请求。您可以使用upstream块来实现负载均衡和高可用性。
proxy_pass指令:使用proxy_pass指令可以将客户端请求转发到后端服务器。您可以使用proxy_pass指令来实现反向代理和负载均衡。
try_files指令:使用try_files指令可以指定Nginx在请求文件时尝试使用不同的文件名。这可以用于处理静态文件请求。

🍏 配置示例

http {
    server {
        listen 80;
        server_name example.com;

        location / {
            root /var/www/html;
            index index.html;
        }

        location /static/ {
            root /var/www/static;
        }

        location /api/ {
            proxy_pass http://backend-server;
        }
    }

    upstream backend-server {
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }
}

在这个示例中,我们定义了一个虚拟主机,它监听80端口,处理来自客户端的HTTP请求。我们使用location块来处理静态文件请求和动态内容请求,使用upstream块来定义后端服务器组。我们还使用proxy_pass指令来实现反向代理和负载均衡。

🍉 虚拟主机

Nginx的虚拟主机是指在同一台服务器上运行多个Web应用程序的能力。每个虚拟主机都有自己的域名和服务器配置,可以访问不同的Web应用程序。虚拟主机可以帮助您轻松地将多个Web应用程序部署到同一台服务器上,每个应用程序都有自己的域名和服务器配置。以下是Nginx的虚拟主机配置的详细说明:
Nginx的虚拟主机配置通常保存在nginx.conf文件中。您可以使用以下命令打开nginx.conf文件:

sudo vim /etc/nginx/nginx.conf

在nginx.conf文件中,您可以找到虚拟主机的配置节。默认情况下,虚拟主机的配置节位于http块中。例如,以下是一个虚拟主机的配置节:

http {
    server {
        listen 80;
        server_name example.com;

        location / {
            root /var/www/example.com;
            index index.html;
        }
    }
}

在这个示例中,我们创建了一个名为example.com的虚拟主机,它监听80端口,并将所有请求通过location块转发到/var/www/example.com目录。我们还指定了默认的索引文件为index.html。

🍊 优化

worker_processes
如果您的服务器性能和应用负载都比较平稳,可以适当调整worker进程数,以避免过多的系统资源占用。

worker_processes auto;

worker_connections

可以增加连接数限制,以防止过多的连接导致服务器性能下降。您可以根据您的服务器性能和应用负载来调整连接数限制的大小。

events {
    worker_connections 1024;
}

启用缓存

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires 3m;
    access_log off;
}

在这个示例中,我们使用正则表达式匹配静态资源的URL,并将它们缓存3分钟。这样可以避免重复加载静态资源,提高网站的性能。

启用压缩
在这个示例中,我们启用了Gzip压缩,并将压缩级别设置为5。我们还指定了需要压缩的MIME类型。

gzip on;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

启用SSL/TLS
在这个示例中,我们启用了SSL/TLS,并指定了SSL/TLS证书和密钥的路径。这样可以确保网站的安全性和可信度。

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/ssl/certificate;
    ssl_certificate_key /path/to/ssl/certificate/key;

    location / {
        proxy_pass http://backend1;
    }

    location /api {
        proxy_pass http://backend2;
    }
}

优化日志

我们定义了一个日志格式,并将访问日志和错误日志分别输出到不同的文件中。我们还指定了日志的格式和输出路径。

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;

启用TCP keepalive
优化服务器配置,以提高网站的性能和安全性。

tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;

启用缓存

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 60m;
proxy_cache_bypass $http_pragma;
proxy_cache_revalidate on;

我们使用proxy_cache指令将缓存区域应用于不同的URL路径。我们还使用proxy_cache_valid指令指定缓存的有效期,使用proxy_cache_bypass指令指定需要绕过缓存的请求,使用proxy_cache_revalidate指令指定是否需要重新验证缓存。
启用缓存可以提高网站的性能和响应速度,但是需要注意以下几点:
缓存区域的大小和有效期需要根据您的应用场景进行调整。如果您的应用需要处理大量的静态资源,可以将缓存区域的大小设置为较大的值,以避免重复加载静态资源。
缓存区域的存储路径需要根据您的服务器配置进行调整。如果您的服务器性能较高,可以将缓存区域的存储路径设置为SSD硬盘,以提高缓存的读取速度。
缓存的有效期需要根据您的应用场景进行调整。如果您的应用需要实时更新数据,可以将缓存的有效期设置为较短的值,以避免频繁的缓存验证。
缓存的绕过和重新验证需要根据您的应用场景进行调整。如果您的应用需要绕过缓存或重新验证缓存,可以使用proxy_cache_bypass和proxy_cache_revalidate指令进行相应的设置。
总之,启用缓存可以提高网站的性能和响应速度,但是需要注意缓存区域的大小、有效期、存储路径、绕过和重新验证等方面的问题。

🍔 总结

为了让这篇文章更有价值,对你印象更深刻,我们在回顾一下nginx的配置:

总的来说,nginx就像是一位魔法师,可以为你的网站带来无限的可能性。但是在学习和使用的过程中,也需要耐心和勇气。只有这样,才能把nginx的魔法发挥到极致。

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

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

相关文章

02-使用Git命令操作远程仓库,如克隆或添加远程仓库,拉取或推送内容

操作远程仓库 创建远程仓库 第一步: 访问GitHub官网,登录自己的账号创建一个远程仓库 第二步: 设置远程仓库的信息(一般远程库的名字和本地库的名字一样),仓库创建完成后可以看到仓库地址(每个仓库都会对应一个网络地址) 第三步: 查看本地仓库对应的Https/SSH连接 远程仓库命…

【负载均衡 SLB介绍及其算法详解】(一万两千字)

目录 一、负载均衡 SLB 定义 二、负载均衡SLB的作用 三、负载均衡器(Load Balancer) 【1】工作原理 【2】主要功能 【3】关键概念 四、工作负载(Workload) 五、负载均衡算法 【1】轮询(Round Robin&#xff0…

Oracle(2-8)Configuring the Database Archiving Mode

文章目录 一、基础知识1、Redo Log History2、NOARCHIVELOG Mode 非归档模式3、ARCHIVELOG Mode 归档模式4、Changing the Archiving Mode 更改归档模式![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d6a09f9a6de24de7bbcdad90b8d6b9ca.png)5、Auto and Manual Ar…

图扑参展高交会-全球清洁能源创新博览会

“相聚鹏城深圳,共享能源盛宴” 第二十五届中国国际高新技术成果交易会(简称“高交会”)于 11 月 15-18 日在深圳盛大开幕。高交会由商务部、科学技术部、工业和信息化部、国家发展改革委、农业农村部、国家知识产权局、中国科学院、中国工程院和深圳市人民政府共同…

从零开始Inline Hook

中断表进入0环 通过中断门进入0环&#xff0c;首先了解一下中断门的构成 构造一个中断号 Base:函数地址 DPL:3 //因为三环使用调用门的条件就是CPL(即cs段选择子的RPL)<DPL P:1 //P为1时&#xff0c;中断表才有效 Segment Selector: 0x0008 //中断成功后切换自己的CPL 在…

生产制造中4种导致产品成本、库存核算差错的问题!(化工/化妆品/生物制剂/混凝土等行业ODOO)

在化工/化妆品/生物制剂/混凝土等行业&#xff0c;因为其生产物料及产成品大都以液体&#xff08;或散颗粒&#xff09;形态为主&#xff0c;多以重量为计数方式&#xff1b;且液体&#xff08;或散颗粒&#xff09;相较于固体的较大区别就是产品计数上变数较大&#xff0c;固体…

“掌握速卖通平台接口:电商开发的技术巅峰“

一、概述 速卖通平台接口是全球速卖通提供的一套API接口&#xff0c;旨在为开发者提供与速卖通平台进行数据交互的能力。通过使用速卖通平台接口&#xff0c;开发者可以快速构建自己的电商应用程序&#xff0c;并实现与速卖通平台的数据共享和交易流程。本文将详细介绍速卖通平…

List集合,遍历,数据结构

一.List常见的方法&#xff1a; 二. List集合的遍历方式 除了 迭代器遍历 增强for遍历 Lambda表达式遍历&#xff0c;还有自己独有的普通for遍历&#xff0c;列表迭代器遍历 1.迭代器遍历 2.增强for遍历 3.Lambda表达式遍历 4.普通for遍历 5.列表迭代器遍历 列表迭代器相对于…

云计算生成式 -给你不一样的音乐推荐新体验

目录 摘要&#xff1a; 正文&#xff1a; 一、亚马逊云与生成式 AI 结合的展望/总结 二、我用亚马逊云科技生成式 AI 产品打造了什么&#xff0c;解决了什么问题 三、未来云端技术发展趋势的见解 四、云端技术未来需要解决的问题 1、如何保护数据安全和隐私&#xff1f; …

SQL Sever 复习笔记【一】

SQL Sever 基础知识 一、查询数据第1节 基本 SQL Server 语句SELECT第2节 SELECT语句示例2.1 SELECT - 检索表示例的某些列2.2 SELECT - 检索表的所有列2.3 SELECT - 对结果集进行筛选2.4 SELECT - 对结果集进行排序2.5 SELECT - 对结果集进行分组2.5 SELECT - 对结果集进行筛选…

企业选择通配符SSL证书

通配符SSL数字证书是CA认证机构签发较多的一款SSL证书&#xff0c;它可以保护一个域名及其所有子域名&#xff0c;并且在证书有效期内可以免费添加子域名。对于子域名较多或者想要创建子域名站点的个人或者企事业单位&#xff0c;通配符SSL证书是性价比较高的一个选择。这种证书…

element ui el-date-picker日期时间选择器 设置只能选择不大于30天时间范围

需求&#xff1a;要求日期时间选择器只能选择最多32天&#xff0c;其他日期为不可点击状态。 日期组件type为daterange或者datetimerange都生效 实现&#xff08;vue2.x&#xff09;&#xff1a; 通过属性picker-options html <el-date-pickerv-model"dateTime&qu…

AUTOSAR OS任务调度的底层逻辑

先参考 FreeRTOS的任务触发底层逻辑 简述RTOS任务调度底层逻辑 AUTOSAR-OS的调度机制-调度表&#xff08;没理解透&#xff0c;继续更新&#xff09; OSEK与FreeRTOS在任务调度上最大的区别在于&#xff0c;FreeRTOS是基于全抢占任务调度和时间片轮转调度机制&#xff0c;具有…

Ubuntu 20.04 for NVIDIA V100 GPU安装手册

安装Ubuntu 20.04.3 LTS版本 image.png 安装Ubuntu 20.04按照安装提示&#xff0c;仔细选择每一项&#xff0c;基本默认即可。 系统中查看GPU信息 系统安装完成之后&#xff0c;进入系统&#xff0c;使用lspci 命令查询一下GPU是否存在、型号信息是什么。 bpangbobpang:\~$…

ROS URDF集成Rviz流程

实现流程&#xff1a; 一、新建功能包&#xff0c;导入依赖 二、编写 urdf 文件 三、在 launch 文件集成 URDF 与 Rviz 四、在 Rviz 中显示机器人模型 需求&#xff1a;在 Rviz 中显示一个盒状机器人 1、创建功能包&#xff0c;导入依赖 创建一个新的功能包&#xff0c;名…

数据爬取+数据可视化实战_哪里只得我共你(Dear Jane)_词云展示----网易云

一、前言 歌词上做文本分析&#xff0c;数据存储在网页上&#xff0c;需要爬取数据下来&#xff0c;词云展示在工作中也变得日益重要&#xff0c;接下来将数据爬虫与可视化结合起来&#xff0c;做个词云展示案例。 二、操作步骤 代码如下&#xff1a; # -*- coding:utf-8 -*-…

服饰行业的EDI应用

服饰行业备受关注的物流环节中最重要的一个问题即为库存管理&#xff0c;服饰行业的企业需要搞清楚如何加快周转率&#xff0c;解决供应链的库存挤压难题。强大需求背景之下的科技革命、互联网发展以及产业变革不断演进&#xff0c;使得企业认识到产业供应链安全可靠、自主可控…

快速了解ChatGPT(大语言模型)

目录 GPT原理&#xff1a;文字接龙&#xff0c;输入一个字&#xff0c;后面会接最有可能出现的文字。 GPT4 学会提问&#xff1a;发挥语言模型的最大能力 参考李宏毅老师的课快速了解大语言模型做的笔记&#xff1a; Lee老师幽默的开场&#xff1a; GPT&#xff1a;chat Ge…

python执行shell

0x00:前言 正常一个网站分为服务端和客户端&#xff0c;因为是正向的&#xff0c;所以服务端是在目标机器上的&#xff0c;客户端则是攻击者机器上&#xff0c;在这里要感谢MiaGz大师傅&#xff0c;这里很多都是参考了MiaGz大师傅的文章写出来的&#xff0c;进行了一点个人修改…

2023年亚太杯数学建模A题——深度学习苹果图像识别(

Image Recognition for Fruit-Picking Robots 水果采摘机器人的图像识别功能 问题 1&#xff1a;计数苹果 根据附件 1 中提供的可收获苹果的图像数据集&#xff0c;提取图像特征&#xff0c;建立数学模型&#xff0c;计算每幅图像中的苹果数量&#xff0c;并绘制附件 1 中所有…