¶一、简介
Nginx 是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
- 官方开源版
- 官方商业版
- 官网:https://www.nginx.com
- 中文官网:https://www.nginx-cn.net
- NGINX Plus 文档:https://docs.nginx.com/nginx
在高连接并发的情况下,Nginx 是 Apache 服务器不错的替代品。
¶二、在线包管理器安装nginx
¶1. apt安装nginx
¶(1)安装nginx
1 | apt update |
¶(3)卸载nginx
1 | systemctl stop nginx |
如果由于 Nginx 卸载不干净导致出现重装失败的问题,解决可参考:https://www.cnblogs.com/alter888/p/9478022.html
¶2. yum安装nginx
¶(1)设置nginx官方yum源(可选)
1 | yum install yum-utils |
设置 nginx 官方 yum 源以能够使用最新版本
¶(2)安装nginx
1 | yum install -y nginx |
¶(3)查看nginx安装信息
1 | #查看已经安装nginx包(如:nginx-1.16.0-1.el7.ngx.x86_64) |
¶(4)卸载nginx
1 | systemctl stop 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/nginxyum安装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 | #yum安装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 >/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 | #启动 |
关于
nginx -V查看编译参数的说明:注意执行
nginx -V只是列出在编译时执行./configure的显式设置参数,而不代表真实编译进nginx的配置,比如有很多的编译参数是默认启用的,编译时也被编译进nginx了,但是通过nginx -V命令却不能看到对应的参数。如在执行./configure时即使没有显式地设置--with-pcre这个编译参数,但是编译好的nginx还是能够使用正则匹配功能。
¶五、nginx内置变量
http核⼼模块的内置变量
http请求变量
Nginx内置变量
⾃定义变量
1 | $uri: 当前请求的uri,不带参数 |
¶六、自定义nginx配置文件
只需在 nginx 主配置文件 nginx.conf 的 http 节点中导入 conf/conf.d 目录(如果没有自行创建该目录)的所有配置文件,即可在 conf/conf.d 目录下自定义配置文件。如下:
1 | http { |
¶七、配置http服务
(1)创建nginx配置文件
1 | vim /opt/nginx/conf/conf.d/http.conf |
内容如下:
1 | ## 第一个虚拟主机配置(静态资源服务器) |
(2)配置防火墙和重载 nginx 配置
1 | #防火墙开放相关监听端口 |
(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)反向代理测试示例
测试示例需求:在本地的 nginx 中模拟反向代理到本地不同端口的上游服务器。
(1)创建nginx配置文件
1 | vim /opt/nginx/conf/conf.d/load_balance.conf |
内容如下:
1 | #上游服务器配置(后端服务器) |
(2)服务节点差异设置
为了更直观的测试负载均衡效果,可给不同的服务节点的访问页面做一些差异内容
1 | mkdir -p /opt/nginx/html/{node1,node2,node3} |
(3)配置防火墙和重载 nginx 配置
1 | #防火墙开放相关监听端口 |
(4)测试
设服务器 IP 地址为:
198.23.188.200,则访问地址:http://198.23.188.200:8080提示:浏览器要设置“停用缓存”,否则可能一直观察到的都是一个内容。
¶3. 高级的反向代理配置
¶1)负载均衡调度模式配置
在Nginx中,可以使用以下几种负载均衡调度模式:
- 轮询(Round Robin):默认情况下,Nginx使用轮询模式进行负载均衡。它按照每个后端服务器的顺序依次分配请求,确保每个后端服务器平均分担负载。
- 加权轮询(Weighted Round Robin):可以为每个后端服务器分配不同的权重,以调整它们接收请求的比例。较高权重的服务器将获得更多的请求。
- IP哈希(IP Hash):基于客户端IP地址对请求进行哈希运算,将相同IP的请求始终转发到同一个后端服务器。这对于需要保持会话或状态的应用程序非常有用。
- 最少连接(Least Connections):将请求分配给当前连接数最少的后端服务器。这有助于平衡服务器的负载,将请求发送到连接较少的服务器,以确保更均匀的负载分布。
- URL哈希(URL Hash):基于请求的URL对后端服务器进行哈希运算,使相同URL的请求总是转发到同一个后端服务器。这对于需要缓存或特定处理逻辑的应用程序非常有用。
nginx 配置相关内容如下:
1 | #(1)轮询(Round Robin)模式 |
¶2)负载均衡健康检查配置
¶(1)简要说明
Nginx健康检查的作用:
Nginx 的健康检查功能主要用于监控后端服务器的可用性和状态,以确保请求被正确地转发给可用的服务器。具体作用如下:
- 确保服务可用性:通过定期向后端服务器发送健康检查请求,Nginx可以检测到服务器是否在线、响应正常以及服务是否可用。如果某个服务器宕机或无法正常响应请求,Nginx将自动将请求转发给其他可用的服务器,确保服务的持续可用性。
- 动态负载均衡:健康检查功能可以让Nginx根据后端服务器的状态自动调整请求的转发策略。当某个服务器出现故障或性能下降时,Nginx可以暂时将请求从故障的服务器转发到其他健康的服务器,实现负载均衡并避免向不可用的服务器发送请求。
- 故障自动恢复:健康检查还能够帮助Nginx检测到后端服务器的恢复情况。一旦某个服务器恢复正常,健康检查会将其标记为健康,并重新将请求转发到该服务器上,实现故障自动恢复。
- 避免服务雪崩效应:通过定期检查后端服务器的状态,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 | upstream 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 | #(1)下载nginx_upstream_check_module模块源码 |
说明:nginx 各版本编译
nginx_upstream_check_module模块后即可正常使用主动健康检查配置,但是要使用该模块的健康监控页面功能(由模块的check_status指令支持),则需要安装模块中补丁支持的特定版本 nginx(支持版本可在模块源码中查看,例如源码中有check_1.20.1+.patch这个补丁文件,则说明其支持 nginx 的1.20.1版本),并使用模块中特定版本的补丁修改 nginx 源码,否则可能会出现访问健康监控页面失败的问题。提示:健康监控页面是否能用不影响主动健康检查功能的使用,故打不打补丁根据需求来决定。
nginx 使用配置如下:
1 | upstream ops_load { |
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健康监控页面效果如下:
¶3)通过反向代理实现动静分离

这里的静态资源用图片来表示,而动态资源用 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 | <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> |
(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 | server { |
(2)上传一张静态资源文件图片(如:logo.jpg)到里 /opt/nginx/html 目录里。
(3)为了能体现出动静分离的效果,可创建一个同时有静态资源内容又有静态资源内容的 html 测试文件,如下:
1 | vim /opt/nginx/html/dynamic_static.html |
内容如下:
1 | <html lang="en"> |
(4)配置防火墙和重载 nginx 配置
1 | #防火墙开放相关监听端口 |
¶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 | server { |
💁♂ 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 | #防火墙开放相关监听端口 |
¶3. 测试https访问
创建一个待测试的html静态资源文件,如下:
1 | echo "<h1>Hi, Nginx !</h1>" >> /opt/nginx/html/test-https.html |
¶十、配置nginx进程和其执行用户
¶1. nginx进程
在 Nginx 的主进程启动后,会创建多个子进程来处理客户端请求和其他任务。这些子进程通常由 Nginx 主进程负责管理、调度和监控。
Nginx 子进程通常分为以下几种类型:
master process(主进程):Nginx 的主进程,负责管理所有子进程,接收和处理来自命令行的信号,并启动整个 Nginx 服务。worker process(工作进程):Nginx 的工作进程,负责处理客户端请求和其他任务,每个工作进程都是一个独立的进程,可以同时处理多个请求。cache loader process(缓存加载进程):用于加载和预热缓存数据的进程,只有在开启缓存功能时才会启动。cache manager process(缓存管理进程):用于管理缓存数据和处理缓存清理的进程,只有在开启缓存功能时才会启动。
通常配置工作进程以满足业务需求。
1 | #指定启动的工作进程数量(默认值为:auto,表示以CPU核心数决定工作进程数量) |
¶2. nginx进程执行用户
默认情况下,Nginx 启动后会创建一个主进程和多个工作进程,其中主进程为运行nginx服务的linux用户(通常是 root 用户),而每个工作进程都是以指定用户身份来执行的,默认情况下是以 nobody 用户身份运行。可以通过修改配置文件中的 user 指令来改变工作进程的执行用户。具体操作如下:
(1) 创建nginx工作进程的执行用户
1 | #创建nginx用户和同名用户组,不自动创建用户主目录,禁止该用户登录系统 |
(2) 修改 nginx 主配置文件nginx.conf,如下:
1 | vim /opt/nginx/conf/nginx.conf |
修改如下:
1 | #修改user指令即可 |
注意:修改 nginx 用户后需要注意也要同时修改一些 nginx 相关的临时文件权限:
1 | chown -R nginx:nginx /opt/nginx/proxy_temp |
(4)重载nginx配置
1 | #重载配置 |
¶十一、配置文件模块化
¶简要概述
在 Nginx 配置文件中可以通过使用 include 指令来实现模块化。从而让配置文件具有可复用性和更易维护性。
具体表现为:允许用户将配置文件拆分为更小的配置文件,使配置更加清晰和可维护。然后通过 include 指令来包含这些被拆分的配置文件到某个配置文件中。
¶include 指令的语法
1 | include file | mask; |
其中:
file是要包含的单个文件的路径,可以是绝对路径或相对于 Nginx 配置文件的路径。mask是一个通配符表达式,用于匹配多个文件。可以使用通配符字符*和?。
¶include 指令使用示例
1 | #包含单个文件 |
请注意,
include指令可以出现在任何适当的位置,以包含其他配置文件的内容。当 Nginx 读取配置文件时,它会按照指令的顺序逐行解析,并将包含的文件内容合并到最终的配置中。
¶十一、配置日志
Nginx 默认有两种日志文件的记录,即 error_log(错误日志)和 access_log(访问日志)。用户可以分别对这两种日志文件进行相关自定义配置。
¶error_log 错误日志配置
error_log 命令用于记录 Nginx 的错误信息,可以配置 off停止日志记录,或者配置日志路径和错误级别进行日志记录,默认支持的错误级别如下:
error:记录错误消息。warn:记录警告消息和错误消息。notice:记录普通但重要的信息。info:记录更详细的信息,通常用于调试。debug:记录详细的调试信息,通常用于详尽的故障排除。
使用格式如下:
1 | error_log logs/error.log error; |
¶access_log 访问日志配置
access_log 命令用于记录客户端请求的访问日志,可以配置 off停止日志记录,或者配置日志路径和日志格式进行日志记录,默认支持:combined(默认,即都不配置日志的情况)、main(安装后通常自动使用的格式) 这些日志格式,当然用户可以自定义日志格式,如下:
1 | log_format custom '$remote_addr - $remote_user [$time_local] "$request" ' |
¶按照日期格式配置日志文件名称
随着 nginx 长时间运行,日志文件也会变得越来越多,甚至几个月就达到了几个 GB 的大小,这会导致在排查日志时会由于内容太多而不好定位。为了解决这个问题,可以配置 nginx 记录日志时按照日期记录到不同的文件里,从而实现日志切割的效果。如下:
1 | log_format custom '$remote_addr - $remote_user [$time_local] "$request" ' |
设 logs 目录路径为:/opt/nginx/logs,则需要给该目录赋予 worker 进程的用户权限和操作权限。
1 | chown nginx:nginx /opt/nginx/logs |
1 | #重载配置 |
