Nginx安裝配置詳解(萬字長文典藏版)

Nginx安裝配置詳解

Nginx簡介

Nginx(“engine x”)是一款高性能的Web服務(wù)器和反向代理服務(wù)器,它采用事件驅(qū)動(dòng)的異步結(jié)構(gòu),具有內(nèi)存占用少、穩(wěn)定性高、能夠處理大量的并發(fā)請求,具有高效和低資源消耗等特點(diǎn)。 Nginx常常被用作Web服務(wù)器、負(fù)載均衡器、反向代理和緩存服務(wù)器等。

Nginx安裝

在Ubuntu中,安裝Nginx步驟如下:

  1. 更新軟件源

可以通過運(yùn)行以下命令更新軟件源:

sudo apt-get update

# 在CentOS中
# sudo yum install epel-release
  1. 安裝Nginx

安裝Nginx服務(wù)器可以通過以下命令:

sudo apt-get install nginx

# 在CentOS中
# sudo yum install nginx
  1. 檢查Nginx是否正確安裝

運(yùn)行以下命令可以檢查Nginx是否正確安裝:

# 查看nginx版本號
nginx -v

# 查看nginx版本號以及其他配置參數(shù),包含安裝、配置文件路徑以及內(nèi)置模塊等信息
nginx -V

如果能夠輸出Nginx的版本號,則表示Nginx已經(jīng)正確安裝。

默認(rèn)情況下,Nginx的安裝路徑為/usr/share/nginx,Nginx的配置文件路徑為/etc/nginx/nginx.conf

  1. nginx幫助手冊命令以及常用命令
# 查看nginx幫助文檔
nginx -h

# 在Linux系統(tǒng)中,可以使用man命令查看nginx詳細(xì)幫助文檔
man nginx

# 檢測nginx配置文件語法是否正確
nginx -t

# 檢測nginx配置文件語法是否正確,并把nginx配置文件信息輸出到屏幕
nginx -T

# 設(shè)置nginx使用的配置文件(默認(rèn)使用:/usr/local/etc/nginx/nginx.conf)
nginx -c nginx_file.conf

# 向nginx主進(jìn)程發(fā)送信號,stop, quit, reopen, reload
nginx -s stop # 停止Nginx進(jìn)程

nginx -s quit # 快速停止Nginx進(jìn)程,但允許完成已經(jīng)接受的連接請求

nginx -s reopen # 重新打開日志文件

# 與stop不同,reload不會(huì)完全停止Nginx進(jìn)程,而是平滑地重新加載配置文件,并在新的工作進(jìn)程中對已有的連接進(jìn)行服務(wù),可在不停止服務(wù)的情況下實(shí)現(xiàn)動(dòng)態(tài)更新配置
nginx -s reload 

區(qū)別:

stop和quit都是停止Nginx進(jìn)程,但quit允許之前接受的連接繼續(xù)完成,而stop則會(huì)強(qiáng)制終止所有連接。
reload會(huì)重載Nginx的配置文件,并啟動(dòng)新的worker進(jìn)程,新的worker進(jìn)程會(huì)用新的配置重新跑,舊的worker進(jìn)程會(huì)繼續(xù)處理舊有的連接,新配置生效后,新的連接會(huì)從新的worker進(jìn)程處理,而reopen是重新打開日志文件,在日志文件較大的時(shí)候,方便日志切割。

全局內(nèi)置指令和變量

Nginx常用的全局指令

  1. user:指定Nginx所使用的系統(tǒng)用戶和用戶組,默認(rèn)為nobody;
  2. worker_processes:指定Nginx工作進(jìn)程的數(shù)量,默認(rèn)為1;
  3. worker_cpu_affinity:指定每個(gè)worker進(jìn)程綁定的CPU核心;
  4. worker_rlimit_nofile:指定每個(gè)worker進(jìn)程允許打開的最大文件數(shù);
  5. pid:指定Nginx進(jìn)程號存放的位置,默認(rèn)為/var/run/nginx.pid;
  6. access_log:指定Nginx訪問日志存放的位置和格式;
  7. error_log:指定Nginx錯(cuò)誤日志存放的位置和格式,常用的格式有debuginfonoticewarnerrorcrit
  8. events:指定Nginx事件模塊的配置,常見的配置包括worker_connections(最大連接數(shù))和useepollkqueue,以及其他一些事件模塊配置;
  9. http:指定Nginx HTTP模塊的配置,包括server_names_hash_max_size(域名哈希表的最大尺寸)、server_names_hash_bucket_size(每個(gè)哈希桶的大小)、client_max_body_size(前端客戶端傳輸?shù)淖畲笳埱篌w大小)等等;
  10. server:指定Nginx所有server塊的配置,包括listen(服務(wù)器監(jiān)聽端口)、server_name(服務(wù)器域名)、access_log(訪問日志路徑和格式)等等。
  11. keepalive_timeout:指定HTTP keep-alive連接超時(shí)時(shí)間。
  12. multi_accept:一個(gè)請求是否能夠被多個(gè) worker 處理。
  13. gzip:是否啟用gzip壓縮傳輸;
  14. ssl:開啟SSL支持;
  15. use:添加 nginx 模塊;

更多配置信息詳見官方文檔:https://nginx.org/en/docs/

更多指令詳見官方文檔:https://nginx.org/en/docs/dirindex.html

nginx常用的內(nèi)置變量

  1. $request_method:所使用的 HTTP 請求方法,如 GET、POST、PUT、DELETE、HEAD 等。
  2. $host: 請求的主機(jī)名。
  3. $http_referer: 請求的 HTTP referer 頭部字段。
  4. $http_user_agent: 請求的 User-Agent 頭部字段。
  5. $remote_addr: 客戶端的 IP 地址。
  6. $request_body: 請求主體的內(nèi)容。
  7. $request_uri: 請求的 URI 包括參數(shù)部分。
  8. $args: 請求中的參數(shù)部分,同$query_string
  9. $scheme: 請求使用的協(xié)議,比如 http 或 https。
  10. $server_name: Nginx 配置中當(dāng)前虛擬主機(jī)的名稱。
  11. $server_port: Nginx 監(jiān)聽的端口號。

通過使用這些內(nèi)置變量,可以方便地在Nginx配置中進(jìn)行動(dòng)態(tài)參數(shù)配置、請求頭部字段獲取等操作。同時(shí),還可以像使用任何其他Nginx變量一樣,將它們與各種指令(如if、set、map)結(jié)合使用。

以下是Nginx中常用的一些內(nèi)置變量及其說明:

  1. $request_method:所使用的 HTTP 請求方法,如 GET、POST、PUT、DELETE、HEAD 等。

示例:

if ($request_method = POST) {
    return 405;
}
  1. $host:請求頭中的主機(jī)名,通常用于虛擬主機(jī)配置。

示例:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
    }
}
  1. $scheme:請求使用的協(xié)議,如 http 或 https。

示例:

if ($scheme = http) {
    return 301 https://$server_name$request_uri;
}
  1. $request_uri:請求的完整 URI,包括參數(shù)。

示例:

location ~ \.php$ {
    fastcgi_pass backend;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param QUERY_STRING $query_string;
}
  1. $remote_addr:客戶端的IP地址。

示例:

geo $blocked_country {
    default no;
    include /etc/nginx/conf.d/blocked_country.txt;
}

server {
    if ($blocked_country) {
        return 403;
    }
}
  1. $args:請求參數(shù)部分的字符串。

示例:

location /search/ {
    if ($args ~* "q=(.*)") {
        set $query $1;
    }

    proxy_pass http://backend/search?q=$query;
}
  1. $http_referer:HTTP 請求頭中的 referer 字段,表示從哪個(gè)網(wǎng)頁鏈接過來。

示例:

if ($http_referer ~* (spamdomain.com|adsite.com)) {
    return 403;
}
  1. $http_user_agent:HTTP 請求頭中的 User-Agent 字段,表示發(fā)起請求的客戶端使用的瀏覽器。

示例:

if ($http_user_agent ~* "MSIE [1-6]\.") {
    return 403;
}
  1. $server_name:配置文件中定義的當(dāng)前虛擬主機(jī)名稱。

示例:

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/example.com;
    }
}
  1. $server_addr:Nginx 監(jiān)聽的 IP 地址。

示例:

server {
    listen 127.0.0.1:8080;
    server_name example.com;

    location / {
        proxy_pass http://backend;
    }
}

這些內(nèi)置變量的詳細(xì)說明和使用方法可以在官網(wǎng)文檔中找到。

更多內(nèi)置變量詳見官方文檔:https://nginx.org/en/docs/varindex.html

set詳細(xì)用法

下面是nginx配置自定義變量的詳細(xì)用法和代碼示例:

它的語法為:

set $variable value;

其中,$variable為變量名,value為變量值,可以是文本、數(shù)字、表達(dá)式等等。set指令可以在http、server、location、if等塊中使用。

需要注意的是,set指令只在當(dāng)前上下文中應(yīng)用。如果在 http 上下文中設(shè)置變量,則它將在整個(gè) Nginx 配置中使用。但是,在 server 和 location 上下文等細(xì)分上下文中設(shè)置的變量僅在該上下文中使用。變量值的計(jì)算是在每個(gè)請求中進(jìn)行的,因此可以在 Nginx 配置中動(dòng)態(tài)地設(shè)置變量。此外,您還可以使用nginx的內(nèi)置變量,例如$uri$request_method等,將它們與自定義變量一起使用來構(gòu)建更復(fù)雜的變量。

  1. 定義參數(shù)變量:

使用set關(guān)鍵字定義參數(shù)變量,例如:

http {
    #定義全局參數(shù)變量
    set $var "/path/to/some/file.txt";
    ...
}
  1. 使用參數(shù)變量:

在配置文件中可以使用$符號引用參數(shù)變量,例如:

location / {
    ...
    #使用參數(shù)變量
    rewrite ^(.*)$ $var;
    ...
}
  1. 參數(shù)變量與字符串拼接:

可以使用concat函數(shù)將參數(shù)變量和字符串拼接起來,例如:

http {
    #定義全局參數(shù)變量
    set $base_url "https://example.com/";
    ...
}

location / {
    ...
    #將參數(shù)變量和字符串拼接起來
    set $img_url "/img/";
    set $full_path "${base_url}$(uri)${img_url}";
    ...
}
  1. 參數(shù)變量與正則表達(dá)式:

可以使用參數(shù)變量與正則表達(dá)式一起使用,例如:

location ~* \.(jpeg|jpg|png)$ {
    ...
    #將匹配的文件類型保存到參數(shù)變量中
    set $img_type $1;
    ...
}
  1. 從請求中提取變量值:
set $my_var $arg_var;

這樣就從請求的參數(shù)中提取了名為arg_var的變量,并將其值賦給$my_var。

  1. 使用表達(dá)式計(jì)算變量值:
set $my_var 10;
set $my_var2 20;
set $my_var3 $my_var+$my_var2;

這樣就定義了三個(gè)變量,$my_var的值為10,$my_var2的值為20,$my_var3的值為它們的和30。

  1. 使用map模塊設(shè)置匹配規(guī)則:
map $uri $my_var {
    /page1.html "This is page 1.";
    /page2.html "This is page 2.";
    default "This page does not exist.";
}

set $my_var2 $my_var;

這樣就使用map模塊給$uri變量匹配規(guī)則,如果匹配到了/page1.html,則$my_var的值為"This is page 1.",否則如果匹配到了/page2.html,則$my_var的值為"This is page 2.",否則如果沒有匹配到任何規(guī)則,則$my_var的值為"This page does not exist."。在set指令中,我們可以使用$my_var來引用這個(gè)變量。

通過使用參數(shù)變量的方式,我們可以大大簡化和優(yōu)化配置文件中的重復(fù)代碼和硬編碼。下面是一個(gè)例子:

http {
    #定義全局參數(shù)變量
    set $base_url "https://example.com/";
    set $img_url "/img/";
    ...
}

server {
    listen 80;
    server_name example.com;
    #將請求重定向到默認(rèn)的ssl端口
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;
    ...
    location / {
        #將請求代理到指定的upstream服務(wù)器,并使用參數(shù)變量
        proxy_pass ${base_url}upstream;
        ...
    }
    location ~* \.(jpeg|jpg|png)$ {
        #將匹配的文件類型保存到參數(shù)變量中,并使用參數(shù)變量
        set $img_type $1;
        ...
        add_header Content-Disposition "attachment; filename=${img_type}";
        ...
    }
}

需要注意的是,由于使用set指令會(huì)增加Nginx的計(jì)算負(fù)擔(dān),因此在配置中不應(yīng)濫用。若使用過度,可能會(huì)導(dǎo)致性能下降或引用其他問題。
總的來說,Nginx的set指令可以用于創(chuàng)建自定義變量,將多個(gè)變量組合到一起生成一個(gè)新的變量,從而簡化配置文件。使用時(shí)應(yīng)當(dāng)根據(jù)具體情況謹(jǐn)慎使用。

map詳細(xì)用法

Nginx map指令用于根據(jù)一個(gè)或多個(gè)變量的值生成映射關(guān)系。它可以將一組固定的鍵值對組合為一個(gè)映射表,并在請求到達(dá)時(shí)使用當(dāng)前請求的變量值來查找相應(yīng)的映射值,并將其賦予一個(gè)新的變量。通過使用map指令,可以在處理請求之前將復(fù)雜的信息邏輯轉(zhuǎn)換為簡單的鍵值對。

map指令的語法如下:

map $variable { 
    key value; 
    key value;
    ...
    default value;
}

其中,$variable是用于查找對應(yīng)映射值的變量名。{}內(nèi)用于定義鍵值對,每個(gè)鍵值對占一行,其中key為要匹配的值,value為匹配成功后要賦予變量的值。最后必須定義一個(gè)default值,當(dāng)所有key檢查完畢后,如果沒有匹配到任何值,則會(huì)使用default值。

下面是一個(gè)map指令的例子:

map $request_uri $my_variable {
    "/foo"    "foo";
    "/bar"    "bar";
    "/baz"    "baz";
    default   "nothing";
}

在這個(gè)例子中,由$request_uri指定要匹配的變量名,當(dāng)$request_uri的值為"/foo"、"/bar"、"/baz"時(shí),它們的值將被映射為相應(yīng)的"foo"、"bar"、"baz"字符串,并賦予$my_variable變量。在所有匹配失敗的情況下,$my_variable的默認(rèn)值為"nothing"。

map指令支持一些高級特性,例如可以使用正則表達(dá)式匹配變量值,使用命名分組;還可以使用include語句包含外部文件,從而方便地組織映射表內(nèi)容。

需要注意的是,由于map指令會(huì)增加Nginx的計(jì)算負(fù)擔(dān),因此在實(shí)際使用中,應(yīng)注意盡量優(yōu)化映射表和避免使用過度。此外,map指令只能在http、server和location塊內(nèi)使用,并且只有第一次使用時(shí)才能定義映射表。

總的來說,Nginx的map指令可以根據(jù)一個(gè)或多個(gè)變量的值生成映射關(guān)系,將復(fù)雜信息邏輯轉(zhuǎn)換為簡單的鍵值對。使用時(shí)應(yīng)當(dāng)注意優(yōu)化映射表和避免使用過度。

events模塊詳解

nginx中的events塊是一個(gè)必須的塊,用于配置全局的事件模型和一些系統(tǒng)相關(guān)的參數(shù)。下面是一個(gè)events塊的示例代碼和注解:

events {
  # 設(shè)置worker進(jìn)程數(shù),建議設(shè)置為CPU個(gè)數(shù)的倍數(shù)
  worker_processes 4;

  # 每個(gè)worker進(jìn)程連接的最大數(shù)
  worker_connections 1024;

  # 使用epoll事件模型,也可以使用kqueue、eventport等
  use epoll;

  # 每個(gè)epoll調(diào)用可處理的最大連接數(shù),設(shè)為on可以提高性能
  multi_accept on;
}

其中,注釋部分為對應(yīng)的配置項(xiàng)和解釋。需要注意的是,events塊中的參數(shù)并不是可選的,必須設(shè)置。下面是一些需要注意的要點(diǎn):

  1. worker_processes

該參數(shù)表示nginx要開啟多少個(gè)worker進(jìn)程。建議將其設(shè)置為CPU個(gè)數(shù)的倍數(shù),以充分利用系統(tǒng)的多核性能。

  1. worker_connections

該參數(shù)表示每個(gè)worker進(jìn)程可以同時(shí)處理的最大連接數(shù)。一般建議將其設(shè)置為最大并發(fā)請求數(shù)。

  1. use

該參數(shù)表示要使用哪種事件模型。常用的包括epoll、kqueue、eventport等。默認(rèn)為select。

epoll是Linux系統(tǒng)中的一個(gè)事件驅(qū)動(dòng)機(jī)制,當(dāng)有IO事件發(fā)生時(shí),它會(huì)通知應(yīng)用程序,從而減少了不必要的輪詢,并提高了性能。
而eventport是Solaris中的一種事件機(jī)制。無論是epoll還是eventport,它們都是異步I/O的核心組成部分。

  1. multi_accept

該參數(shù)表示每個(gè)epoll調(diào)用可以同時(shí)處理的最大連接數(shù)。如果設(shè)為on,可以提高性能。

總之,正確地配置events塊對于保證nginx的穩(wěn)定、高性能運(yùn)行非常重要。

http模塊詳解

在nginx的配置文件中,http塊是最頂層的塊,用于配置HTTP協(xié)議相關(guān)的選項(xiàng)和指令。下面是http塊的用法、示例代碼和注解:

用法:

http {
    // 基本配置指令
    ...
    server {    // server塊配置
        // server塊內(nèi)部配置指令
        ...
    }
}

示例代碼:

http {
    # 配置HTTP服務(wù)器

    # 定義日志格式
    log_format access '$remote_addr - $remote_user [$time_local] '
                      '"$request" $status $body_bytes_sent '
                      '"$http_referer" "$http_user_agent"';

    # 配置HTTP請求頭和HTTP響應(yīng)頭
    include mime.types;
    default_type application/octet-stream;
    server_tokens off;

    # 開啟gzip壓縮
    gzip on;

    # 配置HTTP請求限制
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    # 配置HTTP緩存
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;
    proxy_cache_key "$scheme$request_method$host$request_uri";
    
    # 配置HTTP反向代理
    upstream backend {
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
    }
    server {
        listen 80;
        server_name example.com;
        location / {
            proxy_pass http://backend;
            proxy_cache my_cache;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            limit_req zone=one burst=10 nodelay;
        }
    }

    # 配置HTTP服務(wù)器的其他選項(xiàng)
    keepalive_timeout 65;
}

注解:

  • include 用來引入其他配置文件,此處引入了mimetypes.types文件,用于設(shè)置HTTP請求頭和HTTP響應(yīng)頭。
  • default_type 用來設(shè)置默認(rèn)的mime類型,如果在mimetypes.types文件中找不到對應(yīng)的類型,則會(huì)使用此處設(shè)置的類型。
  • server_tokens 用來控制是否將nginx的版本信息在HTTP響應(yīng)頭中顯示,此處為關(guān)閉。
  • gzip:開啟gzip壓縮,減小傳輸文件大小,提高文件傳輸速度。
  • limit_req_zone 用來設(shè)置請求限制,該例子中設(shè)置了一個(gè)一秒鐘只能有一次請求的限制。
  • proxy_cache_path 用于配置緩存目錄和相關(guān)參數(shù)。
  • upstream 定義了一個(gè)upstream的集群,用于反向代理。
  • server 定義了一個(gè)HTTP服務(wù)器,監(jiān)聽80端口,并將指定的域名與upstream集群關(guān)聯(lián)起來。
  • proxy_pass 配置反向代理,將請求轉(zhuǎn)發(fā)到指定服務(wù)器。
  • proxy_cache 用于指定使用的緩存zone。
  • proxy_set_header 用于設(shè)置HTTP請求頭。
  • limit_req 用于限制請求頻率,該例子中設(shè)置了限制為一秒鐘最多處理10個(gè)請求,超過則拒絕處理。
  • root:指定網(wǎng)站的根目錄。
  • index:指定默認(rèn)訪問的頁面。
  • location:針對特定的URI,可以配置子句,如try_files、proxy_set_header、proxy_pass等。其中用/表示網(wǎng)站的根路徑,默認(rèn)不需要配置。

除了以上配置選項(xiàng),http塊還支持其他選項(xiàng),如ssl等。配置http塊后,需要通過nginx -t命令檢查配置文件是否正確,并通過nginx -s reload命令重新加載配置文件。

server模塊詳解

在Nginx的配置文件中,server塊用于定義一個(gè)虛擬主機(jī)(Virtual Host),它包含了該虛擬主機(jī)所需要的所有配置信息,例如監(jiān)聽的端口、域名、TLS證書、反向代理等等。

示例代碼:

server {
    listen       80;  # 監(jiān)聽端口
    server_name  example.com;  # 域名
    root         /var/www/example.com;  # 網(wǎng)站根目錄
    index        index.html index.htm;  # 默認(rèn)文檔

    location / {
        try_files $uri $uri/ /index.html;  # 請求的資源不存在時(shí),返回index.html頁面
    }

    location /images/ {
        deny all;  # 禁止外部直接訪問該目錄下的文件
    }

    location /api/ {
        proxy_pass http://127.0.0.1:8000;  # 將/api/請求反向代理到本地的8000端口
    }

    error_page  404              /404.html;
    error_page  500 502 503 504  /50x.html;

    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.(gif|jpg|png)$ {
        expires 1d;  # 圖片緩存時(shí)間為1天
    }

}

注解:

  1. listen:定義該虛擬主機(jī)監(jiān)聽的端口,多個(gè)端口可以用空格分隔。例如listen 80;表示該虛擬主機(jī)監(jiān)聽端口為80。

  2. server_name:定義該虛擬主機(jī)對應(yīng)的域名。例如server_name example.com;表示該虛擬主機(jī)應(yīng)對請求的域名為example.com。

  3. root:定義該虛擬主機(jī)的網(wǎng)站根目錄。例如root /var/www/example.com;表示該虛擬主機(jī)對應(yīng)的站點(diǎn)根目錄為/var/www/example.com

  4. index:定義該虛擬主機(jī)的默認(rèn)文檔。例如index index.html index.htm;表示該虛擬主機(jī)默認(rèn)顯示index.html或index.htm頁面。

  5. location:定義該虛擬主機(jī)對請求的URL路徑匹配規(guī)則和配置信息。

  6. try_files:在當(dāng)前l(fā)ocation中匹配的所有URI都無法找到時(shí),Nginx會(huì)一次嘗試它們,處理第一個(gè)匹配并未在文件系統(tǒng)上找到的 URI。

  7. deny all:禁止外部直接訪問該目錄下的文件。

  8. proxy_pass:將請求反向代理到本地的具體端口。例如proxy_pass http://127.0.0.1:8000;表示該虛擬主機(jī)對/api/請求的反向代理到本機(jī)的8000端口。

  9. error_page:定義錯(cuò)誤頁面,例如404.html和50x.html。

  10. location = /50x.html:匹配URL路徑為/50x.html的請求,返回/usr/share/nginx/html目錄下的50x.html頁面。

  11. expires:定義該虛擬主機(jī)的緩存時(shí)間。例如expires 1d;表示該虛擬主機(jī)對圖片的緩存時(shí)間為1天。

在Nginx的配置文件中,可以有多個(gè)server塊,每個(gè)塊都對應(yīng)一個(gè)虛擬主機(jī)。當(dāng)有請求到達(dá)Nginx時(shí),Nginx會(huì)根據(jù)請求所指定的域名,找到對應(yīng)的server塊,并將請求轉(zhuǎn)發(fā)到該虛擬主機(jī)配置所指定的處理方式。

root和alias的區(qū)別

rootalias 都是 Nginx 中用來指定靜態(tài)文件根目錄的指令,但它們的用法和效果是不同的。

root

root 指令用于指定 Nginx 服務(wù)器的主機(jī)根目錄,即靜態(tài)文件存放的根目錄,例如:

server {
    listen 80;
    server_name example.com;
    root /var/www/html;
    ...
}

上面的配置中,訪問 example.com 的請求會(huì)被映射到 /var/www/html 目錄,Nginx 會(huì)在該目錄下尋找網(wǎng)站需要的靜態(tài)資源。

如果 URL 中包含路徑,Nginx 會(huì)將路徑追加到 root 指定的根目錄后面。例如,請求 http://example.com/static/img/logo.png 會(huì)被映射到 /var/www/html/static/img/logo.png 文件。

alias

alias 指令用于指定某個(gè) URI 映射到服務(wù)器本地的一個(gè)實(shí)際路徑,例如:

location /static/ {
    alias /var/www/static/;
    ...
}

上面的規(guī)則將所有以 /static/ 開頭的請求映射到 /var/www/static/ 目錄下,例如請求 http://example.com/static/img/logo.png 會(huì)被映射到 /var/www/static/img/logo.png 文件。

注意事項(xiàng)

使用 root 指令時(shí),URI 中的路徑會(huì)被添加到指定的根目錄后面,并作為訪問文件的完整路徑。因此,你需要確保每個(gè)目錄都存在于正確的位置,否則會(huì)出現(xiàn)404錯(cuò)誤。

使用 alias 指令時(shí),URI 中的部分路徑會(huì)被替換成實(shí)際的文件路徑,因此你需要確保別名路徑的設(shè)置是正確的,否則會(huì)出現(xiàn)404錯(cuò)誤。此外,在使用 alias 指令時(shí),還需要注意下面一些事項(xiàng):

  • alias 路徑末尾一定要加上 /,否則可能出現(xiàn)404錯(cuò)誤。
  • 需要修改 location 塊內(nèi)的 try_files 指令,指定正確的文件訪問路徑。
  • 使用 alias 指令時(shí),相對路徑和絕對路徑的行為是不同的。如果 alias 路徑是到上級目錄或者相對路徑,那么就需要在指令末尾加上斜杠(/)。

root 不同的是,使用 alias 指令可以將 URI 指向任意目錄,而不僅僅是指向 root 指定的根目錄。同時(shí),使用 alias 指令也可以避免 URI 路徑與服務(wù)器路徑的混淆問題。

總之,rootalias 都是用于指定靜態(tài)文件根目錄的指令,但它們的區(qū)別在于 root 只有一個(gè)根目錄,而 alias 可以為不同 URI 指向不同的目錄,并且在處理帶有路徑的 URI 時(shí),兩者的行為也是不同的。通過使用 alias 指令,可以輕松為不同的 URI 指向不同的目錄,提高 Nginx 的靈活性和擴(kuò)展性。

location模塊詳解

Nginx中的location指令用于匹配URI,以便能夠在不同的配置塊中應(yīng)用不同的指令集。在location中使用不同的匹配規(guī)則能夠達(dá)到不同的目的,比如反向代理、負(fù)載均衡、靜態(tài)資源處理等。

以下是location指令的語法格式:

location [區(qū)分大小寫][ = | ~ | ~* | ^~ ] uri {
    ...
}

其中:

  • 精確匹配:在location指令的URI前面使用“=”,表示精確匹配:
location = /login {
    ...
}
  • 前綴匹配:在location指令的URI前面使用“^~”,表示前綴匹配:
location ^~ /images/ {
    ...
}
  • 區(qū)分大小寫:在location指令的URI前面使用“~”,表示區(qū)分大小寫:
location ~ /blog {
    ...
}
  • 不區(qū)分大小寫:在location指令的URI前面使用“~*”,表示不區(qū)分大小寫:
  location ~* \.(gif|jpg|jpeg)$ {
    ...
}

下面分別給出這些不同匹配規(guī)則的說明注釋、示例代碼以及優(yōu)先級。

精確匹配

精確匹配使用“=”符號,表示只有URI完全匹配時(shí)才會(huì)執(zhí)行指定的location塊中的指令,這種方式的匹配優(yōu)先級最高。

示例代碼:

location = /login {
    proxy_pass http://127.0.0.1:8080/login;
}

此時(shí),只有URI為“/login”的請求才會(huì)被匹配到這個(gè)location塊中。

前綴匹配

前綴匹配使用“^~”符號,表示只有當(dāng)URI以指定的前綴開頭時(shí)才會(huì)執(zhí)行指定的location塊中的指令,這種方式的匹配優(yōu)先級比正則匹配高。

示例代碼:

location ^~ /static/ {
    root /var/www;
}

此時(shí),所有以“/static/”開頭的URI都將被匹配到這個(gè)location塊中。

正則匹配(區(qū)分大小寫)

區(qū)分大小寫的正則匹配使用“~”符號,表示只有符合正則表達(dá)式的URI才會(huì)被匹配到這個(gè)location塊中。

示例代碼:

location ~ /blog/post/\d+ {
    root /var/www/blog/;
}

此時(shí),所有形如“/blog/post/”+一個(gè)或多個(gè)數(shù)字的URI都將被匹配到這個(gè)location塊中。

正則匹配(不區(qū)分大小寫)

不區(qū)分大小寫的正則匹配使用“~*”符號,表示只有符合正則表達(dá)式的URI才會(huì)被匹配到這個(gè)location塊中,這種方式的匹配優(yōu)先級最低。

示例代碼:

location ~* \.(gif|jpg|jpeg)$ {
    root /var/www/images/;
}

此時(shí),所有以“gif”、“jpg”或“jpeg”結(jié)尾的URI都將被匹配到這個(gè)location塊中。

最優(yōu)匹配

location / {
    # 此處為默認(rèn)匹配規(guī)則,將所有無法匹配到以上 URI 的請求均指向 index.html
    try_files $uri $uri/ /index.html;
}

總結(jié):

location模塊是Nginx用來匹配URL路徑的模塊之一,其匹配規(guī)則和優(yōu)先級如下:

  1. 精確匹配:當(dāng)location模塊的模式為一個(gè)完整的URI時(shí),只有完全匹配該URI時(shí)才會(huì)執(zhí)行該location塊中的指令,其優(yōu)先級最高。

  2. 前綴匹配:如果location塊的模式?jīng)]有以“= ”開始,而是以"^~"或者“/”開始,則表示該location塊的模式為一個(gè)前綴字符串。當(dāng)請求的URI與該前綴字符串匹配時(shí),將會(huì)執(zhí)行該location塊中的指令,如果URI匹配多個(gè)前綴字符串,則選擇最長匹配的前綴字符串,其優(yōu)先級次于精確匹配。

  3. 正則匹配:當(dāng)location塊的模式為一個(gè)正則表達(dá)式時(shí),如果請求的URI與該正則表達(dá)式匹配,則會(huì)執(zhí)行該location塊中的指令。如果多個(gè)location塊的正則表達(dá)式都能匹配請求的URI,則選擇第一個(gè)匹配成功的location塊,其優(yōu)先級低于前綴匹配。

  4. 最優(yōu)匹配:當(dāng)location塊的模式為“/”時(shí),表示匹配所有請求,但是其優(yōu)先級最低,只有當(dāng)前面的三種匹配方式都無法匹配該請求時(shí),才會(huì)執(zhí)行該location塊中的指令。

需要注意的是,如果多個(gè)location塊都匹配當(dāng)前請求的URI,那么只會(huì)執(zhí)行其中優(yōu)先級最高的那個(gè)location塊中的指令;如果兩個(gè)location塊的優(yōu)先級相等,則選擇前面的location塊。

可以看出,Nginx的location指令可以通過不同的匹配規(guī)則,實(shí)現(xiàn)對不同URI的處理。匹配規(guī)則之間的優(yōu)先級是從高到低的精確匹配 > 前綴匹配 > 正則匹配(區(qū)分大小寫)> 正則匹配(不區(qū)分大小寫)> 最優(yōu)匹配最后。根據(jù)不同的需求進(jìn)行選擇,可以最大限度地提高Nginx的性能和效率。

proxy模塊

在Nginx中使用proxy模塊可以實(shí)現(xiàn)反向代理的功能,即將客戶端的請求轉(zhuǎn)發(fā)到后端服務(wù)器進(jìn)行處理,并將后端服務(wù)器返回的響應(yīng)返回給客戶端。

proxy模塊提供了以下常用的指令:

  • proxy_pass:設(shè)置反向代理的目標(biāo)服務(wù)器地址,可以是IP地址或域名,支持http、https、fastcgi、uwsgi、scgi等協(xié)議。實(shí)現(xiàn)反向代理的核心指令。
  • proxy_set_header:設(shè)置向后端服務(wù)器發(fā)送的HTTP請求頭信息。可以設(shè)置多個(gè)header信息,如Host、User-Agent、Referer等。
  • proxy_connect_timeout:設(shè)置連接后端服務(wù)器的超時(shí)時(shí)間。
  • proxy_read_timeout:設(shè)置從后端服務(wù)器讀取響應(yīng)數(shù)據(jù)的超時(shí)時(shí)間。
  • proxy_send_timeout:設(shè)置向后端服務(wù)器發(fā)送請求的超時(shí)時(shí)間。
  • proxy_buffering:開啟或關(guān)閉代理服務(wù)器對后端服務(wù)器的響應(yīng)緩存。如果開啟,則需要配合proxy_buffer_size和proxy_buffers指令來控制緩存大小。
  • proxy_cache:開啟或關(guān)閉代理服務(wù)器對后端服務(wù)器響應(yīng)的緩存。如果開啟,則需要配合proxy_cache_path指令來設(shè)置緩存路徑和緩存參數(shù)。
  • proxy_redirect:配置代理服務(wù)器對后端服務(wù)器響應(yīng)的重定向規(guī)則。

下面是一個(gè)簡單的反向代理示例,將客戶端請求轉(zhuǎn)發(fā)到后端服務(wù)器進(jìn)行處理,然后將后端服務(wù)器返回的響應(yīng)返回給客戶端:

server {
    listen       80;
    server_name  example.com;

    location /api {
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
  • 通過listen指令設(shè)置端口號為80。
  • 通過server_name指令設(shè)置主機(jī)名為example.com。
  • 通過location指令匹配請求的uri為/api,并將這個(gè)uri轉(zhuǎn)發(fā)到后端服務(wù)器http://backend_server進(jìn)行處理。
  • 通過proxy_set_header指令,將客戶端的Host、X-Real-IP、X-Forwarded-For信息發(fā)送給后端服務(wù)器。
  • 注意:如果你的代理服務(wù)器沒有權(quán)限訪問到后端服務(wù)器,nginx將返回502 Bad Gateway 或者504 Gateway Timeout 錯(cuò)誤。此時(shí)需要檢查代理服務(wù)器是否與后端服務(wù)器的網(wǎng)絡(luò)環(huán)境通暢。

upstream模塊

在 Nginx 配置文件中,upstream 模塊用于定義一組后端服務(wù)或服務(wù)器的列表,可以用來負(fù)載均衡和故障轉(zhuǎn)移。以下是upstream配置塊的示例代碼以及注解:

upstream backend {
    # 定義一組名為backend的后端服務(wù)器列表
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
    # 默認(rèn)的算法為輪詢,其他算法包括ip_hash、random、least_conn和hash等
    # ip_hash:根據(jù)客戶端IP地址進(jìn)行哈希的負(fù)載均衡算法;
    # keepalive:啟用長連接,提高傳輸效率;
    # max_fails:表示最大失敗次數(shù);
    # fail_timeout:表示斷開連接的時(shí)間間隔;
    # backup:表示備用服務(wù)器。
    # 關(guān)于各個(gè)算法的詳細(xì)說明可以參考官方文檔:http://nginx.org/en/docs/http/ngx_http_upstream_module.html
    # 也可以在server配置中單獨(dú)指定,如:server backend1 weight=5 max_fails=3 fail_timeout=10s;
    # 其中weight表示權(quán)重,max_fails和fail_timeout用于故障轉(zhuǎn)移的判斷,weight越大的后端服務(wù)器,獲取的請求越多
    # max_fails表示在fail_timeout時(shí)間內(nèi)出現(xiàn)的最大失敗次數(shù)
    # fail_timeout表示在被標(biāo)記為失敗之前的時(shí)間,出現(xiàn)的最大失敗次數(shù),當(dāng)一個(gè)后端服務(wù)器被標(biāo)記為失敗時(shí),不再把請求負(fù)載給它,直到過了fail_timeout時(shí)間,如果一個(gè)后端服務(wù)器被標(biāo)記為失敗,但是在fail_timeout時(shí)間內(nèi)又恢復(fù)了正常那么它將重新參與負(fù)載均衡
    # 如果所用的算法是ip_hash,則會(huì)根據(jù)客戶端IP地址的HASH值來選擇后端服務(wù)器,這樣可以保證同一客戶端的請求會(huì)被轉(zhuǎn)發(fā)到同一臺(tái)后端服務(wù)器上
    # 自動(dòng)發(fā)現(xiàn)的機(jī)制:添加了一個(gè)新的后端服務(wù)器或失去聯(lián)系的服務(wù)器在指定時(shí)間內(nèi)自動(dòng)被刪除,默認(rèn)值:10秒
    # 還有一個(gè)keepalive機(jī)制,用于復(fù)用后端連接,減少建立連接的開銷
    # 可以在http塊中定義默認(rèn)的參數(shù)
    # keepalive 8;
    # keepalive_timeout表示保持連接時(shí)間(默認(rèn)75秒)
    # keepalive_requests表示單個(gè)連接最大請求數(shù)(默認(rèn)100)
    # 這些參數(shù)可以通過nginx -V命令查看
    # 可以為每個(gè)upstream塊單獨(dú)指定一組參數(shù)
    # 如:upstream backend {
    #          keepalive 64;
    #          keepalive_timeout 65s;
    #          keepalive_requests 100;
    #      }
    # 如果沒有指定,則沿用http塊中的參數(shù)
}

在實(shí)際應(yīng)用中,我們可以通過在 server 配置中引用 upstream 名稱來使用上面定義的后端服務(wù)器列表,實(shí)現(xiàn)負(fù)載均衡和故障轉(zhuǎn)移。

示例代碼:

http {
    upstream backend {
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }
 
    server {
        listen       80;
        server_name  localhost;
 
        location / {
            proxy_pass  http://backend;
            # 將客戶端的請求轉(zhuǎn)發(fā)到backend定義的一組后端服務(wù)器中的一個(gè)
            # 如果其中某個(gè)后端服務(wù)器標(biāo)記為失敗,則會(huì)選擇其他可用的后端服務(wù)器
        }
    }
}

rewrite指令詳解

在Nginx中,rewrite塊是一種用于重寫URL的指令。它可以讓URL匹配一個(gè)正則表達(dá)式,并按照一定規(guī)則重寫URL。下面是rewrite塊的詳細(xì)用法、示例代碼和注解。

語法

rewrite regex replacement [flag];

regex:正則表達(dá)式,用于匹配需要被重寫的URL。

replacement:重寫規(guī)則,在匹配成功后,將被替換的URL。

flag:可選的標(biāo)志,用于指定rewrite行為的不同方面。

示例代碼

location /new-location/ {
  rewrite ^/new-location/(.*)$ /old-location/$1 break;
}

這段代碼中,定義了一個(gè)名為 /new-location/ 的 location 塊,用于對該頁面的請求進(jìn)行處理。其中,使用了 rewrite 指令對請求的 URI 進(jìn)行了修改。

^/new-location/(.*)$ 表示使用正則表達(dá)式匹配 URI,其中 ^$ 表示匹配起始和結(jié)束位置,/new-location/ 表示匹配 URI 的開頭部分,(.*) 表示匹配 URI 的其余部分,并將匹配結(jié)果存儲(chǔ)在變量 $1 中。

/old-location/$1 表示將匹配到的 URI 的其余部分添加在 /old-location/ 后,結(jié)果作為修改后的 URI。

break 參數(shù)表示在重寫 URI 之后停止處理當(dāng)前請求,不再繼續(xù)執(zhí)行下面的 location 指令。

因此,對于請求 /new-location/path/to/resource,會(huì)被重寫為 /old-location/path/to/resource

需要注意的是,rewrite 指令可以出現(xiàn)在 server、location 等塊中,也可以使用 flag 參數(shù)來控制重寫行為,如 last、redirect 等。其中,last 表示在進(jìn)行 URI 重寫之后,重新開始新一輪的 URI 處理,而 redirect 表示將這個(gè)請求重定向到另一個(gè) URL。

rewrite可選參數(shù)詳解

在nginx的rewrite模塊中,有幾個(gè)常用的參數(shù),包括:

  • break:停止執(zhí)行當(dāng)前的rewrite指令集,然后開始執(zhí)行下一個(gè)指令集;
  • last:停止執(zhí)行當(dāng)前的rewrite指令集,然后重新執(zhí)行nginx的location匹配;
  • redirect:發(fā)送302臨時(shí)重定向狀態(tài)碼;
  • permanent:發(fā)送301永久重定向狀態(tài)碼。

下面我們解釋一下它們之間的區(qū)別:

  • break:停止執(zhí)行當(dāng)前的rewrite指令集,但是不對uri進(jìn)行重定向,nginx將繼續(xù)執(zhí)行下一條指令。使用這個(gè)指令通常是為了防止uri被重寫多次。
    示例代碼:
location /admin/ {
  rewrite ^(/admin)(.*)$ $1/index.html break;
  proxy_pass http://backend/;
}

在這個(gè)例子中,如果uri匹配到/admin/,則將/admin/重寫為/admin/index.html,然后繼續(xù)執(zhí)行proxy_pass指令。

  • last:停止執(zhí)行當(dāng)前的rewrite指令集,重新執(zhí)行nginx的location匹配,即再次進(jìn)入location塊中查找匹配的uri,并將uri放入到新的指令集中執(zhí)行。使用這個(gè)指令可以實(shí)現(xiàn)在rewrite過程中動(dòng)態(tài)改變uri或指定新的location處理請求。
    示例代碼:
location /old/ {
  rewrite ^/old/(.*)$ /new/$1 last;
}

location /new/ {
  proxy_pass http://backend/;
}

在這個(gè)例子中,如果uri匹配到/old/,則將/old/后的內(nèi)容重寫為/new/后的內(nèi)容,然后重新匹配uri,進(jìn)入到/new/的location塊中繼續(xù)處理請求。

  • redirect:發(fā)送302臨時(shí)重定向狀態(tài)碼,將客戶端的請求重定向到新的uri,客戶端會(huì)發(fā)送新的請求。使用這個(gè)指令可以實(shí)現(xiàn)uri重定向,但不會(huì)改變?yōu)g覽器的地址欄。
    示例代碼:
rewrite ^/login$ /user/login.html redirect;

在這個(gè)例子中,如果uri匹配到/login,將發(fā)送302臨時(shí)重定向狀態(tài)碼,將客戶端重定向到/user/login.html

  • permanent:發(fā)送301永久重定向狀態(tài)碼,將客戶端的請求永久重定向到新的uri,客戶端會(huì)發(fā)送新的請求。使用這個(gè)指令可以實(shí)現(xiàn)uri重定向,并且會(huì)改變?yōu)g覽器的地址欄。
    示例代碼:
rewrite ^/old/(.*)$ /new/$1 permanent;

在這個(gè)例子中,如果uri匹配到/old/后面跟著任意字符,將發(fā)送301永久重定向狀態(tài)碼,將客戶端重定向到/new/后面跟著同樣的任意字符。

access模塊

nginx access模塊用于控制客戶端請求的訪問權(quán)限。通過配置,可以限制只有指定的IP地址或CIDR的請求才能夠被處理,而其它請求則會(huì)被拒絕。

該模塊的用法非常靈活,可以在全局作用域、server作用域或location作用域下使用。以下是詳細(xì)的用法說明:

全局作用域

在nginx配置文件的全局作用域中使用access模塊,會(huì)將其作用于所有server模塊和location模塊。示例代碼如下:

http {
    ...
    # 訪問控制配置
    include /path/to/access.conf;
    ...
}

其中,access.conf是一個(gè)單獨(dú)的配置文件,該文件中包含了一些access模塊的具體配置。在這個(gè)文件中,可以使用allow和deny指令來進(jìn)行IP地址的訪問控制。

server作用域

在server作用域中使用access模塊,可以針對指定的server塊進(jìn)行訪問控制。示例代碼如下:

server {
    listen 80;
    server_name example.com;
    ...
    # 訪問控制配置
    allow 192.168.1.0/24;
    deny all;
    ...
}

在這個(gè)配置中,只有192.168.1.0/24網(wǎng)段的IP地址可以訪問example.com域名下的資源,其它IP地址則會(huì)被拒絕。

location作用域

在location作用域中使用access模塊,可以針對特定的URL路徑進(jìn)行訪問控制。示例代碼如下:

location /admin/ {
    # 訪問控制配置
    allow 192.168.1.100;
    deny all;
    ...
}

在這個(gè)配置中,只有192.168.1.100的IP地址可以訪問/admin/路徑下的資源,其它IP地址則會(huì)被拒絕。

基于以上示例代碼,下面詳細(xì)解釋access模塊中各個(gè)指令的含義和用法:

allow指令

allow指令表示允許指定的IP地址或CIDR進(jìn)行訪問。該指令可以配置多個(gè)IP地址或CIDR,用空格隔開。示例代碼如下:

allow 192.168.1.100;
allow 10.0.0.0/24;

以上配置表示允許192.168.1.100和10.0.0.0/24網(wǎng)段下的IP地址進(jìn)行訪問。

需要注意的是,如果同時(shí)配置了多個(gè)allow指令,那么所有指令的效果會(huì)疊加。也就是說,如果有任意一個(gè)allow指令允許了該IP訪問,那么該IP就可以訪問資源。

deny指令

deny指令表示禁止指定的IP地址或CIDR進(jìn)行訪問。該指令的用法和allow指令類似,示例代碼如下:

deny 192.168.1.0/24;
deny 10.0.0.100;

以上配置表示禁止192.168.1.0/24網(wǎng)段下的IP地址和10.0.0.100的IP地址進(jìn)行訪問。

需要注意的是,deny指令的優(yōu)先級高于allow指令。也就是說,如果一個(gè)IP地址既符合allow指令的配置,又符合deny指令的配置,那么該IP地址將被拒絕訪問。

all指令

all指令表示允許或禁止所有IP地址進(jìn)行訪問。該指令和allow和deny指令搭配使用,示例代碼如下:

allow all;
den all;

以上配置分別表示允許或禁止所有IP地址進(jìn)行訪問。

需要注意的是,all指令在deny指令中的優(yōu)先級高于allow指令。也就是說,如果同時(shí)配置了allow all和deny all指令,那么所有IP地址都會(huì)被拒絕訪問。

綜上所述,access模塊是nginx中非常常用的一個(gè)模塊,可以幫助管理員實(shí)現(xiàn)靈活的訪問控制策略。需要根據(jù)實(shí)際場景進(jìn)行配置,具體使用時(shí)請參考以上示例代碼。

include模塊

在Nginx的配置文件中,include模塊可以讓我們將多個(gè)配置文件分開管理,便于閱讀和維護(hù)。下面是include模塊的詳細(xì)用法、示例代碼以及注解:

  1. 用法:包含指定的文件,實(shí)現(xiàn)配置文件的模塊化管理。
#示例配置代碼
http {
    include /etc/nginx/mime.types;
    include /etc/nginx/conf.d/*.conf;
}

使用 include 引入的文件格式要求和 nginx 配置文件格式一致,即每條指令以分號結(jié)尾,每段配置以大括號包圍。同時(shí),需要注意避免在 included 文件中重復(fù)定義已有的指令,以免引起配置不一致的問題。

  1. 示例代碼:

我們的Nginx服務(wù)器可能需要配置多個(gè)虛擬主機(jī),并且每個(gè)虛擬主機(jī)都有一些共同的配置,同時(shí)還有針對不同虛擬主機(jī)的獨(dú)特的配置。這時(shí)可以使用include模塊來將共同的配置和不同的配置分開管理。

例如,我們可以將共同的配置放在一個(gè)文件中,比如common.conf:

# common.conf
listen 80;
location / {
    try_files $uri $uri/ =404;
}

接著,在每個(gè)虛擬主機(jī)的配置文件中,我們可以使用include指令來引入common.conf,然后再進(jìn)行獨(dú)特的配置:

# site1.conf
server {
    server_name site1.com;
    include common.conf;
    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

# site2.conf
server {
    server_name site2.com;
    include common.conf;
    root /var/www/site2;
    index index.html;
}

在這個(gè)配置中,我們通過include指令將common.conf引入到每個(gè)虛擬主機(jī)的配置文件中,從而避免了重復(fù)的配置。同時(shí),我們還可以在不同的配置文件中添加獨(dú)特的配置,確保不同的虛擬主機(jī)能夠按照自己的需求工作。

  1. 注解:

在上面的例子中,我們可以發(fā)現(xiàn)include指令同樣可以用來引入Nginx的其他配置文件,比如mime.types(定義MIME類型)、fastcgi.conf(定義FastCGI參數(shù))等。使用include模塊可以讓我們更方便地管理Nginx的配置文件,而不需要將所有的配置都寫在同一個(gè)文件中,從而大大提高了可讀性和可維護(hù)性。

ssl模塊

nginx的ssl模塊用于啟用HTTPS協(xié)議,配置SSL/TLS加密,以保護(hù)網(wǎng)站的安全性。以下是ssl模塊的詳細(xì)用法、示例代碼和注解:

# 配置nginx使用的SSL證書和私鑰
ssl_certificate /path/to/ssl.crt;
ssl_certificate_key /path/to/ssl.key;

# 配置ssl協(xié)議和加密算法
ssl_protocols TLSv1.2 TLSv1.3; # 指定支持的TLS/SSL協(xié)議版本
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384; # 配置加密算法
ssl_prefer_server_ciphers on; # 指定使用服務(wù)器端選擇的加密算法

# 配置SSL會(huì)話緩存
ssl_session_cache shared:SSL:10m; # 指定緩存大小和名稱
ssl_session_timeout 5m; # 指定緩存過期時(shí)間

# 配置ssl安全相關(guān)選項(xiàng)
ssl_stapling on; # 開啟OCSP狀態(tài)響應(yīng)
ssl_stapling_verify on; # 驗(yàn)證OCSP響應(yīng)的有效性
ssl_trusted_certificate /path/to/trust.crt; # 配置CA證書用于驗(yàn)證客戶端證書

# 配置ssl代理相關(guān)選項(xiàng)
proxy_ssl_server_name on; # 開啟SSL Server Name Indication
proxy_ssl_session_reuse on; # 開啟SSL會(huì)話重用
proxy_ssl_protocols TLSv1.2 TLSv1.3; # 配置支持的協(xié)議版本

# 配置ssl客戶端證書認(rèn)證
ssl_client_certificate /path/to/ca.crt; # 配置CA證書
ssl_verify_client on; # 開啟客戶端證書認(rèn)證
ssl_verify_depth 2; # 配置驗(yàn)證鏈最大深度

# 配置ssl限速
limit_rate 100k; # 指定限速速率
limit_rate_after 5m; # 指定限速開始時(shí)間

注解:

  • ssl_certificate和ssl_certificate_key分別配置SSL證書和私鑰。
  • ssl_protocols和ssl_ciphers:分別配置支持的SSL/TLS協(xié)議版本和加密算法。
  • ssl_prefer_server_ciphers指定是否使用服務(wù)器端選擇的加密算法。
  • ssl_session_cache和ssl_session_timeout分別配置SSL會(huì)話緩存大小和過期時(shí)間。
  • ssl_stapling開啟OCSP狀態(tài)響應(yīng),ssl_stapling_verify驗(yàn)證OCSP響應(yīng)的有效性。
  • ssl_trusted_certificate配置CA證書用于驗(yàn)證客戶端證書。
  • proxy_ssl_server_name開啟SSL Server Name Indication(SNI),proxy_ssl_session_reuse開啟SSL會(huì)話重用,proxy_ssl_protocols配置支持的協(xié)議版本。
  • ssl_client_certificate配置CA證書,ssl_verify_client開啟客戶端證書認(rèn)證,ssl_verify_depth配置驗(yàn)證鏈的最大深度。
  • limit_rate和limit_rate_after配置SSL限速。

gzip模塊

在nginx的配置文件中,可以使用gzip模塊來開啟gzip壓縮功能,從而減少傳輸數(shù)據(jù)的大小,提升網(wǎng)站的性能和響應(yīng)速度。

以下是幾個(gè)gzip參數(shù)的說明

  • gzip_types:指定需要使用gzip算法壓縮的MIME類型,默認(rèn)是"text/html"。
  • gzip_vary:告訴代理服務(wù)器使用gzip壓縮之后,要添加Vary: Accept-Encoding頭信息。
  • gzip_proxied:指定啟用gzip壓縮的請求類型。
  • gzip_comp_level:指定gzip壓縮的級別,壓縮級別越高,壓縮比例越高,耗時(shí)也會(huì)相應(yīng)變長,范圍是1-9(9最高)。
  • gzip_buffers:設(shè)置壓縮緩沖區(qū)數(shù)量和大小。
  • gzip_http_version:指定響應(yīng)的最小HTTP版本,如果比該版本低則不啟用壓縮。
  • gzip_disable:禁用用戶代理,如某些舊版Internet Explorer瀏覽器,不支持gzip壓縮。

具體的用法如下

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1024;

其中,gzip指令開啟gzip壓縮功能,gzip_types指令指定需要壓縮的文件類型,gzip_min_length指令指定了最小壓縮文件大小。需要注意的是,gzip_types指令中指定的文件類型必須是MIME類型,格式為type/subtype,多個(gè)文件類型之間用空格分隔。

下面是一個(gè)具體的示例代碼:

http {
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_min_length 1024;
    ...
}

上述代碼中,我們開啟了gzip壓縮,并指定了需要壓縮的文件類型。對于大小小于1024字節(jié)的文件,nginx不會(huì)進(jìn)行g(shù)zip壓縮。

測試gzip模塊

可以使用curl命令來測試gzip模塊是否生效。具體命令是:

curl -I -H "Accept-Encoding: gzip" http://example.com

該命令將顯示HTTP響應(yīng)頭信息,包括Content-Encoding:gzip頭,表示已經(jīng)經(jīng)過gzip壓縮。

需要注意的是,開啟gzip壓縮功能需要消耗一定的CPU資源。因此,一般情況下建議只針對一些體積較大的靜態(tài)資源進(jìn)行g(shù)zip壓縮,以提升性能和響應(yīng)速度。同時(shí),也需要注意gzip壓縮并不是適用于所有情況,例如圖片、音視頻等二進(jìn)制文件可能并不適合壓縮。因此,在使用gzip壓縮時(shí),需要根據(jù)具體情況進(jìn)行調(diào)整和優(yōu)化。

geo模塊

NGINX Geo模塊是用于處理IP地址和地理位置信息的模塊,該模塊能夠根據(jù)IP地址的地理位置進(jìn)行條件分支控制,以便實(shí)現(xiàn)不同的請求轉(zhuǎn)發(fā)、限制訪問等功能。下面是一些示例代碼:

  1. 根據(jù)地理位置進(jìn)行請求轉(zhuǎn)發(fā)
# 定義一個(gè)geo變量,用來匹配地址對應(yīng)的地理位置,并分配一個(gè)默認(rèn)值
geo $region {
   default unknown;
   192.168.1.0/24 local;
   172.16.0.0/12 internal;
   10.0.0.0/8 internal;
   180.169.0.0/16 china;
   192.168.0.0/16 lan;
}

server {
   listen 80;
   server_name example.com;

   location / {
       # 根據(jù)$region匹配成功的值,進(jìn)行條件判斷并進(jìn)行相應(yīng)的請求轉(zhuǎn)發(fā)
       if ($region = china) {
           proxy_pass http://china_servers;
       }
       if ($region = internal) {
           proxy_pass http://internal_servers;
       }
       if ($region = local) {
           proxy_pass http://local_servers;
       }
       proxy_pass http://default_servers;
   }
}
  1. 根據(jù)地理位置限制訪問
# 定義一個(gè)geo變量,用來匹配白名單的IP地址,分配一個(gè)默認(rèn)值為0
geo $white_list {
    default 0;
    180.169.0.0/16 1;
}

server {
    listen 80;
    server_name example.com;

    # 如果$white_list匹配成功,則返回403錯(cuò)誤信息,否則正常進(jìn)行請求處理
    if ($white_list) {
        return 403;
    }
}

以上示例代碼均是簡單的示例,實(shí)際應(yīng)用中還需要結(jié)合具體場景靈活運(yùn)用。

總結(jié)

本文詳細(xì)的介紹了nginx的安裝、常用模塊的配置以及用法,希望各位小伙伴看完這篇文章以后都能熟練使用nginx配置,如這篇文章對你有幫助,歡迎點(diǎn)贊收藏關(guān)注三連,以資鼓勵(lì),謝謝!

本文由mdnice多平臺(tái)發(fā)布

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,998評論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,993評論 2 374

推薦閱讀更多精彩內(nèi)容