Ngixn 配置文件详解
# Ngixn 配置文件详解
本文基于 Nginx 1.24.0,介绍其配置文件 nginx.conf
的主要配置参数。
# 核心参数详解
user nginx nginx; # 指定 Nginx 服务运行的用户和用户组
worker_processes 1; # 定义 Nginx 的 worker 进程数,建议等于 CPU 总核心数
# 全局指定 Nginx 错误日志,定义类型,[ debug | info | notice | warn | error | crit ]
# 如果要关闭 error log,需要写成 error_log /dev/null;
# 而不是 error_log off; 否则错误日志会写到一个叫做 off 的文件中
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid; # 指定 Nginx PID 进程号文件
# 一个 Nginx 进程打开的最多文件描述符数目
# 理论值应该是最多打开文件数(系统的值 ulimit -n)与 Nginx 进程数相除
# 但是 Nginx 分配请求并不均匀,所以建议与 ulimit -n 的值保持一致
worker_rlimit_nofile 65535;
# 工作模式与连接数上限
events {
# 参考事件模型
# use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]
# epoll 模型是 Linux 2.6 以上版本内核中的高性能网络 I/O 模型
# 如果跑在 FreeBSD 上面,就用 kqueue 模型
use epoll;
# 单个进程最大连接数(最大连接数=连接数*进程数),默认值为 1024
worker_connections 65535;
}
# 设定 http 服务器
http {
# 文件扩展名与文件类型映射表
# Nginx 会根据 mime.type 定义的对应关系来告诉浏览器如何处理当前返回的文件(打开或下载)
include mime.types;
# 当 Nginx 无法识别当前访问页面内容时(未定义的扩展名),默认触发下载动作
# 浏览器访问到未定义的扩展名的时候,就默认为下载该文件
# 如果将这个设置改成 default_type text/html; 即把所有未设置的扩展名当 HTML 文件打开
default_type application/octet-stream;
charset utf-8; # 默认编码
# 服务器名字的 hash 表大小(看不懂的参数默认即可)
server_names_hash_bucket_size 128;
# 客户端请求头部的缓冲区大小
client_header_buffer_size 32k;
# 客户请求头缓冲大小
# Nginx 默认会用 client_header_buffer_size 这个 buffer 来读取 header 值
# 如果 header 过大,它会使用 large_client_header_buffers 来读取
large_client_header_buffers 4 64k;
# 设定通过 Nginx 上传文件的大小
client_max_body_size 8m;
# 开启高效文件传输模式
# sendfile 指令指定 Nginx 是否调用 sendfile 函数来输出文件
# 对于普通应用设为 on,如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off,以平衡磁盘与网络 I/O 处理速度,降低系统的负载
# 注意:如果图片显示不正常把这个改成 off
sendfile on;
# 开启目录列表访问,适合下载服务器,默认关闭
autoindex on;
# 防止网络阻塞:数据包会先累积到最大后一次性传输,可以最大化利用网络资源,但会有一点点延迟(默认开启)
tcp_nopush on;
# 防止网络阻塞:小的数据包不等待直接传输(与 tcp_nopush 互斥,但两者可同为 on ,Nginx 会平衡这两个功能,默认开启)
tcp_nodelay on;
keepalive_timeout 65; # 长连接超时时间,单位是秒
# FastCGI 相关参数是为了改善网站的性能:减少资源占用,提高访问速度。
# 参考1:https://blog.csdn.net/luozhonghua2014/article/details/37737823
# 参考2:https://blog.51cto.com/blief/1739655
fastcgi_connect_timeout 300; # 连接到后端 fastcgi 超时时间(秒)
fastcgi_send_timeout 300; # 指 Nginx 进程向 fastcgi 进程发送 request 的整个过程的超时时间(秒)
fastcgi_read_timeout 300; # 指 fastcgi 进程向 Nginx 进程发送 response 的整个过程的超时时间(秒)
fastcgi_buffer_size 64k; # 读取 fastcgi 应答第一部分需要多大缓冲区
fastcgi_buffers 4 64k; # 指定本地需要多少和多大的缓冲区来缓冲 fastcgi 应答请求
fastcgi_busy_buffers_size 128k; # 默认值是 fastcgi_buffer 的 2 倍
fastcgi_temp_file_write_size 128k; # 写入缓存文件使用多大的数据块,默认值是 fastcgi_buffer 的 2 倍
# gzip 模块设置
gzip on; # 开启 gzip 压缩输出
gzip_min_length 1k; # 最小压缩文件大小
gzip_buffers 4 16k; # 压缩缓冲区
gzip_http_version 1.0; # 压缩版本(默认 1.1,前端如果是 squid2.5 请使用 1.0)
gzip_comp_level 2; # 压缩等级
# 压缩类型,默认就已经包含 text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个 warn
# 图片压缩:建议不对 gif、jpge 等图片进行压缩,因为其压缩比例极低,反而耗费 CPU,但 bmp 可以压缩,因为 bmp 压缩比例较大
# 字体压缩:只需要为 ttf、otf 和 svg 字体启用 gzip,对其他字体格式进行 gzip 压缩时效果不明显
# 参考:https://blog.csdn.net/liupeifeng3514/article/details/79018334
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on; # 是否在 http header 中添加 Vary: Accept-Encoding,建议开启
# limit_zone crawler $binary_remote_addr 10m; # 开启限制 IP 连接数的时候需要使用
# upstream 的负载均衡,weight 是权重,可以根据机器配置定义权重
# weigth 参数表示权值,权值越高被分配到的几率越大
# Nginx 的 upstream 目前支持 4 种方式的分配,这里演示一种,后面章节会分别演示
upstream www.baidu.com {
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}
# 全局指定 Nginx 访问日志的格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 全局定义 Nginx 访问日志的位置
access_log logs/access.log main;
# 一般上面两个不配置,只设置 access_log off; 然后在需要的 server 下配置日志
# 这么做可以避免日志产生过大(如果 http 和 server 都不配置,默认会写入 logs/access.log)
access_log off;
# 虚拟主机的配置,一个 server 配置段一般对应一个域名
# 在实际生产中一般会将这部分拆出来形成子配置文件,后面的章节会讲
server {
listen 80; # 指定监听端口
server_name www.baidu.com; # 指定当前网站的访问域名
location / {
root html; # 指定代码位置
index index.html index.htm; # 指定首页文件
}
# 定义 404 错误页面,如果是 404 错误,则把站点根目录下的 404.html 返回给用户
error_page 404 /404.html;
# 定义 50x 错误页面,可以配合 location 使用,用 location 调用实际的错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
1
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# 全局日志的关闭
为了避免日志产生过大,也是处于模块化的思想,我们一般不在全局中(http 中)指定日志格式和输出位置,而是在子配置文件中(每个 server 中)单独配置。
但是如果 http 和 server 都不配置,默认会写入 logs/access.log
,即全局的形式。所以需要关闭全局日志。
网上很多博客中展示的都是错误示例,这里演示正确的关闭方式,包括 error_log
和 access_log
:
# 错误示例,会产生名字为 off/on 的日志文件
error_log off;
access_log on;
正确关闭方式
error_log /dev/null;
access_log off;
1
2
3
4
5
6
7
2
3
4
5
6
7
# 日志 log_format 可选项
默认格式:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
1
2
3
2
3
参数释义表:
字段 | 说明 |
---|---|
$remote_addr | 客户端地址 |
$remote_user | 客户端用户名称 |
$time_local | 访问时间和时区 |
$request | 请求的 URI 和 HTTP 协议 |
$http_host | 请求地址,即浏览器中你输入的地址(IP 或域名) |
$status | HTTP 请求状态 |
$upstream_status | upstream 状态 |
$body_bytes_sent | 发送给客户端文件内容大小 |
$http_referer | url 跳转来源 |
$http_user_agent | 用户终端浏览器等信息 |
$ssl_protocol | SSL 协议版本 |
$ssl_cipher | 交换数据中的算法 |
$upstream_addr | 后台 upstream 的地址,即真正提供服务的主机地址 |
$request_time | 整个请求的总时间 |
$upstream_response_time | 请求过程中,upstream 响应时间 |
# http、server、location 之间的关系
- http:主要用于解决用户请求中的报文信息
- server:用于配置一个具体的网站响应操作
- location:用于匹配 uri
由上至下是包含关系。
# 更多其它参数
server 中的参数配置项其实有很多,它们可以实现一些丰富的功能。上面只列举了最基础的几个参数,后面的章节会单独讲解如何配置来实现各种功能。
# 参考资料
(完)