一、Nginx的文件和目录

  1. /etc/nginx/ 这个目录是nginx服务器的主要配置目录。在这个目录下,您通常会找到多个配置文件和子目录,它们共同定义了nginx服务器的行为。这个目录包括了nginx的主配置文件(nginx.conf),以及通常用于存放特定设置(如虚拟主机配置)的子目录。
  2. /etc/nginx/nginx.conf 这是nginx的主配置文件。它包含了nginx服务器的全局设置,例如工作进程的数量、日志文件的位置、客户端大小限制、文件上传大小限制等。它也可以包括对其他配置文件的引用,例如在/etc/nginx/conf.d/目录下的文件。主配置文件nginx.conf经常会使用include指令来包含其他配置文件,这样可以提高配置的可管理性。
  3. /etc/nginx/conf.d/ 这个目录通常用于存放nginx服务器的虚拟主机配置文件。默认情况下,nginx.conf文件中会包含一个include /etc/nginx/conf.d/*.conf;指令,它会使nginx加载conf.d目录下所有以.conf结尾的文件。这种结构方式便于管理多个独立的配置文件,使得不同的网站或应用可以有自己的配置文件,而且增加或删除特定站点的配置不会影响主配置文件。
  4. /var/log/nginx/ 这个目录存放nginx的日志文件。在nginx配置中,可以定义两种类型的日志:访问日志(记录所有请求详细信息)和错误日志(记录nginx运行中的错误信息)。日志文件对于调试问题和监控nginx服务器的活动非常重要。默认情况下,nginx可能会将日志文件存储在这个位置,但是您可以在nginx的配置文件中修改日志路径,根据需要将它们存放在不同的地方。

二、nginx.conf详细介绍

NGINX配置文件是一个强大而灵活的工具,用于控制NGINX的行为。通常,配置文件位于/etc/nginx/nginx.conf,它的结构分为几个部分。以下是NGINX配置文件中各个部分的详细介绍:

1. 全局块(Global Block)

这是配置文件中的最顶层部分,包含了影响NGINX整个实例的指令。这些指令通常包括:

  • user: 指定NGINX进程运行的用户和用户组。
  • worker_processes: 设置NGINX需要启动的工作进程数量,可以设置为auto让NGINX自动决定。
  • error_log: 配置错误日志文件的位置和日志级别。
  • pid: 设置存储主进程ID的文件路径。

2. 事件块(Events Block)

该块配置与工作进程相关的事件模型:

  • worker_connections: 每个工作进程允许的最大连接数。
  • multi_accept: 定义工作进程是否在接收到新的连接通知时,尝试接收尽可能多的连接。

3. HTTP块(HTTP Block)

HTTP块用于定义所有http服务器共有的配置,它是几个子模块的容器:

  • include: 引入额外的配置文件。
  • upstream: 定义上游服务器组,用于负载均衡。
  • server: 定义服务器。每个server块配置一个虚拟服务器。

HTTP块中也可以包含如access_log, sendfile, keepalive_timeout, client_max_body_size等指令,这些指令通常会被server块中的设置所覆盖。

4. Server块(Server Block)

每个server块定义了一个服务器,用于处理特定的请求。它可以包含以下指令:

  • listen: 监听的端口以及可选的IP地址,也可以指定是否为https及其证书。
  • server_name: 定义这个server监听请求的域名。
  • root: 设置资源的根目录。
  • index: 设置默认的index文件。
  • location: 根据请求的URI进行匹配,并定义这些请求如何被处理。

5. Location块(Location Block)

该块定义了请求的处理方式。它可以有多种匹配模式,包括精确匹配、正则表达式匹配等:

  • proxy_pass: 上游服务器的地址,用于反向代理设置。
  • fastcgi_pass: FastCGI服务器的地址,用于PHP等脚本的处理。
  • rewrite: URI重写规则。

6. 其他块

  • mail:用于配置处理邮件相关服务(例如:IMAP, POP3, SMTP)的指令。

这是NGINX配置文件的基本结构和部分。根据你的需求和环境的不同,可能还会有其他特定的块和指令。需要注意的是,高级配置可能会涉及到更复杂的模块和指令集合,有时候需要额外的模块(如:Stream模块用于负载均衡TCP和UDP流量)。因此,在对配置进行修改时,建议仔细阅读官方文档并进行充分的测试。

三、Nginx指令

  1. nginx 这是启动 Nginx 服务的基本命令。如果您的系统上配置了 systemd,您可能需要使用 systemctl start nginx 来启动服务。
  2. nginx -s signal 这个命令用于向 Nginx 主进程发送指定的信号,其中 signal 可以是以下其中之一:
  • stop:快速停止 Nginx 服务。
  • quit:平缓停止 Nginx 服务。
  • reload:重新加载配置文件。对配置文件做了修改后,使用此命令可以让修改生效而无需重启服务。
  • reopen:重新打开日志文件,用于日志文件管理,例如轮转(log rotation)。
  1. nginx -t 这个命令用于测试配置文件的格式是否正确。在重启或重新加载配置之前,最好运行此测试,确保没有语法错误。
  2. nginx -v 显示 Nginx 的版本信息。
  3. nginx -V 显示 Nginx 的版本,编译器版本和配置参数。
  4. nginx -c configuration-file 通过指定的配置文件启动 Nginx。当你有一个非标准路径的配置文件或者测试新的配置文件时,这个命令非常有用。
  5. nginx -g directives 在命令行上设置全局指令。例如,nginx -g 'daemon off;'可以启动一个前台运行的 Nginx 实例。

四、如何使用 NGINX 提供静态内容

使用NGINX提供静态内容是一个相对直接的过程,可以通过为静态资源创建一个配置块来完成。

  1. 打开nginx的配置文件 编辑nginx的配置文件(通常位于/etc/nginx/nginx.conf),或者你可以在/etc/nginx/conf.d/目录下创建一个新的.conf文件。确保以管理员权限执行编辑操作。
  2. 在配置文件中设置静态资源的位置 创建一个新的 server 块,如果你是在 nginx.conf 文件中添加,通常这个块应该在 http 块内。
    以下示例演示了一个简单的静态内容配置,比如你想要从 /var/www/html 目录提供静态文件:

  server {       listen       80; # 监听的端口       server_name localhost; # 服务器名称或IP       # 配置静态文件根目录       location / {           root   /var/www/html;           index  index.html index.htm; # 默认页面       }             # 其他的location块可以根据需要配置来提供CSS、JavaScript文件等   }


root 指令中指定静态资源的根目录,这个目录包含了你想要由nginx提供的静态内容。index 指令定义了当请求目录而不是文件时,默认应该返回哪个文件。

  1. 测试NGINX配置 保存配置文件后,可以测试配置文件的正确性。在终端或命令行界面输入以下命令:

  nginx -t


如果配置文件没有错误,你会看到类似这样的信息:“syntax is ok”和“test is successful”。

  1. 重新加载NGINX配置 一旦确认配置文件没有错误,就可以重新加载nginx让配置生效:

  nginx -s reload


或者通过systemd系统(如果可用):


  systemctl reload nginx


  1. 检查结果 配置完成后,打开你的web浏览器并输入服务器的地址,你应该能看到静态内容现在由nginx提供。如果localhost,它可能就是 http://localhost

以上步骤即可让NGINX作为静态内容的服务器。如果要提供多个静态内容目录,可以为每个目录创建不同的location块来指定不同的root路径。

五、如何在保证不丢包的情况下重新加载配置

要在不丢包的情况下重新加载NGINX配置,通常只需要执行以下命令:


nginx -s reload


当您传递reload信号给NGINX时,会发生以下步骤,这些步骤确保了在重载配置期间服务的无缝继续:

  1. NGINX主进程接收到重载信号后,首先检查配置文件的语法是否正确。
  2. 如果检查通过,则主进程打开新的日志文件和新的监听套接字。
  3. 主进程使用新的配置启动新的工作进程。
  4. 新工作进程开始接收新的连接,而旧的工作进程继续处理当前的连接。
  5. 当旧的工作进程完成它们当前处理的连接后,它们会关闭。
  6. 如果设置了worker_shutdown_timeout指令,它会限制旧工作进程关闭前等待处理完当前连接的时间。

这个平滑重载机制确保已建立的连接不会被中断,并且新的请求会由重新加载了新配置的工作进程处理。这样,您就可以安全地应用更改而不影响现有的用户体验。

请注意在某些特殊的配置更改后,如更改监听端口号或服务器的基础系统资源,可能需要完全重启NGINX以确保这些更改生效。不过,对于大多数配置更改,reload命令就足够了。在重载配置之前使用nginx -t命令来测试配置文件是一个良好的实践,确保没有语法错误。

六、如何将负载分发到两台或多台 HTTP 服务器

在NGINX中,将负载分发到两台或多台HTTP服务器的方法被称为负载均衡。可以通过以下步骤在NGINX中配置基本的负载均衡:

  1. 定义上游服务器:
    先打开NGINX配置文件(例如 /etc/nginx/nginx.conf 或在 /etc/nginx/conf.d/ 的某个文件中)。然后,在http块中定义一组上游服务器,看起来像这样:

  http {       upstream myapp1 {           server srv1.example.com;           server srv2.example.com;           # …可以添加更多的服务器来分担负载       }   }


upstream 块允许您列出几台服务器,并命名这组服务器(例如 here myapp1)。

  1. 设置代理传递:
    在一个server块中,使用 proxy_pass 指令将请求传递到上述定义的上游服务器组:

  server {       listen 80;       location / {           proxy_pass http://myapp1; # 这里使用的是上游服务器组的名称           # 其他代理设置(可选)       }   }


这里的 location / 块内的 proxy_pass 指示NGINX将所有进入的HTTP请求转发到名为 myapp1 的上游服务器组。

  1. 配置负载均衡方法:
    NGINX默认使用轮询算法(round-robin)来分配请求,即依次向每台服务器发送一个请求。如果您需要不同的负载均衡策略,可以在 upstream 块中进行配置,例如使用最少连接(least_conn)算法:

  upstream myapp1 {       least_conn; # 使用最少连接算法       server srv1.example.com;       server srv2.example.com;       # …   }


NGINX还支持其他負載均衡方法,如ip_hash(基于客户端IP的哈希结果进行分配)和基于权重的分配。

  1. 其他负载均衡设置(可选):
    你可以指定服务器的重试次数、超时时间或者当服务器不可用时的行为。
  2. 测试和重载配置:
    在应用任何配置更改之前,务必使用nginx -t来检查配置文件的语法,并使用 nginx -s reload 或相应的 systemctl 命令重新加载服务。

通过以上步骤,NGINX将能够将请求分发到多台HTTP服务器,从而有效地平衡负载。使用这种配置可以减少任何单一服务器的过载问题,并可提高服务的整体可用性和性能。

七、如何将负载分发到两台或多台 TCP 服务器

在NGINX中,将负载分发到两台或多台TCP服务器通常需要使用NGINX的Stream模块,这是一种可以处理TCP流量的配置方式。以下是设置TCP负载均衡的步骤:

  1. 打开配置文件
    需要在NGINX配置中使用stream上下文,通常可以在/etc/nginx/nginx.conf中增加或者在/etc/nginx/conf.d/目录下创建一个新的.conf文件。
  2. 定义上游服务器组
    stream块中创建一个upstream服务器组,像这样:

stream { upstream tcp_backend { server tcp1.example.com:12345; server tcp2.example.com:12345; # 添加更多TCP服务器… } }


在这里,将逐个列出所有TCP服务器,并指定各自的端口。

  1. 配置服务器监听和转发规则
    接下来,在stream块中添加监听特定端口的server块,并使用proxy_pass将连接转发到你的上游服务器组:

stream { upstream tcp_backend { server tcp1.example.com:12345; server tcp2.example.com:12345; } server { listen 12345; # NGINX将在此端口监听进入的TCP连接 proxy_pass tcp_backend; # 转发到上面定义的后端服务器组 } }


  1. 配置负载均衡选项
    proxy_pass 指令会使NGINX代理传递TCP连接到上游。默认情况下,使用轮询算法。如果需要配置特定的负载均衡选项,请在upstream块中指定,例如:

upstream tcp_backend { least_conn; # 最少连接负载均衡策略 server tcp1.example.com:12345; server tcp2.example.com:12345; }


  1. 检查和应用配置
    执行以下NGINX命令,检查配置文件的语法:

nginx -t


如果输出显示配置文件没问题,使用下面的命令加载新的配置:


nginx -s reload


或通过systemctl(如果你的系统使用systemd):


systemctl reload nginx


通过这些步骤,就可以配置NGINX实现TCP负载均衡,从而分发负载到两台或多台TCP服务器。这样可以提高服务的容错能力和可伸缩性。

八、如何将负载分发到两台或多台 UDP 服务器

在NGINX中,将负载分发到两台或多台UDP服务器的方法与TCP服务器相似,也使用Stream模块来配置。以下是设置UDP负载均衡的步骤:

  1. 启用Stream模块
    确保您的NGINX版本编译时包含了Stream模块。大多数预打包的NGINX版本都已包括了这个模块。
  2. 编辑配置文件
    打开NGINX配置文件,在/etc/nginx/nginx.conf 或是 /etc/nginx/conf.d/ 的配置文件里添加配置。
  3. 定义上游服务器组
    stream部分创建一个名为upstream的服务器组用来列出UDP服务器:

stream { upstream udp_backend { server udp1.example.com:12345; # UDP服务器1 server udp2.example.com:12345; # UDP服务器2 # 可以继续添加更多服务器 } }


  1. 配置UDP监听和负载均衡规则
    然后在stream部分中设置一个server块来监听UDP端口并将数据包转发到你的upstream服务器组:

stream { upstream udp_backend { server udp1.example.com:12345; server udp2.example.com:12345; } server { listen 12345 udp; # 在此端口上监听UDP数据流 proxy_pass udp_backend; # 转发到定义好的服务器组 } }


  1. 配置负载均衡选项
    默认情况下,NGINX会使用轮询策略来分发流量。如需其它策略,可以在upstream块中配置。
  2. 应用配置
    保存配置文件,并通过命令测试NGINX配置语法是否正确:

nginx -t


如果没有错误,可以重新加载NGINX配置以使更改生效:


nginx -s reload


或者,如果服务器使用systemd,可以用以下命令来重载NGINX:


systemctl reload nginx


完成这些步骤后,NGINX将开始使用UDP负载均衡功能,将流量均等地分发到所有的UDP服务器上。这样的配置适用于需要负载均衡UDP流量的应用场景,比如DNS服务器。