一 、操做命令php
sudo nginx #打開 nginx
nginx -s reload|reopen|stop|quit #從新加載配置|重啓|中止|退出 nginx
nginx -t #測試配置是否有語法錯誤html
建議 使用 nginx -s quit 待nginx進程處理任務完畢進行中止node
nginx -t -c /etc/nginx/nginx.confnginx
nginx -s reload -c /etc/nginx/nginx.confweb
nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]正則表達式
-?,-h : 打開幫助信息
-v : 顯示版本信息並退出
-V : 顯示版本和配置選項信息,而後退出
-t : 檢測配置文件是否有語法錯誤,而後退出
-q : 在檢測配置文件期間屏蔽非錯誤信息
-s signal : 給一個 nginx 主進程發送信號:stop(中止), quit(退出), reopen(重啓), reload(從新加載配置文件)
-p prefix : 設置前綴路徑(默認是:/usr/local/Cellar/nginx/1.2.6/)
-c filename : 設置配置文件(默認是:/usr/local/etc/nginx/nginx.conf)
-g directives : 設置配置文件外的全局指令後端
2、配置詳解api
# user字段代表了Nginx服務是由哪一個用戶哪一個羣組來負責維護進程的,默認是nobody # 我這裏用了cainengtian用戶,staff組來啓動並維護進程 # 查看當前用戶命令: whoami # 查看當前用戶所屬組命令: groups ,當前用戶可能有多個所屬組,選第一個便可 user cainengtian staff; # worker_processes字段表示Nginx服務佔用的內核數量 # 爲了充分利用服務器性能你能夠直接寫你本機最高內核 # 查看本機最高內核數量命令: sysctl -n hw.ncpu worker_processes 4; # error_log字段表示Nginx錯誤日誌記錄的位置 # 模式選擇:debug/info/notice/warn/error/crit # 上面模式從左到右記錄的信息從最詳細到最少 error_log /usr/local/var/logs/nginx/error.log debug; # Nginx執行的進程id,默認配置文件是註釋了 # 若是上面worker_processes的數量大於1那Nginx就會啓動多個進程 # 而發信號的時候須要知道要向哪一個進程發信息,不一樣進程有不一樣的pid,因此寫進文件發信號比較簡單 # 你只須要手動建立,好比我下面的位置: touch /usr/local/var/run/nginx.pid pid /usr/local/var/run/nginx.pid; events { # 每個worker進程能併發處理的最大鏈接數 # 看成爲反向代理服務器,計算公式爲: `worker_processes * worker_connections / 4` # 看成爲HTTP服務器時,公式是除以2 worker_connections 2048; } http { # 關閉錯誤頁面的nginx版本數字,提升安全性 server_tokens off; include mime.types; default_type application/octet-stream; # 日誌記錄格式,若是關閉了access_log能夠註釋掉這段 #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可讓讀取磁盤IO操做更快 # 固然若是你在學習的過程當中能夠打開方便查看Nginx的訪問日誌 access_log off; sendfile on; # 在一個數據包裏發送全部頭文件,而不是一個接一個的發送 tcp_nopush on; # 不要緩存 tcp_nodelay on; keepalive_timeout 65; gzip on; client_max_body_size 10m; client_body_buffer_size 128k; # 關於下面這段在後面緊接着來談! include /usr/local/etc/nginx/sites-enabled/*; }
server { # Nginx監聽端口號 listen 80; # 服務器的名字,默認爲localhost,你也能夠寫成aotu.jd.com,這樣子就能夠經過aotu.jd.com來訪問 server_name localhost; # 代碼放置的根目錄 root /var/www/; # 編碼 charset utf-8; location / { # index字段聲明瞭解析的後綴名的前後順序 # 下面匹配到/的時候默認找後綴名爲php的文件,找不到再找html,再找不到就找htm index index.php index.html index.htm; # 自動索引 autoindex on; # 這裏引入瞭解析PHP的東西 include /usr/local/etc/nginx/conf.d/php-fpm; } # 404頁面跳轉到404.html,相對於上面的root目錄 error_page 404 /404.html; # 403頁面跳轉到403.html,相對於上面的root目錄 error_page 403 /403.html; # 50x頁面跳轉到50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
# 當用root配置的時候,root後面指定的目錄是上級目錄 # 而且該上級目錄必須含有和location後指定的名稱的同名目錄,不然404 # root末尾的"/"加不加無所謂 # 下面的配置若是訪問站點http://localhost/test1訪問的就是/var/www/test1目錄下的站點信息 location /test1/ { root /var/www/; } # 若是用alias配置,其後面跟的指定目錄是準確的,而且末尾必須加"/",不然404 # 下面的配置若是訪問站點http://localhost/test2訪問的就是/var/www/目錄下的站點信息 location /test2/ { alias /var/www/; }
3、臨時重定向緩存
location /o2blog_wx/ { # 當匹配到http://aotu.jd.com/o2blog_wx/的時候會跳轉到http://aotu.jd.com/wxblog return 302 http://aotu.jd.com/wxblog }
在一臺服務器上的資源不所有都是對外開放的,這個時候就須要經過Nginx
配置一個限制訪問,好比查看本服務器的PHP
信息,咱們就能夠經過下面配置來實現限制訪問:安全
# 當匹配到/info的時候只容許10.7.101.224訪問,其它的所有限制 # 同時改寫爲/info.php location = /info { allow 10.7.101.224; deny all; rewrite (.*) /info.php }
這個時候只有IP
爲10.7.101.224
的機器才能夠訪問:aotu.jd.com/info,其它機器都會…
固然最佳的實踐是將IP
抽取出來變成白名單,這樣子就能夠實現部分IP
能夠訪問,其它的不能訪問。
5、優先級
一、多個server_name
若是多個文件配置有相同的 server_name ,根據文件名先讀取到哪一個文件就加載哪一個文件的配置
二、location
首先匹配 =,其次匹配^~, 其次是按文件中順序的正則匹配,最後是交給 / 通用匹配。當有匹配成功時候,中止匹配,按當前匹配規則處理請求。
HTTP
能夠嵌套多個server
,配置代理,緩存,日誌定義等絕大多數功能和第三方模塊的配置。
配置參數屬性 | 解釋說明 | 參數列表 |
---|---|---|
include | 主模塊指令,實現對配置文件所包含的文件的設定,能夠減小主配置文件的複雜度,DNS主配置文件中的zonerfc1912,acl基本上都是用include語句 | |
default_type | 核心模塊指令 | 默認設置爲二進制流,也就是當文件類型未定義時使用這種方式 |
log_format | 日誌格式的設定 | 日誌格式的名稱,可自行設置,後面引用 |
access_log | 引用日誌 | 引用log_format設置的名稱 |
keepalive_timeout | 設置客戶端鏈接保存活動的超時時間 | 0是無限制 |
sendfile | 開啓高效文件傳輸模式 | on / off |
tcp_nopush | 開啓防止網絡阻塞 | on / off |
tcp_nodelay | 開啓防止網絡阻塞 | on / off |
upstream | 負載均衡 | |
server | Nginx的server虛擬主機配置 |
Upstream
它的做用是實如今輪詢和客戶端IP之間的後端服務器負荷平衡。
配置參數屬性 | 解釋說明 |
---|---|
輪詢(默認) | 當weight不指定時,各服務器weight相同,每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除。 |
weight | 指定輪詢概率,weight和訪問比率成正比,用於後端服務器性能不均的狀況 |
ip_hash | 每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題。 |
fair(第三方) | 按後端服務器的響應時間來分配請求,響應時間短的優先分配。 |
url_hash(第三方) | 按訪問url的hash結果來分配請求,使每一個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。 |
weight
默認爲1.weight
越大,負載的權重就越大。
Nginx Upstream
狀態例如:
upstream news {
server 127.0.0.1:9527 backup;
server 127.0.0.1:9527 weight=1 max_fails=2 fail_timeout=3;
...
}
複製代碼
配置參數屬性 | 解釋說明 |
---|---|
backup | 預留的備份服務器 |
down | 當前的server暫時不參與負載均衡 |
fail_timeout | 通過max_fails 失敗後,服務暫停的時間 |
max_conns | 限制最大的接收的鏈接數 |
max_fails | 容許請求失敗的次數 |
use location
:在server
中添加
proxy_pass http://127.0.0.1:9527;
// 由於個人API接口是這個,such as /api/profile
// location 具體匹配規則詳見後面
location ~ /api/ {
proxy_pass http://127.0.0.1:9527;
}
複製代碼
Server
配置虛擬主機的相關參數,一個http
中能夠有多個server
。
配置參數屬性 | 解釋說明 | 參數列表 |
---|---|---|
listen | 監聽端口 | http -> 80 / https -> 443 |
server_name | 設置主機域名 | localhost |
charset | 設置訪問的語言編碼 | |
access_log | 設置虛擬主機訪問日誌的存放路徑及日誌的格式 | |
location | 設置虛擬主機的基本信息 |
Location
配置請求的路由,以及各類頁面的處理狀況。
配置參數屬性 | 解釋說明 | 參數列表 |
---|---|---|
root | 設置虛擬主機的網站根目錄 | Vue項目的根目錄/Users/rainy/Desktop/MyWork/Work/cloudwiz-website/dist |
index | 設置虛擬主機默認訪問的網頁 | index.html index.htm |
proxy | 經過不一樣協議將請求從NGINX傳遞到代理服務器 |
=
: 開頭表示精確匹配,如 api
中只匹配根目錄結尾的請求,後面不能帶任何字符串.^~
:開頭表示uri
以某個常規字符串開頭,不是正則匹配.~
: 開頭表示區分大小寫的正則匹配.~*
: 開頭表示不區分大小寫的正則匹配./
: 通用匹配, 若是沒有其它匹配,任何請求都會匹配到.匹配優先級(高到低)
location =
location 完整路徑
location ^~ 路徑
location ~,~* 正則順序
location 部分起始路徑
/
Reverse Proxy
當NGINX
代理請求時,它會將請求發送到指定的代理服務器,獲取響應並將其發送回客戶端。可使用指定的協議將請求代理到HTTP
服務器(另外一個NGINX
服務器或任何其餘服務器)或非HTTP
服務器(能夠運行使用特定框架(如PHP
或Python
)開發的應用程序)。
location / some / path / {
proxy_pass http://www.example.com:8080;
proxy_set_header Host $ host ;
proxy_set_header X-Real-IP $ remote_addr ;
// 禁用特定位置的緩衝
proxy_buffering off ;
proxy_buffers 16 4k ;
proxy_buffer_size 2k ;
proxy_bind 127.0.0.2 ; // IP地址也能夠用變量指定
}
複製代碼
將請求傳遞給非HTTP
代理服務器,**_pass
應使用相應的指令:
fastcgi_pass
將請求傳遞給FastCGI服務器uwsgi_pass
將請求傳遞給uwsgi服務器scgi_pass
將請求傳遞給SCGI服務器memcached_pass
將請求傳遞給memcached服務器配置參數屬性 | 解釋說明 | 參數列 |
---|---|---|
proxy_pass | 將請求傳遞給HTTP代理服務器 | |
proxy_set_header | 傳遞請求標頭 | 默認狀況下,NGINX在代理請求中從新定義兩個頭字段「Host」和「Connection」,並刪除其值爲空字符串的頭字段。「Host」設置爲$proxy_host 變量,「Connection」設置爲close 。 |
proxy_buffering |
負責啓用和禁用緩衝 | on / off |
proxy_buffers | 請求分配的緩衝區的大小和數量 | |
proxy_buffer_size | 代理服務器的響應的第一部分存儲在單獨的緩衝區大小 | 一般包含一個相對較小的響應頭,而且能夠比其他響應的緩衝區小。 |
proxy_bind | 接受來自特定IP網絡或IP地址範圍的鏈接 | 指定proxy_bind 必要網絡接口的指令和IP地址 |
Global Variable
變量名 | 變量含義 |
---|---|
$args | 請求中的參數 |
$content_length | HTTP 請求信息裏的Content-Length |
$content_type | 請求信息裏的Content-Type |
$host | 請求信息中的Host ,若是請求中沒有Host 行,則等於設置的服務器名 |
$http_cookie | cookie 信息 |
$http_referer | 引用地址 |
$http_user_agent | 客戶端代理信息 |
$remote_addr | 客戶端地址 |
$remote_port | 客戶端端口號 |
$remote_user | 客戶端用戶名,認證用 |
$request_method | 請求的方法,好比GET 、POST 等 |
$request_uri | 完整的原始請求URI (帶參數) |
$scheme | 請求方案,http 或https |
$server_addr | 接受請求的服務器的地址,若是沒有用listen 指明服務器地址,使用這個變量將發起一次系統調用以取得地址(形成資源浪費); |
$server_protocol | 請求的協議版本,HTTP/1.0 或HTTP/1.1 |
$uri | 請求中的當前URI , $uri 在請求處理期間 ,值可能會發生變化,例如在執行內部重定向或使用索引文件時 |
index
語法:index file ...;
默認爲index index.html;
index
指令指定了被做爲index的文件,好比上面的index.html
可是在下面這種狀況下,對/index.html
的請求將會被第二個location block
處理,由於第一個與/index.html
並非徹底匹配。
location = / { index index.html; } location / { ... }
try_files
root /var/www/main;location / { try_files $uri $uri.html $uri/ /fallback/index.html; } location /fallback { root /var/www/another; }
對/page
的請求將會首先進入第一個location, 而後嘗試在/var/www/main
下依次查找page
, page.html
, page/
,若是都沒有找到的話將會被重定向到/fallback/index.html
,並由第二個location提供/var/www/another/fallback/index.html
rewrite
經過Perl兼容的正則表達式改變請求的URI,語法:rewrite regex replacement [flag];
flag的值能夠是:
last
結束當前的rewrite指令,並用修改過的URI去匹配其餘的location block
。
break
結束當前的rewrite指令。
redirect
當替換的URI(replacement
)不以 「http://」
,「https://」
, 「$scheme」
開頭時進行狀態碼爲302的暫時性的重定向。
permanent
返回一個狀態碼爲301的永久重定向。
error_page
root /var/www/main; location / { error_page 404 /another/whoops.html; } location /another { root /var/www; }
除了/another
以外的請求都會在/var/www/main
查找請求的資源,若是沒有找到相關資源將會重定向到/another/whoops.html
,由第二個location block
處理,查找/var/www/another/whoops.html