一、概述
本指南对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常见问题
nginx: Command not found解决方法
第一步:
查找名为nginx的路径
sudo find / -name nginx
得到以下结果
然后复制上级目录为/sbin的路径,使用建立软连接的代码
ln -s /usr/local/lighthouse/softwares/nginx/sbin/nginx /usr/bin
再查看一次版本号
nginx -v
问题解决了!