Nginx进阶-常见配置(三)

nginx 变量

Nginx的配置文件使用的语法的就是一门微型的编程语言。既然是编程语言,一般也就少不了“变量”这种东西。

Nginx配置文件使用的语法主要包括以下几个方面:
(1)配置块 (Block Directives):
Nginx配置文件由多个嵌套的配置块组成。
示例配置块如 http, server, 和 location。
配置块以名称开始,后面跟着一对花括号 {},其中包含具体的指令。
(2)指令 (Directives):
指令是Nginx配置的核心组成部分,决定了Nginx如何处理请求。
指令以名称开始,后面跟随一个或多个参数,最后以分号 ; 结束。
示例指令如 listen 80;。
(3)变量 (Variables):
Nginx支持预定义变量,例如 $host 和 $remote_addr,它们在处理请求时动态生成。
(4)上下文 (Contexts):
Nginx配置文件由多个上下文组成,如 http, server, 和 location。
每个上下文可以包含特定类型的指令。
(5)包含 (Includes):
Nginx允许包含其他配置文件,以使主配置文件更加简洁和易于管理。
使用 include 指令来包含其他配置文件,例如 include /etc/nginx/conf.d/*.conf;。
(6)注释 (Comments):
Nginx的配置文件支持使用 # 字符进行注释。

1、nginx变量简介

所有的 Nginx变量在 Nginx 配置文件中引用时都须带上 $ 前缀
在 Nginx 配置中,变量只能存放一种类型的值,而且也只存在一种类型,那就是字符串类型
所有的变量值都可以通过这种方式引用:$变量名

2、nginx 变量的定义和使用

nginx中的变量分为两种:自定义变量与内置预定义变量。

1、自定义变量

1、声明变量可以在sever,http,location等标签中使用set命令声明变量,语法如下

set $变量名 变量值
注意:
nginx 中的变量必须都以$开头
nginx 的配置文件中所有使用的变量都必须是声明过的,否则 nginx 会无法启动并打印相关异常日志

Nginx 变量的创建只能发生在 Nginx 配置加载的时候,或者说 Nginx 启动的时候。而赋值操作则只会发生在请求实际处理的时候。这意味着不创建而直接使用变量会导致启动失败。

2、内置预定义变量

内置预定义变量即无需声明就可以使用的变量,通常包括一个http请求或响应中一部分内容的值,以下为一些常用的内置预定义变量

$arg_PARAMETERGET	请求中变量名PARAMETER参数的值。
$args	这个变量等于GET请求中的参数。例如,foo=123&bar=blahblah;这个变量只可以被修改。
$binary_remote_addr	二进制码形式的客户端地址。
$body_bytes_sent	传送页面的字节数。
$content_length	请求头中的Content-length字段。
$content_type	请求头中的Content-Type字段。
$cookie_COOKIE	cookie COOKIE的值。
$document_root	当前请求在root指令中指定的值。
$document_uri	与$uri相同。
$host	请求中的主机头(Host)字段,如果请求中的主机头不可用或者空,则为处理请求的server名称(处理请求的server的server_name指令的值)。值为小写,不包含端口。
$hostname	机器名使用 gethostname系统调用的值
$http_HEADERHTTP	请求头中的内容,HEADER为HTTP请求中的内容转为小写,-变为_(破折号变为下划线),例如:$http_user_agent(Uaer-Agent的值)。
$sent_http_HEADER	HTTP响应头中的内容,HEADER为HTTP响应中的内容转为小写,-变为_(破折号变为下划线),例如: $sent_http_cache_control, $sent_http_content_type…;
$is_args	如果$args设置,值为"?“,否则为”"。
$limit_rate	这个变量可以限制连接速率。
$nginx_version	当前运行的nginx版本号。
$query_string	与$args相同。
$remote_addr	客户端的IP地址。
$remote_port	客户端的端口。
$remote_user	已经经过Auth Basic Module验证的用户名。
$request_filename	当前连接请求的文件路径,由root或alias指令与URI请求生成。
$request_body	这个变量(0.7.58+)包含请求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比较有意义。
$request_body_file	客户端请求主体信息的临时文件名。
$request_completion	如果请求成功,设为"OK";如果请求未完成或者不是一系列请求中最后一部分则设为空。
$request_method	这个变量是客户端请求的动作,通常为GET或POST。包括0.8.20及之前的版本中,这个变量总为main request中的动作,如果当前请求是一个子请求,并不使用这个当前请求的动作。
$request_uri	这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI。
$scheme	所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect。
$server_addr	服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在listen中指定地址并且使用bind参数。
$server_name	服务器名称。
$server_port	请求到达服务器的端口号。
$server_protocol	请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$uri	请求中的当前URI(不带请求参数,参数位于args),不同于浏览器传递的args),不同于浏览器传递的args),不同于浏览器传递的request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。不包括协议和主机名,例如/foo/bar.html

nginx 监控

1、nginx基础监控

- 进程监控
- 端口监控
注意: 这两个是必须要加在zabbix监控,加触发器有问题及时告警

nginx 提供了 ngx_http_stub_status_module,这个模块提供了基本的监控功能,查看Nginx连接状态。通过HTTP请求来获取与Nginx服务器相关的实时状态信息,包括当前连接数、请求处理情况、响应时间等。

2、监控的指标

1、基本活跃指标

Accepts(接受)、Handled(已处理)、Requests(请求数)是一直在增加的计数器。Active(活跃)、Waiting(等待)、Reading(读)、Writing(写)随着请求量而增减。

2、服务器错误率

通过监控固定时间间隔内的错误代码(4XX代码表示客户端错误,5XX代码表示服务器端错误)。

3、请求处理时间

请求处理时间也可以被记录在 access log 中,通过分析 access log,统计请求的平均响应时间。 ----$request_time 变量

1、nginx Stub Status 监控模块安装
​
先使用命令查看是否已经安装这个模块:

# -V会显示版本号和模块等信息、小写v仅显示版本信息
~]# nginx -V

注意:是如果没有此模块,需要重新安装,编译命令如下:
./configure –with-http_stub_status_module
具体的使用方法是在执行 ./configure 时,指定 --with-http_stub_status_module,然后通过配置:

~]# vim /etc/nginx/conf.d/status.conf 
server {
        listen 80;
        server_name localhost;
        location /nginx-status {
                stub_status     on;
                #access_log      on;
                # 可选参数,允许指定IP地址或IP段来限制访问
                # allow 127.0.0.1;
                # allow 192.168.0.0/24;
                # deny all;
                }
}
​
2、nginx 状态查看

配置完成后在浏览器中输入192.168.175.128/nginx-status 查看显示信息如下:

Active connections: 2    当前nginx处理请求的数目,即​活跃的连接数 2个
server accepts handled requests   #连接数 成功连接数(握手) 处理请求数
 9 9 29 
Reading: 0 Writing: 1 Waiting: 0 

失败连接=连接数(accepts)-成功连接数(handled)(相等表示中间没有失败的),
Reading : nginx读取到客户端的Header信息数。请求头   -----速度快。 
Writing :nginx返回给客户端的Header信息数。响应头       
Waiting :开启keep-alive的情况下,即nginx已处理完正在等候下一次请求指令的驻留连接。
connection    #连接数,tcp连接                             
request       #http请求,GET/POST/DELETE/UPLOAD
长连接(驻留连接)
keepalive_timeout设置为0意味着禁用长连接(Keep-Alive)功能
长连接是指在一个TCP连接上可以发送多个HTTP请求,在所有的请求处理完成后,保持该
连接处于打开状态,以便后续请求复用。这样可以减少TCP连接的建立和关闭的开销,提高服务器的性能。

默认情况下,keepalive_timeout的值是75s。当一个连接的空闲时间超过了keepalive_timeout
的值,Nginx会主动关闭这个连接。

当将keepalive_timeout设置为0时,表示没有空闲时间限制,即不等待客户端主动关闭连接,
而立即关闭连接。这样做可以节省服务器的资源,但也会增加服务器与客户端建立连接的频率。
3、Stub Status 参数说明

基于脚本监控nginx的端口
[root@nginx-server ~]# vim check_port.sh
#!/usr/bin/bash
curl -I http://127.0.0.1 &> /dev/null
if [ $? -ne 0 ];then
        echo "nginx 未运行,正在启动中..."
        sleep 1
        systemctl start nginx
        echo "正在检查nginx是否启动..."
        port=`netstat -lntp | grep nginx |awk '{print $4}' | awk -F':' '{print $NF}'`
        echo "nginx已经启动,端口为: $port"
fi

HTTPS 基本原理

HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并不是一个新鲜协议,Google 很早就开始启用了,初衷是为了保证数据安全。 国内外的大型互联网公司很多也都已经启用了HTTPS,这也是未来互联网发展的趋势。

1、加密算法

1. 对称加密

加密和解密使用相同的密钥。这意味着发送方和接收方都需要共享同一个密钥来进行加密和解密操作。
对称加密算法的原理:
A要给B发送数据:A做一个对称密钥,使用密钥给文件加密,发送加密后的文件和钥匙,B拿钥匙解密

2. 非对称加密

公钥加密且可以自由共享,私钥解密且必须保密

A要给B发送数据
B做一对非对称的密钥,发送公钥给A,A拿公钥对数据进行加密,发送加密后的数据给B,B拿私钥解密

3. 哈希算法

一种数学函数,可以将任意长度的信息映射为固定长度的值,通常其长度要比信息小得多。

例如:MD5、SHA-1、SHA-2(如SHA-256) 等(推荐SHA-256安全性高)

md5sum:计算文件的MD5哈希值生成唯一的128位哈希值,用于校验文件的完整性和验证文件的一致性。

md5sum [文件路径]

4. 数字签名

数字签名是一种用于验证文件或文档的完整性和真实性的技术。它是通过使用非对称加密算法的公钥和私钥来实现的。

签名就是在信息的后面再加上一段内容(信息经过hash后的值),可以证明信息没有被修改过。
hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。
数字签名的过程如下:
1. 发送者使用私钥对数据进行哈希。哈希算法生成唯一的固定长度哈希值,唯一表示文件内容。
2. 发送者使用私钥对哈希值进行加密,生成数字签名。
3. 发送者将数据和数字签名一起发送给接收者。
4. 接收者使用发送者的公钥对数字签名进行解密,得到哈希值。
5. 接收者对接收的数据使用相同哈希算法进行哈希,生成新的哈希值。
6. 接收者比对解密生成的哈希值和自己计算的哈希值。如果一致,说明文件的内容没有被篡改过,数字签名有效。

2、HTTPS 协议介绍

  • HTTP 协议(HyperText Transfer Protocol,超文本传输协议):是客户端浏览器与Web服务器之间的应用层通信协议 。

  • HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer,超文本传输安全协议):HTTP+SSL/TLS,  HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL,用于安全的 HTTP 数据传输。

如上图所示 HTTPS 相比 HTTP 多了一层 SSL/TLS

SSL/TLS

SSL(Secure Sockets Layer 安全套接层协议)TLS(Transport Layer Security,传输层安全协议)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层为数据通讯进行加密提供安全支持。

SSL协议提供的服务主要有:

 ssl:身份认证和数据加密。保证数据完整性
1)认证用户和服务器,确保数据发送到正确的客户机和服务器;
2)加密数据以防止数据中途被窃取;
3)维护数据的完整性,确保数据在传输过程中不被改变。 

3、HTTPS 原理

1. HTTP 访问过程

如上图所示,HTTP请求过程中,客户端与服务器之间没有任何身份确认的过程,数据全部明文传输,“裸奔”在互联网上。这意味着在传输过程中,攻击者可以拦截和窃听数据,包括用户的敏感信息(如用户名、密码等)或其他数据。

可以看到,客户端发出的请求很容易被黑客截获,如果此时黑客冒充服务器,则其可返回任意信息给客户端,而不被客户端察觉。

2. HTTP 传输面临的风险

- 窃听风险:黑客可以获知通信内容。
- 篡改风险:黑客可以修改通信内容。
- 冒充风险:黑客可以冒充他人身份参与通信。

3. SSL证书

那有没有一种方式既可以安全的获取公钥,又能防止黑客冒充呢? 那就需要用到终极武器了:SSL 证书(申购)

证书:.crt, .pem
私钥:.key
证书请求文件:.csr

SSL 证书具体内容
(1)证书的发布机构CA
(2)证书的有效期
(3)公钥
(4)证书所有者
(5)签名 ----- 签名就可以理解为是钞票里面的一个防伪标签。
校验SSL证书过程

客户端在接受到服务端发来的SSL证书时,会对证书的真伪进行校验,以浏览器为例说明如下:

(1)首先浏览器读取证书中的证书所有者、有效期等信息进行一一校验
(2)浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的
    颁发者CA比对,用于校验证书是否为合法机构颁发
(3)如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。
(4)如果找到,那么浏览器就会从操作系统中取出颁发者CA的公钥,然后对服务器发来的证书
    里面的签名进行解密
(5)浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证
    书中签名做对比
(6)对比结果一致,则证明服务器发来的证书合法,没有被冒充
(7)此时浏览器就可以读取证书中的公钥,用于后续加密了
(8)client与web协商对称加密算法,client生成对称加密密钥并使用web公钥加密,发送给
    web服务器,web服务器使用web私钥解密 
(9)使用对称加密密钥传输数据,并校验数据的完整性

通过发送SSL证书的形式,既解决了公钥获取问题,又解决了黑客冒充问题,一箭双雕,HTTPS加密过程也就此形成

相比HTTP,HTTPS 传输更加安全的原因
(1) 所有信息都是加密传播,黑客无法窃听。
(2) 具有校验机制,一旦被篡改,通信双方会立刻发现。
(3) 配备身份证书,防止身份被冒充。

4. CA 机构

CA(Certificate Authority)证书颁发机构主要负责证书的颁发、管理以及归档和吊销。证书内包含了拥有证书者的姓名、地址、电子邮件帐号、公钥、证书有效期、发放证书的CA、CA的数字签名等信息。证书主要有三大功能:加密、签名、身份验证。

阿里云申请配置ssl证书---实战

1.准备一台阿里云服务器,我的机器在香港

2.准备一个域名

3.申请ssl证书

开始配置信息

到这需要等待大约10几分钟!然后刷新

先查看帮助文档

然后在下载

http配置为https

阿里云配置证书案例:

yum安装nginx  ----略
将证书上传到服务器中
1.首先在服务器创建存放证书的文件夹
~]# cd /etc/nginx/ && mkdir cert
2.将证书文件复制到服务器对应的文件夹中
~]# ls
2447549_www.testpm.cn_nginx.zip
~]# unzip 2447549_www.testpm.cn_nginx.zip
~]# cp 2447549_www.testpm.cn* /etc/nginx/cert/
~]# cd /etc/nginx/cert/
改名:
[root@nginx cert]# mv 2447549_www.testpm.cn.key www.testpm.cn.key 
[root@nginx cert]# mv 2447549_www.testpm.cn.pem www.testpm.cn.pem
3.证书配置如443端口、证书路径、私钥路径等相关内容
证书复制完成之后,可以对nginx配置文件进行更改,使用vim命令
[root@nginx ~]# cd /etc/nginx/conf.d/
[root@nginx conf.d]# vim /etc/nginx/conf.d/nginx_ssl.conf 
server {
    listen 443 ssl;  #指定https端口443
    server_name www.testpm.cn;
    access_log  /var/log/nginx/https_access.log  main;
​
    ssl_certificate   /etc/nginx/cert/www.testpm.cn.pem; #指定证书路径
    ssl_certificate_key  /etc/nginx/cert/www.testpm.cn.key; #指定私钥路径
    ssl_session_timeout 5m; #配置用于SSL会话的缓存
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #指定使用的协议
    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; 
        #密码指定为OpenSSL支持的格式
    ssl_prefer_server_ciphers on;  #设置协商加密算法。
​
    location / {
        root  /usr/share/nginx/html;
        index index.html index.htm;
    }
}

80转443端口

server {
    listen 80;
    server_name www.testpm.cn;
    location / {
        #return 301 http://$host$request_url;
        rewrite .* https://www.testpm.cn permanent;
    }
}

80/443均可访问

在一个 server 里面同时监听 80 和 443 两个端口

server {
    listen 80;
    listen 443 ssl;
    server_name  www.testpm.cn;    # IP或域名
    ssl_certificate  /etc/nginx/cert/www.testpm.cn.pem;         # 证书路径
    ssl_certificate_key /etc/nginx/cert/www.testpm.cn.key;      # 私钥路径
    ssl_session_timeout 5m;
    ssl_protocols SSLv2 SSLv3 TLSv1;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers on;
    client_max_body_size 50M;
    client_body_buffer_size 2M;

    location / {
        root  /usr/share/nginx/html;
        index index.html index.htm;
        try_files $uri $uri/ @router;
    }
}

需要给域名做一个解析,香港的服务器添加一个A记录即可

解析完成之后大约需要等待3-5分钟

测试访问

访问成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值