[Python Web]配置 nginx 遇到錯誤排查(初級)


配置 nginx 遇到錯誤排查(初級)

系統版本:ubuntu 14.04,nginx 版本:nginx/1.4.6 (Ubuntu)

本文不是一步步搭建 nginx 的過程,而是我在使用 nginx 的過程中,整理自己遇到的的一些問題。適用於:nginx 遇到問題,排查問題的 checklist

一、安裝

sudo apt-get update
sudo apt-get install nginx

注意:用 root 身份安裝 nginx

二、常用命令

請在執行下面命令時,確保權限正確,統一在命令前加入:sudo,使用 root 權限操作 nginx。

  1. 查看 nginx 版本:nginx -v
  2. 檢查配置語法是否正確:service nginx configtest
  3. 重啟:service nginx restart
  4. 停止:service nginx stop
  5. 查看狀態:service nginx status

如遇到,啟動失敗的情況,請查看 nginx 錯誤日志,日志位於:/var/log/nginx/error.log

三、nginx 正則表達式匹配

location 支持的正則規則,注意:使用正則需要謹慎,確定正則的正確性。

容易出現:因為錯誤的正則,導致 NOT FOUNDThe requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.

3.1 正則表達式匹配

符號 含義
~ 區分大小寫匹配
~* 不區分大小寫匹配
!和!* 分別為區分大小寫不匹配及不區分大小寫不匹配
^ 以什么開頭的匹配
^~ 表示已某常規字符串開頭,不是正則表達式
$ 以什么結尾的匹配
/ 表示通用匹配
\ 轉義字符。可以轉. * ?等
* 代表任意字符
= 表示精確匹配,如location = / ,表示只有域名的情況

3.2 例子

  1. location = / :匹配任何查詢,因為所有請求都已 / 開頭。但是正則表達式規則和長的塊規則將被優先和查詢匹配
  2. location ^~ /images/ :匹配任何已/images/開頭的任何查詢並且停止搜索。任何正則表達式將不會被測試。
  3. location ~* .(gif|jpg|jpeg)$ :匹配任何已.gif、.jpg 或 .jpeg 結尾的請求

四、必知參數

4.1 root

默認訪問請求文件的所在目錄。例如訪問:http://hellogithub.com/img/hello-github.jpg,nginx 中配置如下:

location /img/ {
    root /該圖片所在的絕對路徑;
}

該請求就會到 root 指定路徑去尋找 /img/hello-github.jpg 文件,返回請求。

注意:指定目錄的權限

4.2 user

user root;
worker_processes 4;
pid /run/nginx.pid;

user 參數,代表 worker 屬於那個用戶身份,這個身份牽扯到可以訪問那些目錄。正如上面的 root 參數指定的路徑,如果 worker 沒有訪問該目錄的權限,那么就會返回 403 Forbidden 錯誤。

4.3 server、server_name、listen

server {
    listen 80;
    server_name hellogithub.com;
	...
}
  • server 是配置虛擬主機(Virtual Hosting
  • server_name是對應的虛擬主機的域名(domain)
  • listen 是該虛擬主機監聽的端口

虛擬主機配置實現了,如何一台計算機實現服務多個域名。

注意:在配置 listen 參數時,確保該端口為打開狀態、沒有其它進程占用。

4.4 關系

server {
	listen 80;
	...
	server_name hellogithub.com www.hellogithub.com;
	access_log /path/access.log;
	error_log /path/hellogithub/error.log;

	location / {
		...
		proxy_pass         http://0.0.0.0:4000;
	}
}
  • access_log:虛擬主機的訪問日志
  • error_log:虛擬主機的錯誤日志

請求到了目標服務器,Nginx 接受請求,根據 nginx.conf 中的配置的虛擬主機。找到到具體的虛擬主機配置的規則,然后根據虛擬主機的 location 規則,匹配請求的 path 。最后,返回結果(靜態資源)或者通過 proxy_pass 參數,反向代理到本機上的處理服務,然后把處理后的結果再通過 nginx 返回結果。

注意:proxy_pass 參數配置的地址末尾不要帶 /。例如上面的例子,就不要寫成:http://0.0.0.0:4000/
否則會出現:proxy_pass cannot have URI part in location given by regular expression...,錯誤提示。

4.5 include

http {
    ...

    ##
    # Virtual Host Configs
    ##
    include conf.d/*.conf;
}

意思:引入 conf.d 目錄下后綴為 conf 的文件。該目錄下存放不同的虛擬主機的相關配置。

目的:為了方便以后的修改配置,使用 include 參數。把不同的虛擬主機的配置放在單獨的文件中,達到相互獨立,減少出錯的可能。

五、問題排查步驟

  1. 修改完 nginx.conf 文件后,執行sudo service nginx configtest,檢查語法錯誤。無誤后再重啟 nginx。
  2. 如果語法出現的錯誤,查看 sudo vi /var/log/nginx/error.log 錯誤日志分析問題,根據異常信息,搜索問題的解決辦法。
  3. 語法正確也不一定可以正常啟動 nginx(端口被占用),如果啟動失敗。查看 sudo vi /var/log/nginx/error.log 錯誤日志分析問題。
  4. nginx 正常啟動了,訪問地址出現:
    • 無法訪問此網站(ERR_NAME_NOT_RESOLVED):檢查服務的 80 或 443 端口是否打開。
    • NOT FOUND:檢查 location 是否匹配到了請求的 path。
    • 403 Forbidden:檢查 root 的文件權限和 user 身份的權限。

六、總結

排查問題的關鍵,是需要清楚整個流程都經歷的那些步驟,逐一進行排查,取保每一步的正確。中間最關鍵的信息就是 日志中的錯誤說明

就像排查 nginx,可以通過日志,定位到問題是在那一步出錯了。如果日志中沒有這一次訪問的記錄,那就需要查看端口是否開放、域名解析是否正確。

  • 首先,清楚整個流程
  • 然后,根據有限的信息,定位問題
  • 最后,分析問題,整理問題的關鍵字,求教 Google

至此就是我在配置 nginx 遇到的問題和總結的經驗,這些折騰了我半天。所以,記錄、整理這些東西希望自己以后遇到這個問題有‘套路’,不至於浪費時間,同樣分享給大家,希望能幫到更多的人😁。

PS:在我搜索相關資料的時候,我發現如何配置環境的資料,一般都是雲服務商(linode、digitalocean)寫的最好、最詳細、最全。所以,遇到這類問題,可以多去看看他們的幫助文檔。

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM