ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Nginx配置组成与性能调优

2026/9/10 12:37:33 拓冰建站 浏览量
Nginx配置组成与性能调优

目录

一、Nginx配置介绍

1. 模块组成

2. 图示 

3. 相关框架 

二. 配置调优

1. 全局配置

1.1 关闭版本和修改版本

1.2 修改启动的进程数

1.3 cpu与work进程绑定

1.4 pid路径

1.5 nginx进程的优先级(work进程的优先级)

1.6 调试work进程打开的文件的个数

1.7 服务是否已后台方式运行

1.8 只有master进程没有worker进程

2. event事件(io模型调优)

3. http设置

3.1 mime

3.2 sever下的root

3.3 server块构建虚拟主机

3.4 alias别名

3.5 location匹配

3.5.1 概述

3.5.2 语法规则

3.5.3 匹配优先级

3.6 access模块

3.7 验证模块

3.8 自定义错误页面

3.9 自定义错误日志

3.10 检测文件是否存在

3.11 长连接

3.12 作为下载服务器配置

3.13 其他设置

三、高级配置 

1. 网页的状态页 

2. 第三方模块

3. 变量

3.1 内置变量

3.2 自定义变量


一、Nginx配置介绍

1. 模块组成

nginx配置的基本结构由核心模块 、标准HTTP模块 、可选HTTP模块 、邮件服务模块、Stream服务模块和第三方模块 组成,允许用户定义全局性的设置、针对HTTP协议的设置,以及特定服务器和URL路径的定制化设置。yum安装通常情况下,Nginx的主配置文件位于/etc/nginx/nginx.conf;子配置文件: include conf.d/*.conf;日志通常位于/var/log/nginx/目录下,包含access.log(访问日志)和error.log(错误日志)等。

  • 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
  • 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置等
  • 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
  • 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
  • Stream服务模块: 实现反向代理功能,包括TCP协议代理
  • 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等

2. 图示 

3. 相关框架 

全局配置
events{  控制事件驱动      }
http  {  web网页配置有关   server  { location  }   }main block:主配置段,即全局配置段,对http,mail都有效
#事件驱动相关的配置   同步
event {...
}   
#http/https 协议相关配置段
http {...
}          
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {...
}    
#stream 服务器相关配置段
stream {负载均衡...
}

二. 配置调优

1. 全局配置

1.1 关闭版本和修改版本

关闭版本:

① 修改nginx配置文件 

[root@localhost ~]# vim /apps/nginx/conf/nginx.conf
#这里是编译安装指定的目录,yum安装配置文件默认在/etc/nginx/nginx.conf
http {server_tokens off;
#修改配置文件放在http语句中
[root@localhost ~]# nginx -t                #检测语法是否有误
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx -s reload         #重新加载配置文件

② 客户机访问

修改版本: 修改版本名和版本号需要重新编译安装

① 修改源代码

[root@localhost core]# vim /opt/nginx-1.18.0/src/core/nginx.h
13 #define NGINX_VERSION      "版本号"
14 #define NGINX_VER          "软件名/" NGINX_VERSION
#src源代码目录、core核心代码目录[root@localhost core]# vim /opt/nginx-1.18.0/src/http/ngx_http_header_filter_module.c
49 static u_char ngx_http_server_string[] = "Server: fql" CRLF;
#修改头部信息

② 编译安装 

如果服务开启需要先将服务关闭再编译
[root@localhost nginx-1.18.0]# ./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
[root@localhost nginx-1.18.0]#make && make install
[root@localhost nginx-1.18.0]# systemctl stop firewalld.service 
[root@localhost nginx-1.18.0]# setenforce 0
[root@localhost nginx-1.18.0]# /apps/nginx/sbin/nginx
#启动nginx

 ③ 客户机访问

 server_tokens on(默认)软件名/版本号
 server_tokens offfql

1.2 修改启动的进程数

① 修改配置文件

[root@localhost ~]# pstree -p | grep nginx|-nginx(1717)---nginx(1718)
[root@localhost ~]# ps aux | grep -v grep | grep nginx
root       1717  0.0  0.0  46204  1164 ?        Ss   16:06   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx      1718  0.0  0.1  48736  1996 ?        S    16:06   0:00 nginx: worker process
#查看现有进程数
[root@localhost ~]# vim /apps/nginx/conf/nginx.conf
worker_processes  1;   
#允许的启动工作进程数数量,和真实的cpu数量有关,将数值改为auto
worker_processes  auto;

② 重新加载配置文件,再次查看进程数

[root@localhost ~]# lscpu | grep "CPU(s):"      #查看cpu核心数
CPU(s):                2                       
[root@localhost ~]# nginx -s reload             #重新加载配置文件
[root@localhost ~]# pstree -p | grep nginx|-nginx(1717)-+-nginx(1745)|             `-nginx(1746)
[root@localhost ~]# ps aux | grep -v grep | grep nginx
root       1717  0.0  0.1  46344  2020 ?        Ss   16:06   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx      1745  0.0  0.1  48856  2120 ?        S    16:07   0:00 nginx: worker process
nginx      1746  0.0  0.1  48856  2120 ?        S    16:07   0:00 nginx: worker process
#此时查看worker进程数已变成两个

1.3 cpu与work进程绑定

将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。由于早期开发原因,理论上最大性能为8核心。

CPU序号:
CPU MASK: 00000001:0号CPU         #这里的8个0代表8颗cpu
                     00000010:1号CPU
                     ................
                     10000000:7号CPU 

① 查看指定状态,修改配置文件

[root@localhost ~]# ps axo pid,cmd,psr,ni|grep nginx1717 nginx: master process /apps   0   01745 nginx: worker process         1   01746 nginx: worker process         0   01761 grep --color=auto nginx       0   0
[root@localhost ~]# vim /apps/nginx/conf/nginx.conf
4 worker_cpu_affinity 00000001 00000010;
#序号绑定cpu亲缘性,即把第一个进程放在0号cpu,把第一个进程放在1号cpu

 ② 重新加载配置,再次查看进程状态

[root@localhost ~]# nginx -s reload
[root@localhost ~]# ps axo pid,cmd,psr | grep nginx1717 nginx: master process /apps   01774 nginx: worker process         01775 nginx: worker process         11791 grep --color=auto nginx       1
#此时可以看到两个worker进程分别对应一颗核心

③ 验证进程对应cpu核心是否会改变(不会改变)

1.4 pid路径

 进程号文件位置可以自定义,一般情况下不做修改。

1.5 nginx进程的优先级(work进程的优先级)

 默认优先级为0,将nginx的work进程的优先级调高可以使用nice设置,从而提高效率。nice的优先级是 -20到19。

① 查看进程现有优先级

[root@localhost ~]# ps axo pid,cmd,psr,ni|grep nginx|sort -n  #以数字排序1717 nginx: master process /apps   0   01774 nginx: worker process         0   01775 nginx: worker process         1   01946 grep --color=auto nginx       1   0
#查看默认优先级,默认优先级为0

② 修改配置文件

[root@localhost ~]# vim /apps/nginx/conf/nginx.conf
5 worker_priority -20;
[root@localhost ~]# nginx -s reload

③ 再次查看进程优先级

[root@localhost ~]# ps axo pid,cmd,psr,ni|grep nginx|sort -n1717 nginx: master process /apps   0   01966 nginx: worker process         0 -201967 nginx: worker process         1 -201969 grep --color=auto nginx       1   0

1.6 调试work进程打开的文件的个数

所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制,最好与ulimit -n 或者limits.conf的值保持一致。

① 文件个数相关介绍

[root@localhost ~]# pstree -p | grep nginx|-nginx(1717)-+-nginx(1966)|             `-nginx(1967)
[root@localhost ~]# cd /proc/1966/fd
[root@localhost fd]# ls
0  1  10  11  2  3  4  5  6  7
#这里的fd文件夹代表进程同一时间打开文件(链接)数,需要将改值尽量调大

 ② 修改配置文件

[root@localhost ~]# vim /apps/nginx/conf/nginx.conf
6 worker_rlimit_nofile 65536;
#所有的进程最多可以打开的文件数量为65536,即master进程下所有的worker进程最大可以打开文件数为65536
#数值根据机器性能而定
[root@localhost ~]# nginx -s reload

③ 系统默认单个进程最多可以打开1024文件,修改内核pam认证文件

[root@localhost ~]# ulimit -a | grep open
open files                      (-n) 1024[root@localhost ~]# vim /etc/security/limits.conf
60 *                -       nofile          65536所有用户       软硬均可
#需要重启才可以生效

1.7 服务是否已后台方式运行

一般服务都是后台运行,前台容器中会用到。

daemon off;
#加入此选项

1.8 只有master进程没有worker进程

实际生产中使用较少,测试机器一般性能较差,worker进程过多影响性能。

master_process off|on;
#是否开启Nginx的master-worker工作模式,仅用于开发调试场景,默认为on

2. event事件(io模型调优)

events {
   worker_connections  65536;  #设置单个工作进程的最大并发连接数
   use epoll;
   #使用epoll事件驱动,Nginx支持众多的事件驱动,比如:select、poll、epoll,只能设置在events模块中设置。
   accept_mutex on; 
   #on为同一时刻一个请求轮流由work进程处理,而防止被同时唤醒所有worker,避免多个睡眠进程被唤醒的设置,默认为off,新请求会唤醒所有worker进程,此过程也称为"惊群",因此nginx刚安装完以后要进行适当的优化。建议设置为on
   multi_accept on; 
   #ON时Nginx服务器的每个工作进程可以同时接受多个新的网络连接,此指令默认为off,即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个。建议设置为on
}

3. http设置

 http协议配置说明:

http {include  mime.types; 
#导入支持的文件类型,是相对于/apps/nginx/conf的目录default_type application/octet-stream; 
#除mime.types中文件类型外,设置其它文件默认类型,访问其它类型时会提示下载不匹配的类型文件
#日志配置部分#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 logs/access.log main;
#自定义优化参数sendfile       on; #tcp_nopush     on; #在开启了sendfile的情况下,合并请求后统一发送给客户端。#tcp_nodelay   off; #在开启了keepalived模式下的连接是否启用TCP_NODELAY选项,当为off时,延迟0.2s发送,默认On时,不延迟发送,立即发送用户响应报文。#keepalive_timeout 0;keepalive_timeout  65 65; #设置会话保持时间,第二个值为响应首部:keepAlived:timeout=65,可以和第一个值不同#gzip on; #开启文件压缩server {listen       80; #设置监听地址和端口server_name localhost; #设置server name,可以以空格隔开写多个并支持正则表达式,

3.1 mime

此项为支持的文件格式,如果不支持的格式会自动帮你下载,如果支持就会显示在网页上。

① 查看支持的文件格式

[root@localhost ~]# cat /apps/nginx/conf/mime.types

② 切换到nginx的web目录,新建测试文件

[root@localhost ~]# cd /apps/nginx/html
[root@localhost html]# touch fql.fql 123.html
[root@localhost html]# echo 123 > 123.html

③ 网页访问

3.2 sever下的root

 root指定了主页文件的位置,指定文件的路径,操作详见虚拟主机案例。

3.3 server块构建虚拟主机

Nginx的虚拟主机功能允许一台服务器托管多个域名,并根据不同的域名请求来提供不同的网站内容,从而提高了服务器资源的利用率。这种功能通常被称为"server block"或"server section"。

① 修改主配置文件

[root@localhost ~]# vim /apps/nginx/conf/nginx.conf
22     include       /apps/nginx/conf.d/*.conf;    #如果在该路径下以conf结尾将被读取
[root@localhost ~]# nginx -t                       #检查语法是否有误
[root@localhost ~]# nginx -s reload                #重新加载配置文件

② 新建编辑子配置文件

[root@localhost ~]# mkdir -p /apps/nginx/conf.d/
[root@localhost ~]# cd /apps/nginx/conf.d/
[root@localhost conf.d]# vim pc.conf 
server {                                         #模块listen 80;                               #监听端口sercer_name www.pc.com;                  #域名root /data/nginx/html/pc/;               #访问目录
}[root@localhost conf.d]# vim mobile.conf
server {listen 80;server_name www.mobile.com;root /data/nginx/html/mobile/;
}[root@localhost conf.d]# mkdir /data/nginx/html/{pc,mobile} -p
[root@localhost html]# echo pc > /data/nginx/html/pc/index.html
[root@localhost html]# echo mobile > /data/nginx/html/mobile/index.html

③ 配置客户端/etc/hosts 文件,并访问域名

[root@localhost ~]#vim /etc/hosts
192.168.190.102 www.pc.com www.mobile.com
[root@localhost ~]# curl www.pc.com
pc
[root@localhost ~]# curl www.mobile.com
mobile

3.4 alias别名

root为追加,alias为替换。

server {listen 80;server_name www.fql.com;location /nwes {root /data/nginx/html/pc/;#相当于追加,将文件夹news追加到/data/nginx/html/pc/news}location /study{alias /mnt/nginx/sports/;#相当于替换,访问study就是访问/mnt/nginx/sports}
}

3.5 location匹配

3.5.1 概述

Nginx的location指令是用来匹配请求URL的一种方式,可以根据不同的URL路径来指定不同的处理方式。location指令可以用来匹配请求的URI(Uniform Resource Identifier),并根据匹配的结果来决定如何处理该请求。

3.5.2 语法规则

location [ = | ~ | ~* | ^~ ] uri { ... }

  • = :用于标准url前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求
  • ^~:用于标准url前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对URI的最左边部分做匹配检查,不区分字符大小写
  • ~:用于标准url前,表示包含正则表达式,并且区分大小写
  • ~*:用于标准url前,表示包含正则表达式,并且不区分大写
  • 不带符号:匹配起始于此uri的所有的uri
  • \:用于标准url前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号
3.5.3 匹配优先级

从高到低:=, ^~, ~/~*,不带符号(起始于根)

注意:alias影响优先级;/和=/,谁在前面谁优先。

服务端:
[root@localhost ~]# cd /apps/nginx/conf.d/
[root@localhost conf.d]# vim fql.conf
server {listen 80;server_name www.fql.com;root /data/html/;            #全局配置,兜底location / {                 #追踪url,根据用户的root /opt/;                  #局部配置}
}
[root@localhost ~]# echo opt > /opt/index.html
[root@localhost ~]# nginx -s reload客户端:
[root@localhost opt]# curl www.fql.com
opt

注意:局部与全局:局部优先级高于全局优先级;当局部没有指明路径,全局兜底。

不区分大小写:

① 新建子配置文件

#正则表达式匹配:
[root@localhost conf.d]# vim fql.conf
server {listen 80;server_name www.fql.com;root /data/html/;location ~* /A.?\.jpg/ {       #不区分大小写root /opt/;}
}

② 在/opt/images文件夹存放A.jpg图片

[root@localhost opt]# ls
A.jpg

③ 网页访问

④ 这里需要注意的,虽然程序不区分大小写,但是Linux(当前xfs)系统内核区分。 

⑤ 解决方法:准备两份

[root@localhost opt]# cp A.jpg a.jpg

只要是图片就去images中找:

server{
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js|css)$ {root /data/nginx/images/;}
}

3.6 access模块

Nginx的access模块用于控制对服务器资源的访问权限,允许或拒绝特定的请求。这个模块通常用于实现访问控制、安全策略和防盗链等功能。

① 新建子配置

[root@localhost conf.d]# vim test.conf
server {listen 80;server_name www.nginx.com;root /data/html/;location /test {root /data/;deny 192.168.190.1;}
}
[root@localhost conf.d]# nginx -s reload

② 建立文件夹,添加web信息

[root@localhost ~]# mkdir /data/test -p
[root@localhost ~]# echo test/ > /data/test/index.html

③ 192.168.190.1网页访问

④ 其他机器访问

[root@localhost opt]# curl 192.168.190.102/test/
test/

3.7 验证模块

Nginx的验证模块用于对请求进行身份验证,通常用于实现基于用户名和密码的访问控制。Nginx支持多种验证方式,包括基本身份验证、摘要身份验证、LDAP身份验证等。

  • 基本身份验证:通过HTTP协议的Authorization头部来传递用户名和密码信息,通过auth_basic指令启用基本身份验证
  • 摘要身份验证:摘要身份验证是一种更加安全的身份验证方式,它使用MD5哈希算法对用户名、密码、随机数和请求URI等信息进行加密,从而避免了明文传输密码的问题。在Nginx中,可以通过auth_digest指令启用摘要身份验证
  • LDAP身份验证:LDAP身份验证是一种基于LDAP协议的身份验证方式,它可以将用户信息存储在LDAP服务器中,从而实现集中管理用户信息的目的。在Nginx中,可以通过auth_ldap指令启用LDAP身份验证

① 生成用户信息文件

[root@localhost mnt]# yum install -y httpd
#htpasswd命令来自于httpd-tools包
[root@localhost mnt]# htpasswd -c /mnt/.nginxuser zs   
#交互式生成用户zs密码,-c代表新建用户名和密码对应的文件,第二次新建则不需要选项c
New password: 
Re-type new password: 
Adding password for user zs
[root@localhost mnt]# ls -a
.  ..  .nginxuser
[root@localhost mnt]# htpasswd -b /mnt/.nginxuser lisi 123
#-b将密码跟在用户名后
Adding password for user lisi
[root@localhost mnt]# cat .nginxuser 
zs:$apr1$WrCXuwbv$QXXZFn0idSGsLygAVlyYg1
lisi:$apr1$XJp5u.fa$2y.5bqkN3tv5Y2k8oFzyl.

 ② 配置子配置文件

[root@localhost ~]# cd /apps/nginx/conf.d/
[root@localhost conf.d]# vim pc.conf
server {listen 80;server_name www.pc.com;root /data/nginx/html/pc/;location /admin {auth_basic "welcome";                   #提示信息auth_basic_user_file /mnt/.nginxuser;   #密码文件存放位置}
}
[root@localhost conf.d]# nginx -t
[root@localhost conf.d]# nginx -s reload
[root@localhost ~]# cd /data/nginx/html/pc/
[root@localhost pc]# mkdir admin
[root@localhost pc]# echo admin > admin/index.html

③ 验证

④ 另外火狐浏览器支持查看auth_basic指令后提示信息

3.8 自定义错误页面

我们可以改变默认的错误页面,同时也可以用指定的响应状态码进行响应,可用位置:http, server, location,if in location。

格式:

error_page code ... [=[response]] uri;
页面错误代码  
error_page           固定写法
code                     响应码(404 403等)
=                          可以将响应码转换
uri                        访问连接

操作:

① 修改配置文件

[root@localhost conf.d]# vim pc.conf
server {listen 80;server_name www.pc.com;root /data/nginx/html/pc/;error_page 404 /index.html;    
#当出现404错误,就去/data/nginx/html/pc/这个文件夹找index.html
}

② 访问不存在页面 

③ 跳转自定义错误页面

[root@localhost conf.d]# vim pc.conf
server {listen 80;server_name www.pc.com;root /data/nginx/html/pc/;error_page 404 /40x.html;location = /40x.html {root /mnt/error/;}
}
[root@localhost conf.d]# nginx -t
[root@localhost conf.d]# nginx -s reload
[root@localhost ~]# cd /mnt/error/
[root@localhost error]# echo "please call admin number 123456" > 40x.html

④ 自定义状态码,避免出现404被劫持

[root@localhost conf.d]# vim pc.conf
……
error_page 404 =302/40x.html;
……
#配置基本如上,修改error_page行[root@localhost conf.d]# curl 192.168.190.102/x -I
HTTP/1.1 302 Moved Temporarily                   #正常错误页面应该显示404状态码
Server: nginx/1.18.0
Date: Thu, 22 Feb 2024 08:11:27 GMT
Content-Type: text/html
Content-Length: 32
Connection: keep-alive
ETag: "65d70021-20"

3.9 自定义错误日志

① 修改配置文件

[root@localhost conf.d]# vim pc.conf
server {listen 80;server_name www.pc.com;root /data/nginx/html/pc;error_log /apps/nginx/logs/new_error.log;
}
[root@localhost conf.d]# nginx -t
[root@localhost conf.d]# nginx -s reload

② 访问不存在页面,产生错误日志

[root@localhost ~]# curl 192.168.190.102/xxx

③ 查看自定义路径错误日志

[root@localhost ~]# cd /apps/nginx/logs/
[root@localhost logs]# ls
access.log  error.log  new_error.log  nginx.pid
[root@localhost logs]# cat new_error.log 
2024/02/22 17:12:34 [error] 44698#0: *24 open() "/data/nginx/html/pc/xxx" failed (2: No such file or directory), client: 192.168.190.100, server: www.pc.com, request: "GET /xxx HTTP/1.1", host: "192.168.190.102"

3.10 检测文件是否存在

try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误。

语法格式:

Syntax: try_files file ... uri;
try_files file ... =code;
Default: —
Context: server, location

示例:

① 修改配置文件

[root@localhost conf.d]# vim pc.conf
server {listen 80;server_name www.pc.com;root /data/nginx/html/pc/;location / {root /data/;try_files $uri $uri.html $uri/index.html /about/default.html;}
}
#访问路径下的abc文件,按照设置,先会去找abc,没有abc会在后面加上abc.html,再没有会在路径后补上abc/index.html,还是没有最后没有会有一个兜底的

② 访问页面

[root@localhost ~]# curl 192.168.190.102/abc
about

③ 新增abc.html文件 

[root@localhost data]# echo abc > abc.html

④ 再次访问页面

[root@localhost ~]# curl 192.168.190.102/abc
abc

3.11 长连接

相关设置:

keepalive_timeout  65;
#设定保持连接超时时长,0表示禁止长连接,默认为60-75s,通常配置在http字段作为站点全局配置
keepalive_requests number;  
#在一次长连接上所允许请求的资源的最大数量,默认为100次,建议适当调大,比如:500

示例:

keepalive_requests 3;
#最大下载三个资源就会断开
keepalive_timeout 60 65;   #只能有一个空格 
#开启长连接后,返回客户端的会话保持时间为60s,单次长连接累计请求达到指定次数请求或65秒就会被断开,后面的60为发送给客户端应答报文头部中显示的超时时间设置为60s:如不设置客户端将不显示超时时间。
Keep-Alive:timeout=60  #浏览器收到的服务器返回的报文
#如果设置为0表示关闭会话保持功能,将如下显示:
Connection:close  #浏览器收到的服务器返回的报文

 对哪种浏览器禁用长连接:

keepalive_disable none | browser ...;  
#对哪种浏览器禁用长连接,默认是none

3.12 作为下载服务器配置

① 文件配置

[root@localhost conf.d]# vim pc.conf
server {listen 80;server_name www.pc.com;location  /download {autoindex on;                   #自动文件索引功能,默为offroot /mnt/; }
}
[root@localhost conf.d]# nginx -t
[root@localhost conf.d]# nginx -s reload

② 目录添加文件

[root@localhost mnt]# mkdir download
[root@localhost mnt]# cd download/
[root@localhost download]# cp /etc/passwd .
[root@localhost download]# cp /etc/fstab .
[root@localhost download]# ln -s /etc/shadow .
[root@localhost download]# ls
fstab  passwd  shadow

③ 访问页面 

④ 显示单位

[root@localhost conf.d]# vim pc.conf
server {listen 80;server_name www.pc.com;location  /download {autoindex on;autoindex_exact_size off;  #计算文件确切大小(单位bytes),off 显示大概大小(单位K、M),默认onroot /mnt/;}
}
[root@localhost conf.d]# nginx -t
[root@localhost conf.d]# nginx -s reload[root@localhost download]# ls
fstab  nginx-1.18.0.tar.gz  passwd  shadow

⑤ 其他例子: 

location /download {autoindex on;#开启下载服务器autoindex_exact_size on;#开启确切大小不建议开启autoindex_localtime on;#使用当地时间limit_rate 1024k;#所有人限速1024k,默认单位是字节数set $limit_rate 2M;#谁先生效alias /opt/download;}

3.13 其他设置

limit_except method ... { ... },仅用于location
#限制客户端使用除了指定的请求方法之外的其它方法 
method:GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE, OPTIONS, PROPFIND, 
PROPPATCH, LOCK, UNLOCK, PATCH
limit_except GET {allow 192.168.91.101;deny all;
}
#除了GET和HEAD 之外其它方法仅允许192.168.1.0/24网段主机使用

三、高级配置 

1. 网页的状态页 

 基于nginx 模块 ngx_http_stub_status_module 实现,在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module,否则配置完成之后监测会是提示语法错误注意:状态页显示的是整个服务器的状态,而非虚拟主机的状态。

配置操作:

① 修改配置,统计目前网页状态

[root@localhost conf.d]# vim pc.conf
server {listen 80;server_name www.pc.com;root /data/nginx/html/pc/;location /admin {auth_basic "welcome";auth_basic_user_file /mnt/.nginxuser;}location /status {stub_status;}
}

 ② 访问页面

③ 输出信息解析

Active connections: 1
server accepts handled requests
               11         11            20
 上面三个数字分别对应accepts,handled,requests三个值
Reading: 0 Writing: 1 Waiting: 0 

  • Active connections:当前处于活动状态的客户端连接数,包括连接等待空闲连接数=reading+writing+waiting
  • accepts:统计总值,Nginx自启动后已经接受的客户端请求的总数
  • handled:统计总值,Nginx自启动后已经处理完成的客户端请求总数,通常等于accepts,除非有因worker_connections限制等被拒绝的连接
  • requests:统计总值,Nginx自启动后客户端发来的总的请求数
  • Reading:当前状态,正在读取客户端请求报文首部的连接的连接数,数值越大,说明排队现象严重,性能不足
  • Writing:当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明访问量很大
  • Waiting:当前状态,正在等待客户端发出请求的空闲连接数,开启 keep-alive的情况下,这个值等于active – (reading+writing)

④ 为了安全考虑,增加验证模块

[root@localhost conf.d]# vim pc.conf
server {listen 80;server_name www.pc.com;root /data/nginx/html/pc/;location /status {stub_status;auth_basic "welcome";auth_basic_user_file /mnt/.nginxuser;}
}
[root@localhost conf.d]# nginx -t
[root@localhost conf.d]# nginx -s reload

 ⑤ 验证

⑥ 当需要验证如何提取统计总值

[root@localhost pc]# curl http://zs:123@192.168.190.102/status
Active connections: 1 
server accepts handled requests5 5 4 
Reading: 0 Writing: 1 Waiting: 0 
[root@localhost conf.d]# curl http://zs:123@192.168.190.102/status 2>/dev/null | awk '/Reading/{print $2,$4,$6}'
0 1 0

2. 第三方模块

Nginx是一个高性能的HTTP和反向代理服务器,它的功能可以通过第三方模块进行扩展。可以通过源代码编译Nginx时进行包含,也可以通过Nginx的模块管理系统进行安装。

echo模块:

① 修改子配置文件

[root@localhost conf.d]# vim pc.conf
server {listen 80;server_name www.pc.com;root /data/;location /ip {echo "welcome,your ip addr: ";echo $remote_addr;              #代表远端的ip地址}
}

② 依赖nginx编译echo模块

[root@localhost opt]# unzip echo-nginx-module-master.zip
[root@localhost opt]# cd nginx-1.18.0/
[root@localhost nginx-1.18.0]# systemctl stop nginx
[root@localhost nginx-1.18.0]# ./configure --help | grep add--with-http_addition_module        enable ngx_http_addition_module--add-module=PATH                  enable external module
[root@localhost nginx-1.18.0]# ./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --add-module=/opt/echo-nginx-module-master
[root@localhost nginx-1.18.0]# make && make install
[root@localhost nginx-1.18.0]# systemctl start nginx

③ 添加echo模块后检查语法不会报错

[root@localhost nginx-1.18.0]# nginx -t
[root@localhost nginx-1.18.0]# nginx -s reload

④ 访问页面

[root@localhost ~]# curl 192.168.190.102/ip
welcome,your ip addr: 
192.168.190.100

3. 变量

3.1 内置变量

常用内置变量:

$remote_addr; 
#存放了客户端的地址,注意是客户端的公网IP

$args; 
#变量中存放了URL中的参数,例如:http://www.kgc.org/main/index.do?id=20190221&partner=search
#返回结果为: id=20190221&partner=search    存放的就是这个

$document_root; 
#保存了针对当前资源的请求的系统根目录,例如:/apps/nginx/html

注意:

root /opt

location /admin {

root /data;

}

这里如果访问192.168.190.102/admin,他的$document_root;就是/data

这里如果访问192.168.190.102,他的$document_root;就是/opt

$document_uri;
#保存了当前请求中不包含参数的URI,注意是不包含请求的指令,比
如:http://www.kgc.org/main/index.do?id=20190221&partner=search会被定义为/main/index.do 
#返回结果为:/main/index.do

$host; 
#存放了请求的host名称

示例:

① 修改配置文件

[root@localhost conf.d]# vim pc.conf
……
location /main {index index.html;default_type text/html;echo "hello world,main-->";echo $remote_addr;echo $args;echo $arg_user;echo $document_root;echo $document_uri;echo $host;echo $http_user_agent;echo $http_cookie;echo $request_filename;echo $scheme;echo $scheme://$host$document_uri?$args;}
……

② 测试访问

3.2 自定义变量

假如需要自定义变量名称和值,使用指令set $variable value;

语法格式:

Syntax: set $variable value;
Default: —
Context: server, location, if

示例:

① 修改配置文件

 location /test {set $name yun;echo $name;set $my_port $server_port;    #将内置变量定义给自定义变量echo $my_port; }

② 访问

[root@localhost ~]# curl 192.168.190.102/test
yun
80