因爲當前不少應該都是先後端分離了,同時大量的基於http的分佈式和微服務架構,使得不少時候應用和不一樣項目組之間的系統相互來回調用,關係複雜。若是使用傳統的作法,都在應用中進行各類處理和判斷,不只維護複雜、容易出錯,還大大增長開發、調試的工做量,在nginx中,有很多的非功能類實際上是能夠幫咱們處理掉的,因此,對於現代開發人員來講,有必要對nginx的location比較熟悉,以便達到事半功倍的效果,好比說,平常的圖片上傳就是個例子,咱們能夠將圖片上傳到特定的目錄,而後配置nginx對於用戶上傳的圖片,都轉發到特定的目錄,該目錄不必定是nginx的html目錄,甚至是掛載的盤,這樣對於通常的應用來講,既能夠按應用規劃設置文件服務器,也避免了須要安裝和維護ftp服務器軟件的工做。php
由於Nginx是模塊化架構,每一個模塊都會有一系列本身引入的指令,這些指令一般包含在指令塊中,好比events模塊,就有一個events塊。以下所示:html
events { worker_connections 1024; }
對於最經常使用的部分,指令塊一般層層嵌套。例如:linux
http { server { listen 80; server_name example.com; access_log /var/log/nginx/example.com.log; location ^~ /admin/ { index index.php; } } }
默認狀況下,之塊會繼承父塊中聲明的設置,除非明確覆蓋。nginx
在nginx的配置中,語法比較複雜,並且不一樣的指令,可能規則徹底不一樣。git
好比root僅接受一個字符,聲明服務於網站的文件的根路徑。github
模塊中一般定義了能夠用於指令中的變量,變量以$開頭。某些指令中不容許使用變量,好比error_log,此時它會被當作字面量處理。web
指令的值能夠帶雙引號、帶單引號、不帶引號,除非使用了特殊符號,此時須要用引號括起來以免nginx解析誤解,對於特殊符號須要當作字面量使用的,須要用\,好比$。正則表達式
nginx的基本模塊包括Core、Events(主要是聲明網絡機制,某些參數對系統的性能影響較大)、Configuration,這三個模塊提供了整個基礎架構。spring
nginx使用多進程架構。sql
核心模塊的主要指令:
events模塊的主要指令包括(這些指令必須聲明在events塊中):
配置模塊的主要指令包括:
HTTP Core模塊包含了HTTP服務器的全部基礎塊、指令以及變量,其默認啓用,實際上它也是最重要的一個模塊。它包含三個主要的塊:http,server,location。
一個典型的http配置結構以下:
主要指令包括:
路徑相關指令包括:
客戶端請求相關的指令包括:
限制相關的指令包括:
location /admin/ { limit_except GET { allow 192.168.1.0/24; deny all; } }
格式爲:
limit_except METHOD1 [METHOD2…] { allow | deny | auth_basic | auth_basic_user_file | proxy_pass | perl; }
文件和緩存相關的指令:
其餘指令:
HTTP Core模塊包含了不少的變量,分爲三類:第一類是在Http請求頭中傳遞的,第二類是http響應頭中的,第三類是徹底nginx生成的。參考nginx http server第三版 90頁。
nginx容許用戶聲明樣式匹配指定的uri,location的語法爲:
location [=|~|~*|^~|@] pattern { ... }
第一個可選的參數是修飾符,各修飾符詳解以下:
server { server_name website.com; location ~ ^/abcd$ { […] } }
不少時候,咱們定義的不止一個location,一般至少會有兩個,一個是根自己,一個指向後端服務。因此咱們須要理解nginx接收到一個請求以後,它如何肯定匹配的location。定義在配置文件中的location順序對於一個請求是否優先匹配沒有關係,nginx搜索匹配的樣式的順序以下:
這個模塊的目的就是爲了URL重寫,URL重寫是SEO的關鍵元素之一。URL重寫由rewrite指令執行,它接收一個樣式和一個替換URI。
正則表達式規則參考nginx http server第三版P103。
注意,由於正則表達式的{}和nginx指令塊衝突,因此若是要使用,必須放到引號中。
捕獲,正則表達式中用()括起來的內容會被捕獲到一個個內置變量中,$N,N爲捕獲的索引,從1開始。捕獲的變量能夠做爲指令的值。()也一般和|一塊兒使用,二選一。命名捕獲使用?<name>語法設置,例如^/(?<folder>[^/]+)/(?<file>.*)$。
在nginx中,在正則表達式中捕獲的值,能夠在後續指令中使用,只要不被覆蓋便可。
server { server_name website.com; location ~* ^/(downloads|files)/(.*)$ { add_header Capture1 $1; add_header Capture2 $2; } }
nginx區份內外部請求,內部請求由error_page, index, rewrite,try_files, add_before_body, add_after_body生成。內部請求還分兩類:
簡單的重定向以下:
server { server_name website.com; root /var/www/vhosts/website.com/httpdocs/; location /storage/ { internal; alias /var/www/storage/; } location /documents/ { rewrite ^/documents/(.*)$ /storage/$1; } }
Rewrite模塊的指令包括:
若是聲明的URI以http://開頭,nginx自動使用redirect標誌。
可應用於server,location,if。
任何以_pass結尾的指令都接受到一組服務器的引用。聲明一組服務器的第一步是在http的upstream塊內聲明一個或多個server指令,以下:
http { upstream MyUpstream { server 10.0.0.201; server 10.0.0.202; server 10.0.0.203; } […] }
而後在server塊內引用聲明的upstream,以下:
server { server_name example.com; listen 80; root /home/example.com/www; # Proxy all requests to the MyUpstream server group proxy_pass http://MyUpstream; […] }
nginx提供多種負載均衡機制,P248。從Nginx 1.9.0開始,新增的Stream模塊支持TCP負載均衡,這意味原來必須使用LVS或者HAPROXY做爲負載均衡機制的模式能夠採用NGINX了。
要啓用線程池,必須使用--withthreads參數編譯nginx,對於常常文件下載的應用,應使用以下配置:
location /downloads/ { aio threads; directio 8k; sendfile on; }
ngx_http_log_module模塊負責以聲明的格式記錄請求日誌。
其主要的兩個指令是:
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; access_log off;
默認爲access_log logs/access.log combined;
首先參考centos下nginx安裝與配置安裝所需模塊。
If you are using Openresty, or have the ngx_lua
module and ngx_devel_kit
module installed, you are in luck.
You first need to declare what variables you'll be needing somewhere in your nginx.conf
file using the env
directive:
env API_KEY;
After that, when you want to access the environment variable, you can use a combination of set_by_lua
and os.getenv
, like this:
http { ... server { location / { set_by_lua $api_key 'return os.getenv("API_KEY")'; ... } } }
In this example we are assigning the environment variable to one of Nginx variables; we can use $api_key
as a regular nginx.conf
variable.
Using Lua was our preferred approach, since we have OpenResty. If you can't use Lua, a second solution involves using Perl. The first part is similar; you must declare the variables he uses using env
:
env API_KEY;
After that, you can combine perl_set
and some Perl to do the same thing as before:
http { ... server { location / { perl_set $api_key 'sub { return $ENV{"API_KEY"}; }'; ... } } }
You will need to have the ngx_http_perl_module
module enabled in order to be able to use this technique.