最近在全面學習Nginx,看成筆記了,若有錯誤,歡迎指出或深刻交流。php
相關文章:css
# 配置用戶或者組,默認爲nobody nobody。
#user www www;
#Nginx開啓的worker進程數,建議爲CPU的核數
#worker_processes 2;
#指定nginx進程運行文件存放地址
#pid /nginx/pid/nginx.pid;
#指定日誌路徑,級別。這個設置能夠放入全局塊、http塊、server塊,級別以此爲:debug|info|notice|warn|error|crit|alert|emerg
error_log log/error.log debug;
#能夠在任意地方使用include指令實現配置文件的包含,相似於apache中的include方法,可減小主配置文件長度。
include vhosts/*.conf;
複製代碼
events {
#設置網路鏈接序列化,防止驚羣現象發生,默認爲on
accept_mutex on;
#默認: 500ms 若是一個進程沒有互斥鎖,它將延遲至少多長時間。默認狀況下,延遲是500ms 。
accept_mutex_delay 100ms;
#設置一個進程是否同時接受多個網絡鏈接,默認爲off
multi_accept on;
#事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport,不建議設置,nginx會自行選擇
#use epoll;
#最大鏈接數,默認爲512
worker_connections 1024;
}
複製代碼
http {
#文件擴展名與文件類型映射表
include mime.types;
# 默認文件類型,默認爲text/plain
default_type application/octet-stream;
#取消服務日誌
#access_log off;
#容許sendfile方式傳輸文件,默認爲off,能夠在http塊,server塊,location塊。
sendfile on;
#每一個進程每次調用傳輸數量不能大於設定的值,默認爲0,即不設上限。
sendfile_max_chunk 100k;
#鏈接超時時間,默認爲75s,能夠在http,server,location塊。
keepalive_timeout 65;
#開啓gzip資源壓縮
gzip on;
# 負載均衡,詳細可看了一篇文章:https://learnku.com/articles/36737
upstream blog {
server 192.167.20.19:8081;
server 192.168.10.121:8080 weight=5;
}
#設定請求緩衝
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#上傳文件的大小限制 默認1m
client_max_body_size 8m;
server {
#單鏈接請求上限次數。
keepalive_requests 120;
#監聽端口
listen 80;
#監聽地址
server_name blog.13sai.com;
#設定日誌格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /data/logs/access.log main;
# 根目錄
root /www/web/public;
# 定義錯誤提示頁面
error_page 500 502 503 504 /50x.html;
location /static/ {
#root與alias主要區別在於nginx如何解釋location後面的uri,這會使二者分別以不一樣的方式將請求映射到服務器文件上。
#root的處理結果是:root路徑+location路徑
#alias的處理結果是:使用alias路徑替換location路徑
alias /www/static/;
#過時30天,靜態文件不怎麼更新,過時能夠設大一點,若是頻繁更新,則能夠設置得小一點。
expires 30d;
}
# 處理php請求到fpm端口
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://blog; #請求轉向blog 定義的服務器列表
}
#禁止訪問文件
location ~ /.git {
deny all;
allow 127.0.0.1; #容許的ip
}
}
}
複製代碼
1.首先選擇全部字符串徹底匹配的server_name,如 blog.13sai.com 。
2.其次選擇通配符在前面的server_name,如 *.13sai.com。
3.再次選擇通配符在後面的server_name,如www.13sai.* 。
4.最後選擇使用正則表達式才匹配的server_name,如 ~^\.sai\.com$
若是都不匹配
一、優先選擇listen配置項後有default或default_server的
二、找到匹配listen端口的第一個server塊
複製代碼
location
語法: location[=|~|~*|^~|@]/uri/{...}
配置塊: server location會嘗試根據用戶請求中的URI來匹配上面的/uri表達式,若是能夠匹配,就選擇 location{}塊中的配置來處理用戶請求。
複製代碼
location表達式類型html
~ 表示執行一個正則匹配,區分大小寫;
~* 表示執行一個正則匹配,不區分大小寫;
^~ 表示普通字符匹配。使用前綴匹配。若是匹配成功,則再也不匹配其餘location;
= 進行普通字符精確匹配。也就是徹底匹配;
@ 它定義一個命名的 location,使用在內部定向時,例如 error_page, try_files
複製代碼
優先級:node
(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑)nginx
執行順序:
1. 執行server塊的rewrite指令(這裏的塊指的是server關鍵字後{}包圍的區域,其它xx塊相似)
2. 執行location匹配
3. 執行選定的location中的rewrite指令
若是其中某步URI被重寫,則從新循環執行1-3,直到找到真實存在的文件
若是循環超過10次,則返回500 Internal Server Error錯誤
語法:rewrite regex replacement [flag]; 默認值:—
上下文:server, location, if
rewrite是實現URL重寫的關鍵指令,根據regex(正則表達式)部份內容,重定向到replacement,結尾是flag標記。 正則:perl兼容正則表達式語句進行規則匹配
替代內容:將正則匹配的內容替換成replacement
flag標記:rewrite支持的flag標記
複製代碼
語法:if(condition){...}
默認值:無
做用域:server,location
對給定的條件condition進行判斷。若是爲真,大括號內的rewrite指令將被執行。
if條件(conditon)能夠是以下任何內容:
一個變量名;false若是這個變量是空字符串或者以0開始的字符串;
使用= ,!= 比較的一個變量和字符串
是用~, ~*與正則表達式匹配的變量,若是這個正則表達式中包含},;則整個表達式須要用" 或' 包圍 使用-f ,!-f 檢查一個文件是否存在 使用-d, !-d 檢查一個目錄是否存在 使用-e ,!-e 檢查一個文件、目錄、符號連接是否存在 使用-x , !-x 檢查一個文件是否可執行 複製代碼
if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" ){
rewrite ^.+ /mobile last; #跳轉到手機站
}
if ($request_method = POST) {
return 405;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}
複製代碼
(1)last 和 break 當出如今location 以外時,二者的做用是一致的沒有任何差別。
注意一點就是,他們會跳過全部的在他們以後的rewrite 模塊中的指令,去選擇本身匹配的location
(2)last 和 break 當出如今location 內部時,二者就存在了差別
-- last: 使用了last 指令,rewrite 後會跳出location 做用域,從新開始再走一次剛剛的行爲
-- break: 使用了break 指令,rewrite後不會跳出location 做用域。它的生命也在這個location中終結。
解釋通俗易懂:
last:
從新將rewrite後的地址在server標籤中執行
break:
將rewrite後的地址在當前location標籤中執行
複製代碼
permanent: 永久性重定向。請求日誌中的狀態碼爲301
redirect:臨時重定向。請求日誌中的狀態碼爲302
複製代碼
從實現功能的角度上去看,permanent 和 redirect 是同樣的。不存在好壞。也不存在什麼性能上的問題。可是對seo會有影響,這裏要根據須要作出選擇 在 permanent 和 redirect 中提到了 狀態碼 301 和 302。git
記住:last 和 break 想對於的訪問日誌的請求狀態碼爲200web
當你打開一個網頁,同時打開debug 模式時,會發現301 和 302 時的行爲是這樣的。正則表達式
第一個請求301 或者 302 後,瀏覽器從新獲取了一個新的URL ,而後會對這個新的URL 從新進行訪問。因此當你配置的是permanent 和 redirect ,你對一個URL 的訪問請求,落到服務器上至少爲2次;而當你配置了last 或者是break 時,你最終的URL 肯定下來後,不會將這個URL返回給瀏覽器,而是將其扔給了fastcgi_pass或者是proxy_pass指令去處理。請求一個URL ,落到服務器上的次數就爲1次。apache
注意:配置last 在跨域的時候效果和redirect一致,都是返回302狀態碼,請求地址也發生改變api
nginx做爲http服務器的時候:
max_clients = worker_processes * worker_connections/2
複製代碼
nginx做爲反向代理服務器的時候:
max_clients = worker_processes * worker_connections/4
複製代碼
demo:定義一個叫「two」的記錄區,總容量爲 10M(超過大小將請求失敗,以變量 $binary_remote_addr 做爲會話的判斷基準(即一個地址一個會話)。 限制 /download/ 目錄下,一個會話只能進行一個鏈接。 簡單點,就是限制 /download/ 目錄下,一個IP只能發起一個鏈接,多過一個,一概503。
http {
...
limit_conn_zone $binary_remote_addr zone=two:10m;
server {
...
location /download {
limit_conn two 1;
}
}
}
複製代碼
demo:定義一個叫「one」的記錄區,佔用空間大小爲10m(超過大小將請求失敗),平均處理的請求頻率不能超過每秒一次,也能夠設置分鐘速率
http {
...
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
...
location / {
#緩存區隊列burst=5個,nodelay表示不延期(超過的請求失敗),即每秒最多可處理rate+burst個,同時處理rate個。
limit_req zone=one burst=5 nodelay;
}
}
}
複製代碼
http{
...
#判斷客戶端的ip地址是否在白名單列表當中,若是返回爲0,則在白名單列表當中,不然返回爲1
geo $whiteIpList {
default 1;
118.24.109.254 0;
47.98.147.0/24 1;
#能夠引入一些白名單配置
include 'whiteIP.conf'
}
#若是不在白名單以內,返回客戶端的二進制的ip地址
map $whiteIpList $limit {
default "";
1 $binary_remote_addr;
0 "";
}
#若是返回的是空字符串那麼速率限制會失效
limit_req_zone $limit zone=test:2m rate=1r/m;
...
}
複製代碼
http {
...
server {
...
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked *.13sai.com;
if ($invalid_referer) {
rewrite ^/ blog.13sai.com
}
}
}
}
複製代碼