本篇博客主要用于記錄 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>我啦。
更多精彩