Nginx 配置
# 03.Nginx 配置
接下来我们简单讲讲 Nginx 如何进行配置。
# 使用配置文件
安装了 Nginx 后,Nginx 的目录结构如下:
# cd /opt/nginx
# ll
总用量 4
drwx------. 2 nobody root 6 3月 26 22:31 client_body_temp
drwxr-xr-x. 2 root root 4096 3月 26 22:21 conf
drwx------. 2 nobody root 6 3月 26 22:31 fastcgi_temp
drwxr-xr-x. 2 root root 40 3月 26 22:21 html
drwxr-xr-x. 2 root root 41 3月 26 22:31 logs
drwx------. 2 nobody root 6 3月 26 22:31 proxy_temp
drwxr-xr-x. 2 root root 19 3月 26 22:21 sbin
drwx------. 2 nobody root 6 3月 26 22:31 scgi_temp
drwx------. 2 nobody root 6 3月 26 22:31 uwsgi_temp
2
3
4
5
6
7
8
9
10
11
12
其中:
- sbin:存放的是可执行文件,也就是我们平时启动 Nginx 的地方
- conf:存放的则是各种配置文件
- logs:存放的是日志文件,例如访问日志,错误日志
我们启动 Nginx 的时候,可以使用 -c
选项指定配置文件:
cd /opt/nginx/sbin
./nginx -c /opt/nginx/conf/nginx.conf
2
注意:如果配置文件所在的目录没有权限访问,则不能正常使用 Nginx。
# 默认配置文件
默认的配置文件是 conf/nginx.conf,其中井号 #
开头的是注释,注释有非常多,这里为了方便,我们去掉注释,此时默认配置文件内容如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
根据上述文件,我们可以很明显的将 nginx.conf 配置文件分为三部分:
- 全局块:配置服务器整体运行的配置指令
- events 块:影响 Nginx 服务器与用户的网络连接
- http 块:分为 http 全局块 和 server 块
# 全局块
全剧块指的是从配置文件开始到 events 块之间的内容,主要是设置一些影响 nginx 服务器整体运行的配置指令,例如:
- 配置运行 Nginx 服务器的用户(组):例如是以 root 用户运行还是非 root 的其他用户运行
- 允许生成的 worker process 数:默认配置里,只配了这个参数,后面会讲什么是 worker 以及该参数的作用
- 进程 PID 存放路径
- 日志存放路径和日志级别(日志级别可选)
- ........
示例:
user nobody;
worker_processes 1;
pid logs/nginx.pid;
# error_log logs/error.log;
error_log logs/error.log info;
2
3
4
5
# events 块
events 块涉及的指令主要影响 Nginx 与用户的网络连接,常用的设置有:
- 是否开启对多 work process 下的网络连接进行序列化
- 是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求
- 每个 wordprocess 可以同时支持的最大连接数等
events {
worker_connections 1024;
}
2
3
上述例子就表示每个 work process 支持的最大连接数为 1024,这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置,后续我们再详细介绍。
# http 块
这算是 Nginx 服务器配置中最频繁的部分。代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。主要分为 http 全局块 和 server 块。示例:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# http 全局块
http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等:
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
2
3
4
5
6
7
8
9
10
11
12
13
# server 块
简单来说,server 块就是处理请求的。一个 server 对应一个服务,可以配置多个 server,例如一个 server 负责处理项目 1 的请求,另一个 server 负责项目 2 的请求,这样一个服务器可以处理多个项目的请求,而不用多台服务器分别处理各个项目的请求,节省服务器硬件成本。
用 Nginx 中一些专业的术语来说的话,每个 server 块就相当于一个虚拟的主机。
每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块:
- 全局 server 块 最常见的配置是本虚拟机主机的监听配置,和本虚拟主机的名称,或 IP 配置。
- location 块 :一个 server 块可以配置多个 location 块。location 块的主要作用是基于 Nginx 收到的请求字符串进行匹配,对特定的请求进行处理,例如地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
示例:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
说明:这个 http 块中包含一个 server 块,这个 server 块监听 80 端口;然后有一个 location 块,路径是一个斜线 /
,也就是当用户访问 /
的时候,要怎么处理。
可以配置度多个 server 块:
location / {
root html;
index index.html index.htm;
}
location /test {
root html;
index index.html index.htm;
}
2
3
4
5
6
7
8
9
这样配置了用户访问 /
和 /test
时,要怎么处理请求,root 指的是静态资源的路径(在这里是 /opt/nginx/html
),index 指的是默认的文件。
这样,用户访问 /
的时候,Nginx 会返回 /opt/nginx/html/index.html
,也就是我们看到的页面:
# cat /opt/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# location 指令
location 的语法如下:
location [ = | ~ | ~* | ^~ ] uri {
}
2
说明:
-
=
:用于不含正则表达式的 URI 前,要求请求字符串与 URI 严格匹配,如果匹配成功,就停止继续向下搜索其他 location 块的 URI,并立即处理该请求。 -
~
:用于表示 uri 包含正则表达式,并且区分大小写。 -
~*
:用于表示 uri 包含正则表达式,并且不区分大小写。 -
^~
:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 URI 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 URI 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~
或者 ~*
标识。
其实,nginx.conf
中的注释中就包含了一个个 Nginx 的配置例子,后续我们会详细介绍。
# 可视化配置 Nginx
由于 Nginx 的配置非常多,因此市面上出现了不少可视化配置 Nginx 的工具和网站。
例如:do.co/nginxconfig (opens new window)
开源地址:https://github.com/digitalocean/nginxconfig.io (opens new window),截止到 2024-9-4,已经有 27k 的 star 了