nginx配置详解(容器、负载)—官方原版
创始人
2024-05-29 13:50:31
0

一、概述

本指南对nginx进行了基本介绍,并描述了一些 可以用它完成的简单任务。 据推测,nginx已经安装在阅读器的机器上。 本指南描述了如何启动和停止nginx,并重新加载其 配置,解释结构 的配置文件,并描述了如何设置 nginx 要提供静态内容,如何将nginx配置为代理 服务器,以及如何将其与 FastCGI 应用程序连接。

nginx有一个主进程和几个工作进程。 主进程的主要目的是读取和评估配置, 并维护工作进程。 工作进程对请求进行实际处理。 nginx采用基于事件的模型和依赖于操作系统的机制来有效地 在工作进程之间分发请求

nginx及其模块的工作方式在配置文件中确定。默认情况下,配置文件名为nginx.conf,位于/usr/local/nginx/conf、/etc/nginx或/usr/local/etc/nginx。

二、启动、停止和重新加载配置

要启动nginx,请运行可执行文件。一旦nginx启动,就可以通过使用-s参数调用可执行文件来控制它。使用以下语法:

nginx -s signal

其中信号可能是以下之一:

  • stop— 快速关机

  • quit— 优雅关机

  • reload— 重新加载配置文件

  • reopen— 重新打开日志文件

例如,通过等待工作进程来停止nginx进程 要完成当前请求的服务,可以执行以下命令:

nginx -s quit

在配置文件中所做的更改 在重新加载配置的命令之前不会应用。 发送到nginx或重新启动。 要重新加载配置,请执行:

nginx -s reload

一旦主进程收到重新加载配置的信号,它将检查新配置文件的语法有效性,并尝试应用其中提供的配置。如果成功,主进程将启动新的工作进程,并向旧的工作进程发送消息,请求它们关闭。否则,主进程回滚更改并继续使用旧配置。旧工作进程收到关闭命令,停止接受新连接,并继续服务当前请求,直到所有此类请求都得到服务。之后,旧工作进程退出。

在Unix工具(如kill实用程序)的帮助下,也可以向nginx进程发送信号。在这种情况下,信号将直接发送给具有给定进程ID的进程。默认情况下,nginx主进程的进程ID将写入目录/usr/local/nginx/logs或/var/run中的nginx.pid。例如,如果主进程ID为1628,要发送导致nginx正常关闭的QUIT信号,请执行:

kill -s QUIT 1628

为了获取所有正在运行的nginx进程的列表,可以使用ps实用程序,例如,如下所示:

ps -ax | grep nginx

三、配置文件的结构

nginx由由配置文件中指定的指令控制的模块组成。指令分为简单指令和块指令。简单指令由名称和参数组成,用空格分隔,并以分号(;)结尾。块指令具有与简单指令相同的结构,但它以一组由大括号({和})包围的附加指令结尾,而不是分号。如果块指令可以在大括号内包含其他指令,则称为上下文(例如:事件、http、服务器和位置)。

配置文件中放置在任何上下文之外的指令都被认为是在主上下文中。events 和http指令位于main context中、server 在 http中, location在 server中。

#符号后的其余行被视为注释。

1、提供静态内容

一个重要的web服务器任务是提供文件(如图像或静态HTML页面)。您将实现一个示例,根据请求,文件将从不同的本地目录提供:/data/www(可能包含HTML文件)和/data/images(包含图像)。这将需要编辑配置文件,并在具有两个位置块的http块内设置服务器块。

首先,创建/data/www目录,并将包含任何文本内容的index.html文件放入其中,然后创建/data/images目录,并在其中放置一些图像。

接下来,打开配置文件。默认配置文件已经包含了服务器块的几个示例,其中大部分已注释掉。现在,注释掉所有这些块并开始新的服务器块:

http {server {}
}

通常,配置文件可以包括多个服务器块,这些服务器块通过它们侦听的端口和服务器名称进行区分。一旦nginx决定了哪个服务器处理请求,它就会根据服务器块中定义的位置指令的参数测试请求头中指定的URI。

将location模块添加到server模块:

location / {root /data/www;
}

此位置块指定与请求的URI相比的“/”前缀。对于匹配的请求,URI将添加到根指令中指定的路径,即/data/www,以形成本地文件系统上所请求文件的路径。如果有几个匹配的位置块,nginx选择前缀最长的位置块。上面的位置块提供长度为1的最短前缀,因此只有当所有其他位置块都无法提供匹配时,才会使用此块。

接下来,添加第二个location块:

location /images/ {root /data;
}

它将匹配以/images/开头的请求(location/也匹配此类请求,但前缀更短)。

服务器块的最终配置应如下所示:

server {location / {root /data/www;}location /images/ {root /data;}
}

这已经是一个服务器的工作配置,该服务器在标准端口80上侦听http://localhost/.响应URI以/images/开头的请求,服务器将从/data/images目录发送文件。例如,响应http://localhost/images/example.png请求nginx将发送/data/images/example.png文件。如果这样的文件不存在,nginx将发送一个响应,指示404错误。URI不以/images/开头的请求将映射到/data/www目录。例如,响应http://localhost/some/example.html请求nginx将发送/data/www/some/example.html文件。

要应用新配置,如果nginx尚未启动,请启动它,或者通过执行以下操作向nginx的主进程发送reload信号:

nginx -s reload

如果某些东西不能按预期工作,您可以尝试在/usr/local/nginx/log或/var/log/nginx目录下的access.log和error.log文件中查找原因。

2、设置简单的代理服务器

nginx的常见用途之一是将其设置为代理服务器,这 表示接收请求并将其传递给代理服务器的服务器, 从它们检索响应,并将其发送到客户端。

我们将配置一个基本的代理服务器,它服务于 包含本地目录中文件的图像,并将所有其他请求发送到 代理服务器。 在此示例中,两个服务器都将在单个 nginx 实例上定义。

首先,通过向nginx的配置文件中添加一个服务器块来定义代理服务器,其中包含以下内容:

server {listen 8080;root /data/up1;location / {}
}

这将是一个简单的服务器,它在端口8080上侦听(以前,由于使用了标准端口80,所以未指定侦听指令),并将所有请求映射到本地文件系统上的/data/up1目录。创建此目录并将index.html文件放入其中。请注意,root指令位于服务器上下文中。当选择用于服务请求的位置块不包括其自己的根指令时,使用这样的根指令。

接下来,使用上一节中的服务器配置,并将其修改为代理服务器配置。在第一个位置块中,将proxy_pass指令与参数中指定的代理服务器的协议、名称和端口放在一起(在我们的例子中,它是http://localhost:8080):

server {location / {proxy_pass http://localhost:8080;}location /images/ {root /data;}
}

我们将修改第二个位置块,该块当前将带有/images/前缀的请求映射到/data/images目录下的文件,以使其与具有典型文件扩展名的图像请求相匹配。修改后的位置块如下所示:

location ~ \.(gif|jpg|png)$ {root /data/images;
}

该参数是一个正则表达式,匹配所有以.gif、.jpg或.png结尾的URI。正则表达式应以~开头。相应的请求将映射到/data/images目录。

当nginx选择一个位置块来服务请求时,它首先检查指定前缀的位置指令,记住前缀最长的位置,然后检查正则表达式。如果与正则表达式匹配,nginx会选择这个位置,否则,它会选择前面记住的位置。

代理服务器的最终配置如下所示:

server {location / {proxy_pass http://localhost:8080/;}location ~ \.(gif|jpg|png)$ {root /data/images;}
}

此服务器将过滤以.gif、.jpg或.png结尾的请求,并将它们映射到/data/images目录(通过向根指令的参数添加URI),并将所有其他请求传递到上面配置的代理服务器。

要应用新的配置,请发送重载信号到nginx,如前几节所述。

还有许多指令可用于进一步配置代理连接。

3、设置快速CGI代理

nginx可用于将请求路由到FastCGI服务器,FastCGI服务器运行使用各种框架和编程语言(如PHP)构建的应用程序。

与FastCGI服务器一起使用的最基本的nginx配置包括使用FastCGI_pass指令而不是proxy_pass指令,以及FastCGI_param指令来设置传递给FastCGI服务器的参数。假设FastCGI服务器可以在localhost:9000上访问。以上一节中的代理配置为基础,将proxy_pass指令替换为fastcgi_pass指令,并将参数更改为localhost:9000。在PHP中,SCRIPT_FILENAME参数用于确定脚本名称,QUERY_STRING参数用于传递请求参数。结果配置为:

server {location / {fastcgi_pass  localhost:9000;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param QUERY_STRING    $query_string;}location ~ \.(gif|jpg|png)$ {root /data/images;}
}

这将设置一个服务器,该服务器将通过FastCGI协议将所有请求(静态图像请求除外)路由到在localhost:9000上运行的代理服务器。

四、负载平衡配置

1、负载平衡方法

中支持以下负载平衡机制(或方法) nginx:

  • 轮询 — 分发对应用程序服务器的请求 以循环赛的方式,

  • 最少连接 — 下一个请求分配给服务器,其中 最少的活动连接数,

  • ip-hash — 哈希函数用于确定哪个服务器应该 为下一个请求选择(基于客户端的 IP 地址)。

2、默认负载平衡配置

使用 nginx 进行负载平衡的最简单配置可能看起来 如下所示:

http {upstream myapp1 {server srv1.example.com;server srv2.example.com;server srv3.example.com;}server {listen 80;location / {proxy_pass http://myapp1;}}
}

在上面的示例中,同一应用程序有 3 个实例 在 SRV1-SRV3 上运行。 如果未专门配置负载平衡方法, 它默认为轮循机制。 所有请求都代理到服务器组 myapp1,nginx 应用 HTTP 负载 平衡以分发请求。

nginx中的反向代理实现包括HTTP的负载平衡, HTTPS,FastCGI,uwsgi,SCGI,memcached和gRPC。

要为 HTTPS 而不是 HTTP 配置负载平衡,只需使用“https” 作为协议。

为 FastCGI、uwsgi、SCGI、memcached 或 gRPC 设置负载平衡时,请分别使用 fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass 和 grpc_pass 指令。

3、最少连接的负载平衡

另一个负载均衡规则是连接最少的。 最少连接允许控制应用程序的负载 在某些请求的情况下更公平地实例 需要更长的时间才能完成。

使用最少连接的负载平衡,nginx将尝试不使 繁忙的应用程序服务器具有过多的请求,分发新的 请求改为对不太繁忙的服务器的请求。

nginx 中的最少连接负载平衡在将 least_conn 指令用作服务器组配置的一部分时被激活:

upstream myapp1 {least_conn;server srv1.example.com;server srv2.example.com;server srv3.example.com;}

4、会话持久性

请注意,使用循环或最少连接的负载 平衡,每个后续客户端的请求可能是潜在的 分发到其他服务器。 不能保证同一客户端将始终是 定向到同一服务器。

如果需要将客户端绑定到特定的应用程序服务器 — 换句话说,使客户端的会话“粘性”或“持久化” 始终尝试选择特定服务器的术语 — IP 哈希负载 可以使用平衡机制。

使用 ip 哈希,客户端的 IP 地址用作哈希密钥 确定应为服务器组中的哪个服务器选择 客户的要求。 此方法可确保来自同一客户端的请求 将始终定向到同一服务器 除非此服务器不可用。

要配置 IP 哈希负载平衡,只需将 ip_hash 指令添加到服务器(上游)组配置:

upstream myapp1 {ip_hash;server srv1.example.com;server srv2.example.com;server srv3.example.com;
}

5、加权负载平衡

甚至可能影响nginx负载均衡算法 此外,通过使用服务器权重。

在上面的示例中,未配置服务器权重,这意味着 所有指定的服务器都被视为同样有资格用于 特定的负载平衡方法。

特别是循环赛,这也意味着或多或少相等 跨服务器分发请求 — 前提是有足够的请求 请求,以及何时以统一的方式处理请求,并且 完成得足够快。

为服务器指定权重参数时,权重将作为一部分 的负载平衡决策。

upstream myapp1 {server srv1.example.com weight=3;server srv2.example.com;server srv3.example.com;}

用此配置,每 5 个新请求将分布在 应用程序实例如下:将定向 3 个请求 对于 SRV1,一个请求将转到 SRV2,另一个请求将转到 SRV3。

同样可以使用连接最少和 最新版本的 nginx 中的 IP 哈希负载平衡。

6、健康检查

nginx中的反向代理实现包括带内(或无源) 服务器运行状况检查。 如果来自特定服务器的响应失败并显示错误, nginx会将此服务器标记为失败,并尝试 暂时避免为后续入站请求选择此服务器。

max_fails 指令将连续失败的尝试次数设置为 与fail_timeout期间应发生的服务器通信。 默认情况下,max_fails设置为 1。 设置为 0 时,将禁用此服务器的运行状况检查。 fail_timeout 参数还定义服务器标记为失败的时间长度。 服务器故障后的fail_timeout间隔后,nginx将开始正常 使用实时客户端的请求探测服务器。 如果探测成功,服务器将标记为活动服务器。

相关内容

热门资讯

安卓系统升级清理,深度清理与性... 亲爱的手机控们,你是不是也和我一样,对安卓系统的升级清理充满了好奇和期待呢?每次系统更新,都仿佛是给...
安卓系统更改wifi的dns 你有没有发现,家里的WiFi有时候上网速度慢得让人抓狂?别急,别急,让我来告诉你一个小秘密:通过更改...
安卓系统取消休眠设置,解锁设备... 你知道吗?最近安卓系统来了一次大变动,那就是取消了休眠设置。这可真是让人眼前一亮,让我们一起来看看这...
夏普电视安卓系统吗,畅享无限 亲爱的读者们,你是否在寻找一款既时尚又实用的电视呢?夏普电视可是近年来市场上的一大热门,而它的操作系...
安卓系统能连键盘,畅享便捷输入... 你有没有想过,你的安卓手机或者平板,竟然可以轻松连接键盘呢?没错,就是那种你打字时能感受到指尖触感的...
ios系统跟安卓系统哪个内存大... 你有没有想过,为什么你的手机有时候会卡得像蜗牛一样爬?这背后其实隐藏着一个有趣的秘密——那就是iOS...
骁龙888安卓系统手机,性能与... 你有没有发现,最近手机圈里有个大热门啊?没错,就是骁龙888安卓系统手机!这可是今年最火的处理器,各...
安卓系统apk安装包,从APK... 你有没有遇到过这种情况?手机里突然缺了个啥,比如一款超好用的游戏或者实用的工具,一看,得,得下载个A...
小米手环如何装安卓系统,系统升... 你有没有想过,你的小米手环也能升级成安卓系统呢?没错,就是那个让手机焕然一新的操作系统!今天,就让我...
安卓系统改静音键失灵,探究原因... 手机静音键突然失灵了,这可怎么办呢?是不是你也遇到了这样的烦恼?别急,今天就来给你详细解析一下安卓系...
联想电脑安装了安卓系统,畅享移... 你有没有想过,一台联想电脑竟然能装上安卓系统?这可不是天方夜谭,而是科技发展的新趋势。想象你手中的联...
安卓系统返回键app,如何利用... 你是不是也和我一样,对安卓手机的返回键有着特殊的感情?那个小小的按键,承载了我们多少次的快速导航,多...
安卓系统比苹果安全软件,揭秘其... 你知道吗?在智能手机的世界里,安卓系统和苹果iOS系统就像是一对冤家,各有各的粉丝。不过,今天咱们不...
安卓系统相机怎么替换系统相机,... 你有没有发现,手机里的相机功能越来越强大,但有时候,系统自带的相机总感觉有点不够意思?别急,今天就来...
安卓系统咋设置更流畅,打造流畅... 手机用久了是不是感觉安卓系统有点卡呢?别急,今天就来教你怎么设置,让你的安卓手机瞬间变得流畅如丝!一...
索尼怎么装安卓系统版本,探索安... 你有没有想过,让你的索尼手机焕发第二春,让它从那个老旧的系统里跳出来,拥抱一下安卓的广阔天地呢?没错...
安卓qq系统小黄鸭,畅享智能生... 你知道吗?最近安卓QQ系统里出现了一个超级可爱的小黄鸭,简直萌化了一大批网友的心!这个小黄鸭不仅外观...
安卓双系统手机测评,体验双重魅... 你有没有想过,拥有一部既能运行安卓系统,又能体验iOS风味的手机,是不是就像拥有了两个世界的大门呢?...
x61安装安卓系统,深度解析安... 你有没有想过,你的X61笔记本电脑,那可是个老伙计了,是不是也想给它来个“青春焕发”的变身呢?没错,...
安卓系统图片中带视频,安卓系统... 你有没有发现,现在安卓系统的图片里竟然能藏视频呢?这可真是科技发展的新花样,让人眼前一亮。想象一张普...