Nginx能幹啥?

Nginx能幹的事不少,很強大。官方文檔詳見點我php

Nginx的命令行參數

-? | -h 打印幫助信息
-c file 讀取指定配置文件,而不是默認的nginx.conf
-g directives 從命令行直接讀取配置,取代nginx.conf
-p prefix 指定工做目錄 (默認是/usr/local/nginx)
-q 配置測試期間,禁止輸出非錯誤信息
-s signal 發送信號給worker進程,其中signal真實信號名,也能夠是stop(強制退出)、quit(優雅退出)、reload(從新加載配置)、reopen(從新打開log文件)
-t 測試配置文件是否正確
-T 同上,可是會同時輸出整個配置文件
-v 打印版本號
-V 打印更多配置/編譯信息

Nginx進程pid默認在如下文件中:
/usr/local/nginx/logs/nginx.pidhtml

發送信號給master進程以控制worker進程,詳見點我nginx

Nginx如何處理一個鏈接?

若是有以下配置,那鏈接被代理到這三個裏邊的哪個處理?是根據HTTP頭部的HOST字段來判斷的,若是沒有HOST字段,那就默認第一個配置來處理,除非指定了default_server關鍵字。若是想決絕掉全部不帶HOST字段的請求,那就配置一個server_name爲空字符串"",而後return一個444狀態碼。正則表達式

server {
    listen      80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      80;
    server_name example.com www.example.com;
    ...
}

若是有以下配置,首先檢測的是ip,其次纔是server_name。dom

server {
    listen      192.168.1.1:80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      192.168.1.1:80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      192.168.1.2:80;
    server_name example.com www.example.com;
    ...
}

若是有以下配置,nginx會優先選擇最匹配的uri。location /就能匹配全部url,那麼優先級就最低,若是訪問/xyz.php,那就交給cgi處理,若是訪問/xyz.png,那就到/data/www目錄下找。若是訪問的是/,那麼在/data/www目錄下找index.html文件,找不到則匹配index.php,也就是交給cgi處理,由於location ~ \.php$更匹配。測試

server {
    listen      80;
    server_name example.org www.example.org;
    root        /data/www;

    location / {
        index   index.html index.php;
    }

    location ~* \.(gif|jpg|png)$ {
        expires 30d;
    }

    location ~ \.php$ {
        fastcgi_pass  localhost:9000;
        fastcgi_param SCRIPT_FILENAME
                      $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}

server_name配置方法

以下配置,server_name 參數支持精確匹配、通配符、正則表達式。建議一行別寫太多個參數,參數的個數是有限制的。ui

server {
    listen       80;
    server_name  example.org  www.example.org;
    ...
}

server {
    listen       80;
    server_name  *.example.org;
    ...
}

server {
    listen       80;
    server_name  mail.*;
    ...
}

server {
    listen       80;
    server_name  ~^(?<user>.+)\.example\.net$;
    ...
}

若是HTTP host匹配到多個server,則按以下順序選擇:url

  • 精確匹配
  • 前置通配符,如*.example.com
  • 後置通配符,如mai.*
  • 首個正則表達式,根據在配置文件中出現的順序

編寫規則:.net

  • 通配符出現的位置只容許在字符串的頭部或尾部,不容許出如今中間,如ww*.example.com。一個比較特殊的字符串.example.org,能夠匹配example.org*.example.org
  • 正則表達式的開頭必須是~,不然會被當作其餘兩種匹配方式。經常使用的有前置^和尾置$.須要加轉義字符\
  • 用到大括號{}時須要爲字符串加上雙引號,如"~^(?<name>\w\d{1,3}+)\.example\.net$"

以下配置,是server_name變量捕捉的例子。命令行

server {
    server_name   ~^(www\.)?(?<domain>.+)$;

    location / {
        root   /sites/$domain;
    }
}

語法:

  • ?<name> Perl 5.10 compatible syntax, supported since PCRE-7.0
  • ?'name' Perl 5.10 compatible syntax, supported since PCRE-7.0
  • ?P<name> Python compatible syntax, supported since PCRE-4.0
相關文章
相關標籤/搜索