nginx学习笔记

一、简介

Nginx 是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

在高连接并发的情况下,Nginx 是 Apache 服务器不错的替代品。

二、在线包管理器安装nginx

1. apt安装nginx

(1)安装nginx

1
2
3
4
apt update
apt install -y nginx
#查看Nginx的显式编译参数
nginx -V

(3)卸载nginx

1
2
3
4
5
6
7
8
systemctl stop nginx
apt purge -y nginx nginx-common
#卸载系统中所有不再需要的依赖包
apt autoremove -y
#删除已下载的软件包文件的缓存
apt clean
#删除nginx配置文件(如需要)
rm -rf /etc/nginx/

如果由于 Nginx 卸载不干净导致出现重装失败的问题,解决可参考:https://www.cnblogs.com/alter888/p/9478022.html

2. yum安装nginx

(1)设置nginx官方yum源(可选)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
yum install yum-utils
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF

设置 nginx 官方 yum 源以能够使用最新版本

(2)安装nginx

1
yum install -y nginx

(3)查看nginx安装信息

1
2
3
4
5
6
7
8
#查看已经安装nginx包(如:nginx-1.16.0-1.el7.ngx.x86_64)
rpm -q nginx
#查看nginx版本(如:nginx version: nginx/1.16.0)
nginx -v
#查看yum安装nginx的目录
rpm -ql nginx
#查看Nginx的显式编译参数
nginx -V

(4)卸载nginx

1
2
3
4
5
6
systemctl stop nginx
yum remove -y nginx
#卸载系统中所有不再需要的依赖包
yum autoremove -y
#删除nginx配置文件(如需要)
rm -rf /etc/nginx/

3. 在线包管理器安装nginx路径

安装nginx的目录如下:

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
Nginx主配置文件
/etc/nginx
/etc/nginx/nginx.conf
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf

Cgi、Fastcgi、Uwcgi配置文件
/etc/nginx/fastcgi_params
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params

Nginx编码转换映射配置文件
/etc/nginx/win-utf
/etc/nginx/koi-utf
/etc/nginx/koi-win

http协议的Content-Type与扩展名配置文件
/etc/nginx/mime.types

系统守护进程管理器配置文件
/usr/lib/systemd/system/nginx.service

Nginx⽇志轮询,⽇志切割配置文件
/etc/logrotate.d/nginx

Nginx终端管理命令
/usr/sbin/nginx
/usr/sbin/nginx-debug

Nginx模块⽬录
/etc/nginx/modules
/usr/lib64/nginx
/usr/lib64/nginx/modules

Nginx默认站点⽬录
/usr/share/nginx/html

#Nginx的缓存⽬录
/usr/share/doc/nginx-1.12.2
/usr/share/man/man8/nginx.8.gz

Nginx的⽇志⽬录
/var/log/nginx

yum安装nginx的编译参数如下:

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
程序安装⽬录和路径
--prefix=/etc/nginx
--sbin-path=/usr/sbin/nginx
--modules-path=/usr/lib64/nginx/modules
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock

临时缓存⽂件
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp

设定Nginx进程启动⽤户和组(安全)
--user=nginx
--group=nginx

设置额外的参数将被添加到CFLAGS变量
--with-cc-opt

设置附加的参数, 链接系统库
--with-ld-opt

二、源码编译安装nginx

官方下载地址:http://nginx.org/en/download.html

版本号是双数的是稳定版,而单数则是开发版。

以下以编译安装来讲述。为什么选择编译安装而不选择yum或者apt包管理器安装呢?因为yum或者apt安装的是已经编译好的二进制文件,而已经编译好就说明扩展模块已经固定,很难去添加或者修改自定义的扩展模块,这里选择编译安装就是为了解决这个问题。

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
#yum安装nginx编译依赖
yum install -y gcc gcc-c++ zlib gd-devel zlib-devel openssl openssl-devel pcre-devel make

#apt安装nginx编译依赖
# apt install -y gcc make build-essential zlib1g-dev libpcre3-dev libssl-dev

#下载nginx源码包
wget http://nginx.org/download/nginx-1.18.0.tar.gz
#解压nginx源码包
tar zxvf nginx-1.18.0.tar.gz
#设置vim编辑nginx配置文件语法高亮(可选,如果不想用了直接删除~/.vim/目录即可)
mkdir ~/.vim && cp -r nginx-1.18.0/contrib/vim/* ~/.vim/

#进入解压好的nginx源码目录
cd nginx-1.18.0

#生成nginx的编译配置文件MakeFile
./configure \
--prefix=/opt/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_sub_module \
--with-http_gzip_static_module \
--with-http_stub_status_module


#根据MakeFile编译nginx
make

#安装nginx
make install


#卸载nginx(如需要)
rm -rf /opt/nginx
#如果MakeFile里有uninstall目标,也可以通过make uninstall进行卸载
#make uninstall

#清除编译生成文件(如需要,包括生成的MakeFile、二进制文件等)
make clean

#删除解压nginx源码目录和nginx安装包(如需要)
cd .. && rm -rf nginx-1.18.0 && rm -f nginx-1.18.0.tar.gz

💁‍♂ nginx 安装目录结构说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>/opt/nginx
>├── conf #存放配置文件
>│   ├── fastcgi.conf
>│   ├── fastcgi.conf.default
>│   ├── fastcgi_params
>│   ├── fastcgi_params.default
>│   ├── koi-utf
>│   ├── koi-win
>│   ├── mime.types
>│   ├── mime.types.default
>│   ├── nginx.conf
>│   ├── nginx.conf.default
>│   ├── scgi_params
>│   ├── scgi_params.default
>│   ├── uwsgi_params
>│   ├── uwsgi_params.default
>│   └── win-utf
>├── html #web基础根目录
>│   ├── 50xhtml
>│   └── index.html
>├── logs #日志文件目录
>└── sbin #执行脚本目录
└── nginx

💁‍♂ 常用编译参数说明

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
>--prefix=绝对路径	#定义nginx安装目录。默认为/usr/local/nginx目录。注意:这个目标的设置会影响其他参数中的相对路径目录。(例如:--sbin-path==sbin/nginx,那么实际上可执行文件nginx的安装存放路径为/opt/nginx/sbin/nginx。)
>--sbin-path=path #设置nginx可执行文件的安装存放路径。默认为<prefix>/sbin/nginx。
>--conf-path=path #设置nginx.conf配置文件的安装存放路径。默认为<prefix>/conf目录。
>--pid-path=path #设置将存储主进程的进程ID的nginx.pid文件的路径。默认<prefix>/logs/nginx.pid
>--error-log-path=path #设置error警告和诊断日志路径。默认<prefix>/logs/error.log
>--http-log-path=path #设置每个HTTP请求完成的记录日志路径。默认<prefix>/logs/access.log
>--user=用户名 #指定Nginx worker进程运行时所属的用户。默认为:nobody。
>--group=用户组 #指定Nginx worker进程运行时所属的用户组。默认为:nobody。
>--with-pcre #允许用户使用正则表达式进行模式匹配和文本处理。(默认启用)
>--with-threads #启用 Nginx 的线程池功能。(默认启用)
>--with-poll_module #启用poll多路复用器模块,用于处理网络事件的多路复用。(默认启用,如果不显式指定这--with-select_module或--with-poll_module中的任何一个,Nginx 默认会使用 --with-poll_module)
>--with-select_module #启用select多路复用器模块。(默认未启用)
>--with-file-aio #启用文件异步io支持。(默认未启用)
>--with-ipv6 #启用对IPv6的支持。(默认启用)
>--with-http_upstream_module #启用反向代理和负载均衡的功能,由ngx_http_upstream_module模块支持(默认启用)

>--with-http_ssl_module #启用构建将HTTPS协议支持添加到HTTP服务器的模块的功能。需要OpenSSL库来构建和运行此模块。(默认未启用)
>--with-http_gzip_static_module #用于预压缩静态文件,从而提高网站的性能。(默认未启用)
>--with-http_gunzip_module #用于在 Nginx 中解压缩经过压缩的 HTTP 响应,以便客户端可以正常接收响应。(默认未启用)
>--with-http_sub_module #用于在响应内容中执行字符串替换操作,常用于修改 HTML、CSS、JavaScript 等响应内容。(默认未启用)
>--with-http_realip_module #用于替换客户端 IP 地址,以解决反向代理中的 IP 地址伪装问题。(默认未启用)
>--with-http_image_filter_module #提供了在 HTTP 请求中处理图像的功能,例如缩放、裁剪、旋转、反转等功能。(默认未启用)
>--with-http_mp4_module #提供了处理 MP4 文件的功能,包括切割、拼接、编码等。(默认未启用)
>--with-mail #安装邮件服务器反向代理模块,使nginx可以反向代理IMAP、POP3、SMTP等协议。(默认未启用)
>--with-mail_ssl_module #使IMAP、POP3、SMTP等协议支持SSL/TLS协议加密传输支持。(默认未启用)
>--with-http_v2_module #是用于启用 HTTP/2 模块的选项。(默认未启用)
>--with-http_stub_status_module #提供了一个简单的状态页面,用于监控 Nginx 服务器的运行状态。(默认未启用)

如果想强制禁用某个模块,只需要将--with改成--without。比如禁用select多路复用器模块,则参数为:--without-select_module

三、nginx常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#启动
nginx

#停止
nginx -s stop #立即停止服务(查出nginx进程id后直接强制kill杀掉进程)
nginx -s quit #安全地停止服务(等待所有请求处理完成再停止服务)

#重新加载配置(重新加载配置而无需停止或重启服务)
nginx -s reload


#检测配置文件正确性
nginx -t

#查看nginx的【显式】编译参数
nginx -V

#查看nginx是否在运行
ps aux | grep nginx

关于nginx -V查看编译参数的说明:

注意执行nginx -V只是列出在编译时执行./configure的显式设置参数,而不代表真实编译进nginx的配置,比如有很多的编译参数是默认启用的,编译时也被编译进nginx了,但是通过nginx -V命令却不能看到对应的参数。如在执行./configure时即使没有显式地设置--with-pcre这个编译参数,但是编译好的nginx还是能够使用正则匹配功能。

五、nginx内置变量

http核⼼模块的内置变量

http请求变量
Nginx内置变量
⾃定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$uri: 当前请求的uri,不带参数
$request_uri: 客户端请求的uri,带完整参数
$host: 客户端请求头中Host字段除去端口号的部分。可用于获取请求的域名信息,如果host⾸部为空则$host等价
$http_host: 客户端请求头中Host的完整字段(如有客户端请求头Host中有端口则$http_host包含端口)
$proxy_host:指proxy_pass中设置的host值(对于端口,默认80不包含,其他端口包含)
$remote_addr: 客户端IP(如果只经过一个代理服务器,则可以表示客户端的真实IP,但如果经过多个代理服务器,则只能表示最后代理服务器的IP)
$remote_port: 客户端请求的端口(客户端通常会使用随机的动态端口来发起请求)
$remote_user: 客户端发起请求时的 HTTP 认证用户名
$request_filename: 客户端请求的文件路径
$request_method: 求⽅法, GET POST PUT
$server_addr: 前服务器的 IP 地址
$server_name: 服务器配置的域名。可用于获取当前服务器块(server block)的配置的域名信息(如果在配置中使用了多个 server_name 声明,$server_name 将会返回第一个匹配成功的域名。)
$server_port: 服务器监听的端口
$server_protocol: nginx服务器使用的协议版本, 如http/1.1 http/1.0
$scheme:客户端请求的协议方案,如:http 或 https 等
$document_root: 当前请求映射到的root配置
$hostname: nginx所在的服务器的主机名

六、自定义nginx配置文件

只需在 nginx 主配置文件 nginx.confhttp 节点中导入 conf/conf.d 目录(如果没有自行创建该目录)的所有配置文件,即可在 conf/conf.d 目录下自定义配置文件。如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
http {
include mime.types;
keepalive_timeout 65;
#以上为其他无关配置...

### 添加这行代码 ###
include conf.d/*.conf; #nginx加载主配置文件的时候自动导入conf.d目录下的所有自定义配置文件

#以下为其他无关配置...
server {

}
}

七、配置http服务

(1)创建nginx配置文件

1
vim /opt/nginx/conf/conf.d/http.conf

内容如下:

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
## 第一个虚拟主机配置(静态资源服务器)
server {
listen 8080;
server_name localhost;
#server_name example.com;

#access_log logs/host.access.log main;

location / {
root /opt/nginx/html; #配置web根目录
index index.html index.htm;
}

#图片资源
location ~ .*\.(jpg|png|gif)$ {
root /opt/nginx/html;
gzip on; #传输压缩,压缩本身比较耗费服务端性能,但给带宽带来更好的传输。恰当的使用会增强资源的访问效率。
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types gzip_types text/plain application/json application/x-javascript application/css application/xml application/xml+rss text/javascript application/x-httpd-php image/jpeg image/gif image/png; #压缩的文件类型,一般按需选择,但这里为了未来方便添加文件类型多选一些。具体配置参考文件/etc/nginx/mime.types
expires 1h; #设置静态资源文件在客户端的缓存时间,除非客户清楚缓存或者关闭缓存或者强制访问才会再访问。
}

#文件下载
location /download {
root /opt/nginx/html; #访问 http://localhost:8080/download/test.txt 时会下载 /opt/nginx/html/test.txt 路径的文件
charset utf-8,gbk; #解决目录或者文件显示中文乱码的问题
autoindex on; #自动显示资源路径的文件名称,以此来开启站点下载。默认为关闭。
autoindex_localtime on; #显示的⽂文件时间为文件的服务器时间。默认为off,显示的文件时间为GMT时间
autoindex_exact_size off; #默认为on, 显示出文件的确切⼤大小,单位是bytes;修改为off,显示出文件的⼤大概大小,单位是kB或者MB或者GB。
}
}


## 第二个虚拟主机配置
# server {
# listen 8081;
# server_name localhost; #主机名,一般为一个或多个域名或者ip
# location / {
# root /opt/nginx/html;
# index index.html index.htm;
# }
# }

(2)配置防火墙和重载 nginx 配置

1
2
3
4
5
6
#防火墙开放相关监听端口
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload

#重载配置
/opt/nginx/sbin/nginx -s reload

(3)测试

设服务器 IP 地址为:198.23.188.200,则访问地址:http://198.23.188.200:8080

八、配置反向代理

反向代理:即将客户端对本机的访问请求代理转发到其他服务器。在反向代理中可以按需求配置将请求转发到一个或多个服务器,如果是多个服务器则可实现负载均衡的功能效果。

1. 反向代理常用指令

代理请求常用指令:

  • proxy_pass: 指定反向代理的目标服务器地址。例如:proxy_pass http://backend_server;

  • proxy_set_header: 设置传递给后端服务器的请求头信息(只有目标服务器需要解析这些请求头时才有必要配置,否则可以不配置)。常见的请求头设置配置如下:

1
2
3
4
5
6
7
8
proxy_set_header "Connection" ""; #删除Connection请求头
proxy_set_header Host $host; #设置请求头指定代理请求时的Host头,$host表示使用客户端的Host(不包含端口)作为代理请求的Host
proxy_set_header X-Real-IP $remote_addr; #设置请求头指定客户端真实IP,$remote_addr表示客户端的IP(如果只经过一个代理服务器,则可以表示客户端的真实IP,但如果经过多个代理服务器,则只能表示最后代理服务器的IP)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #设置请求头指定客户端的真实IP以及每次途经的代理IP(由逗号隔开,如:"192.168.60.1, 192.168.60.101",第一个IP即为客户端的真实IP。目标服务器使用X-Forwarded-For获取客户端真实IP比较可靠)
proxy_set_header X-Forwarded-Proto $scheme; #设置请求头指定使用的协议(如:http或者https,$scheme表示客户端请求nginx时使用的协议)

##其他请求头设置
proxy_set_header Range $http_range;
  • proxy_http_version: 指定 Nginx 使用的 HTTP 协议版本(如:1.0(默认)、1.1)。例如:proxy_http_version 1.1;
  • proxy_cache: 设置反向代理缓存。可以通过 proxy_cache 指令来启用缓存并指定缓存名称。例如:proxy_cache my_cache;
  • proxy_redirect: 设置反向代理的重定向规则。可选值:default(默认值,会自动替换响应头中的域名部分,实现反向代理的重定向)、off(禁用重定向,不进行任何修改)、redirect <replacement>(指定自定义的重定向规则,可以使用正则表达式等方式来进行替换)。例如:proxy_redirect default;
  • proxy_connect_timeout: 设置与后端服务器建立连接的超时时间。例如:proxy_connect_timeout 5s;
  • proxy_read_timeout: 设置从后端服务器读取响应的超时时间。例如:proxy_read_timeout 10s;
  • proxy_send_timeout: 设置向后端服务器发送请求的超时时间。例如:proxy_send_timeout 10s;
  • proxy_buffering: 启用或禁用反向代理缓冲。可选:on(默认)、off,例如:proxy_buffering on;
  • proxy_buffer_size <size>:设置反向代理使用的缓冲区大小。默认 4KB。使用示例:proxy_buffer_size 8k;
  • proxy_buffers <number> <size>:设置反向代理缓冲区的数量和大小。默认每个连接分配两个缓冲区,每个缓冲区大小为 4KB。如:proxy_buffers 4 16k;
  • proxy_busy_buffers_size <size>:设置 Nginx 可以积累的响应数据大小。默认为 proxy_buffers 中每个缓冲区的大小。使用示例:proxy_busy_buffers_size 32k;
  • proxy_ignore_headers: 设置要忽略的响应头字段。例如:proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
  • proxy_intercept_errors: 启用或禁用拦截来自后端服务器的错误响应。使用示例:proxy_intercept_errors on;
  • proxy_max_temp_file_size <size>:设置代理模块在处理响应时,允许创建的临时文件的最大大小。默认:1024MB。使用示例:proxy_max_temp_file_size 512m;

代理相应常用指令:

  • 1)add_header: 添加自定义响应头到服务器的响应中。例如跨域配置,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE";
add_header Access-Control-Allow-Headers "Authorization, Content-Type, X-Requested-With";
add_header Access-Control-Max-Age 86400;
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE";
add_header Access-Control-Allow-Headers "Authorization, Content-Type, X-Requested-With";
add_header Access-Control-Max-Age 86400;
add_header Content-Length 0;
add_header Content-Type "text/plain charset=UTF-8";
return 200;
}

2. 简单的反向代理配置

1)反向代理相关配置

nginx 配置相关内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#上游服务器配置(后端服务器)
upstream ops_load {
#负载均衡配置
#配置多个http服务器即可实现负载均衡,其中http服务器可为本机,也可以为其他服务器
#默认负载均衡的调度模式为轮询方式
server 192.168.60.101::8080;
server 192.168.60.102:8080;
}

server {
listen 8080;
server_name localhost;

location / {
#反向代理
#proxy_pass http://localhost:8081; #如果只需要代理到一个服务器,则可以如此配置
proxy_pass http://ops_load; #如果只需要代理到多个服务器,则可以配置upstream来设置多个服务器
}
}

2)反向代理测试示例

测试示例需求:在本地的 nginx 中模拟反向代理到本地不同端口的上游服务器。

(1)创建nginx配置文件

1
vim /opt/nginx/conf/conf.d/load_balance.conf

内容如下:

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
#上游服务器配置(后端服务器)
upstream ops_load {
server localhost:8081;
server 127.0.0.1:8082;
server 127.0.0.1:8083;
}

server {
listen 8080;
server_name localhost;

location / {
proxy_pass http://ops_load;
}
}

#模拟3个上游服务器
server {
listen 8081;
root /opt/nginx/html/node1;
index index.html;
}
server {
listen 8082;
root /opt/nginx/html/node2;
index index.html;
}

server {
listen 8083;
root /opt/nginx/html/node3;
index index.html;
}

(2)服务节点差异设置

为了更直观的测试负载均衡效果,可给不同的服务节点的访问页面做一些差异内容

1
2
3
4
mkdir -p /opt/nginx/html/{node1,node2,node3}
echo "node1" > /opt/nginx/html/node1/index.html
echo "node2" > /opt/nginx/html/node2/index.html
echo "node3" > /opt/nginx/html/node3/index.html

(3)配置防火墙和重载 nginx 配置

1
2
3
4
5
6
#防火墙开放相关监听端口
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload

#重载配置
/opt/nginx/sbin/nginx -s reload

(4)测试

设服务器 IP 地址为:198.23.188.200,则访问地址:http://198.23.188.200:8080

提示:浏览器要设置“停用缓存”,否则可能一直观察到的都是一个内容。

3. 高级的反向代理配置

1)负载均衡调度模式配置

在Nginx中,可以使用以下几种负载均衡调度模式:

  1. 轮询(Round Robin):默认情况下,Nginx使用轮询模式进行负载均衡。它按照每个后端服务器的顺序依次分配请求,确保每个后端服务器平均分担负载。
  2. 加权轮询(Weighted Round Robin):可以为每个后端服务器分配不同的权重,以调整它们接收请求的比例。较高权重的服务器将获得更多的请求。
  3. IP哈希(IP Hash):基于客户端IP地址对请求进行哈希运算,将相同IP的请求始终转发到同一个后端服务器。这对于需要保持会话或状态的应用程序非常有用。
  4. 最少连接(Least Connections):将请求分配给当前连接数最少的后端服务器。这有助于平衡服务器的负载,将请求发送到连接较少的服务器,以确保更均匀的负载分布。
  5. URL哈希(URL Hash):基于请求的URL对后端服务器进行哈希运算,使相同URL的请求总是转发到同一个后端服务器。这对于需要缓存或特定处理逻辑的应用程序非常有用。

nginx 配置相关内容如下:

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
#(1)轮询(Round Robin)模式
upstream backend-rr {
#默认的负载均衡调度模式即为轮询模式,不需要显式地配置
server 192.168.60.101::8080;
server 192.168.60.102:8080;
}

#(2)加权轮询(Weighted Round Robin)模式
upstream backend-wrr {
server 192.168.60.101::8080 weight=5;
server 192.168.60.102:8080 weight=2;
}

#(3)IP哈希(IP Hash)模式
upstream backend-ih {
ip_hash;
server 192.168.60.101::8080;
server 192.168.60.102:8080;
}

#(4)最少连接(Least Connections)模式
upstream backend-lc {
least_conn;
server 192.168.60.101::8080;
server 192.168.60.102:8080;
}

#(5)URL哈希(URL Hash)模式
upstream backend-uh {
hash $request_uri;
server 192.168.60.101::8080;
server 192.168.60.102:8080;
}


server {
listen 8080;
server_name localhost;

location / {
proxy_pass http://backend-rr;
# proxy_pass http://backend-wrr;
# proxy_pass http://backend-ih;
# proxy_pass http://backend-lc;
# proxy_pass http://backend-uh;
}
}

2)负载均衡健康检查配置

(1)简要说明

Nginx健康检查的作用:

Nginx 的健康检查功能主要用于监控后端服务器的可用性和状态,以确保请求被正确地转发给可用的服务器。具体作用如下:

  1. 确保服务可用性:通过定期向后端服务器发送健康检查请求,Nginx可以检测到服务器是否在线、响应正常以及服务是否可用。如果某个服务器宕机或无法正常响应请求,Nginx将自动将请求转发给其他可用的服务器,确保服务的持续可用性。
  2. 动态负载均衡:健康检查功能可以让Nginx根据后端服务器的状态自动调整请求的转发策略。当某个服务器出现故障或性能下降时,Nginx可以暂时将请求从故障的服务器转发到其他健康的服务器,实现负载均衡并避免向不可用的服务器发送请求。
  3. 故障自动恢复:健康检查还能够帮助Nginx检测到后端服务器的恢复情况。一旦某个服务器恢复正常,健康检查会将其标记为健康,并重新将请求转发到该服务器上,实现故障自动恢复。
  4. 避免服务雪崩效应:通过定期检查后端服务器的状态,Nginx可以及时发现故障服务器,并将请求转发到其他可用的服务器上。这有助于避免由于故障服务器无法处理请求而导致的服务雪崩效应,提高整体系统的稳定性和可靠性。

总的来说,Nginx的健康检查功能可以提升后端服务器的可用性、优化负载均衡策略、自动恢复故障服务器,并提高整个系统的可靠性和性能。

Nginx健康检查的类型:

💁‍♂ Nginx 支持两种类型的健康检查:被动健康检查和主动健康检查。

  • 被动健康检查(Passive Health Checks): 被动健康检查是指Nginx通过监控后端服务器的请求响应来确定服务器的健康状态。当Nginx向后端服务器转发请求时,它会等待一段时间来接收服务器的响应。如果服务器在规定时间内成功响应请求,Nginx将认为服务器是健康的,并继续将请求转发到该服务器。如果服务器在规定时间内无法响应请求(例如返回错误状态码或连接超时),Nginx将认为服务器是不健康的,并停止将请求转发到该服务器,直到下次健康检查重新确定其健康状态。

  • 主动健康检查(Active Health Checks): 主动健康检查是指Nginx定期主动向后端服务器发送健康检查请求来确定服务器的健康状态。Nginx会按照预设的时间间隔发送健康检查请求到后端服务器,并等待服务器的响应。如果服务器成功响应了健康检查请求,Nginx将认为服务器是健康的,并继续将请求转发到该服务器。如果服务器无法响应健康检查请求(例如返回错误状态码或连接超时),Nginx将认为服务器是不健康的,并停止将请求转发到该服务器,直到下次健康检查重新确定其健康状态。主动健康检查相对于被动健康检查可以更快地恢复故障服务器的流量分发,这是因为它可以主动监控和检测后端服务器的健康状态。

💁‍♂ 被动健康检查的主动健康检查的选择:

  • 使用被动健康检查时,Nginx 只能在收到客户端请求时才能检测后端服务器的状态。如果后端服务器出现故障或变得不可用,Nginx 需要等待客户端请求到达并在一定时间内没有收到正确的响应,才会暂时将流量停止发送到该服务器。这意味着在发生故障时,存在一定的延迟时间(通常是几秒钟)才能切换流量到其他可用的服务器上。其适用于对故障恢复速度要求不高的情况。

  • 使用主动健康检查时,其允许 Nginx 定期发送健康检查请求到后端服务器。如果服务器无法正常响应或返回错误的响应,Nginx 将立即意识到该服务器的故障,并停止将流量发送到该服务器,而不需要等待客户端请求。这使得故障服务器的恢复速度更快,因为 Nginx 可以更快地检测到故障并将流量转移到其他健康的服务器上。通过主动健康检查,Nginx 可以更及时地发现故障,并且可以更快地将流量从故障服务器切换到其他可用服务器上,从而提高系统的可用性和故障恢复速度。其适用于对故障恢复速度要求比较高的情况。

(2)被动健康检查配置

Nginx 默认是支持基础的被动健康检查的(由ngx_http_upstream_module模块支持),使用配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
upstream ops_load {
server 192.168.60.101:8080 max_fails=1 fail_timeout=10s;
server 192.168.60.102:8080 max_fails=1 fail_timeout=10s;
}

server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://ops_load;
}
}

max_fails=1 fail_timeout=10s 说明:如果后端服务器在一次健康检查周期内(由Nginx配置中的check interval指定)失败一次或更多,则将其标记为不健康状态。一旦标记为不健康状态,Nginx将暂时将其排除在负载均衡范围之外的时间(由fail_timeout指定),在此期间不会将请求转发给该服务器。过了指定的时间后,Nginx将重新尝试将请求转发给该服务器。

  • max_fails=1:表示在一次健康检查周期内,允许的最大失败次数。如果在一次健康检查周期内,该服务器的失败次数达到或超过设定的最大失败次数,则该服务器将被标记为不健康状态。
  • fail_timeout=10s:表示在服务器被标记为不健康状态后,暂时将其排除在负载均衡范围之外的时间。在指定的时间段内,Nginx不会将请求转发给该服务器。在此示例中,如果服务器被标记为不健康状态,将在10秒后重新尝试将请求转发给该服务器。
(3)主动健康检查

Nginx 默认不支持主动健康检查,需使用第三方模块来支持,可使用开源的 nginx_upstream_check_module 模块来实现主动健康检查,重新编译安装 nginx 导入导入该模块,如下:

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
#(1)下载nginx_upstream_check_module模块源码
git clone https://github.com/yaoweibin/nginx_upstream_check_module.git /tmp/nginx_upstream_check_module
#git clone https://ghproxy.com/https://github.com/yaoweibin/nginx_upstream_check_module.git /tmp/nginx_upstream_check_module


#(2)下载nginx源码包
wget http://nginx.org/download/nginx-1.20.1.tar.gz

#(3)解压nginx源码包
tar zxvf nginx-1.20.1.tar.gz

#(4)进入解压好的nginx源码目录
cd nginx-1.20.1

#(5)(可选)如果需要使用健康监控页面,则需要使用nginx_upstream_check_module模块的补丁文件给nginx源码打补丁(修改nginx源码)
yum install -y patch
patch -p1 < /tmp/nginx_upstream_check_module/check_1.20.1+.patch #指定特定nginx版本的补丁文件给nginx源码打补丁

#(6)指定nginx_upstream_check_module模块路径生成nginx的编译配置文件MakeFile
./configure \
--prefix=/opt/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_sub_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--add-module=/tmp/nginx_upstream_check_module

#(7)编译并安装
make && make install

说明:nginx 各版本编译nginx_upstream_check_module模块后即可正常使用主动健康检查配置,但是要使用该模块的健康监控页面功能(由模块的check_status指令支持),则需要安装模块中补丁支持的特定版本 nginx(支持版本可在模块源码中查看,例如源码中有check_1.20.1+.patch这个补丁文件,则说明其支持 nginx 的1.20.1版本),并使用模块中特定版本的补丁修改 nginx 源码,否则可能会出现访问健康监控页面失败的问题。提示:健康监控页面是否能用不影响主动健康检查功能的使用,故打不打补丁根据需求来决定。

nginx 使用配置如下:

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
upstream ops_load {
server 192.168.60.101:8080;
server 192.168.60.102:8080;

#以10s为一个周期,每隔10s,nginx会自动向上游服务器发送一次请求,如果超过5s超时且达到3次,则该服务器标记为不可用;
#如果请求次数有1次以上没有超时,这标记为可用
check interval=10000 rise=1 fall=3 timeout=5000 type=tcp default_down=true;
check_http_send "HEAD / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}

server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://ops_load;
}

# 健康监控页面
location /status {
check_status;

access_log off;
#allow 127.0.0.1;
#deny all;
}
}

nginx_upstream_check_module 模块中相关指令说明:

  • check:健康检查规则

语法:check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [default_down=true|false] [type=tcp|http|ssl_hello|mysql|ajp|fastcgi]

如果省略参数,则默认参数为 interval=30000 fall=5 rise=2 timeout=1000 default_down=true type=tcp

相关参数说明:

  • interval:检查请求的间隔时间

  • rise:如果请求次数有指定次数以上没有超时,这标记为可用状态

  • fall:达到的指定失败次数则标记为不可用状态

  • timeout:请求达到指定的超时时间则标记为不可用状态

  • type:检查协议类型(tcp、ssl_hello、http、mysql、ajp、fastcgi)

  • default_down:设置后端服务器的初始状态(false:可用,默认;true:不可用)

  • port:指定后端服务器的检查端口。有可能与原始服务器端口不同。默认端口为 0,表示与原来的后端服务器相同

  • check_http_send:发送给后端服务器的请求数据报文

  • check_http_expect_alive:判断后端服务器为健康的相应状态码

  • check_status:通过 HTTP 方式显示健康检查服务器的状态。

设 Nginx 服务器 IP 地址为:192.168.60.156,则健康监控页面的访问地址:http://192.168.60.156:8080/status

可以指定如下 URL 参数指定健康监控页面响应的数据格式

  • /status?format=html
  • /status?format=csv
  • /status?format=json

健康监控页面效果如下:

image-20230612161929459

3)通过反向代理实现动静分离

image-20191125010102331

这里的静态资源用图片来表示,而动态资源用 jsp 来表示。

1. 使用tomcat配置动态资源

说明:

  • 安装 jdk 并配置环境变量
  • 安装 tomcat,官方下载解压即用(设安装路径为:/opt/apache-tomcat-8.5.31

(1)在 tomcat web 根目录里创建一个 jsp 测试文件:

1
vim /opt/apache-tomcat-8.5.31/webapps/ROOT/java_test.jsp

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>JSP Test Page</title>
</head>
<body>
<%
Random rand = new Random();
out.println("<h2>Random number:</h2>");
out.println(rand.nextInt(99)+100);
%>
</body>
</html>

(2)运行 tomcat

1
sh /opt/apache-tomcat-8.5.31/bin/startup.sh
2. 使用nginx配置静态资源和反向代理

(1)创建一个 nginx 配置文件

1
vim /opt/nginx/conf/conf.d/dynamic_static.conf

配置内容如下:

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
server {
listen 8080;
server_name localhost;

# 静态资源
location / {
root /opt/nginx/html;
index index.html;
}
# 动态资源
location ~ .*\.jsp$ {
proxy_pass http://192.168.60.102:8080; # 反向代理到 Tomcat
#代理到tomcat等服务器时注意要设置请求参数,如果后端服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败,报400错误。故至少要包含proxy_set_header Host $http_host;为了方便,以下配置了跟多的请求参数。
proxy_set_header Host $http_host;
# proxy_redirect default;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_connect_timeout 30;
# proxy_send_timeout 60;
# proxy_read_timeout 60;
# proxy_buffer_size 32k;
# proxy_buffering on;
# proxy_buffers 4 128k;
# proxy_busy_buffers_size 256k;
# proxy_max_temp_file_size 256k;
}
}

(2)上传一张静态资源文件图片(如:logo.jpg)到里 /opt/nginx/html 目录里。

(3)为了能体现出动静分离的效果,可创建一个同时有静态资源内容又有静态资源内容的 html 测试文件,如下:

1
vim /opt/nginx/html/dynamic_static.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
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>测试nginx动静分离</title>
<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
</head>
<script type="text/javascript">
$(document).ready(function(){
$.ajax({
type: "GET",
url: "/java_test.jsp",
success: function(data) {
$("#get_data").html(data)
},
error: function() {
alert("fail!!,请刷新再试!");
}
});
});
</script>

<body>
<h1 style="color: #0688e8;">测试动静分离</h1>

<h2>静态数据:</h2>
<img src="/logo.jpg" height="200" width="200">
<h2>动态数据:</h2>
<div id="get_data"></div>
</body>
</html>

(4)配置防火墙和重载 nginx 配置

1
2
3
4
5
6
#防火墙开放相关监听端口
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload

#重载配置
/opt/nginx/sbin/nginx -s reload
3. 访问测试

设服务器 IP 地址为:198.23.188.200,则测试如下:

九、配置ssl证书以使用https

使用 https 就需要配置 ssl 证书。一般地,获取 ssl 证书有两种方式:自签名和购买 CA 颁发的 ssl 证书。自签名的证书可能会被浏览器拦截并提示不受信任,因此建议采用比较可靠的商业颁发机构购买(如 Comodo、Symantec 等)或者免费的 Let’s Encrypt 签发的证书。可以使用 certbot 工具来申请得到免费 Let’ s Encrypt SSL 证书。具体操作可参考《通过certbot工具生成ssl证书》。假设这里已经申请得到了 Let’ s Encrypt SSL 证书,下文将介绍如何在 nginx 中配置 ssl 证书以使用 https 。

1. 创建nginx配置文件

1
vi /opt/nginx/conf/conf.d/https.conf

配置内容如下:

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
server {
listen 443 ssl;
server_name example.com;
#ssl_certificate /path/cert.pem;
ssl_certificate /path/fullchain.pem;
ssl_certificate_key /path/privkey.pem;
#ssl_trusted_certificate /path/chain.pem;
#ssl_trusted_certificate /path/fullchain.pem;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
charset utf-8;

# http资源服务
location / {
root /opt/nginx/html;
index index.html index.htm;
}

# 反向代理
# location ^~ /app {
# proxy_pass http://127.0.0.1:8080;
# proxy_set_header Host $host:$server_port;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header REMOTE-HOST $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# client_max_body_size 100m;
# }
}

💁‍♂ nginx SSL 证书配置说明:

  • ssl_certificate:SSL证书路径。(可配置为服务端证书或全链证书)

  • ssl_certificate_key:私钥文件路径。

  • ssl_trusted_certificate:可信任的证书链文件路径。(可配置为中间证书或全链证书)

如果ssl_certificate配置的证书为服务端证书而不包含中间证书,则应该配置 ssl_trusted_certificate 来指定可信任的证书链文件,以便客户端能够正确验证服务端证书的真实性。但由于目前主流CA服务商(包括 Let’s Encrypt )的根证书和中间证书都已经被大多数客户端(如:主流的浏览器)的证书信任列表所接受,所以服务端配置中即使缺少中间证书和根证书,客户端仍然可以正确地验证服务器证书的真实性,也就是说 ssl_certificate 配置 主流CA签发的 SSL 证书时,即使不是全链证书也能被大多数主流的客户端信任。

💁‍♂ 关于证书链的说明:

  • 客户端验证服务器证书的真实性是通过证书链来实现的。如果证书链中最顶层的证书(即CA根证书)在客户端的信任列表里,客户端会从上往下按序验证每层证书的真实性,每一层都使用上一层证书的公钥来验证下一层证书的签名,直到验证到服务器证书为止。如果证书链缺少中间证书,则客户端无法验证该证书链的完整性,也就无法验证服务端证书的真实性。因此,必须包括所有中间证书以及根证书才能构建完整的证书链。只有在证书链完整且验证成功的情况下,客户端才能信任服务器证书并与其建立安全连接。
  • 客户端的信任列表一般包括有根证书、中间证书以及其他可信任的证书等。

2. 配置防火墙和重载nginx配置

1
2
3
4
5
6
#防火墙开放相关监听端口
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload

#重载配置(重新加载 nginx 配置以使得 SSL 证书生效)
/opt/nginx/sbin/nginx -s reload

3. 测试https访问

创建一个待测试的html静态资源文件,如下:

1
echo "<h1>Hi, Nginx !</h1>" >> /opt/nginx/html/test-https.html

访问地址为:https://example.com/test-https.html

十、配置nginx进程和其执行用户

1. nginx进程

在 Nginx 的主进程启动后,会创建多个子进程来处理客户端请求和其他任务。这些子进程通常由 Nginx 主进程负责管理、调度和监控。

Nginx 子进程通常分为以下几种类型:

  • master process(主进程):Nginx 的主进程,负责管理所有子进程,接收和处理来自命令行的信号,并启动整个 Nginx 服务。
  • worker process(工作进程):Nginx 的工作进程,负责处理客户端请求和其他任务,每个工作进程都是一个独立的进程,可以同时处理多个请求。
  • cache loader process(缓存加载进程):用于加载和预热缓存数据的进程,只有在开启缓存功能时才会启动。
  • cache manager process(缓存管理进程):用于管理缓存数据和处理缓存清理的进程,只有在开启缓存功能时才会启动。

通常配置工作进程以满足业务需求。

1
2
3
4
5
6
7
8
9
10
11
#指定启动的工作进程数量(默认值为:auto,表示以CPU核心数决定工作进程数量)
worker_processes 2;
events {
#设置每个工作进程与客户端之间的最大连接数(默认值为:512)
worker_connections 1024;
}

#以下为其他无关配置...
http {
# 其他配置项...
}

2. nginx进程执行用户

默认情况下,Nginx 启动后会创建一个主进程和多个工作进程,其中主进程为运行nginx服务的linux用户(通常是 root 用户),而每个工作进程都是以指定用户身份来执行的,默认情况下是以 nobody 用户身份运行。可以通过修改配置文件中的 user 指令来改变工作进程的执行用户。具体操作如下:

(1) 创建nginx工作进程的执行用户

1
2
#创建nginx用户和同名用户组,不自动创建用户主目录,禁止该用户登录系统
useradd -U -M -s /usr/sbin/nologin nginx

(2) 修改 nginx 主配置文件nginx.conf,如下:

1
vim /opt/nginx/conf/nginx.conf

修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#修改user指令即可
user nginx; #nginx工作进程的执行用户
#user nginx nginx; #指定用户和用户组,如果没有指定用户组,则使用默认用户组


#以下为其他无关配置...
worker_processes 1;
events {
worker_connections 1024;
}
http {
# 其他配置项...
}

注意:修改 nginx 用户后需要注意也要同时修改一些 nginx 相关的临时文件权限:

1
2
chown -R nginx:nginx /opt/nginx/proxy_temp
chown -R nginx:nginx /opt/nginx/logs

(4)重载nginx配置

1
2
#重载配置
/opt/nginx/sbin/nginx -s reload

十一、配置文件模块化

简要概述

在 Nginx 配置文件中可以通过使用 include 指令来实现模块化。从而让配置文件具有可复用性和更易维护性。

具体表现为:允许用户将配置文件拆分为更小的配置文件,使配置更加清晰和可维护。然后通过 include 指令来包含这些被拆分的配置文件到某个配置文件中。

include 指令的语法

1
include file | mask;

其中:

  • file 是要包含的单个文件的路径,可以是绝对路径或相对于 Nginx 配置文件的路径。
  • mask 是一个通配符表达式,用于匹配多个文件。可以使用通配符字符 *?

include 指令使用示例

1
2
3
4
5
#包含单个文件
include /path/to/file.conf;

#包含多个文件,使用通配符匹配
include /path/to/conf.d/*.conf;

请注意,include 指令可以出现在任何适当的位置,以包含其他配置文件的内容。当 Nginx 读取配置文件时,它会按照指令的顺序逐行解析,并将包含的文件内容合并到最终的配置中。

十一、配置日志

Nginx 默认有两种日志文件的记录,即 error_log(错误日志)和 access_log(访问日志)。用户可以分别对这两种日志文件进行相关自定义配置。

error_log 错误日志配置

error_log 命令用于记录 Nginx 的错误信息,可以配置 off停止日志记录,或者配置日志路径和错误级别进行日志记录,默认支持的错误级别如下:

  • error:记录错误消息。
  • warn:记录警告消息和错误消息。
  • notice:记录普通但重要的信息。
  • info:记录更详细的信息,通常用于调试。
  • debug:记录详细的调试信息,通常用于详尽的故障排除。

使用格式如下:

1
2
3
error_log  logs/error.log  error;
#error_log logs/error.log info;
#error_log off; #停止错误日志记录

access_log 访问日志配置

access_log 命令用于记录客户端请求的访问日志,可以配置 off停止日志记录,或者配置日志路径和日志格式进行日志记录,默认支持:combined(默认,即都不配置日志的情况)、main(安装后通常自动使用的格式) 这些日志格式,当然用户可以自定义日志格式,如下:

1
2
3
4
5
6
7
8
log_format custom  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#log_format custom '请求时间=$time_iso8601 | 请求IP=$remote_addr | 请求URL=$request | 请求数据类型=$http_content_type | 请求代理=$http_user_agent | 请求头大小=$body_bytes_sent | 来源URL地址=$http_referer | 客户端的真实IP=$http_x_forwarded_for | 响应状态码=$status | 响应数据类型=$sent_http_content_type | 响应时间=$upstream_response_time';

access_log logs/access.log custom;

#access_log off; #停止访问日志记录

按照日期格式配置日志文件名称

随着 nginx 长时间运行,日志文件也会变得越来越多,甚至几个月就达到了几个 GB 的大小,这会导致在排查日志时会由于内容太多而不好定位。为了解决这个问题,可以配置 nginx 记录日志时按照日期记录到不同的文件里,从而实现日志切割的效果。如下:

1
2
3
4
5
6
7
8
log_format custom  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#log_format custom '请求时间=$time_iso8601 | 请求IP=$remote_addr | 请求URL=$request | 请求数据类型=$http_content_type | 请求代理=$http_user_agent | 请求头大小=$body_bytes_sent | 来源URL地址=$http_referer | 客户端的真实IP=$http_x_forwarded_for | 响应状态码=$status | 响应数据类型=$sent_http_content_type | 响应时间=$upstream_response_time';
map $time_iso8601 $logdate {
'~^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})' $year-$month-$day;
}
access_log logs/access-$logdate.log custom;

设 logs 目录路径为:/opt/nginx/logs,则需要给该目录赋予 worker 进程的用户权限和操作权限。

1
2
chown nginx:nginx /opt/nginx/logs
chmod 755 /opt/nginx/logs
1
2
#重载配置
/opt/nginx/sbin/nginx -s reload


----------- 本文结束 -----------




如果你觉得我的文章对你有帮助,你可以打赏我哦~
0%