nginx学习笔记

一、简介

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

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

二、yum安装

1. 安装yum源

1
sudo yum install yum-utils

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

1
vim /etc/yum.repos.d/nginx.repo
1
2
3
4
5
6
7
8
9
10
11
12
13
[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

2. 安装nginx

1
yum install 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

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
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

二、编译安装

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

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

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

1. 准备活动

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

2. 安装编译依赖包

1
yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel pcre pcre-devel

3. 简单编译安装

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
#进入解压好的源码目录
cd nginx-1.18.0

#生成MakeFile
./configure \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_sub_module \
--with-http_gzip_static_module

#根据MakeFile编译
make

#安装
make install


#卸载
rm -rf /usr/local/nginx
#如果MakeFile里有uninstall目标,也可以通过make uninstall进行卸载
#make uninstall

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

#删除解压目录和安装包
cd .. && rm -rf nginx-1.18.0 && rm -f nginx-1.18.0.tar.gz

安装目录结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/usr/local/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

4. 常用编译参数说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
--prefix=绝对路径	#定义nginx安装目录。默认为usr/local/nginx目录。注意:这个目标的设置会影响其他参数中的相对路径目录。(例如:--sbin-path==sbin/nginx,那么实际上可执行文件nginx的安装存放路径为/usr/local/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-select_module #启用select多路复用器模块。(默认启用)
--with-poll_module #启用poll多路复用器模块,用于处理网络事件的多路复用。(默认启用,如果不显式指定这--with-select_module或--with-poll_module中的任何一个,Nginx 默认会使用 --with-poll_module)
--with-threads #启用 Nginx 的线程池功能。(默认未启用)
--with-file-aio #启用文件异步io支持。(默认未启用)
--with-ipv6 #启用对IPv6的支持。(默认未启用)
--with-http_ssl_module #启用构建将HTTPS协议支持添加到HTTP服务器的模块的功能。需要OpenSSL库来构建和运行此模块。(默认未启用)
--with-http_gzip_static_module #用于预压缩静态文件,从而提高网站的性能。(默认启用)
--with-http_gunzip_module #用于在 Nginx 中解压缩经过压缩的 HTTP 响应,以便客户端可以正常接收响应。(默认启用)
--with-http_sub_module #字符替换模块,允许在响应内容中进行字符串替换,从而实现动态修改内容的功能。(默认启用)
--with-http_realip_module #提取客户端真实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改成--without。比如禁用select多路复用器模块,则参数为:--without-select_module

5. 常规编译安装

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

#安装依赖
yum install -y gcc gcc-c++ zlib gd-devel zlib-devel openssl openssl-devel pcre-devel make

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

#生成MakeFile
./configure \
--prefix=/usr/local/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--error-log-path=/usr/local/nginx/log/error.log \
--http-log-path=/usr/local/nginx/log/access.log \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_gunzip_module \
--with-poll_module \
--with-pcre \
--with-file-aio \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_sub_module \
--with-http_mp4_module

#根据MakeFile编译
make

#安装
make install


#卸载
rm -rf /usr/local/nginx
#如果MakeFile里有uninstall目标,也可以通过make uninstall进行卸载
#make uninstall

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

#删除解压目录和安装包
cd .. && rm -rf nginx-1.18.0 && rm -f nginx-1.18.0.tar.gz

三、常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#进入nginx命令所在的安装目录(如果是编译安装)
cd /usr/local/nginx/sbin

#启动
./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还是能够使用正则匹配功能。

五、内置变量

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: http请求报⽂中host⾸部,如果没有则以处理此请求的虚拟主机的主机名代替
$hostname: nginx服务运⾏在主机的主机名
$remote_addr: 客户端IP
$remote_port: 客户端端⼝
$remote_user: 使⽤⽤户认证时客户端⽤户输⼊的⽤户名
$request_filename: ⽤户请求中的URI经过本地root或alias转换后映射的本地⽂件路径
$request_method: 请求⽅法, GET POST PUT
$server_addr: 服务器地址
$server_name: 服务器名称
$server_port: 服务器端⼝
$server_protocol: 服务器向客户端发送响应时的协议, 如http/1.1 http/1.0
$scheme:在请求中使⽤scheme, 如http://xxx.com中的http
$http_HEADER: 匹配请求报⽂中指定的HEADER
$http_host: 匹配请求报⽂中的host⾸部
$document_root: 当前请求映射到的root配置

六、自定义配置文件

只需在 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
vim 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
44
45
46
47
48
49
50
51
# 第一个虚拟主机配置(静态资源服务器)
server {
listen 8080;
server_name localhost;
#access_log logs/host.access.log main;

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


# 第二个虚拟主机配置(图片服务,和第一个虚拟主机差不多,但会针对图片做压缩等调优)
server{
listen 80;
server_name blog.qcmoke.top; #主机名,一般为一个或多个域名或者ip
location / { #控制网站访问路径
root /usr/share/nginx/blog;
index index.html index.htm;
}

location ~ .*\.(jpg|png|gif)$ {
root /usr/share/nginx/resource/img;
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; #设置静态资源文件在客户端的缓存时间,除非客户清楚缓存或者关闭缓存或者强制访问才会再访问。
}
}


# 第三个虚拟主机配置(文件下载服务)
server{
listen 80;
server_name cloud.qcmoke.top;

location / {
root /usr/share/nginx/cloud;
index index.html index.htm;
}

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

八、负载均衡

1
vim 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
34
35
36
37
38
upstream ops_load {
#可为本地的虚拟主机,也可以为远程的其他vps上的nginx虚拟主机,默认是轮询的方式访问
server 198.23.188.200:8081;
server 198.23.188.200:8082;
server 198.23.188.200:8083;
server 144.34.145.10:8084;
server 101.132.45.132:80;
}

server{
listen 80;
server_name test.qcmoke.top;
index index.html;

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


#本地测试的虚拟主机节点
server {
listen 8081;
root /usr/share/nginx/load/node1;
index index.html;
}

server {
listen 8082;
root /usr/share/nginx/load/node2;
index index.html;
}

server {
listen 8083;
root /usr/share/nginx/load/node3;
index index.html;
}

九、动静分离

image-20191125010102331

1. 环境准备(A主机和B主机)

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

上游服务主机(A主机)

ip:101.132.45.132

作用:提供静态资源和动态资源服务

(nginx提供静态资源资源+tomcat提供动态资源)

代理主机(B主机)

ip:198.23.188.200:

作用:承担反向代理的角色(nginx实现反向代理)

2. A主机环境搭建

(1)动态资源的准备

tomcat安装很傻瓜式,解压即用,这里就不详细介绍。

添加jsp到tomcat web根目录里

1
vim /usr/local/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>

运行tomcat

1
sh /usr/local/apache-tomcat-8.5.31/bin/startup.sh

(2)静态资源的准备

编辑nginx配置文件配置静态资源访问控制

1
vim conf.d/static.conf
1
2
3
4
5
6
7
8
server {
listen 80;
server_name 101.132.45.132;
#静态图片资源访问控制
location ~ .*\.(jpg|png|gif)$ {
root /usr/share/nginx/resource/img;
}
}

/usr/share/nginx/resource/img目录里放一张logo.jpg的图片做测试,并且确保有访问权限

重新加载nginx配置

1
nginx -s reload

3. B主机环境搭建

配置反向代理调度策略

1
vim conf.d/dynamic_static_proxy.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
#配置静态资源请求的地址和端口
upstream static {
server 101.132.45.132:80;
}

#配置动态资源请求的地址和端口
upstream dynamic_java {
server 101.132.45.132:8080;
}

#配置当前服务器的虚拟主机
server {
listen 80;
server_name 198.23.188.200;
location / {
root /usr/share/nginx/html;
index index.html;
}
location ~ .*\.(png|jpg|gif)$ {
#静态图片资源走代理路线
proxy_pass http://static;
include proxy_params; #也可以把/etc/nginx/proxy_params里的内容替换掉这一行

#静态图片资源直接走本地
#root /usr/share/nginx/resource/img;
}
location ~ .*\.jsp$ {
proxy_pass http://dynamic_java;
include proxy_params;
}
}

创建并配置代理参数文件

1
vim /etc/nginx/proxy_params
1
2
3
4
5
6
7
8
9
10
11
12
13
#代理到tomcat等服务器时注意要设置请求参数,如果后端服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败,报400错误。故至少要包含proxy_set_header Host $http_host;为了方便,以下配置了跟多的请求参数。
proxy_redirect default;
proxy_set_header Host $http_host;
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;

重新加载nginx配置

1
nginx -s reload

4. 访问测试

在代理主机B主机上编写动静分离的页面做测试

1
vim /usr/share/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: "http://198.23.188.200/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="http://198.23.188.200/logo.jpg" height="200" width="200">
<h2>动态数据:</h2>
<div id="get_data"></div>
</body>
</html>

访问代理主机B主机的测试页面

到这里nginx配置动静分类的应用服务就完成了。

1562580072428

十、配置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/test.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 4433 ssl;
server_name example.com;
#ssl_certificate /etc/letsencrypt/live/example.com/cert.pem;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
#ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
#ssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
charset utf-8;

# http资源服务
location / {
root /opt/test/web;
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. 重载配置

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

3. 测试

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

1
2
mkdir -p /opt/test/web
echo "<h1>Hi, Nginx !</h1>" >> /opt/test/web/index.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 nginx

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

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

1
2
3
4
5
6
7
8
9
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;
# access_log off; # 可选择关闭日志

设 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%