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

文章目录

  • [💥 简介](#💥 简介)
  • [💫 基本结构](#💫 基本结构)
    • [🍉 事件处理器](#🍉 事件处理器)
      • [🥭 配置分析](#🥭 配置分析)
      • [🍏 配置示例](#🍏 配置示例)
    • [🍉 HTTP服务器](#🍉 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在使用互斥锁时,如果锁已经被其他进程持有,尝试获取锁的最大次数。可以尝试增加这个值,以减少锁的竞争。

🍏 配置示例

powershell 复制代码
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在请求文件时尝试使用不同的文件名。这可以用于处理静态文件请求。

🍏 配置示例

powershell 复制代码
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文件:

powershell 复制代码
sudo vim /etc/nginx/nginx.conf

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

powershell 复制代码
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进程数,以避免过多的系统资源占用。

powershell 复制代码
worker_processes auto;

worker_connections

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

powershell 复制代码
events {
    worker_connections 1024;
}

启用缓存

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

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

启用压缩

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

powershell 复制代码
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证书和密钥的路径。这样可以确保网站的安全性和可信度。

powershell 复制代码
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;
    }
}

优化日志

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

powershell 复制代码
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

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

powershell 复制代码
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;

启用缓存

powershell 复制代码
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的魔法发挥到极致。

相关推荐
聆风吟º1 天前
CANN开源项目深度实践:基于amct-toolkit实现自动化模型量化与精度保障策略
运维·开源·自动化·cann
侠客行03171 天前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
蛇皮划水怪1 天前
深入浅出LangChain4J
java·langchain·llm
山峰哥1 天前
数据库工程与SQL调优——从索引策略到查询优化的深度实践
数据库·sql·性能优化·编辑器
较劲男子汉1 天前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
老毛肚1 天前
MyBatis体系结构与工作原理 上篇
java·mybatis
风流倜傥唐伯虎1 天前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
Doro再努力1 天前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
senijusene1 天前
Linux软件编程:IO编程,标准IO(1)
linux·运维·服务器
不像程序员的程序媛1 天前
Nginx日志切分
服务器·前端·nginx