中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么解決Nginx模塊問題

發布時間:2021-10-18 14:44:12 來源:億速云 閱讀:117 作者:iii 欄目:開發技術

這篇文章主要講解了“怎么解決Nginx模塊問題”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么解決Nginx模塊問題”吧!

問題復現

得知運營的反饋后,我迅速登錄服務器排查問題。首先,查看了接口服務的啟動進程正常。驗證接口服務的ip和端口是否正常,結果也是沒啥問題。接下來,通過Nginx轉發請求,此時出現了問題,無法訪問接口。同時Nginx的access.log文件中輸出了如下日志信息。

192.168.175.120 - - [26/Feb/2021:21:34:21 +0800] "GET /third/system/base/thirdapp/get_detail HTTP/1.1" 404 0 "http://192.168.175.100/api/index.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0" 192.168.175.120 - - [26/Feb/2021:21:34:22 +0800] "GET /third/system/base/thirdapp/get_detail HTTP/1.1" 404 0 "http://192.168.175.100/api/index.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0" 192.168.175.120 - - [26/Feb/2021:21:34:26 +0800] "GET /third/system/base/thirdapp/get_detail HTTP/1.1" 404 0 "http://192.168.175.100/api/index.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0"

此時,從Nginx日志中發現,輸出的狀態為404,未找到后端的接口服務。為了進一步定位問題,我直接在線上環境通過curl命令的方式來訪問接口服務,結果是正常的。

經過這一系列的操作之后,我們就可以確定問題是出在Nginx上了。

問題分析

Nginx開啟debug模塊

既然已經定位到問題了,那我們接下來就要分析下產生問題的具體原因了。既然是Nginx的問題,我第一時間想到的就是調試Nginx查找錯誤原因。于是我在服務器命令行輸入了如下命令來查看安裝Nginx時的配置情況。

nginx -V

注意:這里已經為Nginx配置了系統環境變量,如果沒有配置系統環境變量,則需要輸入nginx命令所在目錄的完整路徑,例如:

/usr/local/nginx/sbin/nginx -v

命令行輸出了如下信息。

configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --add-module=/usr/local/src/fastdfs/fastdfs-nginx-module-1.22/src --with-openssl=/usr/local/src/openssl-1.0.2s --with-pcre=/usr/local/src/pcre-8.43 --with-zlib=/usr/local/src/zlib-1.2.11 --with-http_ssl_module

可以看到,安裝Nginx時沒有配置Nginx的debug模塊。

于是我在服務器上找到了Nginx的安裝文件,在命令行輸入如下命令重新編譯Nginx。

cd /usr/local/src/nginx/  #進入Nginx的安裝文件根目錄 make clean                #清除編譯信息 ./configuration --prefix=/usr/local/nginx-1.17.8 --with-http_stub_status_module --add-module=/usr/local/src/fastdfs/fastdfs-nginx-module-1.22/src --with-openssl=/usr/local/src/openssl-1.0.2s --with-pcre=/usr/local/src/pcre-8.43 --with-zlib=/usr/local/src/zlib-1.2.11 --with-http_ssl_module --with-debug  #設置編譯Nginx的配置信息 make     #編譯Nginx,切記不要輸入make install

上述命令中,切記不要輸入make install 進行安裝。

執行完 make  命令后,會在當前目錄的objs目錄下生成nginx命令,此時我們需要先停止Nginx服務,備份/usr/local/nginx/sbin/目錄下的nginx命令,然后將objs目錄下的nginx命令復制到/usr/local/nginx/sbin/目錄下,然后啟動Nginx服務。

nginx_service.sh stop   #通過腳本停止Nginx服務 mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak #備份原有nginx命令 cp ./objs/nginx /usr/local/nginx/sbin/nginx #復制nginx命令 nginx_service.sh start #通過腳本啟動Nginx服務

注意:這里,在停止Nginx服務前,已經將此Nginx從接入層網關中移除了,所以不會影響線上環境。為了避免使用新編譯的nginx命令重啟Nginx出現問題,這里通過腳本先停止Nginx服務,然后復制nginx命令后,再啟動Nginx服務。

配置Nginx輸出debug日志

在Nginx的nginx.conf文件中配置如下信息。

error_log  logs/error.log debug;

此時,開啟了Nginx的debug日志功能,并將debug信息輸出到error.log文件中。

分析問題

接下來,在服務器命令行輸入如下命令監聽error.log文件的輸出日志。

tail -F /usr/local/nginx/logs/error.log

然后模擬訪問http接口,可以看到error.log文件中輸出如下信息。

2021/02/26 21:34:26 [debug] 31486#0: *56 http request line: "GET /third/system/base/thirdapp/get_detail HTTP/1.1" 2021/02/26 21:34:26 [debug] 31486#0: *56 http uri: "/third/system/base/thirdapp/get_detail" 2021/02/26 21:34:26 [debug] 31486#0: *56 http args: "" 2021/02/26 21:34:26 [debug] 31486#0: *56 http exten: "" 2021/02/26 21:34:26 [debug] 31486#0: *56 posix_memalign: 0000000000FF6450:4096 @16 2021/02/26 21:34:26 [debug] 31486#0: *56 http process request header line 2021/02/26 21:34:26 [debug] 31486#0: *56 http header: "Host: 10.31.5.66" 2021/02/26 21:34:26 [debug] 31486#0: *56 http header: "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0" 2021/02/26 21:34:26 [debug] 31486#0: *56 http header: "Accept: */*" 2021/02/26 21:34:26 [debug] 31486#0: *56 http header: "Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2" 2021/02/26 21:34:26 [debug] 31486#0: *56 http header: "Accept-Encoding: gzip, deflate" 2021/02/26 21:34:26 [debug] 31486#0: *56 http header: "Referer: http://192.168.175.100/api/index.html" 2021/02/26 21:34:26 [debug] 31486#0: *56 http header: "Connection: keep-alive" 2021/02/26 21:34:26 [debug] 31486#0: *56 http header done 2021/02/26 21:34:26 [debug] 31486#0: *56 rewrite phase: 0 2021/02/26 21:34:26 [debug] 31486#0: *56 test location: "/" 2021/02/26 21:34:26 [debug] 31486#0: *56 test location: "file/" 2021/02/26 21:34:26 [debug] 31486#0: *56 test location: ~ "/base" 2021/02/26 21:34:26 [debug] 31486#0: *56 using configuration "/base"

從上面的輸出日志中,我們可以看到:訪問的接口地址為“/third/system/base/thirdapp/get_detail”,如下所示。

2021/02/26 21:34:26 [debug] 31486#0: *56 http uri: "/third/system/base/thirdapp/get_detail"

Nginx在進行轉發時,分別匹配了“/”,“file/”,“~/base”,最終將請求轉發到了“/base”,如下所示。

2021/02/26 21:34:26 [debug] 31486#0: *56 test location: "/" 2021/02/26 21:34:26 [debug] 31486#0: *56 test location: "file/" 2021/02/26 21:34:26 [debug] 31486#0: *56 test location: ~ "/base" 2021/02/26 21:34:26 [debug] 31486#0: *56 using configuration "/base"

我們再來看看Nginx的配置,打開nginx.conf文件,找到下面的配置。

location ~/base {   proxy_pass                  http://base;   proxy_set_header Host $host:$server_port; } location ~/third {   proxy_pass                  http://third;   proxy_set_header Host $host:$server_port; }

那么問題來了,訪問的接口明明是“/third/system/base/thirdapp/get_detail”,為啥會走到“/base”下面呢?

說到這里,相信細心的小伙伴已經發現問題了,沒錯,又是運維的鍋!!

解決問題

看了Nginx的配置后,相信很多小伙伴應該都知道如何解決問題了,沒錯那就是把nginx.conf中的如下配置。

location ~/base {   proxy_pass                  http://base;   proxy_set_header Host $host:$server_port; } location ~/third {   proxy_pass                  http://third;   proxy_set_header Host $host:$server_port; }

修改為如下所示。

location /base {   proxy_pass                  http://base;   proxy_set_header Host $host:$server_port; } location /third {   proxy_pass                  http://third;   proxy_set_header Host $host:$server_port; }

去掉“~”符號即可。

接下來,再次模擬訪問http接口,能夠正常訪問接口。

接下來,將Nginx的debug功能關閉,也就是將nginx.conf文件中的 error_log logs/error.log debug;  配置注釋掉,如下所示。

# error_log  logs/error.log debug;

重新加載nginx.conf文件。

nginx_service.sh reload

最終,將Nginx加入到接入層網關,問題解決。

科普Nginx的轉發規則

Nginx的location語法

location [=|~|~*|^~] /uri/ { … }
  • = 嚴格匹配。如果請求匹配這個location,那么將停止搜索并立即處理此請求

  • ~ 區分大小寫匹配(可用正則表達式)

  • ~* 不區分大小寫匹配(可用正則表達式)

  • !~ 區分大小寫不匹配

  • !~* 不區分大小寫不匹配

  • ^~ 如果把這個前綴用于一個常規字符串,那么告訴nginx 如果路徑匹配那么不測試正則表達式

示例1:

location  / { }

匹配任意請求

示例2:

location ~* .(gif|jpg|jpeg)$ {     rewrite .(gif|jpg|jpeg)$ /logo.png; }

不區分大小寫匹配任何以gif、jpg、jpeg結尾的請求,并將該請求重定向到 /logo.png請求

示例3:

location ~ ^.+\.txt$ {     root /usr/local/nginx/html/; }

區分大小寫匹配以.txt結尾的請求,并設置此location的路徑是/usr/local/nginx/html/。也就是以.txt結尾的請求將訪問/usr/local/nginx/html/  路徑下的txt文件

alias與root的區別

  • root 實際訪問文件路徑會拼接URL中的路徑

  • alias 實際訪問文件路徑不會拼接URL中的路徑

示例如下:

location ^~ /binghe/ {      alias /usr/local/nginx/html/binghetic/;   }
  • 請求:http://test.com/binghe/binghe1.html

  • 實際訪問:/usr/local/nginx/html/binghetic/binghe1.html 文件

location ^~ /binghe/ {      root /usr/local/nginx/html/;   }
  • 請求:http://test.com/binghe/binghe1.html

  • 實際訪問:/usr/local/nginx/html/binghe/binghe1.html 文件

last 和 break關鍵字的區別

(1)last 和 break 當出現在location 之外時,兩者的作用是一致的沒有任何差異

(2)last 和 break 當出現在location 內部時:

  • last 使用了last 指令,rewrite 后會跳出location 作用域,重新開始再走一次剛才的行為

  • break 使用了break 指令,rewrite后不會跳出location 作用域,其整個生命周期都在當前location中。

permanent 和 redirect關鍵字的區別

  • rewrite … permanent 永久性重定向,請求日志中的狀態碼為301

  • rewrite … redirect 臨時重定向,請求日志中的狀態碼為302

綜合實例

將符合某個正則表達式的URL重定向到一個固定頁面

比如:我們需要將符合“/test/(\d+)/[\w-.]+”  這個正則表達式的URL重定向到一個固定的頁面。符合這個正則表達式的頁面可能是:http://test.com/test/12345/abc122.html、http://test.com/test/456/11111cccc.js等

從上面的介紹可以看出,這里可以使用rewrite重定向或者alias關鍵字來達到我們的目的。因此,這里可以這樣做:

(1)使用rewrite關鍵字

location ~ ^.+\.txt$ {     root /usr/local/nginx/html/; } location ~* ^/test/(\d+)/[\w-\.]+$ {     rewrite ^/test/(\d+)/[\w-\.]+$ /testpage.txt last; }

這里將所有符合條件的URL(PS:不區分大小寫)都重定向到/testpage.txt請求,也就是  /usr/local/nginx/html/testpage.txt 文件

(2)使用alias關鍵字

location ~* ^/test/(\d+)/[\w-\.]+$ {     alias /usr/local/nginx/html/binghetic/binghe1.html; }

這里將所有符合條件的URL(不區分大小寫)都重定向到/usr/local/nginx/html/binghetic/binghe1.html 文件

感謝各位的閱讀,以上就是“怎么解決Nginx模塊問題”的內容了,經過本文的學習后,相信大家對怎么解決Nginx模塊問題這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江陵县| 新蔡县| 渝中区| 维西| 内黄县| 白山市| 房产| 眉山市| 故城县| 比如县| 晋州市| 林州市| 广汉市| 同仁县| 本溪| 内丘县| 土默特右旗| 峨山| 秦皇岛市| 肥乡县| 游戏| 道真| 葵青区| 大城县| 措勤县| 合水县| 吐鲁番市| 乌兰县| 耒阳市| 清流县| 河东区| 噶尔县| 徐汇区| 定州市| 梁平县| 佳木斯市| 于田县| 蓬莱市| 南投县| 安义县| 榆林市|