整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          nginx的location配置詳解

          nginx的location配置詳解

          法規則: location [=|~|~*|^~] /uri/ { … }

          =開頭表示精確匹配

          ^~ 開頭表示uri以某個常規字符串開頭,理解為匹配 url路徑即可。nginx不對url做編碼,因此請求為/static/20%/aa,可以被規則^~ /static/ /aa匹配到(注意是空格)。

          ~ 開頭表示區分大小寫的正則匹配

          ~* 開頭表示不區分大小寫的正則匹配

          !~和!~*分別為區分大小寫不匹配及不區分大小寫不匹配 的正則

          / 通用匹配,任何請求都會匹配到。

          多個location配置的情況下匹配順序為(參考資料而來,還未實際驗證,試試就知道了,不必拘泥,僅供參考):

          首先匹配=,其次匹配^~, 其次是按文件中順序的正則匹配,最后是交給 / 通用匹配。當有匹配成功時候,停止匹配,按當前匹配規則處理請求。

          例子,有如下匹配規則:

          location=/ {
           #規則A
          }
          location=/login {
           #規則B
          }
          location ^~ /static/ {
           #規則C
          }
          location ~ \.(gif|jpg|png|js|css)$ {
           #規則D
          }
          location ~* \.png$ {
           #規則E
          }
          location !~ \.xhtml$ {
           #規則F
          }
          location !~* \.xhtml$ {
           #規則G
          }
          location / {
           #規則H
          }
          

          那么產生的效果如下:

          訪問根目錄/, 比如http://localhost/ 將匹配規則A

          訪問 http://localhost/login 將匹配規則B,http://localhost/register 則匹配規則H

          訪問 http://localhost/static/a.html 將匹配規則C

          訪問 http://localhost/a.gif, http://localhost/b.jpg 將匹配規則D和規則E,但是規則D順序優先,規則E不起作用,而 http://localhost/static/c.png 則優先匹配到 規則C

          訪問 http://localhost/a.PNG 則匹配規則E, 而不會匹配規則D,因為規則E不區分大小寫。

          訪問 http://localhost/a.xhtml 不會匹配規則F和規則G,http://localhost/a.XHTML不會匹配規則G,因為不區分大小寫。規則F,規則G屬于排除法,符合匹配規則但是不會匹配到,所以想想看實際應用中哪里會用到。

          訪問 http://localhost/category/id/1111 則最終匹配到規則H,因為以上規則都不匹配,這個時候應該是nginx轉發請求給后端應用服務器,比如FastCGI(php),tomcat(jsp),nginx作為方向代理服務器存在。

          所以實際使用中,通常至少有三個匹配規則定義,如下:

          #直接匹配網站根,通過域名訪問網站首頁比較頻繁,使用這個會加速處理,官網如是說。
          #這里是直接轉發給后端應用服務器了,也可以是一個靜態首頁
          # 第一個必選規則
          location=/ {
           proxy_pass http://tomcat:8080/index
          }
           
          # 第二個必選規則是處理靜態文件請求,這是nginx作為http服務器的強項
          # 有兩種配置模式,目錄匹配或后綴匹配,任選其一或搭配使用
          location ^~ /static/ {
           root /webroot/static/;
          }
          location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
           root /webroot/res/;
          }
           
          #第三個規則就是通用規則,用來轉發動態請求到后端應用服務器
          #非靜態文件請求就默認是動態請求,自己根據實際把握
          #畢竟目前的一些框架的流行,帶.php,.jsp后綴的情況很少了
          location / {
           proxy_pass http://tomcat:8080/
          }
          

          以下部分直接copy過來的,有點亂,可以作為參考

          三、ReWrite語法

          last – 基本上都用這個Flag。

          break – 中止Rewirte,不在繼續匹配

          redirect – 返回臨時重定向的HTTP狀態302

          permanent – 返回永久重定向的HTTP狀態301

          注:last和break最大的不同在于

          - break是終止當前location的rewrite檢測,而且不再進行location匹配 - last是終止當前location的rewrite檢測,但會繼續重試location匹配并處理區塊中的rewrite規則

          1、下面是可以用來判斷的表達式:

          -f和!-f用來判斷是否存在文件

          -d和!-d用來判斷是否存在目錄

          -e和!-e用來判斷是否存在文件或目錄

          -x和!-x用來判斷文件是否可執行

          2、下面是可以用作判斷的全局變量

          $args #這個變量等于請求行中的參數。

          $content_length #請求頭中的Content-length字段。

          $content_type #請求頭中的Content-Type字段。

          $document_root #當前請求在root指令中指定的值。

          $host #請求主機頭字段,否則為服務器名稱。

          $http_user_agent #客戶端agent信息

          $http_cookie #客戶端cookie信息

          $limit_rate #這個變量可以限制連接速率。

          $request_body_file #客戶端請求主體信息的臨時文件名。

          $request_method #客戶端請求的動作,通常為GET或POST。

          $remote_addr #客戶端的IP地址。

          $remote_port #客戶端的端口。

          $remote_user #已經經過Auth Basic Module驗證的用戶名。

          $request_filename #當前請求的文件路徑,由root或alias指令與URI請求生成。

          $query_string #與$args相同。

          $scheme #HTTP方法(如http,https)。

          $server_protocol #請求使用的協議,通常是HTTP/1.0或HTTP/1.1。

          $server_addr #服務器地址,在完成一次系統調用后可以確定這個值。

          $server_name #服務器名稱。

          $server_port #請求到達服務器的端口號。

          $request_uri #包含請求參數的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”。

          $uri #不帶請求參數的當前URI,$uri不包含主機名,如”/foo/bar.html”。

          $document_uri #與$uri相同。

          例:http://localhost:88/test1/test2/test.php

          $host:localhost

          $server_port:88

          $request_uri:http://localhost:88/test1/test2/test.php

          $document_uri:/test1/test2/test.php

          $document_root:D:\nginx/html

          $request_filename:D:\nginx/html/test1/test2/test.php

          四、Redirect語法

          多目錄轉成參數

          abc.domian.com/sort/2=> abc.domian.com/index.php?act=sort&name=abc&id=2

          1. if ($host ~* (.*)\.domain\.com) {

          2. set $sub_name ;

          3. rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=last;

          4. }

          目錄對換

          /123456/xxxx -> /xxxx?id=123456

          1. rewrite ^/(\d+)/(.+)/ /?id=last;

          例如下面設定nginx在用戶使用ie的使用重定向到/nginx-ie目錄下:

          1. if ($http_user_agent ~ MSIE) {

          2. rewrite ^(.*)$ /nginx-ie/ break;

          3. }

          目錄自動加“/”

          1. if (-d $request_filename){

          2. rewrite ^/(.*)([^/])$ http://$host// permanent;

          3. }

          禁止htaccess

          1. location ~/\.ht {

          2. deny all;

          3. }

          禁止多個目錄

          1. location ~ ^/(cron|templates)/ {

          2. deny all;

          3. break;

          4. }

          禁止以/data開頭的文件

          可以禁止/data/下多級目錄下.log.txt等請求;

          1. location ~ ^/data {

          2. deny all;

          3. }

          禁止單個目錄

          不能禁止.log.txt能請求

          1. location /searchword/cron/ {

          2. deny all;

          3. }

          禁止單個文件

          1. location ~ /data/sql/data.sql {

          2. deny all;

          3. }

          給favicon.ico和robots.txt設置過期時間;

          這里為favicon.ico為99 天,robots.txt為7天并不記錄404錯誤日志

          1. location ~(favicon.ico) {

          2. log_not_found off;

          3. expires 99d;

          4. break;

          5. }

          6.

          7. location ~(robots.txt) {

          8. log_not_found off;

          9. expires 7d;

          10. break;

          11. }

          設定某個文件的過期時間;這里為600秒,并不記錄訪問日志

          1. location ^~ /html/scripts/loadhead_1.js {

          2. access_log off;

          3. root /opt/lampp/htdocs/web;

          4. expires 600;

          5. break;

          6. }

          文件反盜鏈并設置過期時間

          這里的return 412 為自定義的http狀態碼,默認為403,方便找出正確的盜鏈的請求

          “rewrite ^/ http://leech.c1gstudio.com/leech.gif;”顯示一張防盜鏈圖片

          “access_log off;”不記錄訪問日志,減輕壓力

          “expires 3d”所有文件3天的瀏覽器緩存

          1. location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {

          2. valid_referers none blocked *.c1gstudio.com *.c1gstudio.net localhost 208.97.167.194;

          3. if ($invalid_referer) {

          4. rewrite ^/ http://leech.c1gstudio.com/leech.gif;

          5. return 412;

          6. break;

          7. }

          8. access_log off;

          9. root /opt/lampp/htdocs/web;

          10. expires 3d;

          11. break;

          12. }

          只充許固定ip訪問網站,并加上密碼

          1. root /opt/htdocs/www;

          2. allow 208.97.167.194;

          3. allow 222.33.1.2;

          4. allow 231.152.49.4;

          5. deny all;

          6. auth_basic "C1G_ADMIN";

          7. auth_basic_user_file htpasswd;

          將多級目錄下的文件轉成一個文件,增強seo效果

          /job-123-456-789.html 指向/job/123/456/789.html

          1. rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job///jobshow_.html last;

          將根目錄下某個文件夾指向2級目錄

          如/shanghaijob/ 指向 /area/shanghai/

          如果你將last改成permanent,那么瀏覽器地址欄顯是 /location/shanghai/

          1. rewrite ^/([0-9a-z]+)job/(.*)$ /area// last;

          上面例子有個問題是訪問/shanghai 時將不會匹配

          1. rewrite ^/([0-9a-z]+)job$ /area// last;

          2. rewrite ^/([0-9a-z]+)job/(.*)$ /area// last;

          這樣/shanghai 也可以訪問了,但頁面中的相對鏈接無法使用,

          如./list_1.html真實地址是/area /shanghia/list_1.html會變成/list_1.html,導至無法訪問。

          那我加上自動跳轉也是不行咯

          (-d $request_filename)它有個條件是必需為真實目錄,而我的rewrite不是的,所以沒有效果

          1. if (-d $request_filename){

          2. rewrite ^/(.*)([^/])$ http://$host// permanent;

          3. }

          知道原因后就好辦了,讓我手動跳轉吧

          1. rewrite ^/([0-9a-z]+)job$ /job/ permanent;

          2. rewrite ^/([0-9a-z]+)job/(.*)$ /area// last;

          文件和目錄不存在的時候重定向:

          1. if (!-e $request_filename) {

          2. proxy_pass http://127.0.0.1;

          3. }

          域名跳轉

          1. server

          2. {

          3. listen 80;

          4. server_name jump.c1gstudio.com;

          5. index index.html index.htm index.php;

          6. root /opt/lampp/htdocs/www;

          7. rewrite ^/ http://www.c1gstudio.com/;

          8. access_log off;

          9. }

          本環境

          底層: Windows 11 x64
          虛擬化層:VMWare Workstation 17.0.2
          虛擬化兼容性:ESXi 6.7
          虛擬硬件:
              CPU: 4 Core
              RAM: 16 GB
              HDD: 128 GB SCSI
              NetWork: NAT
          操作系統版本: CentOS 7.9.2207 Mininal 無更新、無升級內核
                          無系統更新
                          無內核升級
                          關閉 SELinux
                          配置 NTP 時間同步
                          安裝 Open VM Tools
                          美化 CLI

          基本定義

          #    虛擬目錄:也叫別名目錄,將任意位置的網站發布到站點根目錄下,用戶通過子目錄方式訪問
          #    Nginx 定義了兩種 虛擬目錄,分別為 絕對別名 和 相對別名
          #    絕對別名目錄:網站數據目錄可以在任意路徑下并發布到默認站點的根目錄下,用戶通過子目錄方式訪問
          #    相對別名目錄:網站數據目錄在默認站點根目錄下的多層子目錄下,并發布到默認站點的根目錄下,用戶通過子目錄方式訪問,一般不推薦使用這種方式

          絕對別名 虛擬目錄

          場景設計

          #    默認網站 數據目錄 
          /data/www/
          #    創建兩個 網站數據目錄
          AAA 站點 /var/www/aaa
          BBB 站點 /var/www/bbb
          #    設定 網站
          AAA站點 /var/www/aaa 訪問路徑為 http://{URL}/a_site
          BBB站點 /var/www/bbb 訪問路徑為 http://{URL}/b_site 

          創建 網站數據 目錄

          #    創建 AAA 及 BBB 虛擬目錄 
          mkdir -p /var/www/aaa && mkdir -p /var/www/bbb
          #    創建 虛擬目錄 AAA 主頁文件
          echo "Welcom To FourLeaf Studio by A Site <br> Web Data /var/www/aaa" > /var/www/aaa/index.html
          #    創建 虛擬目錄 BBB 主頁文件
          echo "Welcom To FourLeaf Studio by B Site <br> Web Data /var/www/bbb" > /var/www/bbb/index.html

          修改 Nginx 配置文件

          #    修改 Nginx 默認配置文件
          nano /etc/nginx/conf.d/default.conf
          #    {
          #    在 第 10 行,默認網站 配置之后,增加兩段內容
          
              #    絕對別名 虛擬目錄 AAA
              location /a_site {
                  alias /var/www/aaa/;
              }
              #    絕對別名 虛擬目錄 BBB
              location /b_site {
                  alias /var/www/bbb/;
              }
          
          #    }

          重新啟動 Nginx 服務

          #    重新啟動 Nginx 服務
          systemctl restart nginx.service

          訪問地址

          #    絕對別名 虛擬目錄 訪問地址
          http://{URL}/a_site
          http://{URL}/b_site

          AAA 站點 /var/www/aaa 對應 A Site 地址 虛擬目錄

          BBB 站點 /var/www/bbb 對應 B Site 地址 虛擬目錄

          相對別名 虛擬目錄

          場景設計

          #    默認網站 數據目錄 
          /data/www/
          #    創建兩個 網站數據目錄
          CCC 站點 /data/www/test/ccc
          DDD 站點 /data/www/test/ddd
          #    設定 網站
          CCC 站點 /data/www/test/ccc 實際訪問路徑為 http://{URL}/test/cc 
          CCC 站點 /data/www/test/ccc 虛擬訪問路徑為 http://{URL}/ccc
          
          DDD 站點 /data/www/test/ddd 實際訪問路徑為 http://{URL}/test/ddd
          DDD 站點 /data/www/test/ddd 虛擬訪問路徑為 http://{URL}/ddd 

          創建 網站數據 目錄

          #    創建 CCC 及 DDD 虛擬目錄 
          mkdir -p /data/www/test/ccc && mkdir -p /data/www/test/ddd
          #    創建 虛擬目錄 CCC 主頁文件
          echo "Welcom To FourLeaf Studio by A Site <br> Web Data /data/www/test/ccc" > /data/www/test/ccc/index.html
          #    創建 虛擬目錄 DDD 主頁文件
          echo "Welcom To FourLeaf Studio by B Site <br> Web Data /data/www/test/ddd" > /data/www/test/ddd/index.html

          修改 Nginx 配置文件

          #    相對別名,一般用于網站根目錄,進行路徑的虛擬,一般不推薦使用
          nano /etc/nginx/conf.d/default.conf
          #    相對別名,地址設置,僅需要設置到絕對路徑的上一級路徑,并標識完整目錄名稱,不需要定義到完整路徑
          #    {
          #    在 第 10 行,默認網站 配置之后,增加兩段內容
          
              #    相對別名 虛擬目錄 CCC
              location /ccc {
                  root /data/www/test/;
              }
          
              #    相對別名 虛擬目錄 DDD
              location /ddd {
                  root /data/www/test/;
              }
          #    }

          奇葩的設定方式

          重新啟動 Nginx 服務

          #    重新啟動 Nginx 服務
          systemctl restart nginx.service

          訪問地址

          #    實際訪問路徑 地址
          http://{Server_IP}/test/ccc
          http://{Server_IP}/test/ddd
          #    虛擬訪問路徑 地址
          http://{Server_IP}/ccc
          http://{Server_IP}/ddd

          CCC Site 實際訪問路徑及虛擬目錄訪問路徑

          DDD Site 實際訪問路徑及虛擬目錄訪問路徑

          、概述

          今天來詳解一下Nginx的配置文件,以及給出一些配置建議,希望能對大家有所幫助。

          2、nginx.conf

          1)配置文件位置

          nginx 安裝目錄的 conf 文件夾下,例如:/usr/local/nginx/conf/nginx.conf 。

          也可以將配置文件放置在任意位置,在啟動Nginx時指定配置文件的位置,例如:./nginx -c /home/nginx.conf

          2)worker_processes

          設置 worker 的數量,Nginx的進程模型采用的是master、worker模式,一個master負責協調,多個worker負責與客戶端交互。

          此處設置為 auto 即可。

          3)events

          設置使用的模型和每個 worker 的連接數。

          Linux操作系統中模型建議使用 epoll。

          worker 的連接數通常設置為 10240 即可,當然如果硬件資源非常好,也可以適當加大。

          4)include

          包含另一個文件的內容,將另一個文件的內容放在標記處。

          多個文件可以寫多個 include,也可以使用通配符匹配多個文件。

          5)sendfile 和 tcp_nopush

          sendfile: 設置文件高效傳輸是否開啟,默認開啟。

          tcp_nopush:必須是 sendfile 值為 on 時才有效,當 tcp_nopush 設置為 on 代表當數據包累計到一定大小時再發送,有助于提升文件傳輸效率。

          建議都設置為 on。

          6)keepalive_timeout

          客戶端連接服務器的超時時間,在連接斷開前,客戶端再次與服務器進行交互,可復用此連接,不需要重新建立一個連接,減少了資源的開銷。

          設置為 0,則表示交互完立即斷開連接。此值保持默認即可。

          7)gzip

          設置為 on,代表會先將數據壓縮再進行傳輸,這樣做會增加傳輸的效率,節省帶寬,但會影響服務器CPU的性能。

          開啟此配置,還需要配置一些額外的屬性。

          此處可以權衡是節省帶寬還是提高CPU性能,建議開啟,根據實際情況配置。

          gzip on;

          gzip_min_length 512; # 限制最小壓縮,單位字節,小于該值則不會壓縮

          gzip_comp_level 5; # 壓縮的級別,值為1到9,級別越高壓縮的比例越大,cpu消耗越多

          gzip_types text/plain application/javascript text/css image/jpeg image/gif image/png application/json; # 需要壓縮的文件類型

          8)server

          一個server塊就是一個虛擬的服務。

          在server塊中可以指定虛擬服務的 端口、服務名、路由規則等信息。

          server可以有多個。

          一個server下,location也可以有多個。

          server {

          listen 90; # 端口

          server_name localhost; # 服務名,可以是IP地址或者域名,當端口相同時,會根據服務名選擇走哪個路由規則

          location / { # 根路徑路由規則

          root html; # 對應nginx安裝目標下的html文件夾,也可以設置為絕對路徑,例如:root /home/html;

          index hello.html; # 指定默認首頁為 hello.html

          }

              location /hello {       root /home/hello;       # index 省略,代表沒有默認頁     }      

          error_page 500 502 503 504 /50x.html; # 指定這些狀態碼跳轉的錯誤頁

          location=/50x.html {

          root html;

          }

          }

          9)location的匹配規則詳解

          server塊中包含了location塊,location塊在一個server下可以有多個,主要是配置請求的路由規則。

          nginx根據請求的資源路徑,與location塊進行匹配,然后根據location的配置對路由進行轉發。

          location支撐多種匹配規則,下面就具體說一說。

          精確匹配

          location / { # 根路徑路由規則

          root html; # 對應nginx安裝目標下的html文件夾,也可以設置為絕對路徑,例如:root /home/html;

          index hello.html; # 指定默認首頁為 hello.html

          }

              location /hello {

                root /home/hello;

                # index 省略,代表沒有默認頁

              }

          正則表達式匹配

              location ~* \.(GIF|PNG|jpg|bmp|jpeg) {  # *代表不區分大小寫
                 root /home/img;
              }

          匹配以某個路徑開頭的請求

              location ^~ /server/page/ {
                  root /home/page;
              }

          3、綜述

          今天對Nginx配置做了詳細講解,一些Nginx的高級應用,會在后面單獨介紹。希望大家多多溝通交流,共同成長。


          主站蜘蛛池模板: 中文字幕人妻丝袜乱一区三区| 一区二区三区电影网| 中文字幕一区二区三区永久| 国产成人无码精品一区在线观看| 国产凸凹视频一区二区| 国模极品一区二区三区| 精品视频在线观看一区二区 | 色狠狠色噜噜Av天堂一区| 国产一区二区福利| 91视频国产一区| 国产精品一区二区三区久久| 波多野结衣一区二区三区aV高清| 日韩精品在线一区二区| 日韩在线一区二区| 激情综合丝袜美女一区二区| 国模私拍一区二区三区| 亚洲国产成人久久一区二区三区 | 精品成人一区二区三区免费视频 | 国产激情无码一区二区| 国产伦精品一区二区三区不卡| 内射少妇一区27P| 日韩亚洲一区二区三区| 福利国产微拍广场一区视频在线| 国产综合一区二区在线观看| 亚洲一区二区久久| 一区二区日韩国产精品| 亚洲福利一区二区精品秒拍| 秋霞鲁丝片一区二区三区| 人妻体内射精一区二区三区 | 国产一区二区三区久久精品| 国产精品成人免费一区二区| 国产精品无码一区二区三级| 精品无码国产AV一区二区三区| 中文字幕精品一区二区三区视频| 亚洲av无码一区二区三区人妖| 日韩精品无码一区二区视频| 国产肥熟女视频一区二区三区| 日韩在线不卡免费视频一区| 国产伦一区二区三区高清| 无码夜色一区二区三区| 日韩高清国产一区在线|