2022年從零開(kāi)始,用一篇博客掌握 nginx 的初級(jí)配置

本篇博客主要用于記錄 nginx.conf 這一個(gè)文件如何修改的相關(guān)問(wèn)題。

當(dāng) nginx 安裝之后,默認(rèn)的配置如下所示(數(shù)據(jù)來(lái)源為寶塔自動(dòng)生成),本篇博客重點(diǎn)介紹的是配置虛擬機(jī)相關(guān)內(nèi)容,即 server 塊配置項(xiàng)。 server 塊的指令主要用于設(shè)置主機(jī)和端口, location 塊用于匹配網(wǎng)頁(yè)路徑,一個(gè) http 塊可以包含多個(gè) server 。

基礎(chǔ)配置

server
{
    listen 80;
    server_name www.域名.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/目錄;
    
    #SSL-START SSL相關(guān)配置,請(qǐng)勿刪除或修改下一行帶注釋的404規(guī)則
    #error_page 404/404.html;
    #SSL-END
    
    #ERROR-PAGE-START  錯(cuò)誤頁(yè)配置,可以注釋、刪除或修改
    #error_page 404 /404.html;
    #error_page 502 /502.html;
    #ERROR-PAGE-END
    
    #PHP-INFO-START  PHP引用配置,可以注釋或修改
    include enable-php-73.conf;
    #PHP-INFO-END
    
    #REWRITE-START URL重寫規(guī)則引用,修改后將導(dǎo)致面板設(shè)置的偽靜態(tài)規(guī)則失效
    include /www/server/panel/vhost/rewrite/域名偽靜態(tài)文件.conf;
    #REWRITE-END
    
    #禁止訪問(wèn)的文件或目錄
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }
    
    #一鍵申請(qǐng)SSL證書驗(yàn)證目錄相關(guān)設(shè)置
    location ~ \.well-known{
        allow all;
    }
    
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log /dev/null;
        access_log /dev/null;
    }
    
    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log /dev/null;
        access_log /dev/null; 
    }
    access_log  /www/wwwlogs/域名.log;
    error_log  /www/wwwlogs/域名.error.log;
}

這里面要學(xué)習(xí)的第一個(gè)內(nèi)容,就是各個(gè)配置的含義。

# 在配置文件中表示注釋。

配置清單

虛擬主機(jī)監(jiān)聽(tīng)的端口號(hào)

listen 80;

綁定的域名

server_name www.域名.com;

多個(gè)域名用空格分隔。

配置默認(rèn)頁(yè)

index index.php index.html index.htm default.php default.htm default.html;

監(jiān)聽(tīng)URL

# 匹配 URL
location / {
    # 訪問(wèn)路徑,可以是相對(duì)路徑或者絕對(duì)路徑
    root   html;
    index  index.html index.htm;
}

這里比較重要,尤其是 location 后面的規(guī)則,語(yǔ)法如下:

location [=|~|~*|^~] /uri/ {
    # 編寫代碼
}
  • =:精確匹配;
  • ~ :區(qū)分大小寫匹配(可用正則),與之對(duì)應(yīng)的是 !~;
  • ~*:不區(qū)分大小寫的匹配(可用正則),與之對(duì)應(yīng)的是 !~*
  • ^~:以某個(gè)字符串開(kāi)頭;
  • /:通配符,任何請(qǐng)求都會(huì)匹配到;

基于上述內(nèi)容,再去觀察上述默認(rèn)配置,就能讀懂了

# 當(dāng)訪問(wèn) user.ini,htaccess 等文件時(shí),直接返回 404
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
    return 404;
}
# 匹配 .well-known 
location ~ \.well-known{
    allow all;
}

# 匹配以 gif,jpg,jpeg等后綴結(jié)尾的文件
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
    expires      30d;
    error_log /dev/null;
    access_log /dev/null;
}
# 匹配以 js,css 結(jié)尾的文件
location ~ .*\.(js|css)?$
{
    expires      12h;
    error_log /dev/null;
    access_log /dev/null; 
}

可以在匹配到的規(guī)則內(nèi)容中,編寫防盜鏈代碼

valid_referers none blocked 域名1.cn 域名1.cn;
# 如果是
if ($invalid_referer) {
    # 防盜鏈
    rewrite ^/ http://$host/logo.png;
}

其中 valid_referers 語(yǔ)法如下

valid_referers [none|blocked|server_names]
  • none:默認(rèn)值,表示無(wú) referer 值的情況;
  • blocked:表示 referer 值被防火墻進(jìn)行偽裝;
  • server_names:域名列表,可以使用通配符 * 號(hào)。

如果匹配到規(guī)則,那么會(huì)將 $invalid_referer 變量設(shè)置為 1。

這里又延伸出 nginx 全局變量相關(guān)內(nèi)容,這個(gè)還有有必要記憶一下的,基于它們可以實(shí)現(xiàn)很多邏輯。
假設(shè)請(qǐng)求的地址為 http://www.baidu.com:88/test1/test2/a.php?ttt=123

  • $args:請(qǐng)求中的參數(shù),與 $query_string 一致,即 ttt=123
  • $content_length:請(qǐng)求頭中的Content-Length 字段;
  • $content_type:請(qǐng)求頭中的Content-Type字段;
  • $document_root:當(dāng)前請(qǐng)求在root指令中指定的值;
  • $document_uri:與 $uri 一致,請(qǐng)求 URI,即 http://www.baidu.com:88/test1/test2/a.php;
  • $host:請(qǐng)求中的主機(jī)頭字段,即 www.baidu.com;
  • $http_user_agent:客戶端瀏覽器的相關(guān)信息;
  • $http_cookie:客戶端cookie信息;
  • $limit_rate:限制連接速率;
  • $request_body_file:客戶端請(qǐng)求主體信息的臨時(shí)文件名;
  • $request_method:請(qǐng)求方法;
  • $remote_addr:客戶端的ip地址;
  • $remote_port:客戶端的端口號(hào);
  • $remote_user:客戶端用戶名稱;
  • $request_filename:當(dāng)前請(qǐng)求的文件路徑;
  • $request_uri:包含請(qǐng)求參數(shù)的原始 URI,不包含主機(jī)名,即 /test1/test2/a.php
  • $status:請(qǐng)求狀態(tài)碼,成功是200;
  • $http_referer:頁(yè)面來(lái)源;
  • $server_name:請(qǐng)求服務(wù)器名;
  • $server_port:請(qǐng)求=的服務(wù)器端口號(hào);

于此同時(shí)我們還可以在 nginx 請(qǐng)求中判斷請(qǐng)求的是否是文件,目錄等內(nèi)容。

  • -f!-f 用來(lái)判斷文件;
  • -d!-d 用來(lái)判斷目錄;
  • -e!-e 用來(lái)判斷文件或目錄;
  • -x!-x 用來(lái)判斷文件是否可執(zhí)行。

上述還有一個(gè)參數(shù) rewrite 表示重寫規(guī)則,它可以使用 nginx 提供的全局變量我們?cè)O(shè)置的變量,結(jié)合正則表達(dá)式和標(biāo)志位實(shí)現(xiàn) url 重寫與重定向。
rewrite 只能放在 server{} , location{} , if{} 中。
rewrite 只能對(duì)域名后邊的除去傳遞的參數(shù)外的字符串起作用,例如 http://www.aaaa.com/a/b/c.php?id=1&user=hihell 只對(duì) /a/b/c.php 重寫。
rewrite 語(yǔ)法格式如下:

rewrite regex replacement [flag];

上述語(yǔ)法中的 flag 有如下取值:

  • last:表示完成 rewrite,一般寫在 server{}if{} 中;
  • break:停止執(zhí)行當(dāng)前虛擬主機(jī)的后續(xù)rewrite指令集;
  • redirect:返回302臨時(shí)重定向,地址欄會(huì)顯示跳轉(zhuǎn)后的地址;
  • permanent:返回301永久重定向,地址欄會(huì)顯示跳轉(zhuǎn)后的地址。

其中還有一個(gè)需要特別注意就是 $1 , $2 ,這些都是前面正則小括號(hào)里面的對(duì)應(yīng)內(nèi)容。

舉例如下:

location / {
        # 匹配到 ^/news/([0-9]{5})\.html$,轉(zhuǎn)換為 /news_$1
        rewrite '^/news/([0-9]{5})\.html$' /news_$1;
}

上述內(nèi)容表示匹配到 /news/123456.html 的請(qǐng)求,重寫為 /news_123456 。

其它可用配置

單連接請(qǐng)求上限次數(shù)

server
{
    keepalive_requests 120;
}

允許的域名與禁止的域名

server
{
    location [=|~|~*|^~] /uri/ {
         deny www.baidu.com;  # 拒絕的域名
         allow 111.111.111.111; # 允許的 ip  
    }
}

反向代理設(shè)置

location / {
    proxy_pass http://localhost:8080;   
    proxy_set_header Host $host:$server_port;    
}

其中 proxy_pass 參數(shù)表示設(shè)置被代理服務(wù)器的 URL 和端口;
proxy_set_header 設(shè)置 header 參數(shù),例如 Host , X-Real-IP , X-Forwarded-For

設(shè)置錯(cuò)誤頁(yè)
error_page 參與的語(yǔ)法規(guī)則為

error_page 404 502 = @fetch;
location @fetch {
    access_log /logs/face.log log404;
    rewrite ^(.*)$ http://域名:端口/face.jpg redirect;
}

server 塊中的其它配置

  • ssl_certificate
  • ssl_certificate_key
  • ssl_session_timeout
  • expires 2h:緩存2小時(shí);
  • listen 443 ssl:在https訪問(wèn)的時(shí)候,需要證書驗(yàn)證;

nginx 80重定向443
命令如下:

server {
    listen 80;
    server_name 域名1.com 域名2.com;
    return 301 https://$http_host$request_uri;
}
server{
    listen 443 ssl;
    server_name 域名1.com 域名2.com;
}

其中有 2 個(gè)參數(shù)需要說(shuō)明 $http_host$request_uri ,其中 $request_uri 在前文已經(jīng)進(jìn)行了說(shuō)明,表示除 host 以外的其它部分。
$http_host 參數(shù)存在幾個(gè)類似值:

  • $host:瀏覽器請(qǐng)求的 IP,無(wú)端口;
  • $http_host:瀏覽器請(qǐng)求的 IP/端口號(hào),端口存在即顯示;
  • $proxy_host:被代理服務(wù)的 IP/端口號(hào),80端口不顯示,其它顯示。

請(qǐng)求日志
error_log 參數(shù)用于設(shè)置日志存儲(chǔ)位置。

訪問(wèn)控制 allow/deny
在每個(gè)塊中都可以設(shè)置多個(gè) allow , deny ,分別表示允許或禁止某個(gè) IP 或IP 段訪問(wèn)。

return命令
該命令語(yǔ)法格式為

return code ;

該命令用于結(jié)束規(guī)則的執(zhí)行并返回狀態(tài)碼給客戶端。

Set命令
該命令語(yǔ)法格式為

set $variable value ;  # 默認(rèn)值:none

該命令用于定義一個(gè)變量,并給變量賦值。變量的值可為文本,變量及二者聯(lián)合。

記錄時(shí)間

今天是持續(xù)寫作的第 <font color=red>286</font> / 365 天。
可以<font color=#04a9f4>關(guān)注</font>我,<font color=#04a9f4>點(diǎn)贊</font>我、<font color=#04a9f4>評(píng)論</font>我、<font color=#04a9f4>收藏</font>我啦。

更多精彩

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容