nginx 基礎

 一 、操做命令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/*;
}
View Code
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;
    }
}
View Code
# 當用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
}

4、配置限制訪問

在一臺服務器上的資源不所有都是對外開放的,這個時候就須要經過Nginx配置一個限制訪問,好比查看本服務器的PHP信息,咱們就能夠經過下面配置來實現限制訪問:安全

# 當匹配到/info的時候只容許10.7.101.224訪問,其它的所有限制
# 同時改寫爲/info.php
location = /info {
    allow 10.7.101.224;
    deny all;
    rewrite (.*) /info.php
}

這個時候只有IP10.7.101.224的機器才能夠訪問:aotu.jd.com/info,其它機器都會…

固然最佳的實踐是將IP抽取出來變成白名單,這樣子就能夠實現部分IP能夠訪問,其它的不能訪問。

5、優先級

一、多個server_name

若是多個文件配置有相同的 server_name ,根據文件名先讀取到哪一個文件就加載哪一個文件的配置

二、location

  • = 表示精確匹配
  • ^~ 表示uri以某個常規字符串開頭,大多狀況下用來匹配url路徑,nginx不對url作編碼,所以請求爲/static/20%/aa,能夠被規則^~ /static/ /aa匹配到(注意是空格)。
  • ~ 正則匹配(區分大小寫)
  • ~* 正則匹配(不區分大小寫)
  • !~和!~*分別爲區分大小寫不匹配及不區分大小寫不匹配 的正則
  • / 任何請求都會匹配

首先匹配 =,其次匹配^~, 其次是按文件中順序的正則匹配,最後是交給 / 通用匹配。當有匹配成功時候,中止匹配,按當前匹配規則處理請求。

 

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以某個常規字符串開頭,不是正則匹配.
  • ~: 開頭表示區分大小寫的正則匹配.
  • ~*: 開頭表示不區分大小寫的正則匹配.
  • / : 通用匹配, 若是沒有其它匹配,任何請求都會匹配到.

匹配優先級(高到低)

  1. location =
  2. location 完整路徑
  3. location ^~ 路徑
  4. location ~,~* 正則順序
  5. location 部分起始路徑
  6. /

詳見Location配置

Reverse Proxy

NGINX代理請求時,它會將請求發送到指定的代理服務器,獲取響應並將其發送回客戶端。可使用指定的協議將請求代理到HTTP服務器(另外一個NGINX服務器或任何其餘服務器)或非HTTP服務器(能夠運行使用特定框架(如PHPPython)開發的應用程序)。

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應使用相應的指令:

配置參數屬性 解釋說明 參數列
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地址

詳見Proxy

全局變量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 請求的方法,好比GETPOST
$request_uri 完整的原始請求URI(帶參數)
$scheme 請求方案,httphttps
$server_addr 接受請求的服務器的地址,若是沒有用listen指明服務器地址,使用這個變量將發起一次系統調用以取得地址(形成資源浪費);
$server_protocol 請求的協議版本,HTTP/1.0HTTP/1.1
$uri 請求中的當前URI, $uri在請求處理期間 ,值可能會發生變化,例如在執行內部重定向或使用索引文件時

  1. index

    語法:index file ...; 默認爲index index.html;

    index指令指定了被做爲index的文件,好比上面的index.html

    可是在下面這種狀況下,對/index.html的請求將會被第二個location block處理,由於第一個與/index.html並非徹底匹配。

    location = / {
        index index.html;
    }
    location / {
        ...
    }
  2. 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 下依次查找pagepage.htmlpage/,若是都沒有找到的話將會被重定向到/fallback/index.html,並由第二個location提供/var/www/another/fallback/index.html

  3. rewrite

    經過Perl兼容的正則表達式改變請求的URI,語法:rewrite regex replacement [flag];

    flag的值能夠是:

    • last

      結束當前的rewrite指令,並用修改過的URI去匹配其餘的location block

    • break

      結束當前的rewrite指令。

    • redirect

      當替換的URI(replacement)不以 「http://」,「https://」「$scheme」開頭時進行狀態碼爲302的暫時性的重定向。

    • permanent

      返回一個狀態碼爲301的永久重定向。

  4. 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

相關文章
相關標籤/搜索