Nginx_location配置讲解

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下面可以放一堆的东西,这个很简单的,其实也是可以去实现的,很简单的,我把这个注释掉了接下来我们来

看下一个小的内容,其实无所谓

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值