nginx刚才我们把日志这一块简单的了解了一下,接下来就是nginx的location的语法
其实这个也是很简单的,去做URL的匹配,我这里也把crontab干掉了,crontab -e,把里面的内容干掉了,
cd到conf下,然后vim nginx.conf,这块我可以注释掉了,我不想用它了,注释也是很简单的,就是井号#,这个不用说,
还是看上面这一块吧,这里有一个location,一个虚拟的服务器配置,你可以配置多个location,配置多个location其实
就相当于,有点类似于动静分离了,你比如说这里有一个正则表达式,静态的html,js,一些图片什么的,都给他放到自己
指定的一个目录下,一些静态的都放到这下面,这样的话我客户端访问的时候,只要是能满足你这个URL,能够匹配上
这个location,都走nginx里面这个,这个效率就高,如果你要真正去访问我的服务器,.php,或者.do,.action,这种
请求,那你就给我走另外一个location,然后这里面可以来一个反向代理,去访问咱们的APACHE,或者TOMCAT,
这个就类似于动静分离了,非常的简单,location简单说一下吧,基本上常见的匹配方式三种,第一种等号=表示精准匹配,
表示一点也不能差,精准匹配等号,你会发现我下面有一个等号精准匹配,你只要进到这里面,就可能走这个错误了
#user nobody;
#开启进程数 <=CPU数
worker_processes 1;
#错误日志保存位置
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#进程号保存文件
#pid logs/nginx.pid;
#每个进程最大连接数(最大连接=连接数x进程数)每个worker允许同时产生多少个链接,默认1024
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"';
#请求日志保存位置
#access_log logs/access.log main;
#打开发送文件
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
#连接超时时间
keepalive_timeout 65;
#打开gzip压缩
#gzip on;
#设定请求缓冲
#client_header_buffer_size 1k;
#large_client_header_buffers 4 4k;
#设定负载均衡的服务器列表
#upstream myproject {
#weigth参数表示权值,权值越高被分配到的几率越大
#max_fails 当有#max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查
#fail_timeout 在以后的#fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器
#}
#webapp
#upstream myapp {
# server 192.168.1.171:8080 weight=1 max_fails=2 fail_timeout=30s;
# server 192.168.1.172:8080 weight=1 max_fails=2 fail_timeout=30s;
#}
#配置虚拟主机,基于域名、ip和端口
server {
#监听端口
listen 80;
#监听域名
server_name localhost;
#charset koi8-r;
#nginx访问日志放在logs/host.access.log下,并且使用main格式(还可以自定义格式)
#access_log logs/host.access.log main;
#返回的相应文件地址
location / {
#设置客户端真实ip地址
#proxy_set_header X-real-ip $remote_addr;
#负载均衡反向代理
#proxy_pass http://myapp;
#返回根路径地址(相对路径:相对于/usr/local/nginx/)
root html;
#默认访问文件
index index.html index.htm;
}
#配置反向代理tomcat服务器:拦截.jsp结尾的请求转向到tomcat
#location ~ \.jsp$ {
# proxy_pass http://192.168.1.171:8080;
#}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
#错误页面及其返回地址
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
#虚拟主机配置:
server {
listen 1234;
server_name bhz.com;
location / {
#正则表达式匹配uri方式:在/usr/local/nginx/bhz.com下 建立一个test123.html 然后使用正则匹配
#location ~ test {
## 重写语法:if return (条件 = ~ ~*)
#if ($remote_addr = 192.168.1.200) {
# return 401;
#}
#if ($http_user_agent ~* firefox) {
# rewrite ^.*$ /firefox.html;
# break;
#}
root bhz.com;
index index.html;
}
#location /goods {
# rewrite "goods-(\d{1,5})\.html" /goods-ctrl.html;
# root bhz.com;
# index index.html;
#}
#配置访问日志
access_log logs/bhz.com.access.log main;
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.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;
# }
#}
}
那还有一个就是一般匹配,一个普通的字符串,还有一个是正则匹配,你加浪线~,浪线空格,后面写一堆,后面你想写什么就写什么
你可以写一个正则表达式,然后去做一个pattern匹配,基本上location的语法就是这样的,非常简单,咱们可以去看一个小的
demo,在这里边我也懒得去写了,里面有一个demo,这里面有一个配置文件说明,这个其实很全的,常用的配置啊,包括在生产环境中
当然这个只是针对于我的环境,当然在真正工作中,那这个要和你真正的服务器性能去做,其实网上有很多nginx的配置文件,
你不一定要拿我的,我的这个只是一个demo例子,这里面开启的进程数,一般都是小于等于CPU数,你如果是四核八线程的,你就写8
保存的pid,进程号,然后最大的连接数,一个process,允许并发默认是1024,如果你CPU给力的话,你可以往高了设,这都行,
当然你要注意你部署的用户是什么,然后就是扩展文件名啊,映射的列表啊,默认的文件类型啊,default_type啊,等等,
还有日志输出的格式啊,他相当于一个全局的配置,main,你可以自定义,然后保存的位置啊,你可以配到这,表示全局,我配到
这就表示全局了,我配置一个server大括号,表示局部,就是这个意思,http直接写大括号{}直接表示全局,在每一个server里面,
都可以引用外面的配置了,就是这个意思,还有一个超时时间,还有一个打开压缩模式,你到底要怎么去做一些缓冲啊,做一些其他的
东西都可以去做,一堆配置都在这儿呢,咱们再往下看这块,这里面还有一个语法,我还是不能把这个注释掉,我还是得使用这个例子
说明一下,我现在要做这个正则,正则表达式其实也很简单,刚刚那个等号是精准匹配,那个值等其实就没什么意思了,主要是看
一下正则,看到我这里是怎么写的了,我这里写的很简单,我这里location ~ test,简单匹配一个字符串,如果你这里有test了,
就直接走到这个里边
这下面的你先不用考虑,我把它改成浪线~,这是一个正则,这是一个比较复杂的正则,先来一个比较简单吧,
这块我改一下,咱们也按照这个来吧,省的麻烦了,location浪线,表示后面跟正则了,test大括号,还是这样的,一点也没变,
这个是一个什么含义呢
你访问的请求啊,test才能走我的这个index.html,只有这样才能走,可能报错或者什么,咱们可以看一下,我把这个
直接保存,然后去reload一下,/usr/local/ngnix/sbin/nginx -s reload
给我重新reload了,改成什么样了,我看一下,vim /usr/local/nginx/conf/nginx.conf,无非是把之前的去掉了,然后改成
浪线了
现在我再去刷这个,回车
你会发现他竟然跑到welcome界面了,我现在敲bhz.com:1234的时候,他竟然跑到welcome下了,证明什么啊,证明你这个
不匹配呗,正常来讲他要跑到什么下去,他这个竟然跑到上面那块了
他没有进入到bhz.com这个目录下的index.html,正常来讲应该进入到我这个目录下的index,这一块如果我随便来一个test
bhz.com:1234/test
你可能要有这个文件才能匹配到,因为你最终请求的是一个文件,我这里才特意说明了,然后随便建一个文件带有test
定位到bhz.com这个文件,vim test1234.html,然后里面body,其实body写不写都为所谓,然后这回我就说,test page!!!!!
写完了以后,这回我再访问test1234.html
这就进来了,如果test123.html
你看我这边的文件吧,你这边的bhz.com目录没有test123.html,这样我们通过正则过滤掉了,如果你带test就允许你
转到这个目录下,去找bhz.com这个目录下有没有,访问的url带的那个文件,说白了就是一个过滤,但是如果你要访问别的,你要是访问别的
就没有了,虽然我写的是这个,但是跳到上面的去了,他匹配的就是斜杠了
就是你这么去敲,他匹配的就是斜杠了,这块正则等到后期咱们FastDFS的时候,访问一些小文件,group啊,
咱们写一些正则,它里面还有些语法,可能工作中用的也不多,可以做简单的一些过滤,在配置文件里可以写一些if,可以等于=
也可以用正则等于,*表示通配大小写,然后这里面也可以跟一些语句,跟return,break,rewrite,相当于重写,URL重写重定向,
可以跟一些判断语句,然后可以用-f判断是否是文件啊,-d是否是目录啊,-e是否存在啊,等等一些配置
这里面其实已经有了,咱们来copy一下这个,
#location ~ test {
## 重写语法:if return (条件 = ~ ~*)
#if ($remote_addr = 192.168.1.200) {
# return 401;
#}
我再去走到这个里面,然后我去把它加点东西,比如说我加第一个,我加一个重写的语法,这里怎么又两个冒号啊,基本上
这就是一个if else的形式,你会看到这啥意思,这很简单吧,如果禁止你的IP,$remote_addr不就是nginx的一个变量吗,
$remote_addr,IP等于192.168.1.200,等于这个地址的话,等于这个IP的话就给你return了,就可以做一些小的限制,什么黑名单,
白名单啊,你可以动态的去执行一个什么脚本啊,去禁用一些什么用户啊,其实都可以做到的nginx,这个运费要自己去写脚本,
简单的介绍一下吧,return 401,402,你可以自己去定义,无所谓,我可以用一些if语法,然后结合着这种方式去做,可以用等号,
也可以用其他的,可以用return这些东西,返回的东西也 可以用正则,现在咱们暂时测这个,保存退出
我重新把它reload一下,/usr/local/nginx/sbin/nignx -s reload
现在我再去访问test1234.html,这回你会发现,报这个401了
因为他在匹配好了以后,已经看到你主机的IP是这个,所以直接给你return一个401,这个很简单
不想过多去说,你可以自己去试一试,包括这个copy,这里面有好多小的例子,这个其实咱们看一眼就行,看这个语法
这个语法更有意思,刚才不是相当于等于吗,值等=,也可以用这些东西吗,符号判断的时候,用正则去匹配,然后*是忽略
大小写,如果你的http_user_agent,如果是firefox的话,那我就给你转向到一个位置,到什么位置呢,你无论来的是什么样的
请求,我都给你转向到firefox.html下面,就是/firefox.html里面,就是这个意思,然后我退出,退出break,差不多是这样的一个
意思,就是重写rewrite,就是你还个请求来了之后我给你转到另外一个地址,就好像JAVA里的redirect一样,请求过来,然后满足那个
test,然后给他写到另外一个位置,那咱们的user_agent是什么呢,在这儿其实你可以看到,你看这个日志你就知道了,我把这而
直接先保存一下,当然你肯定要有firefox.html这个界面才行,没有这个界面不行,我把它copy一下,先把这个界面建出来,
vim firefox.html,我随便写一个,看他能不能定向到这个界面,firefox page!!!!
我最好是一个html,好了我就这么去写了,保存,然后现在我要进行一个重定向的工作,比如我要重新重启一下,
因为改配置了,reload
那这回我再这样去做的话,test1234.html的话,然后我再回车的话
那你会发现,他直接转到这个位置了,就是firefox的配置了,那为什么呢,其实就是根据你的user_agent,user_agent在哪啊,
你会发现就是logs下的bhz.com.access.log
这个log的user_agent是什么,你可以看一下,浏览器类型,这块就是浏览器类型,Firefox的F大写,*表示忽略大小写,
F大写小写无所谓,你只要叫这个firefox,我都会给你转
差不多就是这样的一个效果,vim /conf/nginx.conf,再看一眼,差不多就是这个意思,你的浏览器,忽略大小写,如果里面
包含firefox这个的话,我就直接把请求redirect到firefox.html这个界面,然后我就退出了,如果我break不用呢,那会有一个
什么情况啊,如果break不用的话,那就会有一个重复定向的问题,我记得,我去掉,然后保存
看一看,重来,/usr/local/nginx/sbin/nginx -s reload
这回我再去刷
最终也会报一个404,错误日志了,cd /logs
到cat error.log,他报了错误的日志,说什么啊,error,open,failed,然后no such file or directory
vim conf/nginx.con,config咱们的nginx,基本上这个break你要知道的
你必须得加,每次这个请求啊,他重写的时候,相当于他不会找到firefox.html这块,如果你不加break,这块有break的问题,
如果你不加他的话,你正常请求的是test1234,每次它会都会让请求重定向,重来一遍到server{},重来一遍,每次重来的时候他都会去
调这儿,如果说你正常来讲,你如果加了一个break的话,一次定位到这里就结束了,break就退出了,就相当于结束了,这是关于这块,
你得加一个break,可能在工作中,你想去做URL重写的时候,也需要用到这个,当然这里可能是具体的一个地址了,比如说在这儿,
再看一个例子了,下面可能有这个例子,这儿有,看这个你可能就能看得更清楚一些
#location /goods {
# rewrite "goods-(\d{1,5})\.html" /goods-ctrl.html;
# root bhz.com;
# index index.html;
#}
比如我这里的location变成什么了,变成/goods这样了,然后每次你的URL是goods-(\d{1,5})\.html这样的,如果是这样的,然后
给你订阅到goods-ctrl.html这个位置,其实/goods这个仅仅表示一个前缀,goods-(\d{1,5})\.html这个是后面一个位置的具体,
那我就可以写正则了,我把这个讲懂了,你就知道break是什么意思了,那我这块又单起来一个location了,其实咱们在工作中可以
配置多个,比如我在这下面又来一个location,这个就好像什么京东那种小文件,电商那样的,就是他访问界面都是,重定向到哪啊,
看到他每次的请求都是什么的html,其实也并不一定是html,看到了我这个location了
这是啥意思啊,是说,只要你满足你这个前缀/goods,跟前面这个是有区别的,我不看这个了,就看这个,只要你访问这个前缀,
这是一个绝对的,只要是goods,那就进入到这里面,我会把你的URL,只要你的url带goods,那就会走我这个location,走了这个
location进来以后呢,再去分析你这个location下面到底是怎么去写的,上面的只要你的location带有test的话,^是表示前缀,
$表示结尾,.*就是任何的请求,都会转到firefox.html,下面这块是什么啊,这块又加了限制了,goods,然后加一个中线,然后小
括号表示一位,小括号表示一个数值,然后数值的大小可以\d,\d表示什么啊还记得吗,\d表示一个字符,表示一个数字,数字表示
一个取值范围,{1,5},就是从0到9999,5位,只要满足goods-1,就是0到9999之间的,只要你请求是这样的,当然其实在真正工作中,
你可以做成什么样子啊,你这里可以有一批的请求连接,你可以把这一批的转到action,.java,就相当于重写,你会看到一些京东,
电商网站啊,如果你见过你公司写PHP的那帮人,去做URL重写的时候,基本上就是这里面有好多的匹配,goods模块,或者是其他的模块,
我会把这里处理的多少的ID,比如说goods,1万中商品都交给这个请求去处理,后面就是一个.java了,.action,这个就无所谓了,
假如这里并不是一个html,可能是一个.do,有一个服务器tomcat这端的一个具体的服务,可能是这样,前面就相当于他的请求了,
正则你就自己随便写,我在这里只是简单举个例子,0到5位数的所有商品的编号,只要是发过来的这种URL,你就可以定位到,到这个
服务上去处理,D差不多就是这样的效果,那咱们看一下吧,那这样的话就说明了一个问题了,rewrite只是细粒度分析,然后再去跳到
某一个位置,其实就是这样的一个过程,我这块写完了以后,然后我去进行保存
然后重新的对他进行reload,你不是说goods,这回我们就不看test了,比如我这个请求就叫goods-10.html,我的请求
是这样的
这啥意思,看一下啊,我们没有这个界面,这个界面得有
我再看一下,还是在bhz.com这个目录下,这个下面,你得有这个界面,没有这界面不行的,那就cd到 bhz.com这个下面
比如说我就这样吧,cp firefox.html goods-ctrl.html,copy一下他,然后改个名字
这样的话就多了一个goods-ctrl.html
我这里就简单写成一个文件了,你要知道和这个匹配的请求,都会redirect到一个URL地址,去做服务,我在这里就写成这个了
在这里我就vim goods-ctrl.html,我在这里就叫做goods ctrl page!!!,这回就存在了,我再次刷新
你会发现直接转到这里了,只要你你这里满足我这个正则,满足我这个正则是5位的,前面是9都无所谓
他都会跳到这个地址去进行服务,这个是4位,如果我再来一个1是5位,再来一个1呢
这就报错了,因为没有了,因为我正则已经超过限制了,因为6位了,从0到99999的数字,你的请求只要是在这个范围,
我都转到一个具体的服务下面去工作,其实这就是一个正则的应用,能理解我说的意思吗,这个其实都是很简单,很基础的,
正则到底怎么去写,你要是有兴趣你可以看写PHP的,都是这么干的,就是什么样的服务,我的服务的请求都是其他的,
让你看不出来是什么写的,你都不知道他是用JAVA写的还是用什么写的,总之这个请求后缀,我其实是到我的nginx之后,
rewrite一次,就是把你的请求进行分析,你这个请求是什么样的,我就该请求什么样的服务,甚至要交给那台Node节点
去给我处理,其实这个就是一个分流的处理,总觉得这个分流很难,其实这个东西很简单,就是大体上是这种策略,
这是在nginx里面去写一些语句啊,什么if啊,包括一些配置啊,包括return,break,rewrite,还可以去加一些判断,
其实这块我就不想去详细讲了,就是nginx要做什么事啊,就是可以对你的请求的request,数据进行一个压缩,怎么
去压缩,具体有一些配置,然后对于一些图片啊,一些html啊,包括css,你的js,可以把这些文件缓存到浏览器,加一个
缓存,只要你访问的response,响应的速度,这些都是做优化的时候,可能需要做的,从而实现动静分离啊,动静分离
无非就是什么啊,无非就是动态的和静态的,两个location分开,然后做网站优化的时候,这些都是运维的事情,或者是
前端PHP,很简单
其实要说的内容,这就是关于location,写正则这个事情,咱们到conf的nginx.conf里面,你会看到刚才有一个
goods,其实你会发现动静分离是什么意思,无非就是动态的界面怎么跑到tomcat,静态的就是访问我们nginx服务器,
在root下面可以放一堆的东西,这个很简单的,其实也是可以去实现的,很简单的,我把这个注释掉了接下来我们来
看下一个小的内容,其实无所谓