nginx 的https 功能基于模块ngx_http_ssl_module实现,因此如果是编译安装的nginx要使用参数 ngx_http_ssl_module开启ssl功能,但是作为nginx的核心功能,yum安装的nginx默认就是开启的,编 译安装的nginx需要指定编译参数–with-http_ssl_module开启
ssl on | off;
#为指定的虚拟主机配置是否启用ssl功能,此功能在1.15.0废弃,使用listen [ssl]替代
listen 443 ssl http2;
ssl_certificate /path/to/file;
#指向包含当前虚拟主机和CA的两个证书信息的文件,一般是crt文件
ssl_certificate_key /path/to/file;
#当前虚拟主机使用的私钥文件,一般是key文件
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
#支持ssl协议版本,早期为ssl现在是TLS,默认为后三个,最新的浏览器已经不再支持TLS1.0和TLS1.1
ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
#配置ssl缓存
off: #关闭缓存
none: #通知客户端支持ssl session cache,但实际不支持
builtin[:size]:#使用OpenSSL内建缓存,为每worker进程私有,使用此内置缓存可能会导致内存碎片
[shared:name:size]:#在各worker之间使用一个共享的缓存,需要定义一个缓存名称和缓存空间大小,1M可以存储4000个会话信息,多个虚拟主机可以使用相同的缓存名称
ssl_session_timeout time; #客户端连接可以复用ssl session cache中缓存的有效时长,默认5分钟
#官方示例配置
http {
...
server {
listen 443 ssl;
keepalive_timeout 70;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
ssl_certificate /usr/local/nginx/conf/cert.pem;
ssl_certificate_key /usr/local/nginx/conf/cert.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
...
}
server {
listen 80;
listen 443 ssl http2;
server_name www.wang.org;
ssl_certificate /apps/nginx/certs/www.wang.org.pem;
ssl_certificate_key /apps/nginx/certs/www.wang.org.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
root /data/nginx/html;
}
server {
listen 443 ssl http2;
server_name www.wang.org;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
if ( $scheme = http ) {
rewrite ^/(.*)$ https://www.wang.org/$1 redirect;
}
.....
}
}
rewrite是nginx服务器的重要功能之一,用于实现常用的URL的重写
ngx_http_rewrite_module 模块指令
if 指令
用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行
配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断
Syntax: if (condition) { ... }
Default: —
Context: server, location
使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之
间使用以下符号链接
= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false
set 指令
指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key,另外set定义格式为set $key value,value可以是text, variables和两者的组合
location /set {
root /data/nginx/html/pc;
index index.html;
default_type text/html;
set $name wang;
echo $name;
set $my_port $server_port;
echo $my_port;
}
break 指令
用于中断当前相同作用域(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位
于它前面的配置生效,位于后面的 ngx_http_rewrite_module 模块中指令就不再执行,Nginx服务器
在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在
server块和locationif块中使用
注意: 如果break指令在location块中后续指令还会继续执行,只是不执行 ngx_http_rewrite_module 模
块的指令,其它指令还会执行
return 指令
return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重
定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有
配置都将不被执行,return可以在server、if 和 location块进行配置
Syntax: return code [text];
return code URL;
return URL;
Default: —
Context: server, location, if
http跳转到https
#方法0:死循环,不要使用
server {
listen 80 ;
listen 443 ssl;
ssl_certificate /apps/nginx/ssl/www.wang.org.crt;
ssl_certificate_key /apps/nginx/ssl/www.wang.org.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
server_name www.wang.org ;
root /data/nginx/html/pc;
return https://www.wang.org/;
}
#方法1
server {
listen 80;
server_name www.wang.org;
return 302 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name www.wang.org;
ssl_certificate /etc/nginx/ssl/www.wang.org.crt;
ssl_certificate_key /etc/nginx/ssl/www.wang.org.key;
location / {
root /data/www/html;
}
}
#方法2
server {
listen 80 ;
listen 443 ssl;
ssl_certificate /apps/nginx/ssl/www.wang.org.crt;
ssl_certificate_key /apps/nginx/ssl/www.wang.org.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
server_name www.wang.org ;
root /data/nginx/html/pc;
if ($scheme = http) {
return https://$server_name$request_uri;;
}
location = /nginx_status {
stub_status;
}
}
rewrite 指令
通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,
rewrite主要是针对用户请求的URL或者是URI做具体处理
Syntax: rewrite regex replacement [flag];
Default: —
Context: server, location, if
flag 说明
redirect;
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求;
使用相对路径,或者http://或https://开头,状态码:302
permanent;
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301
break 和 last 区别
rewrite指令中的break和last都属于服务器内部跳转,客户端链接地址不变,客户端无感知
当rewrite规则遇到break指令后,本location{}后续的指令与其他location{}的所有指令都不执行。
当rewrite规则遇到last指令后,本location{}里后续规则不执行,但重写后的url会再次从头开始匹
配所有Location,也包括本location,哪个location先匹配到就执行哪个,可能会造成死循环500错误
防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标 记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗 链,referer就是之前的那个网站域名
基于访问安全考虑,nginx支持通过ngx_http_referer_module模块,检查访问请求的referer信息是否有 效实现防盗链功能
Syntax: valid_referers none | blocked | server_names | string ...;
Default: —
Context: server, location
none:#请求报文首部没有referer首部,比如用户直接在浏览器输入域名访问web网站,就没有referer信息。
blocked:#请求报文有referer首部,但无有效值,比如为空。
server_names:#referer首部中包含本主机名及即nginx 监听的server_name。
arbitrary_string:#自定义指定字符串,但可使用*作通配符。示例: *.wang.org www.wang.*
regular expression:#被指定的正则表达式模式匹配到的字符串,要使用~开头,例如:~.*\.wang\.com
server {
index index.html;
valid_referers none blocked server_names *.wang.com *.wang.org ~\.google\. ~\.baidu\. ~\.bing\. ~\.so\. ~\.sogou\. ; #定义有效的referer
if ($invalid_referer) { #假如是使用其他的无效的referer访问
return 403 "Forbidden Access"; #返回状态码403
#return 302 http://www.wangxiaochun.com/testdir/images/daotu.jpg; #会出现死循环,用下面方式解决
#rewrite ^(.*)$ /testdir/images/daotu.jpg break;#或者返回错误图片
}
......
}