整合營銷服務商

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

          免費咨詢熱線:

          如何使用Nginx配置端口轉發

          如何使用Nginx配置端口轉發

          何使用Nginx配置端口轉發

          Nginx配置端口轉發

          根據域名利用Nginx實現端口轉發,從而達到一臺服務器轉發到多個項目。

          配置負載均衡池

          #Demo1負載均衡池
          upstream bolg_pool{
           server 127.0.0.1:8081;
          }
          #Demo2負載均衡池
          upstream img_pool{
           server 127.0.0.1:8022;
          }
          

          Demo1端口轉發

          server {
           listen 80; #攔截端口
           server_name bolg.xxxxx.com; #域名配置
           access_log logs/bolg.log;
           error_log logs/bolg.error;
           #將所有請求轉發給blog_pool池的應用處理
           location / {
           proxy_set_header Host $host;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_pass http://blog_pool; #如果是ssl更改成https
           }
          }
          

          Demo2端口轉發

          級目錄映射

          目前前后端項目分離場景多了以后,一般是前端一個端口,后端一個端口。

          如前端是https://example.com/index.html,調用的接口是https://example.com:4433

          如此部署對于一些小項目未免有些麻煩,當然你在公網環境下也可以選擇使用子域名、其他域名進行跨域訪問。

          這里說的是同一個域名,同一個端口,讓前后端同時進行訪問服務。

          前端地址:https://example.com/index.html

          接口地址:https://example.com/api/

          這里先記錄我已經測試通過的反向代理的方式,即不改變原本的server配置。直接通過反向代理將example.com/api 重定向到 example.com:4443/

          location ^~ /api/ {
              proxy_pass  https://example.com:4433/;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          }

          nginx

          Copy

          值得一提的是,location段的^~是代表某個字符作為開頭匹配,這里就是以/api/作為開頭進行匹配URL規則。

          這里不能寫作~,因為~是正則匹配的意思,用了正則就不能再proxy_pass段配置URI了,所謂URI就是4433端口后面的/。

          如果不寫/,當訪問example.com/api/index.php時,會代理到example.com:4433/api/index.php。并不能定位到后端的根路徑,所以這里以/結束。

          非標準HTTPS端口重定向

          如果想讓你的非標準https端口,如2083支持HTTP跳轉HTTPS訪問,請參照如下配置。

          error_page 497 https://$host:2083$request_uri;

          nginx

          Copy

          如果不這么配置,默認當用戶不確定網站協議時,采用了HTTP協議訪問你的HTTPS網站就會出現無法訪問。

          錯誤如:The plain HTTP request was sent to HTTPS port

          HTTP強制跳轉HTTPS

          日常為了保證訪客安全性,我們常常需要讓全站保持HTTPS訪問,那么你可以通過以下配置。

          server {
                  listen 80 default_server;
                  server_name example.com;
                  rewrite ^(.*) https://$server_name$1 permanent;
                  #上面的rewrite也可以寫作
                  return 301 https://$host$request_uri;
          }
          server {
                  listen 443 ssl;
                  server_name example.com;
          }

          Bash

          Copy

          做法是,讓80監聽到的HTTP鏈接全部重定向到HTTPS端口中。

          HSTS策略保持HTTPS連接

          與此同時,你也可以通過開啟HSTS策略強制讓訪客瀏覽器保持使用HTTPS鏈接,添加如下代碼:

          add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;preload" always;

          nginx

          Copy

          • max-age:設置單位時間(秒)內強制使用 HTTPS 連接,這里為1年
          • includeSubDomains:可選,站點所有子域同時生效
          • preload:可選,非規范值,用于定義使用『HSTS 預加載列表』
          • always:可選,保證所有響應都發送此響應頭,包括各種內置錯誤響應

          Nginx反向代理

          反向代理的場景很多,例如前面的前后端統一域名端口,例如負載均衡等。

          location / {
              proxy_pass  http://example.com;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          }

          nginx

          Copy

          完整參數配置

          location / {
              proxy_pass  http://example.com;
              proxy_redirect     off;
              proxy_set_header   Host             $host;
              proxy_set_header   X-Real-IP        $remote_addr;
              proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
              proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
              proxy_max_temp_file_size 0;
              proxy_connect_timeout      90;
              proxy_send_timeout         90;
              proxy_read_timeout         90;
              proxy_buffer_size          4k;
              proxy_buffers              4 32k;
              proxy_busy_buffers_size    64k;
              proxy_temp_file_write_size 64k;
          }

          nginx

          Copy

          端口轉發

          Nginx端口轉發性能也非常強大,可以用于內網數據庫、其他服務端口外露的場景。

          如將內網的192.168.1.2MySQL數據庫端口通過Nginx所在服務器的33062端口進行外露。

          upstream TCP3306 {
              hash $remote_addr consistent;
              server 192.168.1.2:3306;
          }
          
          server {
              listen 33062;
              proxy_connect_timeout 5s;
              proxy_timeout 300s;
              proxy_pass TCP3306;
          }

          nginx

          Copy

          限制訪問IP

          可以通過 ngx_http_access_module 允許限制某些IP地址的訪問。

          比如僅允許內網 IP 訪問管理后臺頁面。

          location /admin {
              allow 192.168.1.0/24;
              allow 10.0.0.0/24;
              deny all;
          }

          nginx

          Copy

          其中的 192.168.1.0/24 和 10.0.0.0/24 皆為允許訪問的 IP。默認從上而下依次匹配規則,如果匹配不中前面的內網IP,則默認命中最后的拒絕訪問。

          過濾請求類型

          如果你已經明確知道你的網站只有 GET、POST、HEAD 這三種請求,其他請求完全用不到,則可以通過如下方式直接屏蔽掉。

          if($request_method !~ ^(GET|HEAD|POST)$) {
              return404;
          }

          nginx

          Copy

          Timeout設置

          有時候,為了優化一些網站性能,可以將超時時間設置低一些,來降低死鏈接。

          http {
          
              client_body_timeout 10;
              client_header_timeout 30;
              keepalive_timeout 30 30;
              send_timeout 10;
          
          }

          Bash

          Copy

          關閉Nginx版本號

          當用戶請求返回數據中不包含具體的nginx版本號,避免一些版本漏洞被猜解。

          server_tokens off;



          、正則表達式匹配

          1. ~ 為區分大小寫匹配
          2. ~* 為不區分大小寫匹配
          3. !~ 和 !~* 分別為區分大小寫不匹配及不區分大小寫不匹配

          二、文件及目錄匹配

          1. -f 和 !-f 用來判斷是否存在文件
          2. -d 和 !-d 用來判斷是否存在目錄
          3. -e 和 !-e 用來判斷是否存在文件或目錄
          4. -x 和 !-x 用來判斷文件是否可執行

          三.rewrite指令的最后一項參數為flag標記,flag標記有

          1. last 相當于 apache 里面的[L]標記,表示 rewrite。
          2. break 本條規則匹配完成后,終止匹配,不再匹配后面的規則。
          3. redirect 返回302臨時重定向,瀏覽器地址會顯示跳轉后的URL地址。
          4. permanent 返回301永久重定向,瀏覽器地址會顯示跳轉后的URL地址。

          使用 last 和 break 實現URI重寫,瀏覽器地址欄不變。

          而且兩者有細微差別,使用alias指令必須用 last標記;使用proxy_pass指令時,需要使用break標記。Last標記在本條rewrite規則執行完畢后,會對其所在server{……}標簽重新發起請求,而break標記則在本條規則匹配完成后,終止匹配。

          例如:如果我們將類似URL/photo/123456 重定向到 /path/to/photo/12/1234/123456.png

          1  rewrite "/photo/([0-9]{2})([0-9]{2})([0-9]{2})" 
          2  
          3  rewrite "/path/to/photo/$1/$1$2/$1$2$3.png" ;

          四、NginxRewrite規則相關指令

          1、break指令

          使用環境:server、location、if

          該指令的作用是完成當前的規則集,不再處理rewrite指令。

          2、if 指令

          使用環境:server、location

          該指令用于檢查一個條件是否符合,如果條件符合,則執行大括號內的語句。If指令不支持嵌套,不支持多個條件&&和||處理。

          3、return指令

          語法:returncode

          使用環境:server、location、if

          該指令用于結束規則的執行并返回狀態碼給客戶端。

          示例:如果訪問的URL以".sh"或".bash"結尾,則返回403狀態碼

          1 location ~ .*\.(sh|bash)?$
          2 {
          3    return 403;
          4 }

          4、rewrite 指令

          語法:rewriteregex replacement flag

          使用環境:server、location、if

          該指令根據表達式來重定向URI,或者修改字符串。指令根據配置文件中的順序來執行。注意重寫表達式只對相對路徑有效。如果你想配對主機名,你應該使用if語句,示例如下:

          1 if( $host ~* www\.(.*) )
          2 {
          3    set $host_without_www $1;
          4    rewrite ^(.*)$  http://$host_without_www$1permanent;
          5 }

          5、Set指令

          語法:setvariable value ;
          默認值:none
          使用環境:server、location、if

          該指令用于定義一個變量,并給變量賦值。變量的值可以為文本、變量以及文本變量的聯合。

          1   set$varname "hello world";

          6、Uninitialized_variable_warn指令

          語法:uninitialized_variable_warnon|off

          使用環境:http、server、location、if

          該指令用于開啟和關閉未初始化變量的警告信息,默認值為開啟。

          五.Nginx的Rewrite規則編寫實例

          1、當訪問的文件和目錄不存在時,重定向到某個html文件

          1 if( !-e $request_filename )
          2 {
          3     rewrite ^/(.*)$ index.htmllast;
          4 }

          2、目錄對換 /123456/xxxx====> /xxxx?id=123456

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

          3、如果客戶端使用的是IE瀏覽器,則重定向到/ie目錄下

          1 if( $http_user_agent  ~ MSIE)
          2 {
          3     rewrite ^(.*)$ /ie/$1 break;
          4 }

          4、禁止訪問多個目錄

          1 location ~ ^/(cron|templates)/
          2 {
          3     deny all;
          4     break;
          5 }

          5、禁止訪問以/data開頭的文件

          1 location ~ ^/data
          2 {
          3     deny all;
          4 }

          6、禁止訪問以.sh,.flv,.mp3為文件后綴名的文件

          1 location ~ .*\.(sh|flv|mp3)$
          2 {
          3     return 403;
          4 }

          7、設置某些類型文件的瀏覽器緩存時間

          1 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
          2 {
          3     expires 30d;
          4 }
          5 location ~ .*\.(js|css)$
          6 {
          7     expires 1h;
          8 }

          8、給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 location ~(robots.txt) {
           7    log_not_found off;
           8    expires 7d;
           9    break;
          10 }

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

          1 location ^~ /html/scripts/loadhead_1.js {
          2     access_log  off;
          3     root /opt/lampp/htdocs/web;
          4     expires 600;
          5     break;
          6 }

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

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

           1 rewrite ^/ http: //img.linuxidc.net/leech.gif;//顯示一張防盜鏈圖片
           2 access_log off; //不記錄訪問日志,減輕壓力
           3 expires 3d //所有文件3天的瀏覽器緩存
           4 
           5 location ~*^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
           6   valid_referers none blocked *.linuxidc.com*.linuxidc.net localhost 208.97.167.194;
           7 if ($invalid_referer) {
           8      rewrite ^/ http://img.linuxidc.net/leech.gif;
           9      return 412;
          10      break;
          11 }
          12 access_log  off;
          13 root /opt/lampp/htdocs/web;
          14 expires 3d;
          15 break;
          16 }

          11、只允許固定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;

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

          1 /job-123-456-789.html 指向/job/123/456/789.html
          2 
          3 rewrite^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;

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

          1 if (!-e $request_filename) {
          2     proxy_pass http://127.0.0.1;
          3 }

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

           1 如/shanghaijob/ 指向 /area/shanghai/
           2 如果你將last改成permanent,那么瀏覽器地址欄顯是/location/shanghai/
           3 rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
           4 上面例子有個問題是訪問/shanghai時將不會匹配
           5 rewrite ^/([0-9a-z]+)job$ /area/$1/ last;
           6 rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
           7 這樣/shanghai 也可以訪問了,但頁面中的相對鏈接無法使用,
           8 如./list_1.html真實地址是/area/shanghia/list_1.html會變成/list_1.html,導至無法訪問。
           9 那我加上自動跳轉也是不行咯
          10 (-d $request_filename)它有個條件是必需為真實目錄,而我的rewrite不是的,所以沒有效果
          11 if (-d $request_filename){
          12 rewrite ^/(.*)([^/])$ http://$host/$1$2/permanent;
          13 }
          14 知道原因后就好辦了,讓我手動跳轉吧
          15 rewrite ^/([0-9a-z]+)job$ /$1job/permanent;
          16 rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;

          15、域名跳轉

          1 server{
          2 
          3   listen      80;
          4   server_name  jump.linuxidc.com;
          5   index index.html index.htm index.php;
          6   root  /opt/lampp/htdocs/www;
          7   rewrite ^/ http://www.linuxidc.com/;
          8   access_log  off;
          9 }

          16、多域名轉向

          1 server_name  www.linuxidc.comwww.linuxidc.net;
          2 index index.html index.htm index.php;
          3 root  /opt/lampp/htdocs;
          4 if ($host ~ "linuxidc\.net") {
          5     rewrite ^(.*) http://www.linuxidc.com$1permanent;
          6 }

          六、nginx全局變量

           1 arg_PARAMETER    #這個變量包含GET請求中,如果有變量PARAMETER時的值。
           2 args                    #這個變量等于請求行中(GET請求)的參數,如:foo=123&bar=blahblah;
           3 binary_remote_addr #二進制的客戶地址。
           4 body_bytes_sent    #響應時送出的body字節數數量。即使連接中斷,這個數據也是精確的。
           5 content_length    #請求頭中的Content-length字段。
           6 content_type      #請求頭中的Content-Type字段。
           7 cookie_COOKIE    #cookie COOKIE變量的值
           8 document_root    #當前請求在root指令中指定的值。
           9 document_uri      #與uri相同。
          10 host                #請求主機頭字段,否則為服務器名稱。
          11 hostname          #Set to themachine’s hostname as returned by gethostname
          12 http_HEADER
          13 is_args              #如果有args參數,這個變量等于”?”,否則等于”",空值。
          14 http_user_agent    #客戶端agent信息
          15 http_cookie          #客戶端cookie信息
          16 limit_rate            #這個變量可以限制連接速率。
          17 query_string          #與args相同。
          18 request_body_file  #客戶端請求主體信息的臨時文件名。
          19 request_method    #客戶端請求的動作,通常為GET或POST。
          20 remote_addr          #客戶端的IP地址。
          21 remote_port          #客戶端的端口。
          22 remote_user          #已經經過Auth Basic Module驗證的用戶名。
          23 request_completion #如果請求結束,設置為OK. 當請求未結束或如果該請求不是請求鏈串的最后一個時,為空(Empty)。
          24 request_method    #GET或POST
          25 request_filename  #當前請求的文件路徑,由root或alias指令與URI請求生成。
          26 request_uri          #包含請求參數的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”。不能修改。
          27 scheme                #HTTP方法(如http,https)。
          28 server_protocol      #請求使用的協議,通常是HTTP/1.0或HTTP/1.1。
          29 server_addr          #服務器地址,在完成一次系統調用后可以確定這個值。
          30 server_name        #服務器名稱。
          31 server_port          #請求到達服務器的端口號。

          七、Apache和Nginx規則的對應關系

          1 Apache的RewriteCond對應Nginx的if
          2 Apache的RewriteRule對應Nginx的rewrite
          3 Apache的[R]對應Nginx的redirect
          4 Apache的[P]對應Nginx的last
          5 Apache的[R,L]對應Nginx的redirect
          6 Apache的[P,L]對應Nginx的last
          7 Apache的[PT,L]對應Nginx的last

          例如:允許指定的域名訪問本站,其他的域名一律轉向www.linuxidc.net

          1 Apache:
          2 RewriteCond %{HTTP_HOST} !^(.*?)\.aaa\.com$[NC]
          3 RewriteCond %{HTTP_HOST} !^localhost$ 
          4 RewriteCond %{HTTP_HOST}!^192\.168\.0\.(.*?)$
          5 RewriteRule ^/(.*)$ http://www.linuxidc.net[R,L]

          Nginx過濾示例:


          主站蜘蛛池模板: 无码喷水一区二区浪潮AV| 无码人妻精品一区二区三区不卡 | 国产精品亚洲一区二区无码 | 国产一区视频在线免费观看| 成人国产一区二区三区| 国产aⅴ一区二区三区| 亚洲一区二区三区成人网站| 无码少妇精品一区二区免费动态| 国产一区二区精品久久91| 久久99国产精品一区二区| 欧洲精品一区二区三区| 97精品国产一区二区三区| 色久综合网精品一区二区| 日本亚洲成高清一区二区三区| 久久精品人妻一区二区三区 | 中文字幕一区二区三区永久 | 无码少妇一区二区三区芒果| 国产日本亚洲一区二区三区| 日韩精品一区二区三区色欲AV | 视频一区视频二区制服丝袜| 在线观看中文字幕一区| 日韩色视频一区二区三区亚洲| 国产乱码精品一区二区三区| 五十路熟女人妻一区二区| 无码人妻一区二区三区免费 | 中文字幕国产一区| 人妻少妇精品一区二区三区| 国模丽丽啪啪一区二区| 国产av天堂一区二区三区| 亚洲一区无码中文字幕| 久久久91精品国产一区二区| 亚洲一区二区三区四区在线观看| 性无码免费一区二区三区在线| 蜜桃视频一区二区三区在线观看| 国产福利91精品一区二区三区| 麻豆AV无码精品一区二区| 理论亚洲区美一区二区三区| 国产丝袜一区二区三区在线观看| 一区二区三区亚洲视频| 亚洲日韩精品一区二区三区无码 | 一区二区国产在线观看|