Nginx服务部署与配置(Day.2)
一、HTTPS访问配置[自签名]
1.1 SSL简介
SSL (Secure Sockets Layer)安全套接层。是由Netscape(网景)公司于1990年开发,用于保障Word Wide Web(WWW)通讯的安全。主要任务是提供私密性,信息完整性和身份认证。1994年改版为SSLv2,1995年改版为SSLv3.
TLS(Transport Layer Security)安全传输层协议,)用于在两个通信应用程序之间提供保密性和数据完整性。该标准协议是由IETF于1999年颁布,整体来说TLS非常类似SSLv3,只是对SSLv3做了些增加和修改。
1.2 SSL协议介绍
SSL是一个不依赖于平台和应用程序的协议,位于TCP/IP协议与各种应用层协议之间,为数据通信提高安全支持。
1.3 传输过程
-
首先发送数字证书,获取到可信的public key。
-
通过public key发送对称秘钥,接收方用私钥解密。
-
通信双方使用仅仅对方可知的对称秘钥进行加密传输。
1.5 OpenSSL介绍
OpenSSL是一个实现安全套接字层的加密工具包,openssl程序是一个命令行工具,用于使用OpenSSL加密库的加密函数。它可以用于:
-
创建和管理私钥、公钥和参数
-
公钥密码操作
-
创建X.509证书、CSR和CRT
-
消息摘要的计算
-
密码加密和解密
-
SSL/TLS客户端和服务器测试
-
处理S/MIME签名或加密邮件
-
时间戳请求、生成和验证
1.6 HTTPS 工作流程(背会)
-
客户端(浏览器)访问 https://www.baidu.com 百度网站;
-
百度服务器返回 HTTPS 使用的 CA 证书;
-
浏览器验证 CA 证书是否为合法证书;
-
验证通过,证书合法,生成一串随机数并使用公钥(证书中提供的)进行加密;
-
发送公钥加密后的随机数给百度服务器;
-
百度服务器拿到密文,通过私钥进行解密,获取到随机数(公钥加密,私钥解密,反之也可以);
-
百度服务器把要发送给浏览器的内容,使用随机数进行加密后传输给浏览器;(对称加密)
-
此时浏览器可以使用随机数进行解密,获取到服务器的真实传输内容。
案例:
[root@nginx1 ~]#openssl genrsa -out rsa1024.key 1024
[root@nginx1 ~]#openssl req -new -key rsa1024.key -out rsa1024.csr
[root@nginx1 ~]#openssl x509 -req -days 365 -in rsa1024.csr -signkey rsa1024.key -out rsa1024.crt
1.7 自签名证书
[root@nginx1 ~]# mkdir /usr/share/nginx/pki/private -p
#生成私钥文件(包含公钥和私钥)
[root@nginx1 ~]# cd /usr/share/nginx/pki/private
[root@nginx1 private]# openssl genrsa -out nginx.key
#查看私钥文件:
[root@nginx1 private]# openssl rsa -in nginx.key -text
#生成证书请求文件
[root@nginx1 ~]# cd /usr/share/nginx/
[root@nginx1 nginx]# openssl req -new -key ./private/nginx.key -out nginx.csr
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]:jx
Organizational Unit Name (eg, section) []:2310
Common Name (eg, your name or your server's hostname) []:www.jx.com
Email Address []:2310@jx.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:jx
#生成证书
[root@nginx1 ~]# cd /etc/pki/nginx
[root@nginx1 nginx]# openssl x509 -req -days 3650 -in nginx.csr -signkey ./private/nginx.key -out nginx.crt
#查看证书:
[root@nginx1 nginx]# openssl x509 -req -days 3650 -in nginx.csr -signkey ./private/nginx.key -text
1.8 nginx配置SSL
server {listen 443 ssl;server_name www.jx.com;
ssl_certificate ../pki/nginx/nginx.crt;ssl_certificate_key ../pki/nginx/private/nginx.key;
ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;
location / {root html;index index.html index.htm;}}
1.9 测试
[root@nginx2 ~]# curl -k https://192.168.115.111
二、 location配置
2.1 作用
配置路径
location [ = | ~ | ~* | ^~ ] uri {...
}
##在浏览器中输入的:http://www.jx.com/s?id=1&test=123,称作URL,即:统一资源定位符
##在WEB服务器中,对资源进行标识,URI,即统一资源标识符
写在server字段中。
2.2 匹配规则
-
= 精确匹配;
-
~ 正则匹配,区分大小写;
-
~* 正则匹配,不区分大小写;
-
^~ 匹配到即停止搜索;
2.3 匹配优先级
= > ^~ > ~ > ~* > 不带任何字符 “/”。
2.4 配置案例
server {listen 80;server_name www.jx.com;# 只有当访问 www.jx.com/info.html 时才会匹配到/usr/share/nginx/html/info.htmllocation = /info.html { # 必须是匹配文件root /usr/share/nginx/html;}# 当访问 www.jx.com/1.jpg 等路径时会去 /usr/share/nginx/images/1.jpg 找对应的资源location ~ \.(jpeg|jpg|png|svg)$ {root /usr/share/nginx/html/images;}# 当访问 www.jx.com/bbs/ 时会匹配上 /usr/share/nginx/html/bbs/index.htmllocation ^~ /bbs/ {root /usr/share/nginx/html;index index.html index.htm;}
}
1、location 中的反斜线,代表后面的名字是一个文件夹名
location /test {...
}
##以上写法会优先查找目录,若目录不存在则查找同名文件
location /test/ {...
}
2、return
停止处理请求,直接返回响应码或重定向到其他 URL ;执行 return 指令后, location 中后续指令将不会被执行。
return code [text];
return code URL;
return URL;例如:
location / {return 404; # 直接返回状态码
}location / {return 404 "pages not found"; # 返回状态码 + 一段文本
}location / {return 302 http://192.168.158.46/bbs ; # 返回状态码 + 重定向地址
}location / {return https://www.baidu.com ; # 返回重定向地址
}
三、rewrite配置
根据指定正则表达式匹配规则,重写 URL 。应用场景: 新老域名的更替!!!
3.1 语法
rewrite 正则表达式 要替换的内容 [flag];
3.2 可写入字段
server、location、if
示例:
rewirte /images/(.*\.jpg)$ /pic/$1; # $1是前面括号(.*\.jpg)的反向引用
flag 可选值的含义:
-
last: 重写后的 URL 发起新请求,再次进入 server 段,重试 location 的中的匹配;
-
break :直接使用重写后的 URL ,不再匹配其它 location 中语句;
-
redirect :返回 302 临时重定向;
-
permanent :返回 301 永久重定向。
3.3 配置案例
server{listen 80;server_name www.jx.com; # 要在本地hosts文件进行配置root /usr/share/nginx/html;location /search {rewrite ^/(.*) https://www.baidu.com redirect;}location /images {rewrite /images/(.*) /pics/$1;}location /pics {rewrite /pics/(.*) /photos/$1;}location /photos {}
}
###生产环境不能使用.*,表示匹配任意!!!
#解析:
#当访问 www.jx.com/search 时,会自动帮我们重定向到 https://www.baidu.com;
#当访问 www.jx.com/images/1.jpg 时,第一步重写 URL 为 www.jx.com/pics/1.jpg ,找到 pics 的 location ,继续重写 URL 为 www.jx.com/photos/1.jpg ,找到 /photos 的 location 后,去 html/photos 目录下寻找 1.jpg 静态资源。
3.4 if 指令
语法:if (condition) {...}
可写字段:server、location
示例:
location / {if ($http_user_agent ~ Chrome) {rewrite /(.*) /Chrome/$1 break;}if ($http_user_agent ~ Firefox) {rewrite /(.*) /Firefox/$1 break;}}
##测试192.168.115.111/index.html
set $var value; #设置变量
condition 判断条件:
-
$variable 仅为变量时,值为空或以0开头字符串都会被当做 false 处理;
-
= 或 != 相等或不等;
-
~ 正则匹配;
-
! ~ 非正则匹配;
-
~* 正则匹配,不区分大小写;
-
-f 或 ! -f 检测文件存在或不存在;
-
-d 或 ! -d 检测目录存在或不存在;
-
-e 或 ! -e 检测文件、目录、符号链接等存在或不存在;
-
-x 或 ! -x 检测文件可以执行或不可执行;
配置实例
server {listen 8080;server_name www.jx.com;root /usr/share/nginx/html;location / {if ( $uri = "/images/" ){rewrite (.*) /pics/ break;}}
}
#当访问 www.jx.com/images/ 时,会进入 if 判断里面执行 rewrite 命令。
3.5 autoindex
用户请求以 / 结尾时,列出目录结构,可以用于快速搭建静态资源下载网站。
注意: 不要在有混合业务的站点开启该功能,容易被攻击。
autoindex.conf 配置信息:
server {listen 80;server_name www.jx.com;location /download/ {root /usr/share/nginx/html;autoindex on; # 打开 autoindex,,可选参数有 on | offautoindex_exact_size on; # 修改为off,以KB、MB、GB显示文件大小,默认为on,以bytes显示出⽂件的确切⼤⼩autoindex_format html; # 以html的方式进行格式化,可选参数有 html | json | xmlautoindex_localtime off; # 显示的⽂件时间为⽂件的服务器时间。默认为off,显示的⽂件时间为GMT时间}
}
#当访问 www.jx.com/download/ 时,会把服务器 /usr/share/nginx/html/download/ 路径下的文件展示出来.
3.6 nginx配置中的常用变量
变量名 | 含义 |
---|---|
remote_add | 客户端IP地址 |
remote_port | 客户端端口 |
server_addr | 服务端IP地址 |
Server_port | 服务端端口 |
server_protocol | 服务端协议 |
binary_remote_addr | 二进制格式的客户端IP地址 |
connection | TCP连接的序号,递增 |
connection_request | TCP连接当前的请求数量 |
uri | 请求的URL,不包含参数 |
request ur | 请求的URL,包含参数 |
scheme | 协议名,http或https |
request metho | 请求方法 |
request_length | 全部请求的长度,包含请求行、请求头、请求体 |
args | 全部参数字符串 |
arg_参数名 | 获取特定参数值 |
is_args | URL中是否有参数,有的话返回?,否则返回空 |
query_string | 与args相同 |
host | 请求信息中的Host,如果请求中没有Host行,则在请求头中找,最后 使用nginx中设置的server_name。 |
http_user_agent | 用户访问方式 |
http_referer | 从哪些链接过来的请求 |
http_via | 每经过一层代理服务器,都会添加相应的信息 |
http_cookie | 获取用户cookie |
request time | 处理请求已消耗的时间 |
https | 是否开启了https,是则返回on,否则返回空 |
request_filename | 磁盘文件系统待访问文件的完整路径 |
document_root | 由URI和root/alias规则生成的文件夹路径 |
limit_rate | 返回响应时的速度上限值 |
配置案例
server{listen 8081;server_name www.jx.com;root /usr/share/nginx/html;location / {return 200 "
remote_addr: $remote_addr
remote_port: $remote_port
server_addr: $server_addr
server_port: $server_port
server_protocol: $server_protocol
binary_remote_addr: $binary_remote_addr
connection: $connection
uri: $uri
request_uri: $request_uri
scheme: $scheme
request_method: $request_method
request_length: $request_length
args: $args
arg_pid: $arg_pid
is_args: $is_args
query_string: $query_string
host: $host
http_user_agent: $http_user_agent
http_referer: $http_referer
http_via: $http_via
request_time: $request_time
https: $https
request_filename: $request_filename
document_root: $document_root
";}
}
当我们访问 http://www.jx.com/时,由于 Nginx 中写了 return 方法,因此浏览器会默认为我们下载一个文件,下面展示的就是下载的文件内容:
remote_addr: 192.168.115.112
remote_port: 56838
server_addr: 192.168.115.111
server_port: 8081
server_protocol: HTTP/1.1
binary_remote_addr: 茉
connection: 126
uri: /test/
request_uri: /test/?pid=121414&cid=sadasd
scheme: http
request_method: GET
request_length: 518
args: pid=121414&cid=sadasd
arg_pid: 121414
is_args: ?
query_string: pid=121414&cid=sadasd
host: var.lion-test.club
http_user_agent: Mozilla/5.0 (Windows NT 7.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0
http_referer:
http_via:
request_time: 0.000
https:
request_filename: /usr/share/nginx/html/test/
document_root: /usr/share/nginx/html
四、配置Nignx状态统计
4.1、下载vts模块
https://github.com/vozlt/nginx-module-vts
4.2、编译nginx
tar xf nginx-module-vts-master.zip
cd nginx-1.22.1/
./configure --prefix=/usr/local/nginx/ --add-module=/home/nginx-module-vts-master && make && make install
4.3、配置状态统计页面
user nginx;
worker_processes 1;
error_log logs/error.log info;
pid logs/nginx.pid;
events {worker_connections 1024;
}
http {include mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';sendfile on;keepalive_timeout 65;gzip on;##添加如下配置###vhost_traffic_status_zone;server {listen 80;server_name localhost;charset utf-8;access_log logs/$server_addr.access.log main;location / {root html;index index.html index.htm;}##添加如下配置####location /status {vhost_traffic_status_display;vhost_traffic_status_display_format html;}error_page 404 /404.html;location = /404.html {root html;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
}
4.4、访问状态统计页面
http://192.168.166.9/status