Nginx常見問題

1)Nginx多Server優(yōu)先級(jí)

在開始處理一個(gè)http請(qǐng)求時(shí),nginx會(huì)取出header頭中的Host變量,與nginx.conf中的每個(gè)server_name進(jìn)行匹配,以此決定到底由哪一個(gè)server來處理這個(gè)請(qǐng)求,但nginx如何配置多個(gè)相同的server_name,會(huì)導(dǎo)致server_name出現(xiàn)優(yōu)先級(jí)訪問沖突

準(zhǔn)備nginx對(duì)應(yīng)的配置文件

[root@web01 conf.d]#  cat server1.conf 
server {
    listen 80;
    server_name localhost test1.com;

    location / {
        root /code/test1;
        index index.html;
    }
}
[root@web01 conf.d]# cat server2.conf 
server {
    listen 80;
    server_name localhost test2.com;

    location / {
        root /code/test2;
        index index.html;
    }
}
[root@web01 conf.d]# cat server3.conf 
server {
    listen 80;
    server_name localhost test3.com;

    location / {
        root /code/test3;
        index index.html;
    }
}

準(zhǔn)備站點(diǎn)目錄

[root@web01 conf.d]# mkdir /code/test{1..3}
[root@web01 conf.d]# echo test1 > /code/test1/index.html
[root@web01 conf.d]# echo test2 > /code/test2/index.html
[root@web01 conf.d]# echo test3 > /code/test3/index.html

檢查語法提示沖突,忽略并重啟

[root@web01 conf.d]# nginx -t
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 conf.d]# nginx -s reload
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
[root@web01 conf.d]#

瀏覽器訪問測(cè)試

# 根據(jù)ip訪問
# 1.用戶第一次訪問,讀取server1.conf配置返回結(jié)果
[root@lb01 ~]# curl 10.0.0.5
test1

# 2. 此時(shí)將server1.conf修改為server4.conf重啟nginx
[root@lb01 conf.d]# mv server1.conf server4.conf
[root@lb01 conf.d]# nginx -s reload

# 3. 再次訪問時(shí),讀取server2.conf配置返回結(jié)果
[root@lb01 conf.d]# curl 10.0.0.5
test2

多Server_name優(yōu)先級(jí)總結(jié)

再開始處理一個(gè)HTTP請(qǐng)求時(shí),Nginx會(huì)讀取header(請(qǐng)求頭)中的host,與每個(gè)server中的server_name進(jìn)行匹配,來決定用哪一個(gè)server標(biāo)簽來完成處理這個(gè)請(qǐng)求,有可能一個(gè)Host與多個(gè)server中的server_name都匹配,這個(gè)時(shí)候就會(huì)根據(jù)匹配優(yōu)先級(jí)來選擇實(shí)際處理的server。
優(yōu)先級(jí)匹配結(jié)果如下:

1.首先選擇所有的字符串完全匹配的server_name。(完全匹配)
2.選擇通配符在前面的server_name,如*.test.com www.test.com
3.選擇通配符在后面的server_name,如test.* test.com test.cn
4.最后選擇使用正則表達(dá)式匹配的server_name
5.如果全部都沒有匹配到,那么將選擇在listen配置項(xiàng)后加入[default_server]的server塊
6.如果沒寫,那么就找到匹配listen端口的第一個(gè)Server塊的配置文件

注意:當(dāng)出現(xiàn)多個(gè)相同的server_name情況下,配置文件排序優(yōu)先使用則會(huì)被調(diào)用,所以建議配置相同端口,不同域名,這樣不會(huì)出現(xiàn)域名訪問沖突。

2)Nginx禁止IP直接訪問

當(dāng)用戶通過訪問IP或者未知域名訪問你得網(wǎng)站的時(shí)候,你希望禁止顯示任何有效內(nèi)容,可以給他返回500,目前國內(nèi)很多機(jī)房都要求網(wǎng)站關(guān)閉空主機(jī)頭,防止未備案的域名指向過來造成麻煩

Nginx禁止IP訪問

[root@lb01 conf.d]# cat server4.conf 
server {
    listen 80 default_server;           #默認(rèn)優(yōu)先返回;
    server_name _;                      #空主機(jī)頭或者IP;
    return 500;                         #直接返回500錯(cuò)誤;
}

引流的方式將訪問的IP直接跳轉(zhuǎn)主站域名

[root@lb01 conf.d]# cat server4.conf 
server {
    listen 80 default_server;
    server_name _;
    return 302 https://www.test.com;
}

Nginx包含文件Include

一臺(tái)服務(wù)器配置多個(gè)網(wǎng)站,如果配置都寫在nginx.conf主配置文件中,會(huì)導(dǎo)致nginx.conf主配置文件變得非常龐大而且可讀性非常的差。那么后期的維護(hù)就變得麻煩。 假設(shè)現(xiàn)在希望快速的關(guān)閉一個(gè)站點(diǎn),該怎么辦? 1.如果是寫在nginx.conf中,則需要手動(dòng)注釋,比較麻煩 2.如果是include的方式,那么僅需修改配置文件的擴(kuò)展名,即可完成注釋 Include包含的作用是為了簡(jiǎn)化主配置文件,便于人類可讀。

inlcude /etc/nginx/online/*.conf #線上使用的配置

/etc/nginx/offline #保留配置,不啟用(下次使用在移動(dòng)到online中)

Nginx路徑root與alias

root與alias路徑匹配主要區(qū)別在于nginx如何解釋location后面的uri,這會(huì)使兩者分別以不同的方式將請(qǐng)求映射到服務(wù)器文件上,alias是一個(gè)目錄別名的定義,root則是最上層目錄的定義

root的處理結(jié)果是:root路徑+location路徑alias的處理結(jié)果是:使用alias定義的路徑

使用root時(shí),用戶訪問http://image.com/picture/1.jpg時(shí),實(shí)際上Nginx會(huì)到/code/picture/目錄下找1.jpg文件

[root@lb01 conf.d]# cat image.conf 
server {
    listen 80;
    server_name image.com;

    location /picture {
        root /code;
    }
}

使用alias時(shí),用戶訪問http://image.com/picture/1.jpg時(shí),實(shí)際上Nginx會(huì)到/code/目錄下找1.jpg文件

[root@lb01 conf.d]# cat image.conf 
server {
    listen 80;
    server_name image.com;

    location /picture {
        alias /code;
    }
}

線上配置

server {
    listen 80;
    server_name image.test.com;

    location / {
        root /code;
    }

    location ~* ^.*\.(png|jpg|gif)$ {
        alias /code/images/;
    }
}

Nginx try_file路徑匹配

nginx的try_file路徑匹配,Nginx會(huì)按順序檢查文件及目錄是否存在(根據(jù) root 和 alias 指令設(shè)置的參數(shù)構(gòu)造完整的文件路徑),并用找到的第一個(gè)文件提供服務(wù)。在元素名后面添加斜杠 / 表示這個(gè)是目錄。如果文件和目錄都不存在,Nginx會(huì)執(zhí)行內(nèi)部重定向,跳轉(zhuǎn)到命令的最后一個(gè) uri 參數(shù)定義的 URI 中

配置實(shí)例一

#1. 配置nginx
[root@lb01 conf.d]# vim try.conf 
server {
    listen 80;
    server_name try.test.com;
    root /code;
    index index.html;

    location / {
        try_files $uri $uri/ /404.html;
    }
}

#2. 創(chuàng)建實(shí)例目錄與文件
[root@lb01 conf.d]# echo try11111 > /code/index.html 
[root@lb01 conf.d]# echo '404 404 404' > /code/404.html

#3. 嘗試訪問try.oldboy.com
[root@lb01 conf.d]# curl try.oldboy.com
404 404 404
#由于訪問的是try.test.com,而$uri取得是域名后面我們寫的內(nèi)容,它找不到,所以返回后面的內(nèi)容,即404.html

#4. 嘗試訪問try.test.com/index.html
[root@lb01 conf.d]# curl try.test.com/index.html
try11111
#由于訪問的是try.test.com/index.html,而$uri取到了index.html所以返回/code/index.html的內(nèi)容

#5. 修改配置為
location / {
    try_files $uri $uri/ /404.html;
}

#6. 再次嘗試訪問try.test.com
[root@lb01 conf.d]# curl try.test.com
try11111
#我們?cè)L問的是try.test.com,而$uri我們沒有寫任何內(nèi)容,于是他訪問的便是“空/”,即匹配到/code/index.html

舉例

location /images/ {
        try_files $uri $uri/ /404.html;
}

用戶請(qǐng)求try.test.com/images/image1.gif,Nginx 會(huì)首先通過用于這個(gè) location,在本地目錄中查找這個(gè)文件
如果image1.gif文件不存在,Nginx 會(huì)在目錄下查找image1.gif/。
try.test.com/images/image1.gif/,它如果不存在的話,會(huì)重定向到/code/404.html

配置實(shí)例二

#1. 配置nginx
[root@lb01 conf.d]# cat try.conf 
server {
    listen 80;
    server_name try.test.com;
    root /code;
    index index.html;

    location / {
        #當(dāng)$uri和$uri/都匹配不到時(shí),由后端的java來進(jìn)行處理,名字可自定義,但一定要加@
        try_files $uri $uri/ @java;             
    }

    location @java {
    proxy_pass http://172.16.1.8:8080;          #配置后端tomcat
    }
}

#2. 配置后端tomcat
[root@web02 ~]# cd /usr/share/tomcat/webapps/ROOT
[root@web02 ROOT]# echo 'I am tomcat' > index.html
[root@web02 ROOT]# systemctl start tomcat

#3. 把文件都挪走
[root@lb01 code]# mv index.html index1.html /tmp/

#4. 測(cè)試訪問
[root@lb01 code]# curl http://try.test.com/index.html
I am tomcat

Nginx調(diào)整上傳文件大小

在Nginx使用上傳文件的過程中,通常需要設(shè)置保存大小限制,避免出現(xiàn)413 Request Entity Too Large

Nginx上傳文件大小限制配置語法

Syntax:  client_max_body_size size;
Default: client_max_body_size 1m;
Context: http, server, location

配置實(shí)例一

#也可以放入/etc/nginx/nginx.config 文件的http層,它是全局生效
server {
    listen 80;
    server_name _;
    client_max_body_size 200m;
}

Nginx優(yōu)雅顯示錯(cuò)誤頁面

error_page錯(cuò)誤日志

第一種配置情況(跳轉(zhuǎn)網(wǎng)絡(luò)地址)

#error_page配置的是http這種的網(wǎng)絡(luò)地址
[root@lb01 conf.d]# cat error.conf 
server {
    listen       80;
    server_name  www.test.com;
    root /code;

    location / {
        index index.html;
        error_page  404  http://www.baidu.com;
    }    
}

第二種配置情況(跳轉(zhuǎn)本地地址)

[root@lb01 conf.d]# cat error.conf 
server {
    listen 80;
    server_name error.test.com;
    root /code;

    location / {
        index index.html;
    }

    #error_page  403 404  /404.jpg;
    error_page 403 404 /404.html;

    location = /404.html {
        root /code;
        index index.html;   
    }
}
?著作權(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)容

  • 1、Nginx 常見問題 1、相同server_name多個(gè)虛擬主機(jī)優(yōu)先級(jí)訪問根據(jù)文件名順序優(yōu)先讀取。使用ip訪問...
    AKyS佐毅閱讀 1,265評(píng)論 0 5
  • 獲取全套nginx教程,請(qǐng)?jiān)L問瓦力博客 在前面那些章節(jié)記錄了nginx基礎(chǔ)用法、模塊等。這小節(jié)會(huì)記錄nginx在配...
    瓦力博客閱讀 240評(píng)論 0 1
  • 1,相同的server_name多個(gè)虛擬主機(jī)優(yōu)先級(jí)訪問在多個(gè)虛擬機(jī)里面假如有多個(gè)server_name,那么他們的...
    滔滔逐浪閱讀 664評(píng)論 0 9
  • 相同server_name多個(gè)虛擬主機(jī)優(yōu)先級(jí)訪問 優(yōu)先讀取第一個(gè)conf文件。 location匹配優(yōu)先級(jí) =進(jìn)行...
    FantJ閱讀 572評(píng)論 0 4
  • nginx常見問題 相同server_name 多個(gè)虛擬主機(jī)優(yōu)先級(jí)訪問 對(duì)于相同的serverName,可以運(yùn)行,...
    andpy閱讀 334評(píng)論 0 0

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