117期开什么平码
展開
湖北國聯計算機科技有限公司
  • 首頁HOME
  • 公司簡介INTRODUCTION
  • 安全防御DEFENSE
  • 軟件開發SOFTWARE
  • 物聯網IOT
  • 運行維護SRE
  • 成功案例CASE
  • 聯系我們CONTACT
  • Technology Services |技術服務

    那些實用的Nginx規則
    來源:湖北國聯計算機科技有限公司-荊州網站建設-荊州軟件開發-政府網站建設公司 時間:2018-12-07

    1.  內置語法

    先介紹Nginx默認已支持的內置功能,靠這些基本就滿足大部分的web服務需求。

    1.1 proxy代理

    proxy常用于兩類應用場景,一類是中轉,如異地科學的上網方式,另外一類是到后端服務的負載均衡方案。

    用反向代理時候,需要特別注意里面的域名默認是在nginx啟動時候就解析了,除非reload否則一直用的是當初解析的域名,也就是說不能動態解析。

    但這個問題是可以通過別的模塊或者用內置字典變量方式來解決。

    resolver114.114.114.114;

    server {

       location / {

           set $serversgithub.com;

           proxy_passhttp://$servers;

       }

    }

    1.1.1 中轉

    針對某個域名進行中轉:

    server {

    listen172.16.10.1:80;

       server_name pypi.python.org;

       location ~ /simple {

           proxy_set_headerHost $http_host;

           proxy_redirect off;

           proxy_passhttp://pypi.python.org;

       }

    }

    注意如果是前后端域名不一樣的話需要處理proxy_redirect301跳轉之類的顯示,否則在跳轉時候會跳轉到proxy_pass的域名。

    另外可以直接代理所有80端口的http流量:

    server {

       listen 80;

       server_name _;

       resolver 114.114.114.114;

       set $URL $host;

       location / {

           proxy_passhttp://$URL;

       }

    }

    如果是想代理https的站點也不是不可能,只是需要自行處理CA證書導入即可,而且經過https中轉的流量對nginx是透明的,也就是有證書的時候做竊聽和劫持的情況。

    1.1.2 負載均衡

    這是代理的另外一個常見用法,通過upstream到多個后端,可以通過weight來調節權重或者backup關鍵詞來指定備份用的后端,通常默認就可以了,或者可以指定類似ip_hash這樣的方式來均衡,配置很簡單,先在http區域添加upstream定義:

    upstreambackend {

       ip_hash;

       server backend1.example.comweight=5;

       server backend2.example.comweight=5;;

    }

    然后在server里面添加proxy_pass

    location /{

       proxy_pass http://backend;

       proxy_http_version 1.1;

       proxy_set_header Connection"";

    }

    做負載均衡的時候可以智能識別后端服務器狀態,雖然可以智能地proxy_next_upstream到另外的后端,但還是會定期損失一些正常的嘗試性的連接,比如過了max_fails 次嘗試之后,休息fail_timeout時間,過了這個時間之后又會去嘗試,這個時候可以使用第三方的upstream_check模塊來在后臺定期地自動探索,類似這樣:

    checkinterval=3000 rise=2 fall=5 timeout=2000 type=http;

    這樣替代用戶正常的連接來進行嘗試的方式進一步保障了高可用的特性。

    還有就是在做前端代理的時候也是這樣的方式,直接proxy_pass到后端即可,比如CDN的場景。

    1.2 防盜鏈

    普通的防盜鏈是通過referer來做,比如:

    location~* \.(gif|jpg|png|bmp)$ {

       valid_referers none blocked*.example.com server_names ~\.google\. ~\.baidu\.;

       if ($invalid_referer) {

           return 403;

       }

    }

    再精細一點的就是URL加密,針對一些用戶IP之類的變量生成一個加密URL通常是針對文件下載時候用到,可以通過openresty來寫lua腳本或者是accesskey之類的模塊來實現。

    1.3 變量

    nginx里面支持正則匹配和變量配置,默認的變量比如remote_addrrequest_filenamequery_stringserver_name之類的,這些組合在一起可以做很多規則,或者還有日志里面statushttp_cookie等。

    還有在進行多域名配置時候可以用通配符,比如:

    server_name~^(www\.)?(.+)$;

    root/data/web/$2;

    這樣就實現了自動進行域名的目錄指派。

    變量方面,比如配置變量a=1

    set $a 1;

    下面這個案例配合if判斷來做有更大的用處。

    1.4 if判斷

    nginx里面支持一些簡單的if判斷,但是沒有多重邏輯的語法,多個判斷條件用起來需要結合變量的方式來實現,比如允許ip地址為10.10.61段和和192.168.100段的用戶訪問,其余的拒絕,返回405狀態碼:

    set $err0;

       if ( $remote_addr ~ 10.10.61.){

           set $err 0;

       }

       if ( $remote_addr ~192.168.100.){

           set $err 0;

       }

       if ( $err = 1){

           return 405;

       }

    這樣通過一個err變量比較巧妙實現了需求。

    1.5 error_page

    有用到后端proxy的地方需要加上這句話才可以傳到狀態碼到nginx

    fastcgi_intercept_errorson;

    具體配置一般是配置到具體的錯誤URL頁面,比如:

    #返回具體狀態碼

    error_page404 403 /4xx.html

    #返回200狀態碼

    error_page404 403 =200  /error.html

    或者采用callback的方式統一做處理:

    error_page404 403 = @fallback;

    [email protected] {

       proxy_pass http://backend;

       access_log/data/logs/404_error.log access;

    }

    這樣在重定向時不會改變URL,然后把404頁面直接返回。

    1.6 rewrite

    rewrite做一些301302之類的跳轉,同時也可以在CDN前端做去問號緩存的效果。

    location/db.txt {

       rewrite (.*) $1? break;

       include proxy.conf;

    }

    另外最常見的跳轉寫法:

    rewrite^/game/(.*) /$1;

    /game/test跳轉為/test的效果,注意這樣是沒有狀態碼的,如果訪問正常就直接返回200狀態碼。

    可以在后面加個permanent參數,就變為了301 Moved Permanently,或者添加redirect改為302跳轉。

    同理,還可以進行多個正則匹配進行URL重組,比如:

    rewrite^/download/(.*)/lastest/(.*)$ /file/$1?ver=$2 break;

    1.7 日志字段

    想針對每個連接進行日志留檔,可以在nginx日志那里配置好字段,比如記錄cookie之類的數據。

    log_format字段里面加入$http_cookie變量即可。

    另外post的數據可以永久保留在文件里面,比如用來做http的日志備份,包括getpost的原始數據,把這個值開啟即可:

    client_body_in_file_only on;

    然后post的數據就會保存在nginx/client_body_temp文件夾里面。

    1.8 internal關鍵詞

    這個關鍵詞很少見,但有時候是很有用的,比如在有很多規則時候,突然需要針對某個目錄轉為nginx內部處理。

    location^~ /upload/down/ {

    alias/data/web/dts/dtsfile/down/;

    internal;

    }

    1.9 try_files

    字面意思是嘗試,后面可以接多個目錄或者文件,比如kohana框架:

    try_files$uri /index.php?$query_string;

    先看是否有URL這個文件,沒有的話再調用index.php來處理,或者支持狀態碼處理:

    try_files/foo /bar/ =404;

    沒有這兩個文件的話返回404狀態。

    1.10 auth認證

    可以做簡單的用戶登錄認證方式,其中的passwd_file得通過apachehtpasswd命令來生成。

    auth_basic"Restricted";

    auth_basic_user_filepasswd_file;

    認證通過之后每次訪問會在頭部添加Authorization字段包含用戶名密碼的base64加密密文給服務端。

    1.11 gzip

    普通的線上web站點gzip壓縮是必須要開的,壓縮一些文本類型的文件再返回給用戶。

    注意必須手動指定全需要壓縮的類型,比如cssjs之類的,線上配置如下:

    gzip on;

    gzip_min_length 2048;

    gzip_buffers    4 16k;

    gzip_vary  on;

    gzip_http_version1.1;

    gzip_types text/plain  text/css text/xml application/xml application/javascriptapplication/x-javascript ;

    1.12 mime配置

    很久以前基本是忽略這個配置,但手游流行之后就發現異常了,需要讓手機瀏覽器知道返回的apk后綴是什么類型,否則類似IE瀏覽器會以zip后綴返回,需要加上:

    application/vnd.android.package-archiveapk;

    application/iphonepxl ipa;

    1.13 限速

    限速包括限制請求的并發數和請求的下載速度。

    簡單的限制某個線程的下載速度就直接加上一句話就可以了:

    limit_rate1024k;

    要限制某個IP的并發數之類的就需要用ngx_http_limit_req_modulengx_http_limit_conn_module模塊了,不過是默認就編譯好的。

    比如使用一個 10M 大小的狀態緩存區,針對每個IP每秒只接受20次的請求:

    limit_req_zone$binary_remote_addr zone=NAME:10m rate=20r/s;

    1.14 location匹配

    location匹配有多種方式,常見的比如

    location = /

    location /

    location^~ /test{

    是有優先級的,直接 ”=” 的優先級是最高的,一般就用”~”這個符號來匹配php就好了,不過是區分了大小寫的:

    location ~.*\.php$

    1.15 文件緩存

    返回給用戶的文件一般都配置了過期時間,讓瀏覽器緩存起來。

    比如緩存14天:

    expires14d;

    針對某些特殊的文件就需要location匹配之后進行禁止緩存配置:

    add_headerCache-Control no-cache;

    add_headerCache-Control no-store;

    expiresoff;

    1.16 緩存文件

    nginx可以作為ATS這樣的緩存服務器來緩存文件,配置也比較簡單,不過我們很少用,除非一些特殊的場合,參考配置:

    #先在全局下面定義好緩存存放的目錄

    proxy_cache_path /data/cache/ levels=1:2 keys_zone=cache_one:10m inactive=7d max_size=10g;

    proxy_temp_path  /data/cache/proxy_temp_path;

    proxy_cache_key  $host$uri$is_args$args;

    #然后在server里面的location匹配好目的文件,加入下一段即可

    proxy_cachecache_one;

    proxy_cache_valid200 304 24h;

    proxy_cache_validany 10m;

    proxy_passhttps://$host;

    proxy_cache_key$host$uri$is_args$args;

    add_header Nginx-Cache "$upstream_cache_status"; 3. 內置模塊

    2. 內置模塊

    nginx含有大量的模塊可以支持多種復雜的需求,比如源碼目錄src/http/modules里面就有很多c模塊的代碼,或者直接通過./configure–help|grep module來查看有哪些內置模塊,編譯時候直接加上就可以了。

    除了nginx內置的模塊,網絡上還有很多第三方的模塊,可以通過編譯時候加參數–add-module=PATH指定模塊源碼來編譯。

    下面介紹一些湖北國聯線上用過而且比較贊的內置模塊。

    2.1 stream

    端口轉發的模塊,從nginx1.9版本才開始支持,包含tcpudp的支持,和IPTABLES相比這個雖然是應用層,會監聽端口,但是配置起來很方便,比IPTABLES靈活,在tcp模塊下面添加類似vhostserver就可以了,方便自動化管理,參考配置:

    server {

       listen PORT;

       proxy_pass IP:PORT;

       access_log/data/logs/tcp/PORT.log;

    }

    2.2 http_realip_module

    nginx反向代理之后,如何讓后端web直接獲取到的IP不是反向代理的iP,而是直接獲取到用戶的真實IP呢,就需要這個模塊了,不需要代碼那里再做類似X-Real-IP的變量特殊判斷。

    2.3 http_slice_module

    在做CDN時候可以用到,讓一個大文件分片,分成多個小文件通過206斷點續傳到后端,然后再組合起來,避免大文件直接回源導致多副本和多次回源的問題。

    2.4http_secure_link_module

    前面說到的防盜鏈可以用這個來做,但是這個一般是針對那種文件下載時候用到的,比如從網頁下載時候,服務端生成一個加密URL給用戶,然后這個URL有過期時間之類的,避免此URL被多次分享出去,不過普通的素材加載還是用普通的防盜鏈即可。

    2.5http_sub_module

    替換響應給用戶的內容,相對于sed之后再返回,比如可以在需要臨時全局修改網站背景或者title時候可以一次性處理好。

    3. 擴展項目

    簡單介紹下大名鼎鼎的兩個基于nginx的擴展項目,也是湖北國聯線上有很多地方用到的。

    3.1 openresty

    集成lua腳本,幾乎可以完成任何普通web相關的需求。

    比如URL加密進行防劫持和防盜鏈,服務端動態生成一串aes加密的URLCDNCDNopenresty解密之后用普通的URL轉發到后端,然后再返回給用戶正確的內容。

    3.2 tengine

    淘寶的nginx修改版,實現了很多nginx的收費功能或者是特殊功能,比如動態加載、concat合并請求,動態解析等。

    湖北國聯python開發的后臺基本都是用的這個版本,主要是利用了concat的合并素材的功能。

    荊州地區政府網站建設 解決方案 專業團隊 Copyright ? 2016 武漢國聯信通科技有限公司松滋分公司 地址:湖北省荊州市沙市區荊沙大道楚天都市佳園一期C區29棟112       地址:湖北省松滋市才知文化廣場1141-1142號     郵編:434200 聯系電話:0716-6666211     網站編輯部郵箱:[email protected] 鄂公網安備 42100202000212號 備案號:鄂ICP備16011027號-1     企業名稱:湖北國聯計算機科技有限公司
    117期开什么平码 体彩扑克3 加拿大飞艇开奖结果开奖时间 36选7中奖规则及奖金 湖北福彩精彩十分开奖 海南私彩开奖号码 时时彩个位杀号100% 快乐赛车计划下载 浙江6十1带坐标的走势图 好彩2复式投注表 黑龙江时时开奖第一网站