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的魔法发挥到极致。

相关推荐
IT机器猫19 分钟前
Docker完整技术汇总
运维·docker·容器
无所不在的物质23 分钟前
Jenkins基础教程
运维·云原生·自动化·jenkins
一休哥助手41 分钟前
全面解析 Linux 系统监控与性能优化
linux·运维·性能优化
忒可君1 小时前
C# winform 报错:类型“System.Int32”的对象无法转换为类型“System.Int16”。
java·开发语言
watl01 小时前
【Android】unzip aar删除冲突classes再zip
android·linux·运维
斌斌_____1 小时前
Spring Boot 配置文件的加载顺序
java·spring boot·后端
路在脚下@1 小时前
Spring如何处理循环依赖
java·后端·spring
团儿.1 小时前
Docker服务发现新纪元:探索Consul的无限魅力
运维·docker·云计算·服务发现·consul
一个不秃头的 程序员2 小时前
代码加入SFTP JAVA ---(小白篇3)
java·python·github
赵大仁2 小时前
在 CentOS 7 上安装 Node.js 20 并升级 GCC、make 和 glibc
linux·运维·服务器·ide·ubuntu·centos·计算机基础