linux9期架构-宋阳阳-day21
课前回顾
KVM服务可以在linux上做虚拟机
禁ping(centos开启或关闭ping)
集群前后端分离接口(api接口):
作用:前端服务器(web)的api接口与后端服务器的(tomcat,)api接口的服务器连接
SEO与浏览器搜索出来的网站排名有关
浏览器URL中的变量是用来调用数据库的
关系型数据库:
非关系型数据库:
网页
#什么是动态页,静态页,伪静态页
URL中,'需要调用数据库',返回的网页,就是动态页(?就是传参,就是在访问数据库)
URL中,'静态页不需要调用数据库',URL中显示准确的路径
URL中,静态页需要调用数据库,'URL中显示伪造的路径',那么这个网页叫伪静态页
访问某一资源,需要调用数据库,那么这个资源就是动态的,否则就是静态的,'静态与动态的区分与文件的种类无关,只和资源存放位置有关'
#为什么要做伪静态:
1.安全
2.为了SEO,百度curl的是静态网页,做伪静态可以利用百度的抓取推广
#不能通过URL准确的判断一个网页是静态页还是动态页
不同的服务,伪静态的做法不一样,具体参考百度
#伪静态的优缺点:
1,文件存档,静态化页面存在服务器,伪静态化调用数据库虚拟生成的(实际还是动态)
2,性能优势,在用户访问量大的时候,静态页面比伪静态更具优势(因为伪静态需要嗲用数据库)
3,安全性能,基本上差不多都是静态化状态(伪静态伪造了服务器的真实路径)
4,实际适用,伪静态比静态化更灵活,部分没法静态化的,都可以伪静态化。
5.伪静态不能被超链接
rewrite 企业应用场景
Nginx的rewrite功能在企业里应用非常广泛:
可以**调整用户浏览的URL**,看起来更规范,合乎开发及产品人员的需求。
为了让搜索引擎搜录网站内容及用户体验更好,企业会**将动态URL地址伪装成静态地址**提供服务。
网址换新域名后,让旧的访问**跳转**到新的域名上。例如,访问京东的360buy.com会跳转到jd.com
根据特殊变量、目录、客户端的信息进行URL**调整**等
Rewrite配置示例
句法:Syntax: rewrite regex replacement [flag]
默认:Default: --
语境:Context: server,location,if
#用于切换维护页面场景
#rewrite ^(.*)$ /page/maintain.html break; #$1?
ngx_http_rewrite_module模块----Rewrite标记Flag
rewrite
指令根据表达式来重定向URL
,或者修改字符串,可以应用于server,location,if
环境下,每行rewrite
指令最后跟一个flag
标记,支持的flag
标记有如下表格所示:
flag | 作用 |
---|---|
last | 本条规则匹配完成后,停止匹配,再匹配后面的规则(因为重新发送了一次请求) |
break | 本条规则匹配完成后,停止匹配,不再匹配后面的规则(404) |
redirect | 返回302临时重定向,地址栏会显示跳转后的地址 |
permanent | 返回301永久重定向,地址栏会显示跳转后的地址(默认) |
^(.*) URL
^(.*)$ URL
^/2018/(.*)$ 某一段URI
(.*) URI
rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect; 变量
^(.*) https://$server_name$1
last与break区别对比示例
[root@web01 conf.d]# vim /etc/nginx/conf.d/rewrite.conf
server {
listen 80;
server_name rw.com;
location ~ ^/break {
rewrite ^/break /test/ break;
}
location ~ ^/last {
rewrite ^/last /test/ last;
}
location /test/ {
default_type application/json;
return 200 "ok";
}
}
#重启nginx服务
[root@web01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 conf.d]# nginx -s reload
#/test目录不存在,也可以return
return不支持正则,所以不支持复杂的重定向 ,
return需要指定状态码,rewrite不需要指定状态码
#有没有root ,不会影响URL的跳转,只是没有默认的location
redirect与permanent区别对比示例
域名的跳转
[root@web01 conf.d]# vim /etc/nginx/conf.d/rw.conf
server {
listen 80;
server_name rw.com;
root /code;
location /test {
rewrite ^(.*)$ https://blog.driverzeng.com redirect;
#rewrite ^(.*)$ https://blog.driverzeng.com permanent;
#return 302 https://blog.driverzeng.com;
#return 301 https://blog.driverzeng.com;
}
}
redirect: 每次请求都会询问服务器,如果当服务器不可用时,则会跳转失败。
permanent: 第一次请求会询问客户端,浏览器会记录跳转的地址,第二次则不再询问服务器,直接通过浏览器缓存的地址跳转。第二次的访问与nginx服务器无关,(除非客户端清除缓存)
临时重定向:
1.用户的访问(考虑到用户是否刷新浏览器)
2.http 转https
永久重定向:
#浏览器输入 rw.com或者rw.com/test 都是同样的跳转
开启rewrite日志
[root@web01 code]# vim /etc/nginx/nginx.conf
/var/log/nginx/error.log warn; ==> /var/log/nginx/error.log notice;
http{
rewrite_log on;
}
注意两点:
1)在http字段加,反正我试了一下,在配置文件的开始位置,nginx会报rewrite_log 是一个不识别的变量。
2)注意 error_log的级别是notice,否则不会显示其具体的匹配过程,但需要注意,最好在测试环境下调试,error_log会增长的很快,我们网站20分钟5G多,所以在线上调试完了,尽快关闭!!!或说改成error级别的。
案例一----------------文件的跳转
用户访问/abc/1.html
实际上真实访问的是/ccc/bbb/2.html
#http://rw.com/abc/1.html ==> http://rw.com/ccc/bbb/2.html
#1.准备真实访问路径
[root@web03 ~]# mkdir /code/ccc/bbb -p
[root@web03 ~]# echo "ccc_bbb_2" > /code/ccc/bbb/2.html
#2.Nginx跳转配置
[root@web03 conf.d]# vim /etc/nginx/conf.d/rw.conf
server {
listen 80;
server_name rw.com/;
location / {
root /code;
index index.html;
}
location /abc {
rewrite (.*) /ccc/bbb/2.html redirect;
rewrite (.*) https://$host/ccc/bbb/2.html redirect;
#rewrite ^(.*)$ https://$host//ccc/bbb/2.html redirect;
#return 302 /ccc/bbb/2.html;
}
}
#3.重启Nginx服务
[root@web03 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web03 conf.d]# nginx -s reload
location /abc === location ^/abc
(.*) 指的是URL,不带http://
^(.*)$ 指的是URL,带http://
$host 域名
案例二-------文件的跳转
用户访问/2018/ccc/2.html
实际上真实访问的是/2014/ccc/bbb/2.html
##http://rw.com/2018/ccc/2.html ==> http://rw.com/2014/ccc/bbb/2.html
#1.准备真是的访问路径
[root@web03 conf.c]# mkdir /code/2014/ccc/bbb -p
[root@web03 conf.c]# echo "2014_ccc_bbb_2" > /code/2014/ccc/bbb/2.html
#2.Nginx跳转配置
[root@web03 conf.d]# vim /etc/nginx/conf.d/rw.conf
server {
listen 80;
server_name rw.com;
location / {
root /code;
index index.html;
}
location /2018 {
rewrite /ccc/2.html /ccc/bbb/2.html redirect;
#rewrite ^/2018/(.*)$ /2014/$1 redirect;
}
}
#3.重启nginx服务
[root@web03 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web03 conf.d]# nginx -s reload
^/2018/(.*)$中,^$可以省略
$1相当于sed的后向引用
案例三---------域名的跳转
用户访问/test实际上真实访问的是https://blog.driverzeng.com
#1.Nginx跳转配置
[root@web03 conf.d]# cat test.conf
server {
listen 80;
server_name localhost;
location /test {
rewrite (.*) https://blog.driverzeng.com redirect;
}
}
#2.重启nginx服务
[root@web03 conf.d]# nginx -s reload
案例四--文件的跳转
用户访问couese-11-22-33.html
实际上真实访问的是/course/11/22/33/course_33.html
#http://www.drz.com/couese-11-22-33.html ==> http://www.drz.com/course/11/22/33/course_33.html
#1.准备真是的访问路径
[root@web03 ~]# mkdir /code/course/11/22/33 -p
[root@web03 ~]# echo "curl docs.etiantian.org" > /code/course/11/22/33/course_33.html
#2.Nginx跳转配置
[root@web03 conf.d]# cat test.conf
server {
listen 80;
server_name localhost;
root /code;
index index.html;
location / {
#灵活配法
rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect;
#固定配法
#rewrite ^/course-(.*) /course/11/22/33/course_33.html redirect;
}
}
#3.重启nginx服务
[root@web03 conf.d]# nginx -s reload
案例五--------------域名和端口的跳转
将http
请求跳转到https
#Nginx跳转配置
server {
listen 80;
server_name rw.com;
rewrite ^(.*) https://$server_name$1 redirect;
#return 302 https://$server_name$request_uri;
}
server {
listen 443;
server_name blog.driverzeng.com;
ssl on;
}
$server_name$1,加不加$1 一样,但是尽量加上
实战---伪静态
server {
listen 80;
server_name discuz.drz.com;
location / {
root /code/discuz/upload;
index index.php index.html;
rewrite ^([^.]*)/topic-(.+).html$ $1/portal.php?mod=topic&topic=$2 last;
rewrite ^([^.]*)/article-([0-9]+)-([0-9]+).html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
rewrite ^([^.]*)/forum-(w+)-([0-9]+).html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
rewrite ^([^.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^([^.]*)/group-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
rewrite ^([^.]*)/space-(username|uid)-(.+).html$ $1/home.php?mod=space&$2=$3 last;
rewrite ^([^.]*)/blog-([0-9]+)-([0-9]+).html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
rewrite ^([^.]*)/(fid|tid)-([0-9]+).html$ $1/archiver/index.php?action=$2&value=$3 last;
if (!-e $request_filename) {
return 404;
}
}
location ~ .php$ {
root /code/discuz/upload;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Rewrite与Nginx全局变量
Rewrite在匹配过程中,会用到一些Nginx全局变量
$server_name #当前用户请求的域名
server {
listen 80;
server_name test.drz.com;
rewrite ^(.*)$ https://$server_name$1;
}
$request_filename 请求的文件路径名(带网站的主目录/code/images/test.jpg) #
$request_uri 当前请求的文件路径(不带网站的主目录/inages/test.jpg)
#大多数用于http协议转https协议
server {
listen 80;
server_name php.drz.com;
return 302 https://$server_name$request_uri;
}
$scheme 用的协议,比如http或者https
如何更加规范的书写Rewrite规则
server {
listen 80;
server_name www.drz.com drz.com;
if ($http_host = drz.com){
rewrite (.*) http://www.drz.com$1;
}
}
# $http_host
#推荐书写格式
server {
listen 80;
server_name drz.com;
rewrite ^(.*)$ http://www.drz.com$request_uri;
}
server {
listen 80;
server_name www.drz.com;
}