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


    💥 简介

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

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

    🍉 虚拟主机

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

    sudo vim /etc/nginx/nginx.conf
    
    • 1

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

    http {
        server {
            listen 80;
            server_name example.com;
    
            location / {
                root /var/www/example.com;
                index index.html;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    🍊 优化

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

    worker_processes auto;
    
    • 1

    worker_connections

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

    events {
        worker_connections 1024;
    }
    
    • 1
    • 2
    • 3

    启用缓存

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

    在这个示例中,我们使用正则表达式匹配静态资源的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;
    
    • 1
    • 2
    • 3

    启用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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    优化日志

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

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    
    • 1
    • 2
    • 3

    启用缓存

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    🍔 总结

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

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

  • 相关阅读:
    确定Mac\Linux系统的架构类型是 x86-64(amd64),还是 arm64 架构
    shell之常见网络命令介绍
    大一网页设计期末大作业,HTML+CSS静态网站
    基于.NetCore开发博客项目 StarBlog - (17) 自动下载文章里的外部图片
    完蛋!百融云被大阳线包围了!
    ZGC的流程图
    解析java中的除法运算和取模运算
    前端的几种网络请求方式
    华为云云耀云服务器L实例评测|怎么搭建企业综合Web平台
    阿里云升级版短信验证教程PHP篇
  • 原文地址:https://blog.csdn.net/duguozhu123/article/details/134687051