Day 58 NginxHttps
1.1 keepalived
7x24小时不DOWN场景
2台服务器
主 优先级150 virtu_router_id 50 lb01
备 优先级100 virtu_router_id 50 lb02
1.2 列脑(主和备上面都有虚拟IP --->俗称VIP)
解决办法:执行脚本
1.2.1 keepalived造成故障:主和备上都编写一个脚本:
1.备判断自己是否能ping通主
2.检查自己是否存在VIP
3.建议使用kill命令杀死备机的keepalived
1.2.2 Nginx故障,导致请求通过VIP找到Master服务器无法提供服务。
1.检查Nginx的进程是否存在,如果存在则sleep 5秒,再次检查
2.如果不存在,则尝试启动一次Nginx
3.如果启动成功,进入下一步,sleep 5秒
4.如果启动不成功,强制杀掉keepalived让地址漂移至备机
5.建议写在Master上面即可。
1.2.3 keepalived用在哪
1.国企,传统互联网,全是物理服务器
1.2.4 keepalived不能用在哪
1.互联网--->使用公有云的 (LB)
2.公有云不能使用keepalived工具,公有云本身负载均衡支持高可用
1.2.5 面试被问到:你们高可用如何实现的??
我们使用公有云的LB负载均衡,本身厂商就支持高可用,所以这一块我们没做考虑。
但:如果贵公司使用的是硬件服务器,那么也可以使用keepalived开源软件实现高可用。
虚拟机上面:
一台服务器的https
前端负载均衡,后端是web服务器,实现https
阿里云:
ecs 运行一个nginx 启用https
slb+ecs实现https
1.3 Rewrite
1.3.1 什么是rewrite
Rewrite即URL重写,主要实现url地址重写, 以及重定向, 就是把传入Web的请求重定向到其他URL的过程。
1.3.2 Rewrite使用场景
1.URL地址跳转,
1.如用户访问bgx.com将其跳转到xuliangwei.com
2.当用户通过http的方式访问bgx.com时,将其跳转至https的方式访问bgx.com
2.URL伪静态, 将动态页面显示为静态页面方式的一种技术, 便于搜索引擎的录入, 同时减少动态URL地址对外暴露过多的参数, 提升更高的安全性。
3.搜索引擎SEO优化依赖于url路径, 以便支持搜索引擎录入
$request_filename;
http://ds.oldboy.com/nginx.png --》 /soft/code/images/nginx.png
$request_uri;
http://ds.oldboy.com/nginx.png --》 /nginx.png
1.3.3 配置开启Nginx的Rewrite
设置/etc/nginx/nginx.conf配置文件中的错误日志级别为notice(nginx中最低级别的错误)
error_log /var/log/nginx/error.log notice;
1.3.4 在http模块层, 增加一行rewrite_log日志
rewrite_log on;
1.3.5 配置rewrite,测试日志是否生效
location / {
rewrite ^/ https://www.xuliangwei.com;
}
1.3.6 重启nginx具体可能是 service nginx reload等命令OK,接下来你可以到错误日志目录查看具体的rewrite信息了。
2018/09/29 09:29:54 [notice] 1389#1389: *6 "^/" matches "/", client: 10.0.0.1, server: ds.oldboy.com, request: "GET / HTTP/1.1", host: "ds.oldboy.com"
2018/09/29 09:29:54 [notice] 1389#1389: *6 rewritten redirect: "https://www.xuliangwei.com",
1.4 r.oldboy.com
1.4.1 eg 1:用户访问/abc/1.html实际上真实访问是/cc/bb/2.html
1.先配置好真实的路径
server {
listen 80;
server_name r.oldboy.com;
location / {
root /code;
index index.html;
}
}
2.准备对应的站点目录
[root@web03 ~ ]# mkdir /code/cc/bb -p
[root@web03 ~ ]# echo "cc_bb_2" > /code/cc/bb/2.html
[root@web03 ~ ]# systemctl restart nginx
3.配置rewrite跳转规则
[root@web03 conf.d]# cat rewrite.conf
server {
listen 80;
server_name r.oldboy.com;
location / {
root /code;
index index.html;
}
#不区分大小写匹配
location ~* /abc/1.html {
rewrite /abc/1.html /cc/bb/2.html;
}
}
3.配置rewrite跳转规则【修订1次】
[root@web03 conf.d]# cat rewrite.conf
server {
listen 80;
server_name r.oldboy.com;
location / {
root /code;
index index.html;
}
#不区分大小写匹配
location ~* /abc/1.html {
rewrite (.*) /cc/bb/2.html redirect;
}
}
4.配置rewrite跳转规则【修订2次】
[root@web03 conf.d]# cat rewrite.conf
server {
listen 80;
server_name r.oldboy.com;
location / {
root /code;
index index.html;
}
#不区分大小写匹配
location ~* /abc/1.html {
return 302 /cc/bb/2.html;
}
}
1.4.2 eg 2:用户访问/2018/ccc/bbb/2.html实际上真实访问是/2014/ccc/bbb/2.html
#http://www.bgx.com/2018/cc/bb/2.html ==> http://www.bgx.com/2014/cc/bb/2.html
1.先配置好真实的路径
server {
listen 80;
server_name r.oldboy.com;
location / {
root /code;
index index.html;
}
}
2.准备对应的站点目录
[root@web03 ~ ]# mkdir /code/2014/cc/bb -p
[root@web03 ~ ]# echo "2014" > /code/2014/cc/bb/2.html
[root@web03 ~ ]# systemctl restart nginx
3.配置rewrite跳转规则
[root@web03 conf.d]# cat rewrite.conf
server {
listen 80;
server_name r.oldboy.com;
location / {
root /code;
index index.html;
}
#不区分大小写匹配
location ~* /2018/cc/bb/1.html {
rewrite (.*) /2014/cc/bb/2.html;
}
}
1.4.3 eg 3:用户访问/test目录下任何内容, 实际上真实访问是http://www.xuliangwei.com
[root@web03 conf.d]# cat rewrite.conf
server {
listen 80;
server_name r.oldboy.com;
location /test {
rewrite (.*) https://www.xuliangwei.com;
}
}
1.4.4 eg 4:用户访问course-11-22-33.html 实际上真实访问是 /course/11/22/33/course_33.html
1.先配置好真实的路径
server {
listen 80;
server_name r.oldboy.com;
location / {
root /code;
index index.html;
}
}
2.准备对应的站点目录
[root@web03 ~ ]# mkdir /code/course/11/22/33/ -p
[root@web03 ~ ]# echo "bgx123.com" > /code/course/11/22/33/course_33.html
[root@web03 ~ ]# systemctl restart nginx
3.配置rewrite跳转规则
[root@web03 conf.d]# cat rewrite.conf
server {
listen 80;
server_name r.oldboy.com;
location / {
root /code;
index index.html;
#仅针对一条规则
#rewrite ^/course-11-22-33.html /course/11/22/33/course_33.html;
# 如果课程路径都一样, 那这条规则灵活度更高
rewrite ^/(.*)-(.*)-(.*)-(.*).html /$1/$2/$3/$4/$1_$4.html;
}
}
1.4.5 eg 5:将http请求,跳转至https
server {
listen 80;
server_name bgx.com;
rewrite ^(.*) https://$server_name$1 redirect;
#return 302 https://$server_name$request_uri;
}
server {
listen 443;
server_name bgx.com;
ssl on;
}
rewrite指令根据表达式来重定向URI, 或者修改字符串。 可以应用于server,location, if环境下, 每行rewrite指令最后跟一个flag标记,支持的flag标记有如下表格所示:
flag
last 本条规则匹配完成后,停止匹配,不在匹配后面的规则
break 本条规则匹配完成后,停止匹配,不在匹配后面的规则
redirect 返回302临时重定向, 地址栏会显示跳转后的地址
permanent 返回301永久重定向, 地址栏会显示跳转后的地址
1.4.6 临时跳转302
location /test {
rewrite (.*) https://www.xuliangwei.com redirect;
}
每一次浏览器都会询问服务端(浏览器不会记录r.oldboy.com/test---》)
1.4.7 永久跳转301
location /test {
rewrite (.*) https://www.xuliangwei.com permanent;
}
只要浏览器访问一次,会记录这个跳转,下次再也不会询问,直接跳转
对比flag中break与last
1.4.8 公司目前产品有一个url地址是r.oldboy.com/2017_old随着时间的推移,公司希望客户通过新的url访问www.oldboy.com/2019_new需要保证浏览器的url地址不发生变化
root@web03 conf.d]# vim rewrite.conf
server {
listen 80;
server_name r.oldboy.com;
root /code;
location ~ ^/2019_new {
rewrite ^/2019_new /2017_old/ break;
}
location ~ ^/2020_new {
rewrite ^/2020_new /2017_old/ last;
}
location ~ ^/2017_old {
root /code;
index index.html;
}
[root@web03 conf.d]# mkdir /code/2017_old -p
[root@web03 conf.d]# echo "2017_code" > /code/2017_old/index.html
[root@web03 conf.d]# systemctl restart nginx
1.5 last与break对比总结:
last r.oldboy.com/2020_new ----> r.oldboy.com/2017_old
1.last进行Rewrite匹配成功, 停止当前这个请求, 并根据rewrite匹配的规则重新向Server发起一个请求。
2.新请求的内容是域名+URL, 对应的地址为www.oldboy.com/2017_old
break r.oldboy.com/2019_new ----> /2017_old 不存在404
1.break进行Rewrite匹配成功后, 不会像last重新发起请求, 首先查找站点目录下/code/2017_old/默认返回页是否存在, 如不存在则404, 如存在继续往下匹配
2.根据Rewrite匹配的规则, 跳转至r.oldboy.com/2017_old/的URL地址, 匹配成功后则不继续匹配
2.1 配置HTTPS前预备知识
2.1.1 HTTPS证书购买选择
HTTPS证书的选择
专业版OV型证书 不显示企业名称
高级版EV型证书 显示企业名称
2.1.2 HTTPS证书购买的类型 oldboy.com (www m image 二级域名)
保护1个域名 www
保护5个域名 www images cdn test m
通配符域名 *.oldboy.com
2.1.3 HTTPS注意事项
Https不支持续费,证书到期需重新申请进行替换
https不支持三级域名解析 test.m.oldboy.com
Https显示绿色, 说明整个网站的URL都是https的。
Https显示×××, 因为网站代码中包含http的不安全连接。
Https显示红色,要么证书是假的,要么证书过期。
自己颁发的证书统统都是假的(我们只管使用)
2.1.4 配置ssl认证证书
1.检查当前环境
//openssl必须是1.0.2
[root@Nginx ~]# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
//nginx必须有ssl模块
[root@Nginx ~]# nginx -V
--with-http_ssl_module
[root@Nginx ~]# mkdir /etc/nginx/ssl_key -p
[root@Nginx ~]# cd /etc/nginx/ssl_key
2.使用openssl充当CA权威机构创建私钥(生产不可能使用此方式生成证书,不被互联网CA权威承认的黑户证书)
[root@Nginx ssh_key]# openssl genrsa -idea -out server.key 2048
3.生成自签证书,同时去掉私钥的密码
[root@Nginx ssl_key]# openssl req -days 36500 -x509 \
-sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
4.配置Nginx
[root@web03 conf.d]# cat https.conf
server {
listen 443;
server_name s.oldboy.com;
ssl on;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
root /code;
index index.html;
}
}
5.创建目录,启动服务
[root@web03 conf.d]# mkdir /code
[root@web03 conf.d]# echo "Https...." > /code/index.html
[root@web03 conf.d]# systemctl restart nginx
6.配置Host解析
10.0.0.9 s.oldboy.com
7.强制跳转访问http的请求至https
[root@web03 conf.d]# cat https.conf
server {
listen 443;
server_name s.oldboy.com;
ssl on;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
root /code;
index index.html;
}
}
server {
listen 80;
server_name s.oldboy.com;
rewrite (.*) https://$server_name$request_uri redirect;
}
如果添加了flag标记,则会有跳转到https的信息 301。
如果没有添加flag标记,则没有跳转https的信息 200。
2.2 rewrite
2.2.1 开启rewrite日志
测试访问rewrite日志是否能查看到
测试rewrite的匹配规则
rewrite的flag标记
last与break
redirect和permanent
2.2.2 https加密
1.证书的购买
2.https证书购买一个域名,还是多个域名,还是泛域名 oldboy.com
3.https不支持三级域名解析