nginx配置详解(容器、负载)—官方原版

一、概述

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

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

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

官网下载:http://nginx.org/en/download.html

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

启动nginx,运行可执行文件。

/etc/nginx/sbin/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将开始正常 使用实时客户端的请求探测服务器。 如果探测成功,服务器将标记为活动服务器。

五、在Nginx独立服务器上安装证书

1、使用远程登录工具,登录Nginx服务器。

2、执行以下命令,在Nginx安装目录(默认为/usr/local/nginx/conf)下创建一个用于存放证书的目录

cd /usr/local/nginx/conf  #进入Nginx默认安装目录。如果您修改过默认安装目录,请根据实际配置调整。
mkdir cert  #创建证书目录,命名为cert。

3、使用远程登录工具附带的本地文件上传功能,将证书文件和私钥文件上传到Nginx服务器的证书目录(示例中为/usr/local/nginx/conf/cert)。

4、编辑Nginx配置文件nginx.conf,修改与证书相关的配置。

a.执行以下命令,打开配置文件

vim /usr/local/nginx/conf/nginx.conf

b.按i键进入编辑模式。

c.在nginx.conf中定位到HTTP协议代码片段(http{}),并在HTTP协议代码里,按照以下代码示例,修改server属性配置。

#以下属性中,以ssl开头的属性表示与证书配置有关。
server {
    #配置HTTPS的默认访问端口为443。
    #如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
    #如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。
    listen 443 ssl;

    #填写证书绑定的域名
    server_name <yourdomain>;
    root html;
    index index.html index.htm;

    #填写证书文件名称
    ssl_certificate cert/<cert-file-name>.pem;
    #填写证书私钥文件名称  
    ssl_certificate_key cert/<cert-file-name>.key;

    ssl_session_timeout 5m;
    #表示使用的加密套件的类型
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    #表示使用的TLS协议的类型,您需要自行评估是否配置TLSv1.1协议。
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

    ssl_prefer_server_ciphers on;
    location / {
        #Web网站程序存放目录
        root html;
        index index.html index.htm;
    }
}

d.可选:设置HTTP请求自动跳转HTTPS。

如果您希望所有的HTTP访问自动跳转到HTTPS页面,则可以在需要跳转的HTTP站点下添加以下rewrite语句

server {
    listen 80;
    #填写证书绑定的域名
    server_name <yourdomain>;
    #将所有HTTP请求通过rewrite指令重定向到HTTPS。
    rewrite ^(.*)$ https://$host$1;
    location / {
        index index.html index.htm;
    }
}

e.修改完成后,按Esc键、输入:wq!并按Enter键,保存修改后的配置文件并退出编辑模式。

5、执行以下命令,重启Nginx服务。

cd /usr/local/nginx/sbin  #进入Nginx服务的可执行目录。
./nginx -s reload  #重新载入配置文件。

如果重启Nginx服务时收到报错,您可以使用以下方法进行排查:

  • 报错the "ssl" parameter requires ngx_http_ssl_module:您需要重新编译Nginx并在编译安装的时候加上--with-http_ssl_module配置。在解压nginx.tar.gz文件后,进入nginx目录,执行:./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

  • 报错"/cert/3970497_demo.aliyundoc.com.pem":BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/cert/3970497_demo.aliyundoc.com.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file):您需要去掉证书相对路径最前面的/。例如,您需要去掉/cert/cert-file-name.pem最前面的/,使用正确的相对路径cert/cert-file-name.pem

六、Nginx常见问题

  1. nginx: Command not found解决方法

第一步:

查找名为nginx的路径

sudo find / -name nginx

得到以下结果

然后复制上级目录为/sbin的路径,使用建立软连接的代码

ln -s /usr/local/lighthouse/softwares/nginx/sbin/nginx /usr/bin

再查看一次版本号

nginx -v

问题解决了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值