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

文章目录

  • 💥 简介
  • 💫 基本结构
    • 🍉 事件处理器
      • 🥭 配置分析
      • 🍏 配置示例
    • 🍉 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.hqwc.cn/news/235816.html

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

相关文章

RK3568 android 13 内置 google GMS服务

需求:Android 系统在国外使用安装app很多需要gms服务,否则无法正常使用,所以出厂前必须要把GMS包集成进系统 1.下载gms包https://download.csdn.net/download/qq_46524402/88136401 2.解压gms包 并放到Android SDK根目录的vender文件夹下 3…

分享从零开始学习网络设备配置--任务4.3 使用动态路由RIPng实现网络连通

任务描述 某公司使用IPv6技术搭建企业网络,由于静态路由需要管理员手工配置,在网络拓扑发生变化时,也不会自动生成新的路由,因此采用IPv6动态路由协议RIPng实现网络连通,实现任意两个节点之间的通信,并降低…

软件工程 课后题 选择 查缺补漏

在一张状态图中只能有一个初态,而终态则可以没有,也可以有多个 所有的对象可以成为各种对象类,每个对象类都定义了一组 方法 通过执行对象的操作可以改变对象的属性,但它必须经过 消息 的传递 UML应用于 基于对象的面向对象的方…

【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)项目搭建

项目笔记为项目总结笔记,若有错误欢迎指出哟~ 【项目专栏】 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)项目搭建 持续更新中… java+vue+微信小程序项目】从零开始搭建——健身房管理平台 项目简介Java项目搭建(IDEA)1.新建项目2.项目类型3.项目设置4…

【android开发-04】android中activity的生命周期介绍

1,返回栈 android中使用任务task来管理activity,一个任务就是一组存放在栈里的活动的集合,这个栈被称为返回栈。栈是一种先进先出的数据结构。当我们启动一个新的活动,他会在返回栈中人栈,并处以栈顶的位置&#xff0…

C# 用代码设置受保护的Excel

写在前面 在导出Excel文件的时候,为了防止文件内容被篡改,这时候就需要对Excel设置工作簿保护和工作表保护,本文使用的是Spire.XLS的免费版本来实现,免费版本是受限的,但是一般情况下已经够用了。 通过NuGet引入Free…

使用npm发布typescript包

使用npm发布typescript包 什么是NPM NPM(节点包管理器)是 JavaScript 编程语言的默认包管理器。NPM 注册表是一个公共存储库,充当存储和分发 JavaScript 包的中心枢纽。它允许开发人员轻松安装、管理和共享可重用的 JavaScript 代码包&…

RNN:文本生成

文章目录 一、完整代码二、过程实现2.1 导包2.2 数据准备2.3 字符分词2.4 构建数据集2.5 定义模型2.6 模型训练2.7 模型推理 三、整体总结 采用RNN和unicode分词进行文本生成 一、完整代码 作者在文章开头地址中使用C实现了这一过程,为了便于理解,这里我…

智跃人力资源管理系统 SQL注入漏洞复现

0x01 产品简介 智跃人力资源管理系统是基于B/S网页端广域网平台,一套考勤系统即可对全国各地多个分公司进行统一管控,成本更低。信息共享更快。跨平台,跨电子设备 0x02 漏洞概述 智跃人力资源管理系统GenerateEntityFromTable.aspx接口处存在…

生成对抗网络(GAN)手写数字生成

文章目录 一、前言二、前期工作1. 设置GPU(如果使用的是CPU可以忽略这步) 二、什么是生成对抗网络1. 简单介绍2. 应用领域 三、网络结构四、构建生成器五、构建鉴别器六、训练模型1. 保存样例图片2. 训练模型 七、生成动图 一、前言 我的环境&#xff1…

centos服务器安装docker和Rabbitmq

centos服务器 一 centos安装docker1 安装docker所需要的依赖包2配置yum源3查看仓库中所有的docker版本4安装docker5 设置docker为开机自启6验证docker是否安装成功 二 使用docker安装RabbitMQ拉取RabbitMQ镜像创建并运行容器 一 centos安装docker 1 安装docker所需要的依赖包 …

电脑投屏到电视的软件,Mac,Linux,Win均可使用

电脑投屏到电视的软件,Mac,Linux,Win均可使用 AirDroid Cast的TV版,可以上笔记本电脑或台式电脑直接投屏到各种安卓电视上。 无线投屏可以实现本地投屏及远程投屏,AirPlay协议可以实现本地投屏,大家可以按需…