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中使⽤