浅谈ngx_http_ssl_module模块

1️⃣ ngx_http_ssl_module

这个模块全部用于http、server区域中

  • 配置参数
ssl on | off;  #为指定的虚拟主机配置是否启⽤ssl功能,此功能在1.15.0废弃,使⽤listen [ssl]替代。
 
ssl_certificate /path/to/file; #当前虚拟主机使⽤使⽤的公钥⽂件,⼀般是crt⽂件
 
ssl_certificate_key /path/to/file; #当前虚拟主机使⽤的私钥⽂件,⼀般是key⽂件
 
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];  #⽀持ssl协议版本,早期为ssl,现在是TSL,
默认为后三个
 
ssl_session_cache off | none | [builtin[:size]] [shared:name:size]; #配置ssl缓存    
      off: 关闭缓存    
      none:  通知客⼾端⽀持ssl session cache,但实际不⽀持    
      builtin[:size]:使⽤OpenSSL内建缓存,为每worker进程私有    
      [shared:name:size]:在各worker之间使⽤⼀个共享的缓存,需要定义⼀个缓存名称和缓存空间⼤⼩,⼀兆 
      可以存储4000个会话信息,多个虚拟主机可以使⽤相同的缓存名称。
 
ssl_session_timeout time;#客⼾端连接可以复⽤ssl session cache中缓存的有效时⻓,默认5m 
  • ngx_http_ssl_module参数示例:
# 生成自签名证书
mkdir /etc/nginx/certs
cd /etc/nginx/certs

openssl req  -newkey rsa:4096 -nodes -sha256 -keyout ca.key  -x509 -days 3650 -out ca.crt 
Generating a 4096 bit RSA private key
..................................................................................................................................................................................................................++
..................................................++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:test.com
Organizational Unit Name (eg, section) []:test.com
Common Name (eg, your name or your server's hostname) []:www.test.com    
Email Address []:

# ⾃制key和csr⽂件
openssl req  -newkey rsa:4096 -nodes -sha256 -keyout www.test.com.key     -out  www.test.com.csr 
Generating a 4096 bit RSA private key
................................................................................................................................................................................++
...............................................................++
writing new private key to 'www.test.com.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN  
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:test.com
Organizational Unit Name (eg, section) []:test.com
Common Name (eg, your name or your server's hostname) []:www.test.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@cenot7-7 certs]# ll
total 16
-rw-r--r-- 1 root root 2004 Jan  9 16:18 ca.crt
-rw-r--r-- 1 root root 3268 Jan  9 16:18 ca.key
-rw-r--r-- 1 root root 1691 Jan  9 16:21 www.test.com.csr
-rw-r--r-- 1 root root 3268 Jan  9 16:21 www.test.com.key

# 签发证书
openssl x509 -req -days 3650 -in  www.test.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial  -out www.test.com.crt
Signature ok
subject=/C=CN/ST=BJ/L=BJ/O=test.com/OU=test.com/CN=www.test.com
Getting CA Private Key

# 查看证书内容
openssl x509 -in www.test.com.crt  -noout -text 

# 配置证书
server {
        listen 443 ssl ;
        server_name www.test.com ;
        root /app/website1;
        ssl_certificate /etc/nginx/certs/www.test.com.crt;
        ssl_certificate_key /etc/nginx/certs/www.test.com.key;
        ssl_session_cache shared:ssl_cache:5m;
        ssl_session_timeout 5m;
}

2️⃣ ngx_http_rewrite_module

  • Nginx服务器利⽤ngx_http_rewrite_module 模块解析和处理rewrite请求,
  • 此功能依靠 PCRE(perl compatible regularexpression),因此编译之前要安装PCRE库,
  • rewrite是nginx服务器的重要功能之⼀,⽤于实现URL的重 写,URL的重写是⾮常有⽤的功能
  • 官方文档:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html

🅿 if指令

⽤于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进⾏配置, Nginx的if语法仅能使⽤if做单次判断,不⽀持使⽤if else或者if elif这样的多重判
在这里插入图片描述

  • condition
    使⽤正则表达式对变量进⾏匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间使⽤以下 符号链接:
    # 比较操作符
    =: #⽐较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false。 
    !=: #⽐较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false。 
    ~: #表⽰在匹配过程中区分⼤⼩写字符,(可以通过正则表达式匹配),满⾜匹配条件为真,不满⾜为假。 
    !~:#为区分⼤⼩写字符且匹配结果不匹配,不满⾜为真,满⾜为假。
    
    ~*: #表⽰在匹配过程中不区分⼤⼩写字符,(可以通过正则表达式匹配),满⾜匹配条件为真,不满⾜为假。 
    !~*: #为不区分⼤⼩字符且匹配结果不匹配,满⾜为假,不满⾜为真。
    
    # 文件及目录存在性判断
    -f 和 ! -f: #判断请求的⽂件是否存在和是否不存在 
    -d 和 ! -d: #判断请求的⽬录是否存在和是否不存在。 
    -x 和 ! -x: #判断⽂件是否可执⾏和是否不可执⾏。 
    -e 和 ! -e: #判断请求的⽂件或⽬录是否存在和是否不存在(包括⽂件,⽬录,软链接)
  • 示例如下:
if ( $scheme = http ){       
    return / https://wwww.studylinu.xyz;     
} 
if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
}
if ($request_method = POST) {
    return 405;
}
if ($slow) {
    limit_rate 10k;
}
if ($invalid_referer) {
    return 403;
}

# 注: 如果$变量的值为空字符串或是以0开头的任意字符串,则if指令认为该条件为false,其他条件为true

🅿 set指令

  • 指定key并给其定义⼀个变量,变量可以调⽤Nginx内置变量赋值给key
  • 另外set定义格式为set $key $value
  • ⽆论是key还是value都要加$符号。

🅿 break指令

  • ⽤于中断当前相同作⽤域(location)中的其他Nginx配置,与该指令处于同⼀作⽤域的Nginx配置中,位于它前⾯的 配置⽣效,位于后⾯的指令配置就不再⽣效了
  • Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上⼀层作⽤域继续向下读取配置
  • 该指令可以在server块和location块以及if块中使⽤

🅿 return指令

  • return⽤于完成对请求的处理,并直接向客⼾端返回响应状态码
  • ⽐如其可以指定重 定向URL(对于特殊重定向状态码,301/302等)
  • 或者是指定提⽰⽂本内容(对于特殊状态码403/500等),处于此指令 后的所有配置都将不被执⾏
  • return可以在server、if和location块进⾏配
    在这里插入图片描述
  • 示例:
return code; #返回给客⼾端指定的HTTP状态码 
return code (text); #返回给客⼾端的状态码及响应体内容,可以调⽤变量 
return code URL; #返回给客⼾端的URL地址

location /main {    
  root /data/nginx/html/pc;    
  default_type text/html;    index index.html;      
  if ( $scheme = http ){        
    #return 666;        
    #return 666 "not allow http";        
    #return 301 http://www.baidu.com;        
    return 500 "service error";        
    echo "if-----> $scheme"; #return后⾯的将不再执⾏     
  }
}

🅿 rewrite_log指令

  • 设置是否开启记录ngx_http_rewrite_module模块⽇志记录到error_log⽇志⽂件当中
  • 可以配置在http、server、 location或if当中
  • 需要⽇志级别为notice

🅿 rewrite指令

通过正则表达式的匹配来改变URI,可以同时存在⼀个或多个指令,按照顺序依次对URI进⾏匹配,rewrite主要是 针对⽤⼾请求的URL或者是URI做具体处理,以下是URL和URI的具体介绍

URI(universal resource identifier):通⽤资源标识符,标识⼀个资源的路径,可以不带协议。 
URL(uniform resource location):统⼀资源定位符,是⽤于在Internet中描述资源的字符串,是URI的⼦集, 
主要包括传输协议(scheme)、主机(IP、端⼝号或者域名)和资源具体地址(⽬录和⽂件名)等三部分,⼀般格式为
 scheme://主机名[:端⼝号][/资源路径],如:http://www.a.com:8080/path/file/index.html就是⼀个URL 路径,URL必须带访问协议。
 每个URL都是⼀个URI,但是URI不都是URL。
 
例如: 
http://example.org:8080/path/to/resource.txt  #URI/URL 
ftp://example.org/resource.txt   #URI/URL 
/absolute/path/to/resource.txt   #URI
  • rewrite的官⽅介绍地址:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite,
  • rewrite可 以配置在server、location、if,其具体使⽤⽅式为
    在这里插入图片描述
  • rewrite将⽤⼾请求的URI基于regex所描述的模式进⾏检查,匹配到时将其替换为表达式指定的新的URI。
  • 注意
    • 如果在同⼀级配置块中存在多个rewrite规则,那么会⾃下⽽下逐个检查;
    • 被某条件规则替换完成后,会重新⼀轮 的替换检查,隐含有循环机制,但不超过10次;
    • 如果超过,提⽰500响应码,[flag]所表⽰的标志位⽤于控制此循环 机制
    • 如果替换后的URL是以http://或https://开头,则替换结果会直接以重向返回给客⼾端, 即永久重定向301

🅿 rewrite flag使⽤介绍

  • 利⽤nginx的rewrite的指令,可以实现url的重新跳转
  • rewrtie有四种不同的flag,分别是redirect(临时重定向)、 permanent(永久重定向)、break和last
  • 前两种是跳转型的flag,跳转型是指有客⼾端浏览器重新对新地址进⾏请求
  • 后两种是代理型,代理型是在WEB服务器内部实现跳转的
redirect; #临时重定向,重写完成后以临时重定向⽅式直接返回重写后⽣成的新URL给客⼾端,由客⼾端重新发起请求;
           使⽤相对 路径,或者http://或https://开头,状态码:302
 
permanent; #重写完成后以永久重定向⽅式直接返回重写后⽣成的新URL给客⼾端,由客⼾端重新发起请求,状态码:301
 
last; #重写完成后停⽌对当前URI在当前location中后续的其它重写操作,⽽后对新的URL启动新⼀轮重写检查,
       不建议在 location中使⽤
 
break; #重写完成后停⽌对当前URL在当前location中后续的其它重写操作,⽽后直接将匹配结果返还给客⼾端即结束循环
        并返回数据给客⼾端,建议在location中使⽤
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值