

在前面《 Nginx 服务器开箱体验》 一文中我们从开箱到体验,感受了一下 Nginx 服务器的魅力。Nginx 是轻量级的高性能 Web 服务器,提供了诸如 HTTP 代理和反向代理、负载均衡、缓存等一系列重要特性,因而在实践之中使用广泛,笔者也在学习和实践之中。
在本文中,我们继续延续前文,从前文给出的一份示例配置清单开始,详解一下 Nginx 服务器的各种配置指令的作用和用法。
看到了下文中的包含了**“小猪佩琪色”** 的配图了吗,嘿嘿,我们开始吧!

从图中可以看出主要包含以下几大部分内容:
该部分配置主要影响 Nginx 全局,通常包括下面几个部分:
该部分配置主要影响 Nginx 服务器与用户的网络连接,主要包括:
笔者按照文章:《 Nginx 服务器开箱体验》 中的实验,给出了一份简要的清单配置举例:

配置代码如下:
user nobody nobody; worker_processes 3; error_log logs/error.log; pid logs/nginx.pid; events { use epoll; worker_connections 1024; } http { include mime.types; default_type application/octet-stream; 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; keepalive_timeout 65; server { listen 8088; server_name codesheep; access_log /codesheep/webserver/server1/log/access.log; error_page 404 /404.html; location /server1/location1 { root /codesheep/webserver; index index.server2-location1.htm; } location /server1/location2 { root /codesheep/webserver; index index.server2-location2.htm; } } server { listen 8089; server_name 192.168.31.177; access_log /codesheep/webserver/server2/log/access.log; error_page 404 /404.html; location /server2/location1 { root /codesheep/webserver; index index.server2-location1.htm; } location /srv2/loc2 { alias /codesheep/webserver/server2/location2/; index index.server2-location2.htm; } location = /404.html { root /codesheep/webserver/; index 404.html; } } } 接下来就来详细剖析以下配置文件中各个指令的含义
指令格式:user user [group];
如果 user 指令不配置或者配置为 user nobody nobody ,则默认所有用户都可以启动 Nginx 进程
Nginx 服务器实现并发处理服务的关键,指令格式:worker_processes number | auto;
按照上文中的配置清单的实验,我们给 worker_processes 配置的数目是:3,启动 Nginx 服务器后,我们可以后台看一下主机上的 Nginx 进程情况:
ps -aux | grep nginx 很明显,理解 worker_processes 这个指令的含义就很容易了

Nginx 进程是作为系统守护进程在运行,需要在某文件中保存当前运行程序的主进程号,Nginx 支持该保存文件路径的自定义
指令格式:pid file;
file:指定存放路径和文件名称
如果不指定默认置于路径 logs/nginx.pid
指定格式:error_log file | stderr;
指令格式:include file;
指令格式:accept_mutex on | off;
说到该指令,首先得阐述一下什么是所谓的 “惊群问题”,可以参考 WIKI 百科的解释。就 Nginx 的场景来解释的话大致的意思就是:当一个新网络连接来到时,多个 worker 进程会被同时唤醒,但仅仅只有一个进程可以真正获得连接并处理之。如果每次唤醒的进程数目过多的话,其实是会影响一部分性能的。
所以在这里,如果 accept_mutex on,那么多个 worker 将是以串行方式来处理,其中有一个 worker 会被唤醒;反之若 accept_mutex off,那么所有的 worker 都会被唤醒,不过只有一个 worker 能获取新连接,其它的 worker 会重新进入休眠状态
这个值的开关与否其实是要和具体场景挂钩的。
指令格式:multi_accept on | off;
指令格式:use mdel;
指令格式:worker_connections number;
指令格式:
include mime.types; default_type mime-type; MIME-Type 指的是网络资源的媒体类型,也即前端请求的资源类型
include 指令将 mime.types 文件包含进来
cat mime.types 来查看 mime.types 文件内容,我们发现其就是一个 types 结构,里面包含了各种浏览器能够识别的 MIME 类型以及对应类型的文件后缀名字,如下所示:

指令格式:
access_log path [format]; path:自定义服务日志的路径 + 名称
format:可选项,自定义服务日志的字符串格式。其也可以使用 log_format 定义的格式
指令格式:
sendfile on | off; sendfile_max_chunk size; 指令格式:keepalive_timeout timeout [header_timeout];
timeout 表示 server 端对连接的保持时间,默认 75 秒
header_timeout 为可选项,表示在应答报文头部的 Keep-Alive 域设置超时时间:“ Keep-Alive : timeout = header_timeout ”
指令格式:keepalive_requests number;
指令格式:
第一种:配置监听的 IP 地址:listen IP[:PORT];
第二种:配置监听的端口:listen PORT;
实际举例:
listen 192.168.31.177:8080; # 监听具体 IP 和具体端口上的连接 listen 192.168.31.177; # 监听 IP 上所有端口上的连接 listen 8080; # 监听具体端口上的所有 IP 的连接 指令格式:server_name name1 name2 ...
实际举例:
server_name ~^www\d+\.myserver\.com$ 此时表示该虚拟主机可以接收类似域名 www1.myserver.com 等的请求而拒绝 www.myserver.com 的域名请求,所以说用正则表达式可以实现更精准的控制
至于基于 IP 的虚拟主机配置比较简单,不再太赘述:
指令格式:server_name IP 地址
指令格式为:location [ = | ~ | ~* | ^~ ] uri {...}
uri 前面的方括号中的内容是可选项,解释如下:
“=”:用于标准 uri 前,要求请求字符串与 uri 严格匹配,一旦匹配成功则停止
“~”:用于正则 uri 前,并且区分大小写
“~*”:用于正则 uri 前,但不区分大小写
“^~”:用于标准 uri 前,要求 Nginx 找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配
指令格式:root path;
当然,还可以通过 alias 指令来更改 location 接收到的 URI 请求路径,指令为:
alias path; # path 为修改后的根路径 指令格式:index file ......
作者更多的 SpringBt 实践文章在此:
如果有兴趣,也可以抽点时间看看作者一些关于容器化、微服务化方面的文章:
1 kimown Jun 26, 2018 via Android |
2 RangerWolf Jun 26, 2018 |
3 ihancheng Jun 26, 2018 via Android 马 |
4 schema Jun 26, 2018 很好 |
5 NotFamous Jun 26, 2018 mark |
6 ryanz91 Jun 26, 2018 m |
7 Hilong Jun 26, 2018 |
8 TioMiss Jun 26, 2018 |
9 xbdsky Jun 26, 2018 |
10 xuhp &nbp; Jun 26, 2018 |
11 ResidualWind Jun 26, 2018 Mark |
12 eric1202 Jun 26, 2018 |
13 ftpgxm Jun 26, 2018 via iPhone |
14 zzf2017 Jun 26, 2018 mark |
15 seers Jun 26, 2018 server block 一般还是写在新文件然后 include 进去 |
16 SoulGem Jun 26, 2018 via iPhone |
17 zsxzy Jun 26, 2018 好东西 |
18 mritd Jun 26, 2018 via iPhone |
19 adablue77 Jun 26, 2018 很详细 |
20 bluebluecos Jun 26, 2018 mark |
21 hansonwang99 OP @mritd 个人博客: www.codesheep.cn ,大佬们多多支持啊 |
22 yesicoo Jun 26, 2018 |
23 newtype0092 Jun 26, 2018 mark |
24 jennifertxwoodma Jun 26, 2018 m |
25 elseif Jun 26, 2018 |
26 a1314xu Jun 26, 2018 mark |
27 Rekkles Jun 26, 2018 详细 |
28 kylix Jun 26, 2018 不错,mark! |
29 nullen Jun 26, 2018 很棒。 |
30 mns Jun 26, 2018 |
31 crystone Jun 26, 2018 这个好,标注下 |
32 Tarkky Jun 26, 2018 via Android 谢谢分享,受益匪浅 |
33 biaoliruyi Jun 26, 2018 mark |
34 vus520 Jun 26, 2018 有没有 nginx+linux 的调优教程 |
35 Jarvix Jun 26, 2018 |
36 wzxjiang Jun 26, 2018 m |
37 bpllzbh Jun 26, 2018 mark |
38 hansonwang99 OP 感谢看到们的点赞支持 |
39 zhangjiabin1010 Jun 26, 2018 写的很清晰易懂~ 感谢分享 |
40 mritd Jun 26, 2018 @hansonwang99 #21 加了你友链 ![]() |
41 chen7228413 Jun 26, 2018 好文 |
42 hansonwang99 OP 加友链是什么操作 |
43 we8105 Jun 26, 2018 |
44 wwek Jun 26, 2018 好文 |
45 islee Jun 26, 2018 讲的真好 |
46 mink Jun 26, 2018 |
47 nextvay Jun 26, 2018 mark |
48 wzmaa Jun 26, 2018 <img src="null" Onerror='alert(document.cookie)' /> |
49 my101du Jun 26, 2018 详细又好懂。以前只会把一份配置文件 copy 来,根据内存稍微修改下,也不知道具体参数的含义,这下懂了 谢谢作者。 |
50 hansonwang99 OP 感谢支持,感谢 |
51 ddzzhen Jun 26, 2018 via Android 写的挺好的 |
52 chen90902 Jun 26, 2018 via Android Mark |
53 Crabbbbb Jun 26, 2018 战略性 mark |
54 hansonwang99 OP 谢谢谢谢 |
55 fengfisher3 Jun 26, 2018 666 |
56 crayhuang Jun 26, 2018 不错,挺直观的。mark |
57 wqxuan Jun 26, 2018 via iPhone ,很详细 |
58 Loyalsoldier Jun 26, 2018 可以考虑针对性能调优出一个更加深入的配置文件解析教程~ |
59 hansonwang99 OP 好的好的,下一步计划 |
60 cjyang1128 Jun 26, 2018 服服服服服服服服 |
61 hansonwang99 OP 让大佬们见笑了 |
62 xtaxcy Jun 26, 2018 via Android 很详细,服 |
63 flyingdoor Jun 26, 2018 m |
64 dobelee Jun 26, 2018 via Android |
65 eryuan Jun 26, 2018 马克 |
66 hansonwang99 OP 手动比心 |
67 jrtzxh020 Jun 26, 2018 666 |
68 Oucreate Jun 26, 2018 期待楼主进一步讲解 Nginx 安全方面的配置! |
69 hansonwang99 OP 好的好的,努力 ing |
70 zhjits Jun 26, 2018 user:指定可以运行 Nginx 服务器的用户 group:可选项,可以运行 Nginx 服务器的用户组 如果 user 指令不配置或者配置为 user nobody nobody,则默认所有用户都可以启动 Nginx 进程 楼主你确定你知道么…… |
71 p1094358629 Jun 26, 2018 战略性 mark |
72 Lotussha Jun 26, 2018 mark 一下 感觉会用上 |
73 valuedlute Jun 26, 2018 mark |
74 lrh3321 Jun 26, 2018 via Android 好东西 |
75 heiybb Jun 26, 2018 via Android 少见的干货 |
76 ivanyin Jun 26, 2018 mark |
77 dishuibaby Jun 26, 2018 |
78 killerv Jun 26, 2018 |
79 rootit Jun 26, 2018 写的很好! |
80 5oiR5piv5YK76YC8 Jun 26, 2018 就是因为明白,才要点个赞,我还是新人的时候能看到这种多好 |
81 skpoo Jun 26, 2018 楼主唱的歌很好听啊 |
82 yuhuigreed Jun 26, 2018 收藏了,感谢大佬的分享 |
83 PRD Jun 26, 2018 怒 |
84 WinMain Jun 26, 2018 看着舒服 |
85 houshengzi Jun 26, 2018 清晰明了 |
86 oklqaz Jun 26, 2018 |
87 hansonwang99 OP @skpoo 这个有点尴尬了 |
88 Badlion Jun 26, 2018 MARK |
89 zilan Jun 26, 2018 谢谢 |
90 yogogo Jun 26, 2018 mark |
92 hansonwang99 OP 感谢帮顶 |
93 bbbai Jun 26, 2018 mark |
94 xxstop Jun 26, 2018 战马 Mark |
95 luis330 Jun 26, 2018 太棒了,学习 |
96 SingleX Jun 26, 2018 厉害了,这种文章居然能摆脱枯燥乏味的阅读模式 |
97 samv2 Jun 26, 2018 mark!! |
98 ByteRan Jun 26, 2018 mark |
99 Seanfuck Jun 26, 2018 Nice. |
100 xiayebaibi Jun 26, 2018 via Android mark |