Nginx常見問題 1. Nginx多Server優先順序 在開始處理一個http請求時,nginx會取出header頭中的Host變數,與nginx.conf中的每個server_name進行匹配,以此決定到底由哪一個server來處理這個請求,但nginx如何配置多個相同的server_name, ...
Nginx常見問題
1. Nginx多Server優先順序
在開始處理一個http請求時,nginx會取出header頭中的Host變數,與nginx.conf中的每個server_name進行匹配,以此決定到底由哪一個server來處理這個請求,但nginx如何配置多個相同的server_name,會導致server_name出現優先順序訪問衝突。
1.1 準備nginx對應的配置文件
[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;
}
}
[root@web01 conf.d]#
1.2 準備站點目錄
[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
1.3 檢查語法提示衝突,忽略並重啟
[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]#
1.4 瀏覽器訪問測試
#根據功能變數名稱訪問測試正常
#根據ip訪問
#1. 用戶第一次訪問,讀取server1.conf配置返回結果
[root@lb01 ~]# curl 10.0.0.5
test1
#2. 此時將server1.conf修改為server4.conf重啟nginx
[root@lb01 conf.d]# mv server1.conf server4.conf
[root@lb01 conf.d]# nginx -s reload
#3. 再次訪問時,讀取server2.conf配置返回結果
[root@lb01 conf.d]# curl 10.0.0.5
test2
1.5 多Server_name優先順序總結
再開始處理一個HTTP請求時,Nginx會讀取header(請求頭)中的host,與每個server中的server_name進行匹配,來決定用哪一個server標簽來完成處理這個請求,有可能一個Host與多個server中的server_name都匹配,這個時候就會根據匹配優先順序來選擇實際處理的server。優先順序匹配結果如下:
1.首先選擇所有的字元串完全匹配的server_name。(完全匹配)
2.選擇通配符在前面的server_name,如.haoda.com www.haoda.com3.選擇通配符在後面的server_name,如bgx. haoda.com haoda.cn
4.最後選擇使用正則表達式匹配的server_name
5.如果全部都沒有匹配到,那麼將選擇在listen配置項後加入[default_server]的server塊
6.如果沒寫,那麼就找到匹配listen埠的第一個Server塊的配置文件
註意:當出現多個相同的server_name情況下,配置文件排序優先使用則會被調用,所以建議配置相同埠,不同功能變數名稱,這樣不會出現功能變數名稱訪問衝突。
2. Nginx禁止IP直接訪問
當用戶通過訪問IP或者未知功能變數名稱訪問你得網站的時候,你希望禁止顯示任何有效內容,可以給他返回500,目前國內很多機房都要求網站關閉空主機頭,防止未備案的功能變數名稱指向過來造成麻煩
2.1 Nginx禁止IP訪問
[root@lb01 conf.d]# cat server4.conf
server {
listen 80 default_server; #預設優先返回;
server_name _; #空主機頭或者IP;
return 500; #直接返回500錯誤;
}
2.2 引流的方式將訪問的IP直接跳轉主站功能變數名稱
[root@lb01 conf.d]# cat server4.conf
server {
listen 80 default_server;
server_name _;
return 302 http://test1.com;
}
Nginx包含文件Include
一臺伺服器配置多個網站,如果配置都寫在nginx.conf主配置文件中,會導致nginx.conf主配置文件變得非常龐大而且可讀性非常的差。那麼後期的維護就變得麻煩。 假設現在希望快速的關閉一個站點,該怎麼辦? 1.如果是寫在nginx.conf中,則需要手動註釋,比較麻煩 2.如果是include的方式,那麼僅需修改配置文件的擴展名,即可完成註釋 Include包含的作用是為了簡化主配置文件,便於人類可讀。
inlcude /etc/nginx/online/*.conf #線上使用的配置
/etc/nginx/offline #保留配置,不啟用(下次使用在移動到online中)
Nginx路徑root與alias
root與alias路徑匹配主要區別在於nginx如何解釋location後面的uri,這會使兩者分別以不同的方式將請求映射到伺服器文件上,alias是一個目錄別名的定義,root則是最上層目錄的定義。
root的處理結果是:root路徑+location路徑alias的處理結果是:使用alias定義的路徑
1 使用root時,用戶訪問http://image.com/picture/1.jpg時,實際上Nginx會到/code/picture/目錄下找1.jpg文件
[root@lb01 conf.d]# cat image.conf
server {
listen 80;
server_name image.com;
location /picture {
root /code;
}
}
2 使用alias時,用戶訪問http://image.com/picture/1.jpg時,實際上Nginx會到/code/目錄下找1.jpg文件
[root@lb01 conf.d]# cat image.conf
server {
listen 80;
server_name image.com;
location /picture {
alias /code;
}
}
3 線上一般配置
server {
listen 80;
server_name image.oldboy.com;
location / {
root /code;
}
location ~* ^.*\.(png|jpg|gif)$ {
alias /code/images/;
}
}
Nginx try_file路徑匹配
nginx的try_file路徑匹配,Nginx會按順序檢查文件及目錄是否存在(根據 root 和 alias 指令設置的參數構造完整的文件路徑),並用找到的第一個文件提供服務。在元素名後面添加斜杠 / 表示這個是目錄。如果文件和目錄都不存在,Nginx會執行內部重定向,跳轉到命令的最後一個 uri 參數定義的 URI 中。
1 Nginx try_file配置實例1
#1. 配置nginx
[root@lb01 conf.d]# vim try.conf
server {
listen 80;
server_name try.haoda.com;
root /code;
index index.html;
location / {
try_files $uri /404.html;
}
}
#2. 創建實例目錄與文件
[root@lb01 conf.d]# echo try11111 > /code/index.html
[root@lb01 conf.d]# echo '404 404 404' > /code/404.html
#3. 嘗試訪問try.haoda.com
[root@lb01 conf.d]# curl try.haoda.com
404 404 404
#由於訪問的是try.haoda.com,而$uri取得是功能變數名稱後面我們寫的內容,它找不到,所以返回後面的內容,即404.html
#4. 嘗試訪問try.haoda.com/index.html
[root@lb01 conf.d]# curl try.haoda.com/index.html
try11111
#由於訪問的是try.haoda.com/index.html,而$uri取到了index.html所以返回/code/index.html的內容
#5. 修改配置為
location / {
try_files $uri $uri/ /404.html;
}
#6. 再次嘗試訪問try.haoda.com
[root@lb01 conf.d]# curl try.haoda.com
try11111
#我們訪問的是try.haoda.com,而$uri我們沒有寫任何內容,於是他訪問的便是“空/”,即匹配到/code/index.html
舉例
location /images/ {
try_files $uri $uri/ /404.html;
}
用戶請求try.haoda.com/images/image1.gif,Nginx 會首先通過用於這個 location,在本地目錄中查找這個文件。如果“image1.gif”文件不存在,Nginx 會查找“image1.gif/”目錄,即“try.haoda.com/images/image1.gif/”,如果都不存在,會重定向到“/404.html”
2 Nginx try_file配置實例2
#1. 配置nginx
[root@lb01 conf.d]# cat try.conf
server {
listen 80;
server_name try.haoda.com;
root /code;
index index.html;
location / {
try_files $uri $uri/ @java; #當$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. 測試訪問
[root@lb01 code]# curl http://try.haoda.com/index.html
i am tomcat
Nginx調整上傳文件大小
在nginx使用上傳文件的過程中,通常需要設置保溫大小限制,避免出現413 Request Entity Too Large
nginx上傳文件大小限制配置語法
Syntax: client_max_body_size size;
Default: client_max_body_size 1m;
Context: http, server, location
nginx長傳文件大小限制配置示例
#也可以放入http層,全局生效
server {
listen 80;
server_name _;
client_max_body_size 200m;
}
Nginx優雅顯示錯誤頁面
error_page錯誤日誌
1 第一種配置情況(跳轉網路地址)
#error_page配置的是http這種的網路地址
[root@lb01 conf.d]# cat error.conf
server {
listen 80;
server_name www.haoda.com;
root /code;
#error_page 404 http://www.baidu.com;
location / {
index index.html;
error_page 404 http://www.baidu.com;
}
}
2 第二種配置情況(跳轉本地地址)
[root@lb01 conf.d]# cat error.conf
server {
listen 80;
server_name error.haoda.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;
}
}