Nginx_location配置讲解
生活随笔
收集整理的這篇文章主要介紹了
Nginx_location配置讲解
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
nginx剛才我們把日志這一塊簡單的了解了一下,接下來就是nginx的location的語法
其實這個也是很簡單的,去做URL的匹配,我這里也把crontab干掉了,crontab -e,把里面的內(nèi)容干掉了,cd到conf下,然后vim nginx.conf,這塊我可以注釋掉了,我不想用它了,注釋也是很簡單的,就是井號#,這個不用說,還是看上面這一塊吧,這里有一個location,一個虛擬的服務(wù)器配置,你可以配置多個location,配置多個location其實就相當(dāng)于,有點類似于動靜分離了,你比如說這里有一個正則表達式,靜態(tài)的html,js,一些圖片什么的,都給他放到自己指定的一個目錄下,一些靜態(tài)的都放到這下面,這樣的話我客戶端訪問的時候,只要是能滿足你這個URL,能夠匹配上這個location,都走nginx里面這個,這個效率就高,如果你要真正去訪問我的服務(wù)器,.php,或者.do,.action,這種請求,那你就給我走另外一個location,然后這里面可以來一個反向代理,去訪問咱們的APACHE,或者TOMCAT,這個就類似于動靜分離了,非常的簡單,location簡單說一下吧,基本上常見的匹配方式三種,第一種等號=表示精準(zhǔn)匹配,表示一點也不能差,精準(zhǔn)匹配等號,你會發(fā)現(xiàn)我下面有一個等號精準(zhǔn)匹配,你只要進到這里面,就可能走這個錯誤了
#user nobody;#開啟進程數(shù)?<=CPU數(shù)?
worker_processes 1;#錯誤日志保存位置
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#進程號保存文件
#pid logs/nginx.pid;#每個進程最大連接數(shù)(最大連接=連接數(shù)x進程數(shù))每個worker允許同時產(chǎn)生多少個鏈接,默認1024
events {worker_connections 1024;
}http {#文件擴展名與文件類型映射表include mime.types;#默認文件類型default_type application/octet-stream;#日志文件輸出格式?這個位置相于全局設(shè)置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;#打開發(fā)送文件sendfile on;#tcp_nopush on;#keepalive_timeout 0;#連接超時時間keepalive_timeout 65;#打開gzip壓縮#gzip on;#設(shè)定請求緩沖#client_header_buffer_size?1k;#large_client_header_buffers?4?4k;#設(shè)定負載均衡的服務(wù)器列表#upstream myproject {#weigth參數(shù)表示權(quán)值,權(quán)值越高被分配到的幾率越大#max_fails?當(dāng)有#max_fails個請求失敗,就表示后端的服務(wù)器不可用,默認為1,將其設(shè)置為0可以關(guān)閉檢查#fail_timeout?在以后的#fail_timeout時間內(nèi)nginx不會再把請求發(fā)往已檢查出標(biāo)記為不可用的服務(wù)器#}#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 {#監(jiān)聽端口listen 80;#監(jiān)聽域名server_name localhost;#charset koi8-r;#nginx訪問日志放在logs/host.access.log下,并且使用main格式(還可以自定義格式)#access_log logs/host.access.log main;#返回的相應(yīng)文件地址location / {#設(shè)置客戶端真實ip地址#proxy_set_header X-real-ip $remote_addr; #負載均衡反向代理#proxy_pass http://myapp;#返回根路徑地址(相對路徑:相對于/usr/local/nginx/)root html;#默認訪問文件index index.html index.htm;}#配置反向代理tomcat服務(wù)器:攔截.jsp結(jié)尾的請求轉(zhuǎn)向到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,這里面有一個配置文件說明,這個其實很全的,常用的配置啊,包括在生產(chǎn)環(huán)境中當(dāng)然這個只是針對于我的環(huán)境,當(dāng)然在真正工作中,那這個要和你真正的服務(wù)器性能去做,其實網(wǎng)上有很多nginx的配置文件,你不一定要拿我的,我的這個只是一個demo例子,這里面開啟的進程數(shù),一般都是小于等于CPU數(shù),你如果是四核八線程的,你就寫8保存的pid,進程號,然后最大的連接數(shù),一個process,允許并發(fā)默認是1024,如果你CPU給力的話,你可以往高了設(shè),這都行,當(dāng)然你要注意你部署的用戶是什么,然后就是擴展文件名啊,映射的列表啊,默認的文件類型啊,default_type啊,等等,還有日志輸出的格式啊,他相當(dāng)于一個全局的配置,main,你可以自定義,然后保存的位置啊,你可以配到這,表示全局,我配到這就表示全局了,我配置一個server大括號,表示局部,就是這個意思,http直接寫大括號{}直接表示全局,在每一個server里面,都可以引用外面的配置了,就是這個意思,還有一個超時時間,還有一個打開壓縮模式,你到底要怎么去做一些緩沖啊,做一些其他的東西都可以去做,一堆配置都在這兒呢,咱們再往下看這塊,這里面還有一個語法,我還是不能把這個注釋掉,我還是得使用這個例子說明一下,我現(xiàn)在要做這個正則,正則表達式其實也很簡單,剛剛那個等號是精準(zhǔn)匹配,那個值等其實就沒什么意思了,主要是看一下正則,看到我這里是怎么寫的了,我這里寫的很簡單,我這里location ~ test,簡單匹配一個字符串,如果你這里有test了,就直接走到這個里邊
這下面的你先不用考慮,我把它改成浪線~,這是一個正則,這是一個比較復(fù)雜的正則,先來一個比較簡單吧,這塊我改一下,咱們也按照這個來吧,省的麻煩了,location浪線,表示后面跟正則了,test大括號,還是這樣的,一點也沒變,這個是一個什么含義呢
你訪問的請求啊,test才能走我的這個index.html,只有這樣才能走,可能報錯或者什么,咱們可以看一下,我把這個直接保存,然后去reload一下,/usr/local/ngnix/sbin/nginx -s reload
給我重新reload了,改成什么樣了,我看一下,vim /usr/local/nginx/conf/nginx.conf,無非是把之前的去掉了,然后改成浪線了
現(xiàn)在我再去刷這個,回車
你會發(fā)現(xiàn)他竟然跑到welcome界面了,我現(xiàn)在敲bhz.com:1234的時候,他竟然跑到welcome下了,證明什么啊,證明你這個不匹配唄,正常來講他要跑到什么下去,他這個竟然跑到上面那塊了
他沒有進入到bhz.com這個目錄下的index.html,正常來講應(yīng)該進入到我這個目錄下的index,這一塊如果我隨便來一個testbhz.com:1234/test
你可能要有這個文件才能匹配到,因為你最終請求的是一個文件,我這里才特意說明了,然后隨便建一個文件帶有test定位到bhz.com這個文件,vim test1234.html,然后里面body,其實body寫不寫都為所謂,然后這回我就說,test page!!!!!
寫完了以后,這回我再訪問test1234.html
這就進來了,如果test123.html
你看我這邊的文件吧,你這邊的bhz.com目錄沒有test123.html,這樣我們通過正則過濾掉了,如果你帶test就允許你轉(zhuǎn)到這個目錄下,去找bhz.com這個目錄下有沒有,訪問的url帶的那個文件,說白了就是一個過濾,但是如果你要訪問別的,你要是訪問別的就沒有了,雖然我寫的是這個,但是跳到上面的去了,他匹配的就是斜杠了
就是你這么去敲,他匹配的就是斜杠了,這塊正則等到后期咱們FastDFS的時候,訪問一些小文件,group啊,咱們寫一些正則,它里面還有些語法,可能工作中用的也不多,可以做簡單的一些過濾,在配置文件里可以寫一些if,可以等于=也可以用正則等于,*表示通配大小寫,然后這里面也可以跟一些語句,跟return,break,rewrite,相當(dāng)于重寫,URL重寫重定向,可以跟一些判斷語句,然后可以用-f判斷是否是文件啊,-d是否是目錄啊,-e是否存在啊,等等一些配置
這里面其實已經(jīng)有了,咱們來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了,就可以做一些小的限制,什么黑名單,白名單啊,你可以動態(tài)的去執(zhí)行一個什么腳本啊,去禁用一些什么用戶啊,其實都可以做到的nginx,這個運費要自己去寫腳本,簡單的介紹一下吧,return 401,402,你可以自己去定義,無所謂,我可以用一些if語法,然后結(jié)合著這種方式去做,可以用等號,也可以用其他的,可以用return這些東西,返回的東西也 可以用正則,現(xiàn)在咱們暫時測這個,保存退出
我重新把它reload一下,/usr/local/nginx/sbin/nignx -s reload
現(xiàn)在我再去訪問test1234.html,這回你會發(fā)現(xiàn),報這個401了
因為他在匹配好了以后,已經(jīng)看到你主機的IP是這個,所以直接給你return一個401,這個很簡單
不想過多去說,你可以自己去試一試,包括這個copy,這里面有好多小的例子,這個其實咱們看一眼就行,看這個語法
這個語法更有意思,剛才不是相當(dāng)于等于嗎,值等=,也可以用這些東西嗎,符號判斷的時候,用正則去匹配,然后*是忽略大小寫,如果你的http_user_agent,如果是firefox的話,那我就給你轉(zhuǎn)向到一個位置,到什么位置呢,你無論來的是什么樣的請求,我都給你轉(zhuǎn)向到firefox.html下面,就是/firefox.html里面,就是這個意思,然后我退出,退出break,差不多是這樣的一個意思,就是重寫rewrite,就是你還個請求來了之后我給你轉(zhuǎn)到另外一個地址,就好像JAVA里的redirect一樣,請求過來,然后滿足那個test,然后給他寫到另外一個位置,那咱們的user_agent是什么呢,在這兒其實你可以看到,你看這個日志你就知道了,我把這而直接先保存一下,當(dāng)然你肯定要有firefox.html這個界面才行,沒有這個界面不行,我把它copy一下,先把這個界面建出來,vim firefox.html,我隨便寫一個,看他能不能定向到這個界面,firefox page!!!!
我最好是一個html,好了我就這么去寫了,保存,然后現(xiàn)在我要進行一個重定向的工作,比如我要重新重啟一下,因為改配置了,reload
那這回我再這樣去做的話,test1234.html的話,然后我再回車的話
那你會發(fā)現(xiàn),他直接轉(zhuǎn)到這個位置了,就是firefox的配置了,那為什么呢,其實就是根據(jù)你的user_agent,user_agent在哪啊,你會發(fā)現(xiàn)就是logs下的bhz.com.access.log
這個log的user_agent是什么,你可以看一下,瀏覽器類型,這塊就是瀏覽器類型,Firefox的F大寫,*表示忽略大小寫,F大寫小寫無所謂,你只要叫這個firefox,我都會給你轉(zhuǎn)
差不多就是這樣的一個效果,vim /conf/nginx.conf,再看一眼,差不多就是這個意思,你的瀏覽器,忽略大小寫,如果里面包含firefox這個的話,我就直接把請求redirect到firefox.html這個界面,然后我就退出了,如果我break不用呢,那會有一個什么情況啊,如果break不用的話,那就會有一個重復(fù)定向的問題,我記得,我去掉,然后保存
看一看,重來,/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你要知道的
你必須得加,每次這個請求啊,他重寫的時候,相當(dāng)于他不會找到firefox.html這塊,如果你不加break,這塊有break的問題,如果你不加他的話,你正常請求的是test1234,每次它會都會讓請求重定向,重來一遍到server{},重來一遍,每次重來的時候他都會去調(diào)這兒,如果說你正常來講,你如果加了一個break的話,一次定位到這里就結(jié)束了,break就退出了,就相當(dāng)于結(jié)束了,這是關(guān)于這塊,你得加一個break,可能在工作中,你想去做URL重寫的時候,也需要用到這個,當(dāng)然這里可能是具體的一個地址了,比如說在這兒,再看一個例子了,下面可能有這個例子,這兒有,看這個你可能就能看得更清楚一些#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,跟前面這個是有區(qū)別的,我不看這個了,就看這個,只要你訪問這個前綴,這是一個絕對的,只要是goods,那就進入到這里面,我會把你的URL,只要你的url帶goods,那就會走我這個location,走了這個location進來以后呢,再去分析你這個location下面到底是怎么去寫的,上面的只要你的location帶有test的話,^是表示前綴,$表示結(jié)尾,.*就是任何的請求,都會轉(zhuǎn)到firefox.html,下面這塊是什么啊,這塊又加了限制了,goods,然后加一個中線,然后小括號表示一位,小括號表示一個數(shù)值,然后數(shù)值的大小可以\d,\d表示什么啊還記得嗎,\d表示一個字符,表示一個數(shù)字,數(shù)字表示一個取值范圍,{1,5},就是從0到9999,5位,只要滿足goods-1,就是0到9999之間的,只要你請求是這樣的,當(dāng)然其實在真正工作中,你可以做成什么樣子啊,你這里可以有一批的請求連接,你可以把這一批的轉(zhuǎn)到action,.java,就相當(dāng)于重寫,你會看到一些京東,電商網(wǎng)站啊,如果你見過你公司寫PHP的那幫人,去做URL重寫的時候,基本上就是這里面有好多的匹配,goods模塊,或者是其他的模塊,我會把這里處理的多少的ID,比如說goods,1萬中商品都交給這個請求去處理,后面就是一個.java了,.action,這個就無所謂了,假如這里并不是一個html,可能是一個.do,有一個服務(wù)器tomcat這端的一個具體的服務(wù),可能是這樣,前面就相當(dāng)于他的請求了,正則你就自己隨便寫,我在這里只是簡單舉個例子,0到5位數(shù)的所有商品的編號,只要是發(fā)過來的這種URL,你就可以定位到,到這個服務(wù)上去處理,D差不多就是這樣的效果,那咱們看一下吧,那這樣的話就說明了一個問題了,rewrite只是細粒度分析,然后再去跳到某一個位置,其實就是這樣的一個過程,我這塊寫完了以后,然后我去進行保存
然后重新的對他進行reload,你不是說goods,這回我們就不看test了,比如我這個請求就叫g(shù)oods-10.html,我的請求是這樣的
這啥意思,看一下啊,我們沒有這個界面,這個界面得有
我再看一下,還是在bhz.com這個目錄下,這個下面,你得有這個界面,沒有這界面不行的,那就cd到 bhz.com這個下面
比如說我就這樣吧,cp firefox.html goods-ctrl.html,copy一下他,然后改個名字
這樣的話就多了一個goods-ctrl.html
我這里就簡單寫成一個文件了,你要知道和這個匹配的請求,都會redirect到一個URL地址,去做服務(wù),我在這里就寫成這個了在這里我就vim goods-ctrl.html,我在這里就叫做goods ctrl page!!!,這回就存在了,我再次刷新
你會發(fā)現(xiàn)直接轉(zhuǎn)到這里了,只要你你這里滿足我這個正則,滿足我這個正則是5位的,前面是9都無所謂
他都會跳到這個地址去進行服務(wù),這個是4位,如果我再來一個1是5位,再來一個1呢
這就報錯了,因為沒有了,因為我正則已經(jīng)超過限制了,因為6位了,從0到99999的數(shù)字,你的請求只要是在這個范圍,我都轉(zhuǎn)到一個具體的服務(wù)下面去工作,其實這就是一個正則的應(yīng)用,能理解我說的意思嗎,這個其實都是很簡單,很基礎(chǔ)的,正則到底怎么去寫,你要是有興趣你可以看寫PHP的,都是這么干的,就是什么樣的服務(wù),我的服務(wù)的請求都是其他的,讓你看不出來是什么寫的,你都不知道他是用JAVA寫的還是用什么寫的,總之這個請求后綴,我其實是到我的nginx之后,rewrite一次,就是把你的請求進行分析,你這個請求是什么樣的,我就該請求什么樣的服務(wù),甚至要交給那臺Node節(jié)點去給我處理,其實這個就是一個分流的處理,總覺得這個分流很難,其實這個東西很簡單,就是大體上是這種策略,這是在nginx里面去寫一些語句啊,什么if啊,包括一些配置啊,包括return,break,rewrite,還可以去加一些判斷,其實這塊我就不想去詳細講了,就是nginx要做什么事啊,就是可以對你的請求的request,數(shù)據(jù)進行一個壓縮,怎么去壓縮,具體有一些配置,然后對于一些圖片啊,一些html啊,包括css,你的js,可以把這些文件緩存到瀏覽器,加一個緩存,只要你訪問的response,響應(yīng)的速度,這些都是做優(yōu)化的時候,可能需要做的,從而實現(xiàn)動靜分離啊,動靜分離無非就是什么啊,無非就是動態(tài)的和靜態(tài)的,兩個location分開,然后做網(wǎng)站優(yōu)化的時候,這些都是運維的事情,或者是前端PHP,很簡單
其實要說的內(nèi)容,這就是關(guān)于location,寫正則這個事情,咱們到conf的nginx.conf里面,你會看到剛才有一個goods,其實你會發(fā)現(xiàn)動靜分離是什么意思,無非就是動態(tài)的界面怎么跑到tomcat,靜態(tài)的就是訪問我們nginx服務(wù)器,在root下面可以放一堆的東西,這個很簡單的,其實也是可以去實現(xiàn)的,很簡單的,我把這個注釋掉了接下來我們來看下一個小的內(nèi)容,其實無所謂
?
總結(jié)
以上是生活随笔為你收集整理的Nginx_location配置讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日志文件切分讲解
- 下一篇: Nginx_反向代理配置讲解