成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Nginx規(guī)則和模塊介紹

這篇文章主要介紹“Nginx規(guī)則和模塊介紹”,在日常操作中,相信很多人在Nginx規(guī)則和模塊介紹問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Nginx規(guī)則和模塊介紹”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了江北免費(fèi)建站歡迎大家使用!

1. 概述

大家都知道Nginx有很多功能模塊,比如反向代理、緩存等,這篇文章總結(jié)下我們這些年實際環(huán)境中那些有用的Nginx規(guī)則和模塊,大部分是用法的概括及介紹,具體細(xì)節(jié)在實際配置時再自行Google。

2. 內(nèi)置語法

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

2.1 proxy代理

proxy常用于兩類應(yīng)用場景,一類是中轉(zhuǎn),如異地科學(xué)的上網(wǎng)方式,另外一類是到后端服務(wù)的負(fù)載均衡方案。

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

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

resolver 114.114.114.114; server {     location / {         set $servers github.com;         proxy_pass http://$servers;     } }

2.1.1 中轉(zhuǎn)

針對某個域名進(jìn)行中轉(zhuǎn):

server { listen 172.16.10.1:80;     server_name pypi.python.org;     location ~ /simple {         proxy_set_header Host $http_host;         proxy_redirect off;         proxy_pass http://pypi.python.org;     } }

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

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

server {     listen 80;     server_name _;     resolver 114.114.114.114;     set $URL $host;     location / {         proxy_pass http://$URL;     } }

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

2.1.2 負(fù)載均衡

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

upstream backend {     ip_hash;     server backend1.example.com weight=5;     server backend2.example.com weight=5;; }

然后在server里面添加proxy_pass:

location / {     proxy_pass http://backend;     proxy_http_version 1.1;     proxy_set_header Connection ""; }

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

check interval=3000 rise=2 fall=5 timeout=2000 type=http;

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

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

2.2 防盜鏈

普通的防盜鏈?zhǔn)峭ㄟ^referer來做,比如:

location ~* \.(gif|jpg|png|bmp)$ {     valid_referers none blocked *.example.com server_names ~\.google\. ~\.baidu\.;     if ($invalid_referer) {         return 403;     } }

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

2.3 變量

nginx里面支持正則匹配和變量配置,默認(rèn)的變量比如remote_addr、request_filename、query_string、server_name之類的,這些組合在一起可以做很多規(guī)則,或者還有日志里面status、http_cookie等。

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

server_name ~^(www\.)?(.+)$; root /data/web/$2;

這樣就實現(xiàn)了自動進(jìn)行域名的目錄指派。

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

set $a 1;

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

2.4 if判斷

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

set $err 0;     if ( $remote_addr ~ 10.10.61.){         set $err 0;     }     if ( $remote_addr ~ 192.168.100.){         set $err 0;     }     if ( $err = 1){         return 405;     }

這樣通過一個err變量比較巧妙實現(xiàn)了需求。

2.5 error_page

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

fastcgi_intercept_errors on;

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

#返回具體狀態(tài)碼 error_page 404 403 /4xx.html #返回200狀態(tài)碼 error_page 404 403 =200  /error.html

或者采用callback的方式統(tǒng)一做處理:

error_page 404 403 = @fallback;  location @fallback {     proxy_pass http://backend;     access_log /data/logs/404_error.log access; }

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

2.6 rewrite

rewrite做一些301、302之類的跳轉(zhuǎn),同時也可以在CDN前端做“去問號”緩存的效果。

location /db.txt {     rewrite (.*) $1? break;     include proxy.conf; }

另外最常見的跳轉(zhuǎn)寫法:

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

把/game/test跳轉(zhuǎn)為/test的效果,注意這樣是沒有狀態(tài)碼的,如果訪問正常就直接返回200狀態(tài)碼。

可以在后面加個permanent參數(shù),就變?yōu)榱?01 Moved Permanently,或者添加redirect改為302跳轉(zhuǎn)。

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

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

2.7 日志字段

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

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

另外post的數(shù)據(jù)可以***保留在文件里面,比如用來做http的日志備份,包括get和post的原始數(shù)據(jù),把這個值開啟即可:

client_body_in_file_only  on;

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

2.8 internal關(guān)鍵詞

這個關(guān)鍵詞很少見,但有時候是很有用的,比如在有很多規(guī)則時候,突然需要針對某個目錄轉(zhuǎn)為nginx內(nèi)部處理。

location ^~ /upload/down/ { alias /data/web/dts/dtsfile/down/; internal; }

2.9 try_files

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

try_files $uri /index.php?$query_string;

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

try_files /foo /bar/ =404;

沒有這兩個文件的話返回404狀態(tài)。

2.10 auth認(rèn)證

可以做簡單的用戶登錄認(rèn)證方式,其中的passwd_file得通過apache的htpasswd命令來生成。

auth_basic "Restricted"; auth_basic_user_file passwd_file;

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

2.11 gzip

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

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

gzip on; gzip_min_length  2048; gzip_buffers     4 16k; gzip_vary   on; gzip_http_version 1.1; gzip_types  text/plain  text/css text/xml application/xml application/javascript application/x-javascript ;

2.12 mime配置

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

application/vnd.android.package-archive apk; application/iphone pxl ipa;

2.13 限速

限速包括限制請求的并發(fā)數(shù)和請求的下載速度。

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

limit_rate 1024k;

要限制某個IP的并發(fā)數(shù)之類的就需要用ngx_http_limit_req_module和ngx_http_limit_conn_module模塊了,不過是默認(rèn)就編譯好的。

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

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

2.14 location匹配

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

location  = /  location  /  location ^~ /test{

是有優(yōu)先級的,直接 ”=” 的優(yōu)先級是***的,一般就用”~”這個符號來匹配php就好了,不過是區(qū)分了大小寫的:

location ~ .*\.php$

2.15 文件緩存

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

比如緩存14天:

expires 14d;

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

add_header Cache-Control no-cache; add_header Cache-Control no-store; expires off;

2.16 緩存文件

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

#先在全局下面定義好緩存存放的目錄 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_cache cache_one; proxy_cache_valid 200 304 24h; proxy_cache_valid any 10m; proxy_pass https://$host; proxy_cache_key $host$uri$is_args$args; add_header  Nginx-Cache "$upstream_cache_status"; 3. 內(nèi)置模塊

3. 內(nèi)置模塊

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

除了nginx內(nèi)置的模塊,網(wǎng)絡(luò)上還有很多第三方的模塊,可以通過編譯時候加參數(shù)–add-module=PATH指定模塊源碼來編譯。

下面介紹一些我們線上用過而且比較贊的內(nèi)置模塊。

3.1 stream

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

server {     listen PORT;     proxy_pass IP:PORT;     access_log /data/logs/tcp/PORT.log; }

3.2 http_realip_module

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

3.3 http_slice_module

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

3.4 http_secure_link_module

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

3.5 http_sub_module

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

4. 擴(kuò)展項目

簡單介紹下大名鼎鼎的兩個基于nginx的擴(kuò)展項目,也是我們線上有很多地方用到的。

4.1 openresty

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

比如URL加密進(jìn)行防劫持和防盜鏈,服務(wù)端動態(tài)生成一串a(chǎn)es加密的URL給CDN,CDN的openresty解密之后用普通的URL轉(zhuǎn)發(fā)到后端,然后再返回給用戶正確的內(nèi)容。

4.2 tengine

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

我們python開發(fā)的后臺基本都是用的這個版本,主要是利用了concat的合并素材的功能。

到此,關(guān)于“Nginx規(guī)則和模塊介紹”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

分享標(biāo)題:Nginx規(guī)則和模塊介紹
URL地址:http://jinyejixie.com/article18/ppsggp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、小程序開發(fā)、網(wǎng)站改版、Google企業(yè)建站、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
永州市| 汤阴县| 建昌县| 德兴市| 都江堰市| 米泉市| 莫力| 比如县| 葵青区| 合作市| 莫力| 华容县| 周宁县| 深水埗区| 康马县| 远安县| 东安县| 无极县| 临高县| 桃园县| 太湖县| 合江县| 精河县| 平遥县| 南通市| 公安县| 西华县| 耒阳市| 宁远县| 汨罗市| 绵阳市| 竹山县| 衡山县| 临海市| 海宁市| 五原县| 本溪| 阳春市| 通城县| 垦利县| 永清县|